Source code for qpdk.cells.transmon

"""Transmon qubit components."""

from __future__ import annotations

import gdsfactory as gf
from gdsfactory.component import Component
from gdsfactory.typings import LayerSpec

from qpdk.tech import LAYER


[docs] @gf.cell_with_module_name def transmon( pad_width: float = 200.0, pad_height: float = 100.0, pad_gap: float = 6.0, junction_width: float = 0.15, junction_height: float = 0.3, island_width: float = 10.0, island_height: float = 4.0, layer_metal: LayerSpec = LAYER.M1_DRAW, layer_junction: LayerSpec = LAYER.JJ_AREA, layer_island: LayerSpec = LAYER.M1_DRAW, port_type: str = "electrical", ) -> Component: """Creates a transmon qubit with Josephson junction. A transmon qubit consists of two capacitor pads connected by a Josephson junction. The junction creates an anharmonic oscillator that can be used as a qubit. Args: pad_width: Width of each capacitor pad in μm. pad_height: Height of each capacitor pad in μm. pad_gap: Gap between the two pads in μm. junction_width: Width of the Josephson junction in μm. junction_height: Height of the Josephson junction in μm. island_width: Width of the central island in μm. island_height: Height of the central island in μm. layer_metal: Layer for the metal pads. layer_junction: Layer for the Josephson junction. layer_island: Layer for the central island. port_type: Type of port to add to the component. Returns: Component: A gdsfactory component with the transmon geometry. """ c = Component() # Create left capacitor pad left_pad = gf.components.rectangle( size=(pad_width, pad_height), layer=layer_metal, port_type=port_type, ) left_pad_ref = c.add_ref(left_pad) left_pad_ref.move((-pad_width - pad_gap / 2, -pad_height / 2)) # Create right capacitor pad right_pad = gf.components.rectangle( size=(pad_width, pad_height), layer=layer_metal, port_type=port_type, ) right_pad_ref = c.add_ref(right_pad) right_pad_ref.move((pad_gap / 2, -pad_height / 2)) # Create central island island = gf.components.rectangle( size=(island_width, island_height), layer=layer_island, ) island_ref = c.add_ref(island) island_ref.move((-island_width / 2, -island_height / 2)) # Create Josephson junction junction = gf.components.rectangle( size=(junction_width, junction_height), layer=layer_junction, ) junction_ref = c.add_ref(junction) junction_ref.move((-junction_width / 2, -junction_height / 2)) # Add connection lines from pads to island # Only add connections if there is a gap between island and pads connection_width = abs(pad_gap / 2 - island_width / 2) if pad_gap / 2 > island_width / 2: left_connection = gf.components.rectangle( size=(connection_width, junction_height / 2), layer=layer_metal, ) left_conn_ref = c.add_ref(left_connection) left_conn_ref.move((-pad_gap / 2, -junction_height / 4)) right_connection = gf.components.rectangle( size=(connection_width, junction_height / 2), layer=layer_metal, ) right_conn_ref = c.add_ref(right_connection) right_conn_ref.move((island_width / 2, -junction_height / 4)) # Add ports for connections c.add_port( name="left_pad", center=(-pad_width - pad_gap / 2, 0), width=pad_height, orientation=180, layer=layer_metal, ) c.add_port( name="right_pad", center=(pad_width + pad_gap / 2, 0), width=pad_height, orientation=0, layer=layer_metal, ) # Add metadata c.info["qubit_type"] = "transmon" c.info["pad_width"] = pad_width c.info["pad_height"] = pad_height c.info["pad_gap"] = pad_gap c.info["junction_area"] = junction_width * junction_height return c
[docs] @gf.cell_with_module_name def transmon_circular( pad_radius: float = 100.0, pad_gap: float = 6.0, junction_width: float = 0.15, junction_height: float = 0.3, island_radius: float = 5.0, layer_metal: LayerSpec = LAYER.M1_DRAW, layer_junction: LayerSpec = LAYER.JJ_AREA, layer_island: LayerSpec = LAYER.M1_DRAW, port_type: str = "electrical", ) -> Component: """Creates a circular transmon qubit with Josephson junction. A circular variant of the transmon qubit with circular capacitor pads. Args: pad_radius: Radius of each circular capacitor pad in μm. pad_gap: Gap between the two pads in μm. junction_width: Width of the Josephson junction in μm. junction_height: Height of the Josephson junction in μm. island_radius: Radius of the central circular island in μm. layer_metal: Layer for the metal pads. layer_junction: Layer for the Josephson junction. layer_island: Layer for the central island. port_type: Type of port to add to the component. Returns: Component: A gdsfactory component with the circular transmon geometry. """ c = Component() # Create left circular pad left_pad = gf.components.circle( radius=pad_radius, layer=layer_metal, ) left_pad_ref = c.add_ref(left_pad) left_pad_ref.move((-pad_radius - pad_gap / 2, 0)) # Create right circular pad right_pad = gf.components.circle( radius=pad_radius, layer=layer_metal, ) right_pad_ref = c.add_ref(right_pad) right_pad_ref.move((pad_radius + pad_gap / 2, 0)) # Create central circular island island = gf.components.circle( radius=island_radius, layer=layer_island, ) c.add_ref(island) # Create Josephson junction junction = gf.components.rectangle( size=(junction_width, junction_height), layer=layer_junction, ) junction_ref = c.add_ref(junction) junction_ref.move((-junction_width / 2, -junction_height / 2)) # Add connection lines from pads to island # Only add connections if there is a gap between island and pads connection_width = abs(pad_gap / 2 - island_radius) if pad_gap / 2 > island_radius: left_connection = gf.components.rectangle( size=(connection_width, junction_height / 2), layer=layer_metal, ) left_conn_ref = c.add_ref(left_connection) left_conn_ref.move((-pad_gap / 2, -junction_height / 4)) right_connection = gf.components.rectangle( size=(connection_width, junction_height / 2), layer=layer_metal, ) right_conn_ref = c.add_ref(right_connection) right_conn_ref.move((island_radius, -junction_height / 4)) # Add ports for connections c.add_port( name="left_pad", center=(-2 * pad_radius - pad_gap / 2, 0), width=2 * pad_radius, orientation=180, layer=layer_metal, ) c.add_port( name="right_pad", center=(2 * pad_radius + pad_gap / 2, 0), width=2 * pad_radius, orientation=0, layer=layer_metal, ) # Add metadata c.info["qubit_type"] = "transmon_circular" c.info["pad_radius"] = pad_radius c.info["pad_gap"] = pad_gap c.info["junction_area"] = junction_width * junction_height return c
if __name__ == "__main__": from qpdk import PDK PDK.activate() # c = transmon() c = transmon_circular() c.show()