PCells#

Components are grouped by their tags. Each component is listed once, under its main category; the badges under each entry show all of its tags.

Qubits

17 components

Qubits
Resonators

25 components

Resonators
Josephson Junctions

8 components

Josephson Junctions
Couplers

7 components

Couplers
Capacitors

3 components

Capacitors
Inductors

1 component

Inductors
Detectors

1 component

Detectors
Interconnects

8 components

Interconnects
Terminations

3 components

Terminations
Waveguides

12 components

Waveguides
Chip

1 component

Chip

Qubits#

Transmons#

double_pad_transmon#

qubits transmons

qpdk.cells.double_pad_transmon(pad_size=(250.0, 400.0), pad_gap=15.0, junction_spec=<function squid_junction>, junction_displacement=None, layer_metal=<LayerMapQPDK.M1_DRAW: 1>)[source]#

Creates a double capacitor pad 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.

+---------+         +---------+ |         |         |         | |  pad1   |   XX    |  pad2   | |         |   XX    |         | +---------+ junct.  +---------+  left_pad             right_pad +---------+         +---------+ |         |         |         | |  pad1   |   XX    |  pad2   | |         |   XX    |         | +---------+ junct.  +---------+  left_pad             right_pad

See [KYG+07] for details.

Parameters:
  • pad_size (tuple[float, float]) – (width, height) of each capacitor pad in μm.

  • pad_gap (float) – Gap between the two capacitor pads in μm.

  • junction_spec (ComponentSpec) – Component specification for the Josephson junction component.

  • junction_displacement (DCplxTrans | float | None) – Optional complex transformation, or in-place rotation in degrees, to apply to the junction.

  • layer_metal (LayerSpec) – Layer for the metal pads.

Returns:

A gdsfactory component with the transmon geometry.

Return type:

Component

double_pad_transmon

double_pad_transmon_with_bbox#

qubits transmons

qpdk.cells.double_pad_transmon_with_bbox(bbox_extension=200.0, pad_size=(250.0, 400.0), pad_gap=15.0, junction_spec=<function squid_junction>, junction_displacement=None, layer_metal=<LayerMapQPDK.M1_DRAW: 1>, layer_etch=<LayerMapQPDK.M1_ETCH: 47>)[source]#

Creates a double capacitor pad transmon qubit with Josephson junction and an etched bounding box.

See double_pad_transmon() for more details.

Parameters:
  • bbox_extension (float) – Extension size for the bounding box in μm.

  • pad_size (tuple[float, float]) – (width, height) of each capacitor pad in μm.

  • pad_gap (float) – Gap between the two capacitor pads in μm.

  • junction_spec (ComponentSpec) – Component specification for the Josephson junction component.

  • junction_displacement (DCplxTrans | float | None) – Optional complex transformation, or in-place rotation in degrees, to apply to the junction.

  • layer_metal (LayerSpec) – Layer for the metal pads.

  • layer_etch (LayerSpec) – Layer for the etched bounding box.

Returns:

A gdsfactory component with the transmon geometry and etched box.

Return type:

Component

double_pad_transmon_with_bbox

double_pad_transmon_with_resonator#

qubits resonators transmons

qpdk.cells.double_pad_transmon_with_resonator(*, qubit='double_pad_transmon_with_bbox', resonator=functools.partial(<function resonator_quarter_wave>, start_with_bend=True, length=4000, meanders=6), resonator_meander_start=(-900, -1200), resonator_length=5000.0, resonator_meanders=5, resonator_bend_spec='bend_circular', resonator_cross_section='cpw', resonator_open_start=False, resonator_open_end=True, coupler=functools.partial(<function plate_capacitor_single>, width=20, length=394), qubit_rotation=90, coupler_port='left_pad', coupler_offset=(-45, 0))#

Returns a transmon qubit coupled to a quarter wave resonator.

Parameters:
  • qubit (ComponentSpec) – Qubit component.

  • resonator (ComponentSpec) – Resonator component.

  • resonator_meander_start (tuple[float, float]) – (x, y) position of the start of the resonator meander.

  • resonator_length (float) – Length of the resonator in µm.

  • resonator_meanders (int) – Number of meander sections for the resonator.

  • resonator_bend_spec (ComponentSpec) – Specification for the bend component used in meanders.

  • resonator_cross_section (CrossSectionSpec) – Cross-section specification for the resonator.

  • resonator_open_start (bool) – If True, adds an etch section at the start of the resonator.

  • resonator_open_end (bool) – If True, adds an etch section at the end of the resonator.

  • coupler (ComponentSpec) – Coupler spec.

  • qubit_rotation (float) – Rotation angle for the qubit in degrees.

  • coupler_port (str) – Name of the qubit port to position the coupler relative to.

  • coupler_offset (tuple[float, float]) – (x, y) offset for the coupler position.

Return type:

Component

double_pad_transmon_with_resonator

double_pad_transmon_with_resonator_and_probeline#

couplers qubits resonators transmons

qpdk.cells.double_pad_transmon_with_resonator_and_probeline(*, qubit='double_pad_transmon_with_bbox', resonator=functools.partial(<function resonator_quarter_wave>, start_with_bend=True, length=4000, meanders=6), resonator_meander_start=(-900, -1200), resonator_length=5000.0, resonator_meanders=5, resonator_bend_spec='bend_circular', resonator_cross_section='cpw', resonator_open_start=False, resonator_open_end=True, coupler=functools.partial(<function plate_capacitor_single>, width=20, length=394), qubit_rotation=90, coupler_port='left_pad', coupler_offset=(-45, 0), probeline_coupler=<function coupler_straight>, probeline_coupling_gap=16.0, probeline_coupling_length=None)#

Returns a transmon qubit coupled to a quarter wave resonator and a probeline.

Uses a coupler_straight() to couple the resonator to a probeline. The coupling section is inserted at the start of the resonator meander, with one waveguide carrying the resonator signal and the other providing ports for probeline routing.

Parameters:
  • qubit (ComponentSpec) – Qubit component.

  • resonator (ComponentSpec) – Resonator component.

  • resonator_meander_start (tuple[float, float]) – (x, y) position of the start of the resonator meander.

  • resonator_length (float) – Length of the resonator in µm.

  • resonator_meanders (int) – Number of meander sections for the resonator.

  • resonator_bend_spec (ComponentSpec) – Specification for the bend component used in meanders.

  • resonator_cross_section (CrossSectionSpec) – Cross-section specification for the resonator.

  • resonator_open_start (bool) – If True, adds an etch section at the start of the resonator.

  • resonator_open_end (bool) – If True, adds an etch section at the end of the resonator.

  • coupler (ComponentSpec) – Coupler spec.

  • qubit_rotation (float) – Rotation angle for the qubit in degrees.

  • coupler_port (str) – Name of the qubit port to position the coupler relative to.

  • coupler_offset (tuple[float, float]) – (x, y) offset for the coupler position.

  • probeline_coupler (ComponentSpec) – Component spec for the probeline coupling section.

  • probeline_coupling_gap (float) – Gap between the resonator and probeline waveguides in the coupling section in µm.

  • probeline_coupling_length (float | None) – Length of the coupling section in µm.

Return type:

Component

double_pad_transmon_with_resonator_and_probeline

flipmon#

flip-chip qubits transmons

qpdk.cells.flipmon(inner_circle_radius=60.0, outer_ring_radius=110.0, outer_ring_width=60.0, top_circle_radius=110.0, junction_spec=<function squid_junction_long>, junction_displacement=None, layer_metal=<LayerMapQPDK.M1_DRAW: 1>, layer_metal_top=<LayerMapQPDK.M2_DRAW: 3>, junction_position_rotation=0.0, bump_diameter=15.0)[source]#

Creates a circular transmon qubit with flipmon geometry.

A circular variant of the transmon qubit with another circle as the inner pad.

      .─────────.    ,─'  .─────.  '─.  ,'   ,'       '.   '. ;    ;    .─.    ;    :  outer ring ;    ;    │*│ XX :    :  (M1_DRAW) ;    ;    '─'    ;    :  '.   '.       ,'   ,'  inner pad    '─.  '─────'  ,─'   (M1_DRAW)       '─────────'                         * = bump (center)                        XX = junction       .─────────.    ,─'  .─────.  '─.  ,'   ,'       '.   '. ;    ;    .─.    ;    :  outer ring ;    ;    │*│ XX :    :  (M1_DRAW) ;    ;    '─'    ;    :  '.   '.       ,'   ,'  inner pad    '─.  '─────'  ,─'   (M1_DRAW)       '─────────'                         * = bump (center)                        XX = junction

See [LWJ+25, LZY+21] for details about the flipmon design.

Parameters:
  • inner_circle_radius (float) – Central radius of the inner circular capacitor pad in μm.

  • outer_ring_radius (float) – Central radius of the outer circular capacitor pad in μm.

  • outer_ring_width (float) – Width of the outer circular capacitor pad in μm.

  • top_circle_radius (float) – Central radius of the top circular capacitor pad in μm. There is no separate width as the filled circle is not a ring.

  • bump_diameter (float) – Diameter of the central indium bump in μm.

  • junction_spec (ComponentSpec) – Component specification for the Josephson junction component.

  • junction_displacement (DCplxTrans | float | None) – Optional complex transformation, or in-place rotation in degrees, to apply to the junction.

  • layer_metal (LayerSpec) – Layer for the metal pads.

  • layer_metal_top (LayerSpec) – Layer for the other metal layer pad for flip-chip.

  • junction_position_rotation (float) – Rotation in degrees about the ring center, relocating the junction around the ring.

Returns:

A gdsfactory component with the circular transmon geometry.

Return type:

Component

flipmon

flipmon_with_bbox#

flip-chip qubits transmons

qpdk.cells.flipmon_with_bbox(inner_circle_radius=60.0, outer_ring_radius=110.0, outer_ring_width=60.0, top_circle_radius=110.0, junction_spec=<function squid_junction_long>, junction_displacement=None, layer_metal=<LayerMapQPDK.M1_DRAW: 1>, layer_metal_top=<LayerMapQPDK.M2_DRAW: 3>, layer_etch=<LayerMapQPDK.M1_ETCH: 47>, layer_etch_top=<LayerMapQPDK.M2_ETCH: 48>, m1_etch_extension_gap=30.0, m2_etch_extension_gap=40.0, junction_position_rotation=0.0, bump_diameter=15.0)[source]#

Creates a circular transmon qubit with flipmon geometry and a circular etched bounding box.

See flipmon() for more details.

Parameters:
  • inner_circle_radius (float) – Central radius of the inner circular capacitor pad in μm.

  • outer_ring_radius (float) – Central radius of the outer circular capacitor pad in μm.

  • outer_ring_width (float) – Width of the outer circular capacitor pad in μm.

  • top_circle_radius (float) – Central radius of the top circular capacitor pad in μm.

  • bump_diameter (float) – Diameter of the central indium bump in μm.

  • junction_spec (ComponentSpec) – Component specification for the Josephson junction component.

  • junction_displacement (DCplxTrans | float | None) – Optional complex transformation, or in-place rotation in degrees, to apply to the junction.

  • layer_metal (LayerSpec) – Layer for the metal pads.

  • layer_metal_top (LayerSpec) – Layer for the other metal layer pad for flip-chip.

  • layer_etch (LayerSpec) – Layer for the M1 etched bounding box.

  • layer_etch_top (LayerSpec) – Layer for the M2 etched bounding box.

  • m1_etch_extension_gap (float) – Radius extension length for the M1 etch bounding box in μm.

  • m2_etch_extension_gap (float) – Radius extension length for the M2 etch bounding box in μm.

  • junction_position_rotation (float) – Rotation in degrees about the ring center, relocating the junction around the ring.

Returns:

A gdsfactory component with the flipmon geometry and etched box.

Return type:

Component

flipmon_with_bbox

flipmon_with_resonator#

qubits resonators transmons

qpdk.cells.flipmon_with_resonator(*, qubit='flipmon_with_bbox', resonator=functools.partial(<function resonator_quarter_wave>, start_with_bend=True, length=4000, meanders=6), resonator_meander_start=(-900, -1200), resonator_length=5000.0, resonator_meanders=5, resonator_bend_spec='bend_circular', resonator_cross_section='cpw', resonator_open_start=False, resonator_open_end=True, coupler=functools.partial(<function plate_capacitor_single>, width=10, length=58), qubit_rotation=-90, coupler_port='outer_ring_outside', coupler_offset=(-10, 0))#

Returns a transmon qubit coupled to a quarter wave resonator.

Parameters:
  • qubit (ComponentSpec) – Qubit component.

  • resonator (ComponentSpec) – Resonator component.

  • resonator_meander_start (tuple[float, float]) – (x, y) position of the start of the resonator meander.

  • resonator_length (float) – Length of the resonator in µm.

  • resonator_meanders (int) – Number of meander sections for the resonator.

  • resonator_bend_spec (ComponentSpec) – Specification for the bend component used in meanders.

  • resonator_cross_section (CrossSectionSpec) – Cross-section specification for the resonator.

  • resonator_open_start (bool) – If True, adds an etch section at the start of the resonator.

  • resonator_open_end (bool) – If True, adds an etch section at the end of the resonator.

  • coupler (ComponentSpec) – Coupler spec.

  • qubit_rotation (float) – Rotation angle for the qubit in degrees.

  • coupler_port (str) – Name of the qubit port to position the coupler relative to.

  • coupler_offset (tuple[float, float]) – (x, y) offset for the coupler position.

Return type:

Component

flipmon_with_resonator

flipmon_with_resonator_and_probeline#

couplers qubits resonators transmons

qpdk.cells.flipmon_with_resonator_and_probeline(*, qubit=functools.partial(<function flipmon_with_bbox>, junction_position_rotation=180), resonator=functools.partial(<function resonator_quarter_wave>, start_with_bend=True, length=4000, meanders=6), resonator_meander_start=(-900, -1200), resonator_length=5000.0, resonator_meanders=5, resonator_bend_spec='bend_circular', resonator_cross_section='cpw', resonator_open_start=False, resonator_open_end=True, coupler=functools.partial(<function plate_capacitor_single>, width=10, length=58), qubit_rotation=-90, coupler_port='outer_ring_outside', coupler_offset=(-10, 0), probeline_coupler=<function coupler_straight>, probeline_coupling_gap=16.0, probeline_coupling_length=None)#

Returns a transmon qubit coupled to a quarter wave resonator and a probeline.

Uses a coupler_straight() to couple the resonator to a probeline. The coupling section is inserted at the start of the resonator meander, with one waveguide carrying the resonator signal and the other providing ports for probeline routing.

Parameters:
  • qubit (ComponentSpec) – Qubit component.

  • resonator (ComponentSpec) – Resonator component.

  • resonator_meander_start (tuple[float, float]) – (x, y) position of the start of the resonator meander.

  • resonator_length (float) – Length of the resonator in µm.

  • resonator_meanders (int) – Number of meander sections for the resonator.

  • resonator_bend_spec (ComponentSpec) – Specification for the bend component used in meanders.

  • resonator_cross_section (CrossSectionSpec) – Cross-section specification for the resonator.

  • resonator_open_start (bool) – If True, adds an etch section at the start of the resonator.

  • resonator_open_end (bool) – If True, adds an etch section at the end of the resonator.

  • coupler (ComponentSpec) – Coupler spec.

  • qubit_rotation (float) – Rotation angle for the qubit in degrees.

  • coupler_port (str) – Name of the qubit port to position the coupler relative to.

  • coupler_offset (tuple[float, float]) – (x, y) offset for the coupler position.

  • probeline_coupler (ComponentSpec) – Component spec for the probeline coupling section.

  • probeline_coupling_gap (float) – Gap between the resonator and probeline waveguides in the coupling section in µm.

  • probeline_coupling_length (float | None) – Length of the coupling section in µm.

Return type:

Component

flipmon_with_resonator_and_probeline

transmon_with_resonator#

qubits resonators transmons

qpdk.cells.transmon_with_resonator(qubit='double_pad_transmon_with_bbox', resonator=functools.partial(<function resonator_quarter_wave>, start_with_bend=True, length=4000, meanders=6), resonator_meander_start=(-900, -1200), resonator_length=5000.0, resonator_meanders=5, resonator_bend_spec='bend_circular', resonator_cross_section='cpw', resonator_open_start=False, resonator_open_end=True, coupler=functools.partial(<function plate_capacitor_single>, width=20, length=394), qubit_rotation=90, coupler_port='left_pad', coupler_offset=(-45, 0))[source]#

Returns a transmon qubit coupled to a quarter wave resonator.

Parameters:
  • qubit (ComponentSpec) – Qubit component.

  • resonator (ComponentSpec) – Resonator component.

  • resonator_meander_start (tuple[float, float]) – (x, y) position of the start of the resonator meander.

  • resonator_length (float) – Length of the resonator in µm.

  • resonator_meanders (int) – Number of meander sections for the resonator.

  • resonator_bend_spec (ComponentSpec) – Specification for the bend component used in meanders.

  • resonator_cross_section (CrossSectionSpec) – Cross-section specification for the resonator.

  • resonator_open_start (bool) – If True, adds an etch section at the start of the resonator.

  • resonator_open_end (bool) – If True, adds an etch section at the end of the resonator.

  • coupler (ComponentSpec) – Coupler spec.

  • qubit_rotation (float) – Rotation angle for the qubit in degrees.

  • coupler_port (str) – Name of the qubit port to position the coupler relative to.

  • coupler_offset (tuple[float, float]) – (x, y) offset for the coupler position.

Return type:

Component

transmon_with_resonator

transmon_with_resonator_and_probeline#

couplers qubits resonators transmons

qpdk.cells.transmon_with_resonator_and_probeline(qubit='double_pad_transmon_with_bbox', resonator=functools.partial(<function resonator_quarter_wave>, start_with_bend=True, length=4000, meanders=6), resonator_meander_start=(-900, -1200), resonator_length=5000.0, resonator_meanders=5, resonator_bend_spec='bend_circular', resonator_cross_section='cpw', resonator_open_start=False, resonator_open_end=True, coupler=functools.partial(<function plate_capacitor_single>, width=20, length=394), qubit_rotation=90, coupler_port='left_pad', coupler_offset=(-45, 0), probeline_coupler=<function coupler_straight>, probeline_coupling_gap=16.0, probeline_coupling_length=None)[source]#

Returns a transmon qubit coupled to a quarter wave resonator and a probeline.

Uses a coupler_straight() to couple the resonator to a probeline. The coupling section is inserted at the start of the resonator meander, with one waveguide carrying the resonator signal and the other providing ports for probeline routing.

Parameters:
  • qubit (ComponentSpec) – Qubit component.

  • resonator (ComponentSpec) – Resonator component.

  • resonator_meander_start (tuple[float, float]) – (x, y) position of the start of the resonator meander.

  • resonator_length (float) – Length of the resonator in µm.

  • resonator_meanders (int) – Number of meander sections for the resonator.

  • resonator_bend_spec (ComponentSpec) – Specification for the bend component used in meanders.

  • resonator_cross_section (CrossSectionSpec) – Cross-section specification for the resonator.

  • resonator_open_start (bool) – If True, adds an etch section at the start of the resonator.

  • resonator_open_end (bool) – If True, adds an etch section at the end of the resonator.

  • coupler (ComponentSpec) – Coupler spec.

  • qubit_rotation (float) – Rotation angle for the qubit in degrees.

  • coupler_port (str) – Name of the qubit port to position the coupler relative to.

  • coupler_offset (tuple[float, float]) – (x, y) offset for the coupler position.

  • probeline_coupler (ComponentSpec) – Component spec for the probeline coupling section.

  • probeline_coupling_gap (float) – Gap between the resonator and probeline waveguides in the coupling section in µm.

  • probeline_coupling_length (float | None) – Length of the coupling section in µm.

Return type:

Component

transmon_with_resonator_and_probeline

xmon_transmon#

qubits transmons

qpdk.cells.xmon_transmon(arm_width=(30.0, 20.0, 30.0, 20.0), arm_lengths=(160.0, 120.0, 160.0, 120.0), gap_width=10.0, junction_spec=<function squid_junction>, junction_displacement=None, layer_metal=<LayerMapQPDK.M1_DRAW: 1>, layer_etch=<LayerMapQPDK.M1_ETCH: 47>)[source]#

Creates an Xmon style transmon qubit with cross-shaped geometry.

An Xmon transmon consists of a cross-shaped capacitor pad with four arms extending from a central region, connected by a Josephson junction at the center. The design provides better control over the coupling to readout resonators and neighboring qubits through the individual arm geometries.

         top_arm         ┌─────┐         │     │         │     │         │     │ ┌───────┘     └───────┐ │  left         right │ │  arm           arm  │ └───────┐     ┌───────┘         │     │         │     │         │     │ bottom_arm         └─────┘           /          x           \         junction          top_arm         ┌─────┐         │     │         │     │         │     │ ┌───────┘     └───────┐ │  left         right │ │  arm           arm  │ └───────┐     ┌───────┘         │     │         │     │         │     │ bottom_arm         └─────┘           /          x           \         junction

See [BKM+13] for details about the Xmon design.

Parameters:
  • arm_width (tuple[float, float, float, float]) – Tuple of (top, right, bottom, left) arm widths in μm.

  • arm_lengths (tuple[float, float, float, float]) – Tuple of (top, right, bottom, left) arm lengths in μm. Computed from center to end of each arm.

  • gap_width (float) – Width of the etched gap around arms in μm.

  • junction_spec (ComponentSpec) – Component specification for the Josephson junction component.

  • junction_displacement (DCplxTrans | float | None) – Optional complex transformation, or in-place rotation in degrees, to apply to the junction.

  • layer_metal (LayerSpec) – Layer for the metal pads.

  • layer_etch (LayerSpec) – Layer for the etched regions.

Returns:

A gdsfactory component with the Xmon transmon geometry.

Return type:

Component

xmon_transmon

Other Qubits#

fluxonium#

inductors qubits

qpdk.cells.fluxonium(pad_size=(250.0, 400.0), pad_gap=25.0, junction_spec=<function josephson_junction>, junction_displacement=None, junction_margin=1.0, inductor_n_turns=155, inductor_margin_x=1.0, inductor_cross_section=<function superinductor_cross_section>, connection_wire_width=2.0, layer_metal=<LayerMapQPDK.M1_DRAW: 1>, inductor='meander', inductor_array_spec=<function josephson_junction_array>)[source]#

Creates a fluxonium qubit with capacitor pads, Josephson junction, and superinductor.

+---------+           +---------+ |         |           |         | |         |           |         | |  pad1   |           |  pad2   | |         |           |         | |         |           |         | +----+----+           +----+----+      |                     |      |      JJ             |      +======XX=============+      |                     |      |      inductor       |      +---------------------+ +---------+           +---------+ |         |           |         | |         |           |         | |  pad1   |           |  pad2   | |         |           |         | |         |           |         | +----+----+           +----+----+      |                     |      |      JJ             |      +======XX=============+      |                     |      |      inductor       |      +---------------------+

See [MKGD09] and [NLS+19].

Parameters:
  • pad_size (tuple[float, float]) – (width, height) of each capacitor pad in µm.

  • pad_gap (float) – Gap between the two capacitor pads in µm.

  • junction_spec (ComponentSpec) – Component specification for the Josephson junction.

  • junction_displacement (DCplxTrans | None) – Optional transformation applied to the junction.

  • junction_margin (float) – Vertical margin between the junction and capacitor pads in µm.

  • inductor_n_turns (int) – Number of horizontal meander runs. Must be odd.

  • inductor_margin_x (float) – Horizontal margin for the inductor in µm.

  • inductor_cross_section (CrossSectionSpec) – Cross-section for the meander inductor.

  • connection_wire_width (float) – Width of the connecting wires in µm.

  • layer_metal (LayerSpec) – Layer for the metal pads and connection wires.

  • inductor (Literal['meander', 'array']) – Superinductor implementation. "meander" draws a kinetic-inductance meander. "array" draws a Josephson junction array from inductor_array_spec instead, as in [MKGD09].

  • inductor_array_spec (ComponentSpec) – Component specification for the junction array, used when inductor="array". Its port o1 must face west and o2 east, i.e. an even number of folds. The metal wires overlap half of the array’s lead_length (0.5 µm if it has none), so they never reach the end islands.

Returns:

The fluxonium component.

Raises:

ValueError – If inductor_n_turns is even, if pad_gap is too small, or if the junction array does not fit between the pads.

Return type:

Component

fluxonium

fluxonium_with_bbox#

inductors qubits

qpdk.cells.fluxonium_with_bbox(bbox_extension=200.0, pad_size=(250.0, 400.0), pad_gap=25.0, junction_spec=<function josephson_junction>, junction_displacement=None, junction_margin=1.0, inductor_n_turns=155, inductor_margin_x=1.0, inductor_cross_section=<function superinductor_cross_section>, connection_wire_width=2.0, layer_metal=<LayerMapQPDK.M1_DRAW: 1>, inductor='meander', inductor_array_spec=<function josephson_junction_array>)[source]#

Fluxonium with an etched bounding box.

Parameters:
  • bbox_extension (float) – Extension of the bounding box from the fluxonium edge in µm.

  • pad_size (tuple[float, float]) – (width, height) of each capacitor pad in µm.

  • pad_gap (float) – Gap between the two capacitor pads in µm.

  • junction_spec (ComponentSpec) – Component specification for the Josephson junction.

  • junction_displacement (DCplxTrans | None) – Optional transformation applied to the junction.

  • junction_margin (float) – Vertical margin between the junction and capacitor pads in µm.

  • inductor_n_turns (int) – Number of horizontal meander runs. Must be odd.

  • inductor_margin_x (float) – Horizontal margin for the inductor in µm.

  • inductor_cross_section (CrossSectionSpec) – Cross-section for the meander inductor.

  • connection_wire_width (float) – Width of the connecting wires in µm.

  • layer_metal (LayerSpec) – Layer for the metal pads and connection wires.

  • inductor (Literal['meander', 'array']) – Superinductor implementation. "meander" draws a kinetic-inductance meander. "array" draws a Josephson junction array from inductor_array_spec instead, as in [MKGD09].

  • inductor_array_spec (ComponentSpec) – Component specification for the junction array, used when inductor="array". Its port o1 must face west and o2 east, i.e. an even number of folds.

Returns:

The fluxonium component with a bounding box.

Return type:

Component

fluxonium_with_bbox

gatemon#

qubits

qpdk.cells.gatemon(island_size=(150.0, 150.0), pocket_gap=60.0, pocket_gap_top=40.0, electrode_size=(60.0, 60.0), electrode_spacing=100.0, lead_width=2.0, junction_length=1.0, junction_width=0.002, junction_offset=20.0, nanotube_contact_overlap=0.5, hbn_size=(80.0, 80.0), size_patch=(60.0, 50.0), electrode_offset=-40.0, gate_offset=100.0, gate_tip_width=16.0, gate_tip_gap=5.0, gate_length=50.0, gate_cross_section='cpw', layer_metal=<LayerMapQPDK.M1_DRAW: 1>, layer_etch=<LayerMapQPDK.M1_ETCH: 47>)[source]#

Create a gatemon with contact pads, rectangular hBN and a boxy top gate.

The upper Nb/Au pad overlaps the island and its lower counterpart overlaps ground. Thin contact stems approach each other beneath the island’s left half, then branch right to the nanotube. The top gate has a rectangular tip over the weak link and a right-angle elbow onto exposed M1. A rectangular hBN footprint encloses the tube and insulates every gate/contact overlap. Al reconnection pads overlap the Nb/Au and M1 pads.

The contact proportions follow Fig. 1b of [RAP+25], with idealized rectangular hBN and gate geometry. Register the actual flake and nanotube positions before fabrication. CNT is a native GDS placement path of nominal width, with overlap onto both contacts. The weak link belongs in the circuit model and is excluded from the PEC extrusions in qpdk.tech.LAYER_STACK_GATEMON.

Parameters:
  • island_size (tuple[float, float]) – Island (width, height) in µm.

  • pocket_gap (float) – Gap between the island and the pocket side walls in µm.

  • pocket_gap_top (float) – Gap from the island to the readout side of the pocket in µm.

  • electrode_size (tuple[float, float]) – Nb/Au landing-pad (width, height) in µm.

  • electrode_spacing (float) – Gap between the two landing pads in µm.

  • lead_width (float) – Width of the Nb/Au stems and contact branches in µm.

  • junction_length (float) – Gap between the contact tips in µm.

  • junction_width (float) – Width of the nanotube placement trace in µm.

  • junction_offset (float) – Horizontal distance from the stems to the weak link in µm.

  • nanotube_contact_overlap (float) – Tube overlap onto each contact tip in µm.

  • hbn_size (tuple[float, float]) – Rectangular hBN footprint (width, height) in µm.

  • size_patch (tuple[float, float]) – Al contact-reconnection pad (width, height) in µm.

  • electrode_offset (float) – Horizontal position of the contact stems relative to the island.

  • gate_offset (float) – Horizontal distance from the stems to the M1 gate feed in µm.

  • gate_tip_width (float) – Width of the top-gate tip and neck in µm.

  • gate_tip_gap (float) – Lateral clearance from hBN to the M1 gate landing in µm.

  • gate_length (float) – M1 gate-feed length beyond the pocket in µm.

  • gate_cross_section (CrossSectionSpec) – Cross-section of the gate feed at the cell boundary.

  • layer_metal (LayerSpec) – Layer for M1 metal.

  • layer_etch (LayerSpec) – Layer for the etched pocket.

Returns:

Gatemon with readout, gate and junction placement ports.

Raises:

ValueError – If dimensions are invalid, pads or gate leave the pocket, the nanotube is exposed, or a gate/contact overlap lacks hBN.

Return type:

Component

gatemon

unimon#

qubits

qpdk.cells.unimon(arm_length=3000.0, arm_meanders=6, bend_spec=<function bend_circular>, cross_section='cpw', junction_spec=functools.partial(<function squid_junction>, junction_spec=functools.partial(<function josephson_junction>, junction_overlap_displacement=1.8, wide_straight_length=4.0, narrow_straight_length=0.5, taper_length=4)), junction_gap=10.0, junction_etch_width=22.0)[source]#

Creates a unimon qubit from two grounded \(\lambda/4\) CPW resonator arms connected by a SQUID junction.

The unimon is a superconducting qubit consisting of a single Josephson junction (or SQUID for flux tunability) embedded in the center of a two grounded \(\lambda/4\) CPW resonators, providing a large geometric inductance that, together with the Josephson nonlinearity, yields high anharmonicity and resilience to charge noise.

o1 (shorted to ground) ┌── │     :math:`\lambda/4` └─┐    resonator arm   │    (meandered) ┌─┘ │ └X┐  junction (SQUID)   │ ┌─┘ │     :math:`\lambda/4` └─┐   resonator arm   │   (meandered) ──┘ o2 (shorted to ground) o1 (shorted to ground) ┌── │     :math:`\lambda/4` └─┐    resonator arm   │    (meandered) ┌─┘ │ └X┐  junction (SQUID)   │ ┌─┘ │     :math:`\lambda/4` └─┐   resonator arm   │   (meandered) ──┘ o2 (shorted to ground)

See [HKC+22, TVT+24] for details.

Parameters:
  • arm_length (float) – Length of each \(\lambda/4\) resonator arm in µm.

  • arm_meanders (int) – Number of meander sections in each arm.

  • bend_spec (ComponentSpec) – Specification for the bend component used in meanders.

  • cross_section (CrossSectionSpec) – Cross-section specification for the resonator arms.

  • junction_spec (ComponentSpec) – Component specification for the junction (SQUID) component.

  • junction_gap (float) – Length of the etched gap on which the junction sits in µm.

  • junction_etch_width (float) – Width of the etched region where the junction sits in µm.

Returns:

A gdsfactory component with the unimon qubit geometry.

Return type:

Component

unimon

unimon_arm#

qubits resonators

qpdk.cells.unimon_arm(arm_length=3000.0, arm_meanders=6, bend_spec=<function bend_circular>, cross_section='cpw', junction_gap=6.0)[source]#

Creates a quarter-wave resonator arm for the unimon qubit.

Parameters:
  • arm_length (float) – Length of the resonator arm in µm.

  • arm_meanders (int) – Number of meanders in the arm.

  • bend_spec (ComponentSpec) – Specification for the bend component.

  • cross_section (CrossSectionSpec) – Cross-section specification for the arm.

  • junction_gap (float) – Gap for the junction in µm.

Returns:

The quarter-wave resonator arm component.

Return type:

Component

unimon_arm

unimon_coupled#

couplers qubits

qpdk.cells.unimon_coupled(arm_length=3000.0, arm_meanders=6, bend_spec=<function bend_circular>, cross_section='cpw', junction_spec=functools.partial(<function squid_junction>, junction_spec=functools.partial(<function josephson_junction>, junction_overlap_displacement=1.8, wide_straight_length=4.0, narrow_straight_length=0.5, taper_length=4)), junction_gap=6.0, junction_etch_width=22.0, coupling_gap=30.0, coupling_angle=180.0, coupling_extension_length=50.0, cross_section_non_resonator='cpw')[source]#

Creates a unimon qubit with a half-circle coupling waveguide for readout.

This component combines a unimon() qubit with a half-circle coupler placed at a specified gap for proximity coupling to a readout resonator.

o1 (shorted to ground) ┌── │ └─┐   │ ┌─┘ │ ─┐ └X┐│   │+-- coupling_o3 ┌─┘│ │ ─┘ └─┐   │ ──┘ o2 (shorted to ground) o1 (shorted to ground) ┌── │ └─┐   │ ┌─┘ │ ─┐ └X┐│   │+-- coupling_o3 ┌─┘│ │ ─┘ └─┐   │ ──┘ o2 (shorted to ground)
Parameters:
  • arm_length (float) – Length of each \(\lambda/4\) resonator arm in µm.

  • arm_meanders (int) – Number of meander sections in each arm.

  • bend_spec (ComponentSpec) – Specification for the bend component used in meanders.

  • cross_section (CrossSectionSpec) – Cross-section specification for the resonator arms.

  • junction_spec (ComponentSpec) – Component specification for the junction (SQUID) component.

  • junction_gap (float) – Length of the etched gap on which the junction sits in µm.

  • junction_etch_width (float) – Width of the etched region where the junction sits in µm.

  • coupling_gap (float) – Edge-to-edge gap between M1_DRAW centre conductors of the unimon resonator and the coupling waveguide in µm. The coupling radius is automatically computed as meander_radius + coupling_gap + width_resonator/2 + width_coupler/2 to ensure a uniform gap across the bend.

  • coupling_angle (float) – Angle of the circular arc in degrees.

  • coupling_extension_length (float) – Length of the straight sections extending from the ends of the half-circle in μm.

  • cross_section_non_resonator (CrossSectionSpec) – Cross-section for the coupling waveguide.

Returns:

A gdsfactory component with the unimon and half-circle coupler.

Return type:

Component

unimon_coupled

Resonators#

cpw_jpa#

junctions resonators

qpdk.cells.cpw_jpa(length=4680.0, meanders=6, bend_spec=<function bend_circular>, cross_section='cpw', coupling_capacitor_spec=functools.partial(<function interdigital_capacitor>, fingers=8, finger_length=50.0), termination_spec=<function squid_termination>, pump_length=200.0, pump_gap=2.0, pump_offset=20.0)[source]#

Flux-driven \(\lambda/4\) CPW Josephson parametric amplifier.

The signal port o1 couples through coupling_capacitor_spec into a meandered \(\lambda/4\) resonator. The resonator ends in termination_spec, which shorts it to ground through a DC SQUID. The pump line o2 is a shorted CPW that runs perpendicular to the resonator, past the ground side of the SQUID, as in the WMI devices of [PFZ+17]. Only a pump_gap wide strip of ground plane separates the pump slot from the ground-side SQUID contacts, and the short sits pump_offset beyond the SQUID. The pump current and its return through that strip couple to the SQUID loop through a mutual inductance \(M\) [LIK+14, YIW+08]. The pump-to-loop distance is not reported in these sources, so pump_gap and pump_offset are design variables. The SAX models do not include \(M\); it has to be extracted by EM simulation. The static flux bias comes from an off-chip coil.

With the SQUID inductance \(L_\text{s}\) the resonance is [YIW+08]:

\[\omega_\text{r}(\Phi) \approx \frac{\omega_{\lambda/4}}{1 + L_\text{s}(\Phi) / L_\text{r}}, \qquad L_\text{s}(\Phi) = \frac{\Phi_0}{2 \pi I_\text{c,tot} |\cos(\pi \Phi / \Phi_0)|},\]

where \(L_\text{r}\) is the total inductance of the \(\lambda/4\) line. The default coupling capacitor is about \(28\,\text{fF}\), close to the \(30\,\text{fF}\) of the WMI devices with \(Q_\text{ext} \approx 300\) [PFZ+17]. With the default \(I_\text{c,tot} = 4.8\,\text{µA}\) of squid_termination(), the SAX model of the default layout resonates at \(6.07\,\text{GHz}\) at zero flux and \(5.93\,\text{GHz}\) at \(0.3\,\Phi_0\), with \(Q_\text{ext} \approx 290\).

             ┌──────────────┐              │  meander     │ o1 ──║║──────┘  λ/4 line    │     Cc                      │              ┌──────────────┘   ┬ pump short              └──────── X  ║ │                           ║ │                           ║ │                             o2              ┌──────────────┐              │  meander     │ o1 ──║║──────┘  λ/4 line    │     Cc                      │              ┌──────────────┘   ┬ pump short              └──────── X  ║ │                           ║ │                           ║ │                             o2
Parameters:
  • length (float) – Realized \(\lambda/4\) line length in µm, from the coupling capacitor to the SQUID pocket. Includes the termination’s CPW lead.

  • meanders (int) – Number of meander sections.

  • bend_spec (ComponentSpec) – Specification for the meander bends.

  • cross_section (CrossSectionSpec) – Cross-section of the resonator, the pump line, the coupling capacitor and the termination lead.

  • coupling_capacitor_spec (ComponentSpec) – Two-port coupling capacitor between o1 and the open end of the resonator.

  • termination_spec (ComponentSpec) – One-port SQUID termination, see squid_termination(). It must provide a squid port and the length, pocket_width and loop_area info entries.

  • pump_length (float) – Length of the pump CPW line in µm.

  • pump_gap (float) – Width in µm of the ground-plane strip between the ground-side SQUID contacts and the pump line slot.

  • pump_offset (float) – Distance in µm from the SQUID centre to the pump short, along the pump line, so the pump runs past the whole SQUID.

Returns:

The JPA with signal port o1 and pump port o2.

Return type:

Component

Raises:

ValueError – If length does not exceed the termination lead length.

cpw_jpa

drum_lc_resonator#

capacitors couplers inductors resonators

qpdk.cells.drum_lc_resonator(radius=7.5, support='rim', n_turns=75, turn_length=300.0, inductor_cross_section='meander_inductor_cross_section', coupling_gap=6.0, coupling_pad_size=20.0, margin=10.0, cross_section='cpw')[source]#

Creates a drum LC resonator side-coupled to a CPW feedline.

A meander inductor is shunted to ground by a vacuum_gap_capacitor() at its open end, forming the mechanically compliant LC circuit of [PDamskaggB+15]. The resonator couples capacitively to the feedline through a pad at coupling_gap from the centre conductor, after the capacitively coupled drum cavities of [OKDamskaggP+16]. The bottom electrode is the hot node and the membrane is grounded through the drum ring.

o1 =================================== o2  feedline                    [pad]          +------------+--+          |  meander   L  +--(drum)--GND          +------------+          GND o1 =================================== o2  feedline                    [pad]          +------------+--+          |  meander   L  +--(drum)--GND          +------------+          GND

The etched window sits below the feedline’s lower ground plane, which is kept intact except for a notch around the pad. The notch leaves coupling_gap of clearance to the ground on the sides of the pad.

The resonance is \(\omega_\text{r} = 1/\sqrt{L (C_\text{d} + C_\text{p} + C_\text{c})}\) in the lumped model, see qpdk.models.drum.drum_lc_resonator(), which also lists what that model leaves out. The default meander is about 23 mm of wire, a substantial fraction of a guided wavelength near 7 GHz on silicon, so this layout is not a lumped inductor there and its real resonances differ from that model. Simulate the layout before relying on its frequency.

Parameters:
  • radius (float) – Drum bottom-electrode radius in µm.

  • support (Literal['rim', 'legs']) – How the drum membrane is held, "rim" or "legs".

  • n_turns (int) – Number of meander inductor runs. Must be odd. The default gives about 14 nH, the inductance of [PDamskaggB+15].

  • turn_length (float) – Length of each meander run in µm.

  • inductor_cross_section (CrossSectionSpec) – Cross-section of the meander wire, the drum leads and the internal wiring.

  • coupling_gap (float) – Gap between the coupling pad and the feedline centre conductor in µm.

  • coupling_pad_size (float) – Side length of the square coupling pad in µm.

  • margin (float) – Spacing in µm between the pad, inductor, drum and the edge of the etched window.

  • cross_section (CrossSectionSpec) – Cross-section of the feedline.

Returns:

The resonator with feedline ports o1 and o2.

Return type:

Component

Raises:

ValueError – If n_turns is even or a spacing is not positive.

drum_lc_resonator

esr_lc_resonator#

capacitors inductors resonators

qpdk.cells.esr_lc_resonator(wire_width=5.0, wire_length=730.0, fingers=12, finger_length=800.0, finger_gap=50.0, finger_thickness=50.0, coupling_gap=50.0, ground_gap=50.0, feedline_length=2000.0, cross_section='cpw')[source]#

Planar LC resonator for inductive-detection electron spin resonance.

A floating interdigital_capacitor() whose two electrodes are bridged by a short, narrow wire that forms the inductance. The microwave magnetic field is concentrated around the wire, where the spins sit [BPK+16, RPA+20].

The capacitor is rotated so that its bus bars run parallel to a CPW feedline. The upper bus bar sits coupling_gap below the feedline centre conductor and couples to it capacitively. Both bus bars extend to the right past the last finger to a rail, one finger_gap away, that joins them: a lead as wide as a finger runs from each bus bar towards the middle of the rail, and the wire spans the remaining wire_length between the two leads. Neither electrode touches the ground plane, so the resonator couples to ground only through its stray capacitances:

o1 ─────────────────────────────────── o2   feedline      ┌─────────────────────────┐      │ ┌──┐ ┌──┐ ┌──┐ ┌──┐  ┌──┤      │ │  │ │  │ │  │ │  │  │  │ lead      │ │  │ │  │ │  │ │  │  │  │      │ │  │ │  │ │  │ │  │  └┐┌┘      │ │  │ │  │ │  │ │  │   ││  wire      │ │  │ │  │ │  │ │  │  ┌┘└┐      │ │  └─┘  └─┘  └─┘  │  │  │ lead      └─┴─────────────────┴──┴──┘ ─────────────────────────────────────── ground o1 ─────────────────────────────────── o2   feedline      ┌─────────────────────────┐      │ ┌──┐ ┌──┐ ┌──┐ ┌──┐  ┌──┤      │ │  │ │  │ │  │ │  │  │  │ lead      │ │  │ │  │ │  │ │  │  │  │      │ │  │ │  │ │  │ │  │  └┐┌┘      │ │  │ │  │ │  │ │  │   ││  wire      │ │  │ │  │ │  │ │  │  ┌┘└┐      │ │  └─┘  └─┘  └─┘  │  │  │ lead      └─┴─────────────────┴──┴──┘ ─────────────────────────────────────── ground

As in [RPA+20], the wire sits midway between the two electrodes. Both references float the resonator in a 3D cavity and drive it with antennas; here it is coupled to an on-chip CPW instead.

info["wire_squares"] is wire_length / wire_width. info["mode_volume"] is qpdk.models.esr.esr_mode_volume() in µm³ (1 µm³ = 1 fL), evaluated with the geometric inductance of the wire alone for a ESR_FILM_THICKNESS film. That counts only the field energy of the wire, so the stray inductance of the leads and the capacitor electrodes is excluded. The matching SAX model is qpdk.models.esr_lc_resonator().

Parameters:
  • wire_width (float) – Wire width in µm, between 0.1 and 5.

  • wire_length (float) – Wire length in µm, at most finger_length + finger_gap, the span between the bus bars.

  • fingers (int) – Number of capacitor fingers (at least 2).

  • finger_length (float) – Length of each capacitor finger in µm.

  • finger_gap (float) – Gap between adjacent capacitor fingers, and between the last finger and the rail, in µm.

  • finger_thickness (float) – Width of each capacitor finger, of the bus bars and of the leads in µm.

  • coupling_gap (float) – Gap between the feedline centre conductor and the upper bus bar in µm.

  • ground_gap (float) – Gap between the resonator and the surrounding ground plane in µm.

  • feedline_length (float) – Length of the feedline in µm.

  • cross_section (CrossSectionSpec) – Cross-section of the feedline.

Returns:

Component with feedline ports o1 and o2.

Raises:

ValueError – If the wire width is out of range, fingers is below 2, a length is not positive, the wire is wider than a lead or longer than the span between the bus bars, the bus-bar length is off the 2 nm grid, or the feedline is shorter than the etch window.

Return type:

Component

esr_lc_resonator

hyperbolic_edge_resonator#

resonators

qpdk.cells.hyperbolic_edge_resonator(length=4000.0, end=(1000.0, 0.0), start_angle=0.0, end_angle=0.0, region=None, bend_radius=30.0, margin=25.0, end_straight=70.0, cross_section='cpw')[source]#

Return a meandered CPW resonator of exact length between two points.

The resonator starts at port o1 at the origin travelling along start_angle and ends at port o2 at end travelling along end_angle, so both ends can meet couplers at arbitrary angles. In between it meanders with legs perpendicular to the line between its two end straights, 2 bend_radius apart and joined by U-turns as in resonator(), alternating sides and staying at least margin from the edges of the convex region. The leg height is solved so the centreline length equals length; info["length"] holds the extruded length.

Both ends are left as plain CPW ends: in hyperbolic_lattice() they connect galvanically to coupler pins, which set the open-end boundary condition.

Parameters:
  • length (float) – Centreline length in µm.

  • end (tuple[float, float]) – Position of o2 relative to o1 in µm.

  • start_angle (float) – Travel direction at o1 in degrees.

  • end_angle (float) – Travel direction at o2 in degrees.

  • region (Sequence[tuple[float, float]] | None) – Convex polygon the meander must stay inside, relative to o1. Defaults to a square with o1 and end on a diagonal.

  • bend_radius (float) – Radius of the meander bends in µm; the legs are twice this apart.

  • margin (float) – Minimum distance from the centreline to the region edge in µm.

  • end_straight (float) – Straight run at each end before the first bend in µm.

  • cross_section (CrossSectionSpec) – CPW cross-section.

Returns:

Component with ports o1 and o2.

Raises:

ValueError – If region cannot hold a resonator of this length.

Return type:

Component

hyperbolic_edge_resonator

hyperbolic_lattice#

chips lattices resonators

qpdk.cells.hyperbolic_lattice(p=7, q=3, shells=1, disk_radius=6000.0, resonator_length=7500.0, stub_length=400.0, probe_pins=(11, 0), pin_radius=40.0, pin_gap=4.0, ground_gap=6.0, lead_length=20.0, bend_radius=30.0, margin=25.0, boundary_apex=0.6, feed_length=1000.0, cross_section='cpw')[source]#

Return a Kollár-type hyperbolic lattice of CPW edge resonators.

Every edge of the {p,q} tiling from qpdk.hyperbolic.hyperbolic_tiling() carries a hyperbolic_edge_resonator() and every vertex a hyperbolic_vertex_coupler() [KollarFH19]. The line between two pin rims is resonator_length long, so the couplers’ leads count towards it. In full-wave operation the lattice realises line-graph tight binding with \(t < 0\) and a flat band at \(\omega_0 - 2|t|\); for \(q > 3\) only approximately, since the coupler disk couples only neighbouring pins.

Free coupler pins on the boundary get a shorted CPW stub of stub_length (a \(\lambda/4\) resonator far above the band), so boundary resonators see the same end loading as interior ones. The free pins listed in probe_pins instead route to launchers, exposed as ports o1, o2, … in that order.

Each resonator meanders inside the quadrilateral of its two vertices and the centroids of the two adjacent faces. A boundary edge has only one face; its outer apex is that centroid mirrored across the edge and pulled in by boundary_apex and clipped to the bisector with each neighbouring boundary edge.

The defaults fit {7,3} and {5,4} with one shell. More shells or larger p need a larger disk_radius (two shells of {7,3} fit at 12000 µm), and the default probe_pins need at least 12 free pins.

Simulate the lattice with qpdk.models.hyperbolic.hyperbolic_lattice(); a SAX circuit built from the netlist is too large to compile.

Parameters:
  • p (int) – Polygon side count of the tiling.

  • q (int) – Polygons per vertex, i.e. coupler pins.

  • shells (int) – Polygon rings around the central polygon.

  • disk_radius (float) – Radius of the Poincaré disk on the chip in µm.

  • resonator_length (float) – Pin-rim to pin-rim length of each edge resonator in µm.

  • stub_length (float) – Pin-rim to short length of each boundary stub in µm.

  • probe_pins (Sequence[int]) – Indices into qpdk.hyperbolic.HyperbolicTiling.free_pins routed to launchers.

  • pin_radius (float) – Coupler disk radius in µm.

  • pin_gap (float) – Coupler radial gap in µm.

  • ground_gap (float) – Coupler ground clearance in µm.

  • lead_length (float) – Coupler lead length in µm.

  • bend_radius (float) – Meander bend radius in µm; the legs are twice this apart.

  • margin (float) – Minimum distance from a resonator centreline to its region edge in µm.

  • boundary_apex (float) – Scale of the mirrored outer apex of boundary edges.

  • feed_length (float) – Straight run from a probe pin before turning to its launcher in µm.

  • cross_section (CrossSectionSpec) – CPW cross-section.

Returns:

Component with one port per probe pin.

Raises:

ValueError – If probe_pins is invalid or a resonator does not fit.

Return type:

Component

hyperbolic_lattice

lumped_element_resonator#

capacitors inductors resonators

qpdk.cells.lumped_element_resonator(fingers=20, finger_length=20.0, finger_gap=2.0, finger_thickness=5.0, n_turns=15, bus_bar_spacing=4.0, cross_section=<function meander_inductor_cross_section>, etch_bbox_margin=2.0)[source]#

Creates a lumped-element resonator combining an interdigital capacitor and a meander inductor.

The resonator consists of an interdigital capacitor section (providing capacitance) connected in parallel with a meander inductor section (providing inductance) via shared bus bars. The resonance frequency is:

\[f_\text{r} = \frac{1}{2\pi\sqrt{LC}}\]
+-----------+ | Capacitor | o1 --+   (IDC)   +-- o2 |           | | Inductor  | | (Meander) | +-----------+ +-----------+ | Capacitor | o1 --+   (IDC)   +-- o2 |           | | Inductor  | | (Meander) | +-----------+

Similar structures are described in [CSD+23, KVH+11].

Parameters:
  • fingers (int) – Number of interdigital capacitor fingers.

  • finger_length (float) – Length of each capacitor finger in µm.

  • finger_gap (float) – Gap between adjacent capacitor fingers in µm.

  • finger_thickness (float) – Width of each capacitor finger and bus bar in µm.

  • n_turns (int) – Number of horizontal meander inductor runs.

  • bus_bar_spacing (float) – Vertical spacing between the capacitor and inductor sections in µm.

  • cross_section (CrossSectionSpec) – Cross-section specification for the inductor and ports.

  • etch_bbox_margin (float) – Margin around the structure for the etch region in µm.

Returns:

A gdsfactory component with the lumped-element resonator

geometry and two ports (‘o1’ and ‘o2’).

Return type:

Component

Raises:

ValueError – If n_turns is even, bus_bar_spacing <= 0, or if the resultant meander run length is non-positive.

lumped_element_resonator

nanowire_resonator#

inductors resonators

qpdk.cells.nanowire_resonator(wire_width=0.1, wire_length=40.0, n_turns=1, wire_gap=None, lead_length=None, corner_style='sharp', radius=None, pad_width=300.0, pad_height=150.0, pad_ground_gap=50.0, coupling_gap=4.0, contact_overlap=2.0, feedline_length=500.0, cross_section='cpw', wire_layer=<LayerMapQPDK.NbTiN: 18>)[source]#

Creates a lumped resonator from a high-kinetic-inductance nanowire.

A nanowire on wire_layer joins two capacitor pads. The upper pad sits coupling_gap below the centre conductor of a CPW feedline and couples to it capacitively. The lower pad is tied to the ground plane along its bottom edge, so the resonator is a parallel LC to ground, shunt-coupled to the feedline:

o1 ────────────────────────────── o2   feedline      ┌──────────────────────┐      │       pad (C)        │      └──────────┬───────────┘                 │  nanowire (L)      ┌──────────┴───────────┐      │     ground pad       │ ─────┘                      └─────   ground o1 ────────────────────────────── o2   feedline      ┌──────────────────────┐      │       pad (C)        │      └──────────┬───────────┘                 │  nanowire (L)      ┌──────────┴───────────┐      │     ground pad       │ ─────┘                      └─────   ground

The wire is straight for n_turns=1, or a meander_inductor() with vertical runs of length wire_length otherwise, so n_turns must be odd for the wire to end on the opposite pad. The meander sits lead_length away from both pads and joins each pad through one straight lead from its end run, so the wire contacts each pad once and the U-turns stay clear of the metal. info["n_squares"] is the drawn square count between the pad edges: qpdk.tech.meander_n_squares_drawn() for the meander plus lead_length / wire_width for each lead. The contact_overlap stubs under the pads are not counted.

Design references for the nanowire geometry and its kinetic inductance are [JCL+22, MGK+18]. The matching SAX model is qpdk.models.nanowire_resonator().

Parameters:
  • wire_width (float) – Nanowire width in µm, between 0.05 and 1.

  • wire_length (float) – Length of each nanowire run in µm. The gap between the pads is wire_length + 2 * lead_length.

  • n_turns (int) – Number of nanowire runs (odd). 1 gives a straight wire.

  • wire_gap (float | None) – Gap between adjacent runs in µm. Defaults to wire_width.

  • lead_length (float | None) – Length of the straight leads between the meander and each pad in µm, which is also the clearance between the U-turns and the pads. Defaults to wire_gap.

  • corner_style (Literal['sharp', 'chamfer', 'round', 'optimal']) – Corner style of a meandered wire, see meander_inductor().

  • radius (float | None) – Centreline radius for "round" corners in µm.

  • pad_width (float) – Pad size along the feedline in µm.

  • pad_height (float) – Pad size across the feedline in µm.

  • pad_ground_gap (float) – Gap between the pads and the ground plane at the sides in µm.

  • coupling_gap (float) – Gap between the feedline centre conductor and the upper pad in µm.

  • contact_overlap (float) – Length of the nanowire stubs that overlap the pads in µm.

  • feedline_length (float) – Length of the feedline in µm.

  • cross_section (CrossSectionSpec) – Cross-section of the feedline.

  • wire_layer (LayerSpec) – Layer of the nanowire.

Returns:

Component with feedline ports o1 and o2.

Raises:

ValueError – If the wire width is out of range, n_turns is even or not positive, a length is not positive, or the wire does not fit between the pads or the feedline is too short.

Return type:

Component

nanowire_resonator

neck_termination#

resonators waveguides

qpdk.cells.neck_termination(cross_section='cpw', taper_length=100.0, taper_shape='linear', neck_width=2.0, neck_length=325.0, window_width=380.0, trap_hole_rows=4, trap_hole_size=4.0, trap_hole_pitch=5.5, trap_hole_offset=6.0, trap_hole_keepout=24.0)[source]#

Shorted CPW termination through a taper and a narrow neck.

Geometry of the grounded end of the resonators in Shulga et al. [SNV+26]. The centre conductor tapers from the CPW width to neck_width and continues as a straight neck that joins the ground plane at the far edge of a rectangular etched window, so the neck is a strip in a ground opening rather than a CPW with a fixed gap. The ground plane around the window focuses the applied field unevenly onto the taper and neck, and the neck sits at the current antinode, so a single trapped vortex shifts the resonance by a measurable amount. An optional ring of square etched holes along the two long sides and the far end of the window traps vortices in the ground plane, with a hole-free column where the neck current enters the ground. The ring is left open at the port end, where the CPW enters. Holes in the rest of the ground plane are left to qpdk.utils.fill_magnetic_vortices().

The paper states the 325 µm neck length and the 1-10 µm neck widths: 1 µm showed single-vortex frequency steps, 5 µm did not, and a 2 µm neck stayed free of vortices after cooling in 113 µT. The taper length (about 100 µm) and the window size (about 380 µm by 425 µm) are estimated from its figures, and the paper does not describe the taper profile. In the paper vortices sit preferentially in the taper. Sharp corners crowd the current and lower the vortex-entry current [CB11]. The default linear taper only has shallow kinks at its ends (about 2° for the defaults), so the effect is small; taper_shape="smooth" removes them with a raised-cosine profile, which matters for short tapers.

The hole defaults follow the usual rules for flux-trap arrays: the superconducting web between holes (1.5 µm) is narrower than the neck, so the holes trap before the neck does [NP14], and the first row is 6 µm from the window edge. Chiaro et al. found that holes 6 µm or more from a CPW gap edge add no measurable dielectric loss [CMD+16]. The window sits near the voltage node of the resonator, so its edges see a weaker electric field than a CPW gap at the open end, and the same margin is conservative here. At the far end the ground return current crowds around the junction with the neck, so the hole-free column trap_hole_keepout must stay wider than the neck. For 1 µm necks use a narrower web (trap_hole_pitch - trap_hole_size); the cell logs a warning when the web is not narrower than the neck.

Thresholds from vortex_trapping_threshold() are field-cooled estimates for an isolated strip. They ignore the flux focusing of the nearby ground planes, which lowers the real threshold (the 8 µm bulge of [NP14] trapped at 42 µT against the 53 µT the formula gives), so use them to compare widths, not as absolute fields. Zero-field-cooled entry and microwave drive can trap vortices at much lower fields, and similar frequency jumps have been seen in resonators without a neck [KVK+26], so measure a resonator without a neck on the same chip as a control.

            ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫             ┌─────────────────────────┐ ▫ ▫             │ ─────┐                  │ ▫ ▫ o1 ─────────┤      ├──────────────────┤  (keepout)             │ ─────┘   neck           │ ▫ ▫             │ taper                   │ ▫ ▫             └─────────────────────────┘ ▫ ▫             ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫             ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫             ┌─────────────────────────┐ ▫ ▫             │ ─────┐                  │ ▫ ▫ o1 ─────────┤      ├──────────────────┤  (keepout)             │ ─────┘   neck           │ ▫ ▫             │ taper                   │ ▫ ▫             └─────────────────────────┘ ▫ ▫             ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫ ▫
Parameters:
  • cross_section (CrossSectionSpec) – CPW cross-section at port o1.

  • taper_length (float) – Length of the taper in µm.

  • taper_shape (Literal['linear', 'smooth']) – "linear" for a straight-sided taper, "smooth" for a raised-cosine width profile with no corners.

  • neck_width (float) – Width of the neck in µm.

  • neck_length (float) – Length of the neck in µm.

  • window_width (float) – Width of the etched window across the line in µm. The window length is taper_length + neck_length.

  • trap_hole_rows (int) – Number of rows in the ring of flux-trapping holes around the window. Zero disables the holes.

  • trap_hole_size (float) – Side of each square hole in µm.

  • trap_hole_pitch (float) – Centre-to-centre hole spacing in µm.

  • trap_hole_offset (float) – Width of the ground strip between the window and the first row of holes in µm.

  • trap_hole_keepout (float) – Minimum width of the hole-free column centred on the neck at the far end of the window in µm. The grid can make the column wider.

Returns:

Component with a single port o1.

Raises:

ValueError – If a dimension is out of range.

Return type:

Component

neck_termination

quarter_wave_resonator_coupled#

couplers resonators

qpdk.cells.quarter_wave_resonator_coupled(length=4000.0, meanders=6, bend_spec=<function bend_circular>, cross_section='cpw', *, start_with_bend=False, end_with_bend=False, cross_section_non_resonator='cpw', coupling_straight_length=200.0, coupling_gap=20.0)[source]#

Creates a quarter-wave resonator with a coupling waveguide.

Composes a straight coupler, the meander, and explicit open and short terminations. The meander starts at the coupler output so that the trace leaves the coupling gap at coupling_straight_length. Layouts with no usable first straight section retain the unsplit coupled-resonator cell.

The terminations are fixed: the coupled end is open and the far end is shorted. Use resonator_coupled() if other terminations are needed.

coupling_o1 ─────────────── coupling_o2              coupling_gap resonator_o1 ───────┐                     │ ┌───────────────────┘ │ └───────────────────┐                     │ ┌───────────────────┘ │ └──── (shorted, no port) coupling_o1 ─────────────── coupling_o2              coupling_gap resonator_o1 ───────┐                     │ ┌───────────────────┘ │ └───────────────────┐                     │ ┌───────────────────┘ │ └──── (shorted, no port)
Parameters:
  • length (float) – Length of the resonator in μm.

  • meanders (int) – Number of meander sections to fit the resonator in a compact area.

  • bend_spec (ComponentSpec) – Specification for the bend component used in meanders.

  • cross_section (CrossSectionSpec) – Cross-section specification for the resonator.

  • start_with_bend (bool) – If True, starts the resonator with a bend.

  • end_with_bend (bool) – If True, ends the resonator with a bend.

  • cross_section_non_resonator (CrossSectionSpec) – Cross-section specification for the coupling waveguide.

  • coupling_straight_length (float) – Length of the coupling waveguide section in μm.

  • coupling_gap (float) – Gap between the resonator and coupling waveguide in μm.

Returns:

The coupled quarter-wave resonator component.

Raises:

ValueError – If the requested length is too short for its meanders.

Return type:

Component

quarter_wave_resonator_coupled

resonator#

resonators

qpdk.cells.resonator(length=4000.0, meanders=6, bend_spec=<function bend_circular>, cross_section='cpw', *, start_with_bend=False, end_with_bend=False, open_start=True, open_end=False)[source]#

Creates a meandering coplanar waveguide resonator.

Changing open_start and open_end appropriately allows creating a shorted quarter-wave resonator or an open half-wave resonator.

o1 ─────┐         │ ┌───────┘ │ └───────┐         │ ┌───────┘ │ └────── o2 o1 ─────┐         │ ┌───────┘ │ └───────┐         │ ┌───────┘ │ └────── o2

See [MP12] for details

Parameters:
  • length (float) – Length of the resonator in μm.

  • meanders (int) – Number of meander sections to fit the resonator in a compact area.

  • bend_spec (ComponentSpec) – Specification for the bend component used in meanders.

  • cross_section (CrossSectionSpec) – Cross-section specification for the resonator.

  • start_with_bend (bool) – If True, starts the resonator with a bend.

  • end_with_bend (bool) – If True, ends the resonator with a bend.

  • open_start (bool) – If True, adds an etch section at the start of the resonator.

  • open_end (bool) – If True, adds an etch section at the end of the resonator.

Returns:

A gdsfactory component with meandering resonator geometry.

Return type:

Component

Raises:

ValueError – If length is too short for the requested meanders.

resonator

resonator_coupled#

couplers resonators

qpdk.cells.resonator_coupled(length=4000.0, meanders=6, bend_spec=<function bend_circular>, cross_section='cpw', *, start_with_bend=False, end_with_bend=False, open_start=True, open_end=False, cross_section_non_resonator='cpw', coupling_straight_length=200.0, coupling_gap=20.0)[source]#

Creates a meandering coplanar waveguide resonator with a coupling waveguide.

This component combines a resonator with a parallel coupling waveguide placed at a specified gap for proximity coupling. Similar to the design described in [BM18].

coupling_o1 ─────────────── coupling_o2              coupling_gap resonator_o1 ───────┐                     │ ┌───────────────────┘ │ └───────────────────┐                     │ ┌───────────────────┘ │ └──── resonator_o2 coupling_o1 ─────────────── coupling_o2              coupling_gap resonator_o1 ───────┐                     │ ┌───────────────────┘ │ └───────────────────┐                     │ ┌───────────────────┘ │ └──── resonator_o2
Parameters:
  • length (float) – Length of the resonator in μm.

  • meanders (int) – Number of meander sections to fit the resonator in a compact area.

  • bend_spec (ComponentSpec) – Specification for the bend component used in meanders.

  • cross_section (CrossSectionSpec) – Cross-section specification for the resonator.

  • start_with_bend (bool) – If True, starts the resonator with a bend.

  • end_with_bend (bool) – If True, ends the resonator with a bend.

  • open_start (bool) – If True, adds an etch section at the start of the resonator.

  • open_end (bool) – If True, adds an etch section at the end of the resonator.

  • cross_section_non_resonator (CrossSectionSpec) – Cross-section specification for the coupling waveguide.

  • coupling_straight_length (float) – Length of the coupling waveguide section in μm.

  • coupling_gap (float) – Gap between the resonator and coupling waveguide in μm. Measured from edges of the center conductors.

Returns:

A gdsfactory component with meandering resonator and coupling waveguide.

Return type:

Component

resonator_coupled

resonator_half_wave#

resonators

qpdk.cells.resonator_half_wave(length=4000.0, meanders=6, bend_spec=<function bend_circular>, cross_section='cpw', *, start_with_bend=False, end_with_bend=False, open_start=True, open_end=True)[source]#

Return a half-wave resonator with its schematic and model boundary.

Parameters:
  • length (float) – Total resonator length in µm.

  • meanders (int) – Number of meander bends.

  • bend_spec (ComponentSpec) – Component used for each bend.

  • cross_section (CrossSectionSpec) – Resonator cross section.

  • start_with_bend (bool) – Start the path with a bend.

  • end_with_bend (bool) – End the path with a bend.

  • open_start (bool) – Leave the start open instead of shorting it.

  • open_end (bool) – Leave the end open instead of shorting it.

Return type:

Component

resonator_half_wave

resonator_half_wave_bend_both#

resonators

qpdk.cells.resonator_half_wave_bend_both(length=4000.0, meanders=6, bend_spec=<function bend_circular>, cross_section='cpw', *, start_with_bend=True, end_with_bend=True, open_start=True, open_end=True)#

Return a half-wave resonator with its schematic and model boundary.

Parameters:
  • length (float) – Total resonator length in µm.

  • meanders (int) – Number of meander bends.

  • bend_spec (ComponentSpec) – Component used for each bend.

  • cross_section (CrossSectionSpec) – Resonator cross section.

  • start_with_bend (bool) – Start the path with a bend.

  • end_with_bend (bool) – End the path with a bend.

  • open_start (bool) – Leave the start open instead of shorting it.

  • open_end (bool) – Leave the end open instead of shorting it.

Return type:

Component

resonator_half_wave_bend_both

resonator_half_wave_bend_end#

resonators

qpdk.cells.resonator_half_wave_bend_end(length=4000.0, meanders=6, bend_spec=<function bend_circular>, cross_section='cpw', *, start_with_bend=False, end_with_bend=True, open_start=True, open_end=True)#

Return a half-wave resonator with its schematic and model boundary.

Parameters:
  • length (float) – Total resonator length in µm.

  • meanders (int) – Number of meander bends.

  • bend_spec (ComponentSpec) – Component used for each bend.

  • cross_section (CrossSectionSpec) – Resonator cross section.

  • start_with_bend (bool) – Start the path with a bend.

  • end_with_bend (bool) – End the path with a bend.

  • open_start (bool) – Leave the start open instead of shorting it.

  • open_end (bool) – Leave the end open instead of shorting it.

Return type:

Component

resonator_half_wave_bend_end

resonator_half_wave_bend_start#

resonators

qpdk.cells.resonator_half_wave_bend_start(length=4000.0, meanders=6, bend_spec=<function bend_circular>, cross_section='cpw', *, start_with_bend=True, end_with_bend=False, open_start=True, open_end=True)#

Return a half-wave resonator with its schematic and model boundary.

Parameters:
  • length (float) – Total resonator length in µm.

  • meanders (int) – Number of meander bends.

  • bend_spec (ComponentSpec) – Component used for each bend.

  • cross_section (CrossSectionSpec) – Resonator cross section.

  • start_with_bend (bool) – Start the path with a bend.

  • end_with_bend (bool) – End the path with a bend.

  • open_start (bool) – Leave the start open instead of shorting it.

  • open_end (bool) – Leave the end open instead of shorting it.

Return type:

Component

resonator_half_wave_bend_start

resonator_half_wave_bulge#

resonators

qpdk.cells.resonator_half_wave_bulge(length=8000.0, meanders=6, bend_spec=<function bend_circular>, cross_section='cpw', bulge_width=25.0, bulge_length=50.0, taper_length=20.0)[source]#

Half-wave resonator with a cpw_bulge() at its centre.

The centre of an open-ended half-wave resonator is the current antinode of the fundamental mode (and a current node of the first harmonic), as in [NP14]. The bulge sits in the middle of the central meander row, so meanders must be even.

Parameters:
  • length (float) – Total centre-line length, including bends and the bulge, in µm.

  • meanders (int) – Number of meander bends. Must be even.

  • bend_spec (ComponentSpec) – Bend used in the meanders.

  • cross_section (CrossSectionSpec) – CPW cross-section of the resonator.

  • bulge_width (float) – See cpw_bulge().

  • bulge_length (float) – See cpw_bulge().

  • taper_length (float) – See cpw_bulge().

Returns:

Component with open-end ports o1 and o2.

Raises:

ValueError – If meanders is odd or length is too short.

Return type:

Component

resonator_half_wave_bulge

resonator_meander#

resonators

qpdk.cells.resonator_meander(length=3700.0, meanders=6, bend_spec=<function bend_circular>, cross_section='cpw', end_with_bend=False)[source]#

Return the modeled CPW path from the first bend to the shorted end.

Parameters:
  • length (float) – Total path length, including bends, in µm.

  • meanders (int) – Number of meander bends.

  • bend_spec (ComponentSpec) – Component used for each bend.

  • cross_section (CrossSectionSpec) – Resonator cross section.

  • end_with_bend (bool) – Whether the path ends with a bend.

Return type:

Component

resonator_meander

resonator_quarter_wave#

resonators

qpdk.cells.resonator_quarter_wave(length=4000.0, meanders=6, bend_spec=<function bend_circular>, cross_section='cpw', *, start_with_bend=False, end_with_bend=False, open_start=False, open_end=True)[source]#

Return a quarter-wave resonator with its schematic and model boundary.

Parameters:
  • length (float) – Total resonator length in µm.

  • meanders (int) – Number of meander bends.

  • bend_spec (ComponentSpec) – Component used for each bend.

  • cross_section (CrossSectionSpec) – Resonator cross section.

  • start_with_bend (bool) – Start the path with a bend.

  • end_with_bend (bool) – End the path with a bend.

  • open_start (bool) – Leave the start open instead of shorting it.

  • open_end (bool) – Leave the end open instead of shorting it.

Return type:

Component

resonator_quarter_wave

resonator_quarter_wave_bend_both#

resonators

qpdk.cells.resonator_quarter_wave_bend_both(length=4000.0, meanders=6, bend_spec=<function bend_circular>, cross_section='cpw', *, start_with_bend=True, end_with_bend=True, open_start=False, open_end=True)#

Return a quarter-wave resonator with its schematic and model boundary.

Parameters:
  • length (float) – Total resonator length in µm.

  • meanders (int) – Number of meander bends.

  • bend_spec (ComponentSpec) – Component used for each bend.

  • cross_section (CrossSectionSpec) – Resonator cross section.

  • start_with_bend (bool) – Start the path with a bend.

  • end_with_bend (bool) – End the path with a bend.

  • open_start (bool) – Leave the start open instead of shorting it.

  • open_end (bool) – Leave the end open instead of shorting it.

Return type:

Component

resonator_quarter_wave_bend_both

resonator_quarter_wave_bend_end#

resonators

qpdk.cells.resonator_quarter_wave_bend_end(length=4000.0, meanders=6, bend_spec=<function bend_circular>, cross_section='cpw', *, start_with_bend=False, end_with_bend=True, open_start=False, open_end=True)#

Return a quarter-wave resonator with its schematic and model boundary.

Parameters:
  • length (float) – Total resonator length in µm.

  • meanders (int) – Number of meander bends.

  • bend_spec (ComponentSpec) – Component used for each bend.

  • cross_section (CrossSectionSpec) – Resonator cross section.

  • start_with_bend (bool) – Start the path with a bend.

  • end_with_bend (bool) – End the path with a bend.

  • open_start (bool) – Leave the start open instead of shorting it.

  • open_end (bool) – Leave the end open instead of shorting it.

Return type:

Component

resonator_quarter_wave_bend_end

resonator_quarter_wave_bend_start#

resonators

qpdk.cells.resonator_quarter_wave_bend_start(length=4000.0, meanders=6, bend_spec=<function bend_circular>, cross_section='cpw', *, start_with_bend=True, end_with_bend=False, open_start=False, open_end=True)#

Return a quarter-wave resonator with its schematic and model boundary.

Parameters:
  • length (float) – Total resonator length in µm.

  • meanders (int) – Number of meander bends.

  • bend_spec (ComponentSpec) – Component used for each bend.

  • cross_section (CrossSectionSpec) – Resonator cross section.

  • start_with_bend (bool) – Start the path with a bend.

  • end_with_bend (bool) – End the path with a bend.

  • open_start (bool) – Leave the start open instead of shorting it.

  • open_end (bool) – Leave the end open instead of shorting it.

Return type:

Component

resonator_quarter_wave_bend_start

resonator_quarter_wave_neck#

resonators

qpdk.cells.resonator_quarter_wave_neck(length=4000.0, meanders=6, bend_spec=<function bend_circular>, cross_section='cpw', taper_length=100.0, taper_shape='linear', neck_width=2.0, neck_length=325.0, window_width=380.0, trap_hole_rows=4, trap_hole_size=4.0, trap_hole_pitch=5.5, trap_hole_offset=6.0, trap_hole_keepout=24.0)[source]#

Quarter-wave resonator grounded through a neck_termination().

The open end carries the coupling port o1. At the grounded end, the current antinode, the line turns away from the meander with a 90° bend and ends in the taper, neck and etched window of [SNV+26], so the window does not overlap the meander.

Parameters:
Returns:

Component with the open-end port o1.

Return type:

Component

resonator_quarter_wave_neck

straight_double_open#

resonators waveguides

qpdk.cells.straight_double_open(length=10.0, cross_section=<function coplanar_waveguide>, npoints=2)[source]#

Returns a straight waveguide with etched gaps at both ends.

Note

This may be treated as a \(\lambda/2\) straight resonator in some contexts.

Parameters:
  • length (float) – Length of the straight waveguide in μm.

  • cross_section (CrossSectionSpec) – Cross-section specification.

  • npoints (int) – Number of points for the waveguide.

Return type:

Component

straight_double_open

straight_open#

resonators terminations waveguides

qpdk.cells.straight_open(length=10.0, cross_section=<function coplanar_waveguide>, npoints=2)[source]#

Returns a straight waveguide with etched gap at one end.

Parameters:
  • length (float) – Length of the straight waveguide in μm.

  • cross_section (CrossSectionSpec) – Cross-section specification.

  • npoints (int) – Number of points for the waveguide.

Return type:

Component

straight_open

straight_shorted#

resonators terminations waveguides

qpdk.cells.straight_shorted(length=10.0, cross_section=<function coplanar_waveguide>, npoints=2)[source]#

Return a straight waveguide whose far end is shorted.

The CPW slots stop at the far end, joining its center trace to ground.

Parameters:
  • length (float) – Length of the straight waveguide in μm.

  • cross_section (CrossSectionSpec) – Cross-section specification.

  • npoints (int) – Number of points for the waveguide.

Return type:

Component

straight_shorted

Josephson Junctions#

josephson_junction#

junctions

qpdk.cells.josephson_junction(junction_overlap_displacement=1.8, wide_straight_length=8.3, narrow_straight_length=0.5, taper_length=4.7, cross_section_wide=<function josephson_junction_cross_section_wide>, cross_section_narrow=<function josephson_junction_cross_section_narrow>, layer_patch=<LayerMapQPDK.JJ_PATCH: 54>, size_patch=(1.5, 1.0))[source]#

Creates a single Josephson junction component.

A Josephson junction consists of two superconducting electrodes separated by a thin insulating barrier allowing tunnelling.

right_wide ┌───┐          ╷ overlap │   │━━━━────╶╶╷╶╶ └───┘          ╷                │                │                ┃                ┃              ┌───┐              │   │              └───┘              left_wide right_wide ┌───┐          ╷ overlap │   │━━━━────╶╶╷╶╶ └───┘          ╷                │                │                ┃                ┃              ┌───┐              │   │              └───┘              left_wide
Parameters:
  • junction_overlap_displacement (float) – Displacement of the overlap region in µm. Measured from the centers of the junction ports.

  • wide_straight_length (float) – Length of the wide straight section in µm.

  • narrow_straight_length (float) – Length of the narrow straight section in µm.

  • taper_length (float) – Length of the taper section in µm.

  • cross_section_wide (CrossSectionSpec) – Cross-section specification for the wide section.

  • cross_section_narrow (CrossSectionSpec) – Cross-section specification for the narrow section.

  • layer_patch (LayerSpec) – Layer for the patch that creates the overlap region.

  • size_patch (tuple[float, float]) – Size of the patch that creates the overlap region.

Returns:

The Josephson junction component.

Return type:

Component

josephson_junction

josephson_junction_array#

inductors junctions

qpdk.cells.josephson_junction_array(n_junctions=43, junction_area=0.5, island_length=0.3, island_width=2.0, pitch=0.465, layout_style='dolan', n_folds=0, fold_spacing=4.0, lead_length=1.0, ground_plane_distance=None, critical_current_density=0.09, layer_junction=<LayerMapQPDK.JJ_AREA: 13>, layer_patch=<LayerMapQPDK.JJ_PATCH: 54>, layer_etch=<LayerMapQPDK.M1_ETCH: 47>)[source]#

Creates a chain of Josephson junctions in series between two ports.

The array is used as a superinductance, for example in the fluxonium [MKGD09, MPK+12], or as a junction-chain transmission line. Island \(i\) (\(i = 0, \dots, N\)) sits at \(i p\) along the unfolded chain and junction \(k\) sits between islands \(k\) and \(k + 1\).

o1 ┌────┐ ┌─┐ ┌─┐ ┌─┐       ┌─┐ ┌────┐ o2 ───┤lead├─┤ ├─┤ ├─┤ ├─ ... ─┤ ├─┤lead├───    └────┘ └─┘ └─┘ └─┘       └─┘ └────┘           │<p>│           island_length o1 ┌────┐ ┌─┐ ┌─┐ ┌─┐       ┌─┐ ┌────┐ o2 ───┤lead├─┤ ├─┤ ├─┤ ├─ ... ─┤ ├─┤lead├───    └────┘ └─┘ └─┘ └─┘       └─┘ └────┘           │<p>│           island_length
Layout styles:
  • "dolan": collinear islands of island_length × island_width separated by the bridge gap \(p - l\). This is the mask of a shadow-evaporated bridge chain. The junction overlap, junction_area / island_width, comes from the evaporation angle and is not drawn.

  • "manhattan": overlap junctions on a straight chain. Islands are bars alternating at ±45° to the chain axis, i.e. along the two evaporation axes, so adjacent narrow tips of width \(\sqrt{A}\) cross at right angles and draw the junction overlap \(A\).

With n_folds > 0 the chain zig-zags in n_folds + 1 rows spaced by fold_spacing. The junctions are split as evenly as possible over the rows, and the island at each row end is joined to the first island of the next row by a vertical connector (island_length wide for Dolan, \(\sqrt{A}\) for Manhattan). The drawn islands are checked for unintended contact: Dolan islands must not touch, and Manhattan islands may overlap only their chain neighbours, in exactly the junction area.

The info dictionary reports the number of junctions, the total junction area \(N A\), the area and perimeter of one interior island (as drawn), the chain length \(N p\), the critical current \(I_\text{c} = J_\text{c} A\) in nA, and the estimated inductances \(L_\text{J} = \Phi_0 / (2 \pi J_\text{c} A)\) and \(L_\text{array} = N L_\text{J}\) in nH, which neglect the kinetic and geometric inductance of the islands.

Defaults reproduce the array of [MKGD09]: \(N = 43\) junctions of \(0.25 \times 2\,\mu\text{m}^2\) in a \(20\,\mu\text{m}\) chain, with \(J_\text{c}\) set so that \(L_\text{array}\) matches the reported \(E_L = 0.52\,\text{GHz}\).

Parameters:
  • n_junctions (int) – Number of junctions \(N\) in the chain.

  • junction_area (float) – Area \(A\) of each junction in µm².

  • island_length (float) – Length \(l\) of each island along the chain (Dolan) or of the wide body of each bar (Manhattan) in µm.

  • island_width (float) – Width of each island in µm. For Dolan this is also the junction width.

  • pitch (float) – Island-to-island pitch \(p\) along the chain in µm.

  • layout_style (Literal['dolan', 'manhattan']) – "dolan" or "manhattan".

  • n_folds (int) – Number of folds. 0 draws a straight chain.

  • fold_spacing (float) – Centre-to-centre spacing between rows in µm.

  • lead_length (float) – Length of the contact lead at each end in µm.

  • ground_plane_distance (float | None) – If given, draw a ground-plane clearance on layer_etch that extends this far beyond the chain bounding box in µm.

  • critical_current_density (float) – Critical current density \(J_\text{c}\) in µA/µm², used only for the info inductance estimate.

  • layer_junction (LayerSpec) – Layer for the islands and leads.

  • layer_patch (TypeAliasForwardRef('LayerSpec') | None) – Layer for the contact patches on the leads, or None.

  • layer_etch (LayerSpec) – Layer for the optional ground-plane clearance.

Returns:

The junction array component with ports o1 and o2.

Raises:

ValueError – If the geometry is inconsistent.

Return type:

Component

josephson_junction_array

josephson_junction_array_compact#

inductors junctions

qpdk.cells.josephson_junction_array_compact(n_junctions=43, junction_area=0.5, island_length=0.3, island_width=2.0, pitch=0.465, layout_style='dolan', n_folds=2, fold_spacing=4.0, lead_length=1.0, ground_plane_distance=None, critical_current_density=0.09, layer_junction=<LayerMapQPDK.JJ_AREA: 13>, layer_patch=<LayerMapQPDK.JJ_PATCH: 54>, layer_etch=<LayerMapQPDK.M1_ETCH: 47>)[source]#

Creates a folded Josephson junction array that fits a compact bounding box.

Same as josephson_junction_array() with n_folds defaulting to 2, so the chain zig-zags in three rows and both ports face away from each other.

o1 ──┤├┤├┤├┤├┤├─┐                  │      ┌─┤├┤├┤├┤├─┘      │      └─┤├┤├┤├┤├┤├── o2 o1 ──┤├┤├┤├┤├┤├─┐                  │      ┌─┤├┤├┤├┤├─┘      │      └─┤├┤├┤├┤├┤├── o2

See [MKGD09, MPK+12].

Parameters:
  • n_junctions (int) – Number of junctions \(N\) in the chain.

  • junction_area (float) – Area \(A\) of each junction in µm².

  • island_length (float) – Length of each island along the chain in µm.

  • island_width (float) – Width of each island in µm.

  • pitch (float) – Island-to-island pitch along the chain in µm.

  • layout_style (Literal['dolan', 'manhattan']) – "dolan" or "manhattan".

  • n_folds (int) – Number of folds.

  • fold_spacing (float) – Centre-to-centre spacing between rows in µm.

  • lead_length (float) – Length of the contact lead at each end in µm.

  • ground_plane_distance (float | None) – Optional ground-plane clearance in µm.

  • critical_current_density (float) – Critical current density in µA/µm².

  • layer_junction (LayerSpec) – Layer for the islands and leads.

  • layer_patch (TypeAliasForwardRef('LayerSpec') | None) – Layer for the contact patches on the leads, or None.

  • layer_etch (LayerSpec) – Layer for the optional ground-plane clearance.

Returns:

The folded junction array component.

Return type:

Component

josephson_junction_array_compact

josephson_junction_long#

junctions

qpdk.cells.josephson_junction_long(**kwargs)[source]#

Josephson junction with wide_straight_length=12.

Returns:

The Josephson junction component with long wires.

Return type:

Component

josephson_junction_long

single_josephson_junction_wire#

junctions

qpdk.cells.single_josephson_junction_wire(wide_straight_length=8.3, narrow_straight_length=0.5, taper_length=4.7, cross_section_wide=<function josephson_junction_cross_section_wide>, cross_section_narrow=<function josephson_junction_cross_section_narrow>, layer_patch=<LayerMapQPDK.JJ_PATCH: 54>, size_patch=(1.5, 1.0))[source]#

Creates a single wire to use in a Josephson junction.

┌───┐ │o1 │━━━━────╶╶╶╶╶ o2 └───┘        wide  narrow ┌───┐ │o1 │━━━━────╶╶╶╶╶ o2 └───┘        wide  narrow
Parameters:
  • wide_straight_length (float) – Length of the wide straight section in µm.

  • narrow_straight_length (float) – Length of the narrow straight section in µm.

  • taper_length (float) – Length of the taper section in µm.

  • cross_section_wide (CrossSectionSpec) – Cross-section specification for the wide section.

  • cross_section_narrow (CrossSectionSpec) – Cross-section specification for the narrow section.

  • layer_patch (LayerSpec) – Layer for the patch that creates the overlap region.

  • size_patch (tuple[float, float]) – Size of the patch that creates the overlap region.

Returns:

The junction wire component.

Return type:

Component

single_josephson_junction_wire

squid_junction#

junctions

qpdk.cells.squid_junction(junction_spec=<function josephson_junction>, loop_area=4)[source]#

Creates a SQUID (Superconducting Quantum Interference Device) junction component.

A SQUID consists of two Josephson junctions connected in parallel, forming a loop.

See [CB04] for details.

Parameters:
  • junction_spec (ComponentSpec) – Component specification for the Josephson junction component.

  • loop_area (float) – Area of the SQUID loop in µm². This does not take into account the junction wire widths.

Returns:

The SQUID junction component.

Return type:

Component

squid_junction

squid_junction_long#

junctions

qpdk.cells.squid_junction_long(**kwargs)[source]#

SQUID junction with josephson_junction_long.

Returns:

The SQUID junction component with long wires.

Return type:

Component

squid_junction_long

squid_termination#

junctions terminations

qpdk.cells.squid_termination(length=10.0, cross_section='cpw', junction_spec=functools.partial(<function squid_junction>, junction_spec=functools.partial(<function josephson_junction>, junction_overlap_displacement=1.8, wide_straight_length=4.0, narrow_straight_length=0.5, taper_length=4)))[source]#

CPW lead shorted to the ground plane through a DC SQUID.

The lead ends in an etched pocket that separates the centre conductor from the ground plane. The SQUID bridges the pocket, so the centre conductor reaches ground only through the SQUID, as in the flux-driven JPA of [YIW+08]. The pocket length follows from the SQUID: the pocket edges run through the centres of the JJ_PATCH contact patches, so the lead-side patches land half on the lead and the ground-side patches half on the ground plane.

 ──────────┬──────┐            │      │ o1 ────────│  X   │  ground            │ SQUID│  ──────────┴──────┘   CPW lead   pocket  ──────────┬──────┐            │      │ o1 ────────│  X   │  ground            │ SQUID│  ──────────┴──────┘   CPW lead   pocket
Parameters:
  • length (float) – Length of the CPW lead in µm.

  • cross_section (CrossSectionSpec) – Cross-section of the CPW lead. The pocket spans the full CPW width, centre conductor plus both gaps.

  • junction_spec (ComponentSpec) – Component specification for the SQUID.

Returns:

The SQUID termination with CPW port o1 and a squid placement port at the SQUID centre.

Return type:

Component

Raises:

ValueError – If the SQUID has no JJ_PATCH contacts on one side, its lead-side contacts overhang the centre conductor, or a contact lies wholly over the pocket.

squid_termination

Couplers#

coupler_ring#

couplers waveguides

qpdk.cells.coupler_ring(length_x=20, gap=16, cross_section='cpw', bend=<function bend_circular>)[source]#

Return a ring coupler fed by a straight bus.

Parameters:
  • length_x (float) – Straight coupling length in μm.

  • gap (float) – Edge-to-edge conductor gap in μm.

  • cross_section (CrossSectionSpec) – Cross-section specification.

  • bend (ComponentSpec) – Component used for the ring bends.

Return type:

Component

coupler_ring

coupler_straight#

couplers waveguides

qpdk.cells.coupler_straight(length=10, gap=16, cross_section='cpw', cross_section_non_resonator=None, resonator_offset=0.0)[source]#

Return two parallel coupled waveguides.

Parameters:
  • length (float) – Coupling length in μm.

  • gap (float) – Edge-to-edge conductor gap in μm.

  • cross_section (CrossSectionSpec) – Cross-section specification.

  • cross_section_non_resonator (CrossSectionSpec | None) – Optional cross section for the upper bus.

  • resonator_offset (float) – Shift the lower trace to the right, in µm.

Return type:

Component

coupler_straight

gatemon_coupler#

couplers

qpdk.cells.gatemon_coupler(length=600.0, coupling_position=200.0, island_width=150.0, pocket_gap_top=40.0, qubit_side='bottom', coupling_capacitance=5.4e-15, cross_section='cpw')[source]#

Return a passing CPW with a capacitive island reference port.

The qubit port sits at the island edge across the etched gap. Its circuit branch represents a lumped capacitance, so no metal spur crosses that gap. The capacitance is a nominal circuit estimate, not a layout extraction.

Parameters:
  • length (float) – Complete CPW length in µm.

  • coupling_position (float) – Island center measured from o1 in µm.

  • island_width (float) – Width of the island reference plane in µm.

  • pocket_gap_top (float) – Clearance from island to the CPW conductor edge in µm.

  • qubit_side (str) – Island side of the CPW, bottom or top.

  • coupling_capacitance (float) – Nominal mutual capacitance in F for the SAX model.

  • cross_section (CrossSectionSpec) – Cross-section of the passing CPW.

Returns:

CPW with o1, o2 and qubit ports.

Raises:

ValueError – If the island reference plane lies outside the line.

Return type:

Component

gatemon_coupler

half_circle_coupler#

capacitors couplers

qpdk.cells.half_circle_coupler(radius=50.0, angle=180.0, extension_length=10.0, cross_section='cpw', extra_straight_length=20.0, open_end=True)[source]#

Creates a half-circle coupler for readout.

This coupler consists of a circular bend (typically 180 degrees) that wraps around a resonator arm for capacitive coupling.

Parameters:
  • radius (float) – Inner radius of the half-circle in μm.

  • angle (float) – Angle of the circular arc in degrees.

  • extension_length (float) – Length of the straight sections extending from the ends of the half-circle in μm.

  • cross_section (CrossSectionSpec) – Cross-section specification for the coupler.

  • extra_straight_length (float) – Length of the straight section extending from the bottom of the half-circle in μm.

  • open_end (bool) – If True, adds an etched gap at the ends of the extensions.

Returns:

A gdsfactory component with the half-circle coupler geometry.

Return type:

Component

half_circle_coupler

hyperbolic_vertex_coupler#

capacitors couplers

qpdk.cells.hyperbolic_vertex_coupler(q=3, rotation=0.0, pin_radius=40.0, pin_gap=4.0, ground_gap=6.0, lead_length=20.0, cross_section='cpw')[source]#

Return a q-pin capacitive coupler for a hyperbolic lattice vertex.

A metal disk of radius pin_radius is cut into q pie-slice pins by radial gaps of width pin_gap and isolated from ground by a ring of width ground_gap. Each pin feeds a short CPW lead, so the resonators of the q lattice edges meeting at the vertex couple through the gaps [KollarFH19].

      o2       │    .─────.   ( \ 1 / )  (   \ /   ) ( 2   │   0 )── o1  (    │    )   `───┴───'       │       o3       o2       │    .─────.   ( \ 1 / )  (   \ /   ) ( 2   │   0 )── o1  (    │    )   `───┴───'       │       o3

Pin k points along rotation + 360 k / q degrees. Its port sits at the end of the lead, snapped to the 1 nm grid, and faces away from the disk centre along the snapped direction (generally not Manhattan).

Parameters:
  • q (int) – Number of pins (edges meeting at the vertex).

  • rotation (float) – Direction of pin 0 in degrees.

  • pin_radius (float) – Radius of the metal disk in µm.

  • pin_gap (float) – Width of the radial gaps between pins in µm.

  • ground_gap (float) – Clearance between the disk and ground in µm.

  • lead_length (float) – Length of the CPW lead beyond the disk in µm.

  • cross_section (CrossSectionSpec) – CPW cross-section of the leads.

Returns:

Component with ports o1 … oq.

Raises:

ValueError – If q < 2 or the pins are too narrow for the leads.

Return type:

Component

hyperbolic_vertex_coupler

plate_capacitor#

capacitors couplers

qpdk.cells.plate_capacitor(length=80.0, width=10.0, gap=7.0, offset=0.0)[source]#

Two facing plate capacitor pads with the dataset’s coplanar ground frame.

Reuses two plate_capacitor_single() cells. The first pad is centered at the origin and the second is shifted vertically by offset. Ports o1 and o2 lie at the outer ends of the pads’ short CPW necks. A grounded frame, 45 um wide and 10 um from the electrode bounding box, matches qpdk.models.plate_capacitor() on silicon. The frame is part of the modeled environment and surrounds both port reference planes.

The model includes the coupling and both capacitances to ground. Its validated dimensions are length 40 to 120 um, width 5 to 20 um, gap 4 to 10 um and offset -12 to 12 um. The lookup returns NaN outside that range.

Parameters:
  • length (float) – Vertical pad length in um.

  • width (float) – Horizontal pad width in um.

  • gap (float) – Horizontal separation between facing pad edges in um.

  • offset (float) – Vertical displacement of the second pad in um.

Returns:

Component with two signal ports and an implicit common ground.

Raises:

ValueError – If length, width or gap is not positive.

Return type:

Component

plate_capacitor

plate_capacitor_single#

capacitors couplers

qpdk.cells.plate_capacitor_single(length=26.0, width=5.0, layer_metal=<LayerMapQPDK.M1_DRAW: 1>, etch_layer='M1_ETCH', etch_bbox_margin=2.0, cross_section='cpw')[source]#

Creates a single plate capacitor for coupling.

This is essentially half of a plate_capacitor().

           ______  _________|      | |                | |  o1       pad1 | |                | |_________       |           |______|            ______  _________|      | |                | |  o1       pad1 | |                | |_________       |           |______|
Parameters:
  • length (float) – Length (vertical extent) of the capacitor pad in μm.

  • width (float) – Width (horizontal extent) of the capacitor pad in μm.

  • layer_metal (LayerSpec) – Layer for the metal pad.

  • etch_layer (TypeAliasForwardRef('LayerSpec') | None) – Optional layer for etching around the capacitor.

  • etch_bbox_margin (float) – Margin around the capacitor for the etch layer in μm.

  • cross_section (CrossSectionSpec) – Cross-section for the short straight from the etch box capacitor.

Returns:

A gdsfactory component with the plate capacitor geometry.

Raises:

ValueError – If width or length is not positive.

Return type:

Component

plate_capacitor_single

Capacitors#

interdigital_capacitor#

capacitors

qpdk.cells.interdigital_capacitor(fingers=4, finger_length=20.0, finger_gap=2.0, thickness=5.0, layer_metal=<LayerMapQPDK.M1_DRAW: 1>, etch_layer='M1_ETCH', etch_bbox_margin=2.0, cross_section='cpw')[source]#

Generate an interdigital capacitor component with ports on both ends.

An interdigital capacitor consists of interleaved metal fingers that create a distributed capacitance. This component creates a planar capacitor with two sets of interleaved fingers extending from opposite ends.

   ┌─┐───────┐┌─┐    │ │───────┘│ │    │ │ ┌──────│ │   ┌│ │ └──────│ │┐ o1└│ │──────┐ │ │┘o2    │ │──────┘ │ │    │ │ ┌──────│ │    └─┘ └──────└─┘    ┌─┐───────┐┌─┐    │ │───────┘│ │    │ │ ┌──────│ │   ┌│ │ └──────│ │┐ o1└│ │──────┐ │ │┘o2    │ │──────┘ │ │    │ │ ┌──────│ │    └─┘ └──────└─┘

See for example [LeiZhuW00].

Note

finger_length=0 effectively provides a parallel plate capacitor. The capacitance scales approximately linearly with the number of fingers and finger length.

The matching SAX model is interdigital_capacitor(). The single-sided variant is its own factory, interdigital_capacitor_half(), with a different port contract.

Parameters:
  • fingers (int) – Total number of fingers of the capacitor (must be >= 1).

  • finger_length (float) – Length of each finger in μm.

  • finger_gap (float) – Gap between adjacent fingers in μm.

  • thickness (float) – Thickness of fingers and the base section in μm.

  • layer_metal (LayerSpec) – Layer for the metal fingers.

  • etch_layer (TypeAliasForwardRef('LayerSpec') | None) – Optional layer for etching around the capacitor.

  • etch_bbox_margin (float) – Margin around the capacitor for the etch layer in μm.

  • cross_section (CrossSectionSpec) – Cross-section for the short straight from the etch box capacitor.

Returns:

A gdsfactory component with the interdigital capacitor geometry

and two ports (‘o1’ and ‘o2’) on opposing sides.

Return type:

Component

interdigital_capacitor

interdigital_capacitor_half#

capacitors

qpdk.cells.interdigital_capacitor_half(fingers=4, finger_length=20.0, finger_gap=2.0, thickness=5.0, layer_metal=<LayerMapQPDK.M1_DRAW: 1>, etch_layer='M1_ETCH', etch_bbox_margin=2.0, cross_section='cpw')[source]#

Generate a single-sided interdigital capacitor with a single port.

This is one comb of the interdigital capacitor, for layouts whose second plate is a separate object. It exposes only port ‘o1’, so the two-port interdigital_capacitor() model does not describe it and no SAX model is registered for this factory.

Parameters:
  • fingers (int) – Total number of fingers of the capacitor (must be >= 1).

  • finger_length (float) – Length of each finger in μm.

  • finger_gap (float) – Gap between adjacent fingers in μm.

  • thickness (float) – Thickness of fingers and the base section in μm.

  • layer_metal (LayerSpec) – Layer for the metal fingers.

  • etch_layer (TypeAliasForwardRef('LayerSpec') | None) – Optional layer for etching around the capacitor.

  • etch_bbox_margin (float) – Margin around the capacitor for the etch layer in μm.

  • cross_section (CrossSectionSpec) – Cross-section for the short straight from the etch box capacitor.

Returns:

A gdsfactory component with the single-sided interdigital

capacitor geometry and a single port (‘o1’).

Return type:

Component

interdigital_capacitor_half

vacuum_gap_capacitor#

capacitors

qpdk.cells.vacuum_gap_capacitor(radius=7.5, support='rim', etch_gap=2.0, rim_width=3.0, n_legs=4, leg_width=2.0, cross_section=<function meander_inductor_cross_section>)[source]#

Creates a suspended vacuum-gap parallel-plate (drum) capacitor.

A circular bottom electrode of radius \(a\) in M1 sits under an aluminium membrane on VG_TOP, separated by the vacuum gap \(d\) of the layer stack, after [CLS+10, PDamskaggB+15]. The membrane is clamped onto an M1 ring around the electrode, either along its whole edge (support="rim") or through n_legs radial legs (support="legs"). VG_SAC marks the sacrificial layer under the suspended part.

In the Aalto process the membrane is evaporated on a sacrificial amorphous-silicon layer that is etched away to release it [MdLepinayDamskaggOKSillanpaa19]. Here the membrane lands on M1, since the layer stack measures the gap from the top of M1.

The suspended part spans the electrode plus the etched gap to the ring, a diameter of \(2(a + \text{etch\_gap})\). With the defaults that is 19 µm over a 15 µm electrode, so the mechanics of the drawn membrane are not those of the 15 µm drum of [PDamskaggB+15].

      .-----------.  ring + membrane (o2)      /  .-------.  \ o1 ---=|  bottom |   |--- o2      \  '-------'  /       '-----------'       .-----------.  ring + membrane (o2)      /  .-------.  \ o1 ---=|  bottom |   |--- o2      \  '-------'  /       '-----------'

Port o1 connects to the bottom electrode through a lead that passes under the membrane in a slot of the ring. Port o2 connects to the ring and through it to the membrane. The plate overlap is set by the bottom electrode, so the parallel-plate capacitance is \(C = \varepsilon_0 \pi a^2 / d\), see qpdk.models.drum.vacuum_gap_capacitance_analytical().

Parameters:
  • radius (float) – Bottom-electrode radius \(a\) in µm.

  • support (Literal['rim', 'legs']) – How the membrane is held, "rim" or "legs".

  • etch_gap (float) – Etched gap in µm between electrode and ring, and between ring and ground.

  • rim_width (float) – Width of the M1 ring the membrane lands on, in µm.

  • n_legs (int) – Number of radial legs for support="legs".

  • leg_width (float) – Width of each leg in µm for support="legs".

  • cross_section (CrossSectionSpec) – Cross-section of the two leads and ports.

Returns:

The drum capacitor with ports o1 (bottom electrode) and

o2 (membrane).

Return type:

Component

Raises:

ValueError – If a dimension is not positive, support is unknown, n_legs < 1, or a leg would land on the lead slot.

vacuum_gap_capacitor

Inductors#

meander_inductor#

inductors

qpdk.cells.meander_inductor(n_turns=5, turn_length=200.0, cross_section=<function meander_inductor_cross_section>, wire_gap=None, etch_bbox_margin=2.0, add_etch=True, corner_style='sharp', radius=None)[source]#

Creates a meander inductor with Manhattan routing using a narrow wire.

The inductor consists of multiple horizontal runs connected by short vertical segments at alternating ends, forming a serpentine (meander) path. The total inductance is dominated by kinetic inductance for superconducting thin films.

o1 ─────────────────────┐                         │ ┌───────────────────────┘ │ └───────────────────────┐                         │ ┌───────────────────────┘ │ └────────────────────── o2 o1 ─────────────────────┐                         │ ┌───────────────────────┘ │ └───────────────────────┐                         │ ┌───────────────────────┘ │ └────────────────────── o2

Similar structures are described in [CSD+23, KVH+11].

Parameters:
  • n_turns (int) – Number of horizontal meander runs (must be >= 1).

  • turn_length (float) – Length of each horizontal run in µm.

  • cross_section (CrossSectionSpec) – Cross-section specification for the meander wire. The center conductor width and etch gap are derived from this specification. The meander’s vertical pitch is the wire width plus the run-to-run gap, which defaults to twice the etch gap so that the etched regions of adjacent runs do not overlap, maintaining the characteristic impedance of each run.

  • wire_gap (float | None) – Optional explicit gap between adjacent inductor runs in µm. If None (default), it’s inferred as 2x the etch gap from the cross-section, or the wire width if it has no etch section.

  • etch_bbox_margin (float) – Extra margin around the inductor for the etch bounding box in µm. This margin is added in addition to the etch region defined in the cross-section.

  • add_etch (bool) – Whether to add the etch bounding box. Defaults to True.

  • corner_style (Literal['sharp', 'chamfer', 'round', 'optimal']) –

    Shape of the U-turn corners, all within the same bounding box:

    • "sharp": Manhattan corners (the original geometry).

    • "chamfer": the outer corner of each 90° bend is cut at 45° so the wire keeps its width \(w\) along the diagonal.

    • "round": circular arcs of centreline radius radius.

    • "optimal": the current-crowding-free hairpin contour of [CB11], drawn with gdsfactory.components.optimal_hairpin(). Each hairpin spans half a run.

  • radius (float | None) – Centreline radius of "round" corners in µm, with \(w/2 < R \\le p/2\) for pitch \(p\). Defaults to \(p/2\), which makes each U-turn a semicircle. Ignored for other styles.

Returns:

A gdsfactory component with the meander inductor geometry

and two ports (‘o1’ and ‘o2’). info holds

  • total_wire_length: centreline length of the sharp meander in µm.

  • n_squares: total_wire_length / w, which counts every corner square as one square. The SAX model uses this value.

  • n_squares_drawn: squares of the drawn polygon for the chosen corner_style, from qpdk.tech.meander_n_squares_drawn(). A sharp 90° corner counts 0.559 squares [HH63].

  • n_squares_convention: the corner rule used for n_squares_drawn.

Return type:

Component

Raises:

ValueError – If n_turns < 1, turn_length <= 0, wire_gap is not positive, radius is out of range, the runs are too short for the chosen corners, or corner_style is unknown.

meander_inductor

Detectors#

snspd#

detectors

qpdk.cells.snspd(wire_width=0.2, wire_pitch=0.6, size=(10, 8), num_squares=None, turn_ratio=4, terminals_same_side=False, layer=<LayerMapQPDK.NbTiN: 18>, port_type='electrical')[source]#

Creates an optimally-rounded SNSPD.

e1 ─────────────────────╮ ╭───────────────────────╯ ╰───────────────────────╮ ╭───────────────────────╯ ╰───────────────────────╮ ╭───────────────────────╯ ╰───────────────────────╮    e2 ──────────────────╯ e1 ─────────────────────╮ ╭───────────────────────╯ ╰───────────────────────╮ ╭───────────────────────╯ ╰───────────────────────╮ ╭───────────────────────╯ ╰───────────────────────╮    e2 ──────────────────╯
Parameters:
  • wire_width (float) – Width of the wire.

  • wire_pitch (float) – Distance between two adjacent wires. Must be greater than width.

  • size (Size) – Float2 (width, height) of the rectangle formed by the outer boundary of the SNSPD.

  • num_squares (int | None) – int | None = None Total number of squares inside the SNSPD length. If given, overrides size with an approximately square SNSPD. The meander count is quantized to whole wire pitches, so the achieved square count (reported in info[“num_squares”]) is close to but not exactly the requested one.

  • turn_ratio (float) – float Specifies how much of the SNSPD width is dedicated to the 180 degree turn. A turn_ratio of 10 will result in 20% of the width being comprised of the turn.

  • terminals_same_side (bool) – If True, both ports will be located on the same side of the SNSPD.

  • layer (LayerSpec) – layer spec to put polygon geometry on.

  • port_type (Literal['electrical', 'optical']) – type of port to add to the component (“electrical” or “optical”).

Returns:

A Component containing the SNSPD geometry.

Raises:

ValueError – If parameters are invalid or the SNSPD is too small for at least 3 meanders.

Return type:

Component

snspd

Interconnects#

3D Integration#

bump_transition#

3d-integration flip-chip interconnects waveguides

qpdk.cells.bump_transition(cross_section='cpw', cross_section_top='cpw_top', taper_length=10.0, taper_length_top=10.0, pad_width=30.0, pad_gap=6.0, pad_length=30.0, bump_diameter=15.0, n_ground_bumps_per_side=0, ground_bump_pitch=30.0, ground_bump_distance=15.0)[source]#

CPW transition between the two chips of a flip-chip stack through one indium bump.

Follows the indium transition of [RBF+26] (Fig. A5b) and the bump-interrupted resonators of [RKD+17] (Fig. 4b): the CPW is routed from one chip to the other with the centre conductor kept galvanically continuous through a single indium bump. The bottom-chip CPW (o1, on M1) widens over a short jog into a closed pad, and the top-chip CPW (o2, on M2) leaves an identical pad in the opposite direction. The defaults use a 15 µm bump on 30 µm square pads, the landing pad size [FML+17] found sufficient for 15 µm indium pillars at ±2 µm bonder alignment.

In those works the ground planes are tied together by a field of bumps across the whole chip rather than by bumps dedicated to each transition, so place an indium_bump_array() alongside. n_ground_bumps_per_side optionally adds ground bumps next to the pads.

Both chips are drawn in the same (bottom-chip, top-down) coordinate frame, so the pads overlap and the bump lands on both.

 bottom (M1)      top (M2)          _________ o1 ─────/   (o)   \───── o2         \_________/  bottom (M1)      top (M2)          _________ o1 ─────/   (o)   \───── o2         \_________/
Parameters:
  • cross_section (CrossSectionSpec) – Bottom-chip CPW cross-section at o1.

  • cross_section_top (CrossSectionSpec) – Top-chip CPW cross-section at o2.

  • taper_length (float) – Length of the bottom-chip jog from the CPW into the pad in µm.

  • taper_length_top (float) – Length of the top-chip jog from the pad into the CPW in µm.

  • pad_width (float) – Centre-conductor width of both pads in µm.

  • pad_gap (float) – Gap between the pads and ground in µm.

  • pad_length (float) – Length of the pads along the propagation direction in µm.

  • bump_diameter (float) – Indium bump diameter in µm.

  • n_ground_bumps_per_side (int) – Number of optional ground bumps on each side of the pads.

  • ground_bump_pitch (float) – Centre-to-centre pitch of the ground bumps (along x) in µm.

  • ground_bump_distance (float) – Distance from the ground-plane edge to the ground bump centres in µm.

Returns:

Component with the bottom-chip port o1 and the top-chip port o2.

Raises:

ValueError – If the bump does not fit in the pad, or the ground bumps reach into the CPW gap.

Return type:

Component

bump_transition

indium_bump#

3d-integration flip-chip interconnects

qpdk.cells.indium_bump(diameter=15.0)[source]#

Creates an indium bump component for 3D integration.

See [RKD+17] for details.

Parameters:

diameter (float) – Diameter of the indium bump in µm.

Returns:

A gdsfactory Component representing the indium bump.

Return type:

Component

indium_bump

indium_bump_array#

3d-integration flip-chip interconnects

qpdk.cells.indium_bump_array(columns=4, rows=4, pitch=200.0, diameter=15.0)[source]#

Creates a rectangular field of indium bumps centred at the origin.

Use it to tie the ground planes of the two chips of a flip-chip stack together, away from any CPW gaps.

(o)  (o)  (o)  (o) (o)  (o)  (o)  (o)   <- rows x columns bumps at pitch (o)  (o)  (o)  (o) (o)  (o)  (o)  (o) (o)  (o)  (o)  (o)   <- rows x columns bumps at pitch (o)  (o)  (o)  (o)
Parameters:
  • columns (int) – Number of bumps along x.

  • rows (int) – Number of bumps along y.

  • pitch (float) – Centre-to-centre pitch of the bumps along both axes in µm.

  • diameter (float) – Diameter of each indium bump in µm.

Returns:

A gdsfactory Component with columns * rows indium bumps.

Return type:

Component

indium_bump_array

tsv#

3d-integration interconnects

qpdk.cells.tsv(width=10.0, length=20.0, pad_margin=2.0, chip='bottom')[source]#

Creates a slot-shaped superconducting through-silicon via (TSV).

The default \(10 \times 20\,\text{µm}\) slot is the TSV of [MYR+21], see also [YSM+20]. Use width == length for a round via.

Landing pads on the front- and backside metal enclose the via by pad_margin, so the via stays covered by metal even when placed next to an etched gap.

With chip="top" the via runs through the flip-chip top chip, on TSV2 with pads on M2 and MB2, see LAYER_STACK_FLIP_CHIP_BACKSIDE.

 .-----------. (   TSV slot  )  ── center  '-----------'  .-----------. (   TSV slot  )  ── center  '-----------'
Parameters:
  • width (float) – Via width (short axis, along y) in µm.

  • length (float) – Via length (long axis, along x) in µm.

  • pad_margin (float) – Landing-pad enclosure of the via on each metal layer in µm. 0 omits the pads.

  • chip (Literal['bottom', 'top']) – Chip the via goes through, "bottom" or "top".

Returns:

A gdsfactory Component representing the TSV.

Raises:

ValueError – If length is smaller than width.

Return type:

Component

tsv

tsv_transition#

3d-integration interconnects waveguides

qpdk.cells.tsv_transition(cross_section=None, taper_length=100.0, pad_width=40.0, pad_gap=24.0, pad_length=30.0, via_width=10.0, via_length=20.0, via_pad_margin=2.0, n_signal_vias=2, signal_via_pitch=20.0, n_ground_vias_per_side=4, ground_via_pitch=30.0, ground_via_distance=15.0, chip='bottom')[source]#

Front-side CPW tapered into a TSV landing pad.

The CPW widens linearly over taper_length into a pad carrying n_signal_vias parallel signal TSVs, surrounded by 2 * n_ground_vias_per_side TSVs stitching the front and back ground planes. On the backside, the signal TSVs land on an isolated MB pad of the same size, clear of the backside ground by pad_gap. Connect other backside structures at the backside placement port. With chip="top" the same transition is built on the flip-chip top chip, from M2 to MB2.

The defaults follow the transition of [MYR+21], Fig. 6: two signal TSVs in parallel (a single TSV gives a large impedance mismatch) and eight ground TSVs. The pad gap keeps the pad close to the aspect ratio \(w / (w + 2s)\) of the default \(50\,\Omega\) CPW; the taper and pad dimensions are the knobs to optimise the transition impedance, see the palace_tsv_transition notebook.

          o   o   o   o      <- ground TSVs        ___________________ o1 ── /      [==]        |       \      [==]        |   <- signal TSVs in pad        ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾           o   o   o   o           o   o   o   o      <- ground TSVs        ___________________ o1 ── /      [==]        |       \      [==]        |   <- signal TSVs in pad        ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾           o   o   o   o
Parameters:
  • cross_section (TypeAliasForwardRef('CrossSectionSpec') | None) – Front-side CPW cross-section at the o1 port. None uses the front cross-section of chip.

  • taper_length (float) – Length of the linear taper from the CPW to the pad in µm.

  • pad_width (float) – Centre-conductor width of the pad in µm.

  • pad_gap (float) – Gap between the pad and ground in µm.

  • pad_length (float) – Length of the pad along the propagation direction in µm.

  • via_width (float) – TSV width in µm.

  • via_length (float) – TSV length in µm.

  • via_pad_margin (float) – TSV landing-pad enclosure in µm.

  • n_signal_vias (int) – Number of parallel signal TSVs in the pad.

  • signal_via_pitch (float) – Centre-to-centre pitch of the signal TSVs (along y) in µm.

  • n_ground_vias_per_side (int) – Number of ground TSVs on each side of the pad.

  • ground_via_pitch (float) – Centre-to-centre pitch of the ground TSVs (along x) in µm.

  • ground_via_distance (float) – Distance from the ground-plane edge to the ground TSV centres in µm.

  • chip (Literal['bottom', 'top']) – Chip the TSVs go through, "bottom" or "top".

Returns:

Component with the CPW port o1 and the backside placement port at the signal TSVs.

Return type:

Component

tsv_transition

tsv_transition_double_sided#

3d-integration interconnects waveguides

qpdk.cells.tsv_transition_double_sided(cross_section=None, cross_section_backside=None, taper_length=100.0, taper_length_backside=100.0, pad_width=40.0, pad_gap=24.0, pad_length=30.0, via_width=10.0, via_length=20.0, via_pad_margin=2.0, n_signal_vias=2, signal_via_pitch=20.0, n_ground_vias_per_side=4, ground_via_pitch=30.0, ground_via_distance=15.0, chip='bottom')[source]#

CPW transition from the front side to the backside through TSVs.

A front-side CPW (o1, on M1) tapers into a pad, the signal passes through n_signal_vias parallel TSVs, and a backside CPW (o2, on MB) tapers out of an identical pad in the opposite direction. 2 * n_ground_vias_per_side TSVs stitch the front and back ground planes around the pad. This is the side A to side B transition of [MYR+21], Fig. 6.

Simulate it with LAYER_STACK_BACKSIDE; the backside metal also turns every CPW on the chip into a conductor-backed CPW, see the conductor_backed option of cpw_parameters(). With chip="top" it runs from M2 to MB2 through the flip-chip top chip instead, see LAYER_STACK_FLIP_CHIP_BACKSIDE.

 front (M1)              back (MB)        ______________________ o1 ── /     [==]            \ ── o2       \     [==]            /        ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾  front (M1)              back (MB)        ______________________ o1 ── /     [==]            \ ── o2       \     [==]            /        ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
Parameters:
  • cross_section (TypeAliasForwardRef('CrossSectionSpec') | None) – Front-side CPW cross-section at o1. None uses the front cross-section of chip.

  • cross_section_backside (TypeAliasForwardRef('CrossSectionSpec') | None) – Backside CPW cross-section at o2. None uses the back cross-section of chip.

  • taper_length (float) – Length of the front-side taper in µm.

  • taper_length_backside (float) – Length of the backside taper in µm.

  • pad_width (float) – Centre-conductor width of both pads in µm.

  • pad_gap (float) – Gap between the pads and ground in µm.

  • pad_length (float) – Length of the pads along the propagation direction in µm.

  • via_width (float) – TSV width in µm.

  • via_length (float) – TSV length in µm.

  • via_pad_margin (float) – TSV landing-pad enclosure in µm.

  • n_signal_vias (int) – Number of parallel signal TSVs.

  • signal_via_pitch (float) – Centre-to-centre pitch of the signal TSVs (along y) in µm.

  • n_ground_vias_per_side (int) – Number of ground TSVs on each side of the pads.

  • ground_via_pitch (float) – Centre-to-centre pitch of the ground TSVs (along x) in µm.

  • ground_via_distance (float) – Distance from the ground-plane edge to the ground TSV centres in µm.

  • chip (Literal['bottom', 'top']) – Chip the TSVs go through, "bottom" or "top".

Returns:

Component with the front-side port o1 and the backside port o2.

Return type:

Component

tsv_transition_double_sided

Other Interconnects#

airbridge#

interconnects

qpdk.cells.airbridge(bridge_length=30.0, bridge_width=8.0, pad_width=15.0, pad_length=12.0, bridge_layer=<LayerMapQPDK.AB_DRAW: 51>, pad_layer=<LayerMapQPDK.AB_VIA: 52>)[source]#

Generate a superconducting airbridge component.

Creates an airbridge consisting of a suspended bridge span and landing pads on either side. The bridge allows transmission lines to cross over each other without electrical contact, which is essential for complex quantum circuit routing without crosstalk.

+─────────+ │ landing │  AB_VIA │   pad   │ +─+     +─+   │     │   │     │ bridge  AB_DRAW   │     │ +─+     +─+ │ landing │  AB_VIA │   pad   │ +─────────+ +─────────+ │ landing │  AB_VIA │   pad   │ +─+     +─+   │     │   │     │ bridge  AB_DRAW   │     │ +─+     +─+ │ landing │  AB_VIA │   pad   │ +─────────+

The bridge_layer (AB_DRAW) represents the elevated metal bridge structure, while the pad_layer (AB_VIA) represents the contact/landing pads that connect to the underlying circuit.

Note

To be used with ComponentAlongPath the unrotated version should be oriented for placement on a horizontal line.

Parameters:
  • bridge_length (float) – Total length of the airbridge span in µm.

  • bridge_width (float) – Width of the suspended bridge in µm.

  • pad_width (float) – Width of the landing pads in µm.

  • pad_length (float) – Length of each landing pad in µm.

  • bridge_layer (LayerSpec) – Layer for the suspended bridge metal (default: AB_DRAW).

  • pad_layer (LayerSpec) – Layer for the landing pads/contacts (default: AB_VIA).

Returns:

Component containing the airbridge geometry with appropriate ports.

Return type:

Component

airbridge

launcher#

interconnects waveguides

qpdk.cells.launcher(straight_length=200.0, taper_length=100.0, cross_section_big=<function launcher_cross_section_big>, cross_section_small='cpw')[source]#

Generate an RF launcher pad for wirebonding or probe testing.

Creates a launcher component consisting of a straight section with large cross-section connected to a tapered transition down to a smaller cross-section. This design facilitates RF signal access through probes or wirebonds while maintaining good impedance matching.

┌───────\ │        \ │         │ ── o1 │        / └───────/ ┌───────\ │        \ │         │ ── o1 │        / └───────/

The default dimensions are taken from [TSK+25].

Parameters:
  • straight_length (float) – Length of the straight, wirebond landing area, section in µm.

  • taper_length (float) – Length of the taper section in µm.

  • cross_section_big (CrossSectionSpec) – Cross-section specification for the large end of the launcher (probe/wirebond interface).

  • cross_section_small (CrossSectionSpec) – Cross-section specification for the small end of the launcher (circuit interface).

Returns:

A gdsfactory component containing the complete launcher

geometry with one output port (“o1”) at the small end.

Return type:

Component

launcher

Terminations#

open#

terminations

qpdk.cells.open()[source]#

Return a layout-free ideal one-port open for schematic simulation.

Return type:

Component

open

open_2_port#

terminations

qpdk.cells.open_2_port(cross_section=<function coplanar_waveguide>)[source]#

Return an etched open end with an isolated external model port.

Parameters:

cross_section (CrossSectionSpec) – Cross section of the connected resonator trace.

Return type:

Component

open_2_port

short#

terminations

qpdk.cells.short()[source]#

Return a layout-free ideal one-port short for schematic simulation.

Return type:

Component

short

Waveguides#

Bends#

bend_circular#

bend circular waveguides

qpdk.cells.bend_circular(angle=90.0, radius=100.0, npoints=None, cross_section=<function coplanar_waveguide>, allow_min_radius_violation=True, **kwargs)[source]#

Returns circular bend.

Cross-sections have a minimum value of allowed bend radius, which is half their total width. If the user-specified radius is smaller than this value, it is adjusted to the minimum acceptable one.

Parameters:
  • angle (float) – Angle of the bend in degrees.

  • radius (float) – Radius of the bend in μm.

  • npoints (int | None) – Number of points for the bend (optional, cannot be used with angular_step).

  • cross_section (CrossSectionSpec) – Cross-section specification.

  • allow_min_radius_violation (bool) – Allow radius smaller than cross-section radius.

  • **kwargs – Additional arguments passed to gf.c.bend_circular (e.g., angular_step).

Return type:

Component

bend_circular

bend_circular_all_angle#

bend circular waveguides

qpdk.cells.bend_circular_all_angle(radius=100.0, angle=90.0, npoints=None, layer=None, cross_section=<function coplanar_waveguide>, allow_min_radius_violation=True)[source]#

Returns circular bend with arbitrary angle.

Parameters:
  • radius (float | None) – Radius of the bend in μm.

  • angle (float) – Angle of the bend in degrees.

  • npoints (int | None) – Number of points for the bend.

  • layer (LayerSpec | None) – Layer specification.

  • cross_section (CrossSectionSpec) – Cross-section specification.

  • allow_min_radius_violation (bool) – Allow radius smaller than cross-section radius.

Return type:

ComponentAllAngle

bend_circular_all_angle

bend_euler#

bend euler waveguides

qpdk.cells.bend_euler(angle=90.0, p=0.5, with_arc_floorplan=True, npoints=720, cross_section=<function coplanar_waveguide>, allow_min_radius_violation=True, **kwargs)[source]#

Regular degree euler bend.

Parameters:
  • angle (float) – Angle of the bend in degrees.

  • p (float) – Fraction of the bend that is curved (0-1).

  • with_arc_floorplan (bool) – Include arc floorplan.

  • npoints (int) – Number of points for the bend.

  • cross_section (CrossSectionSpec) – Cross-section specification.

  • allow_min_radius_violation (bool) – Allow radius smaller than cross-section radius.

  • **kwargs – Additional arguments passed to gf.c.bend_euler.

Returns:

The euler bend component.

Return type:

Component

bend_euler

bend_euler_all_angle#

bend euler waveguides

qpdk.cells.bend_euler_all_angle(radius=None, angle=90.0, p=0.5, with_arc_floorplan=True, npoints=None, layer=None, cross_section=<function coplanar_waveguide>, allow_min_radius_violation=True)[source]#

Returns regular degree euler bend with arbitrary angle.

Parameters:
  • radius (float | None) – Radius of the bend in μm.

  • angle (float) – Angle of the bend in degrees.

  • p (float) – Fraction of the bend that is curved (0-1).

  • with_arc_floorplan (bool) – Include arc floorplan.

  • npoints (int | None) – Number of points for the bend.

  • layer (LayerSpec | None) – Layer specification.

  • cross_section (CrossSectionSpec) – Cross-section specification.

  • allow_min_radius_violation (bool) – Allow radius smaller than cross-section radius.

Return type:

ComponentAllAngle

bend_euler_all_angle

bend_s#

bend s waveguides

qpdk.cells.bend_s(size=(20.0, 3.0), npoints=99, cross_section=<function coplanar_waveguide>, allow_min_radius_violation=True, **kwargs)[source]#

Return S bend with bezier curve.

stores min_bend_radius property in self.info[‘min_bend_radius’] min_bend_radius depends on height and length

Parameters:
  • size (Size) – Tuple of (length, offset) for the S bend in μm.

  • npoints (int) – Number of points used to discretize the Bézier curve.

  • cross_section (CrossSectionSpec) – Cross-section specification.

  • allow_min_radius_violation (bool) – Allow radius smaller than cross-section radius.

  • **kwargs – Additional arguments passed to gf.c.bend_s.

Return type:

Component

bend_s

Other Waveguides#

cpw_bulge#

waveguides

qpdk.cells.cpw_bulge(cross_section='cpw', bulge_width=25.0, bulge_length=50.0, taper_length=20.0)[source]#

CPW section with a locally widened centre conductor.

Following Nsanzineza and Plourde [NP14], the wide section has a lower trapping threshold (vortex_trapping_threshold() scales as \(1/w^2\)) so that, placed at the current antinode of a resonator, it is where vortices are trapped first. The gap is kept constant, so the ground-plane edges flare with the conductor; the paper does not state how its gap behaves.

The paper used a 3 µm line widened to 8 µm over 50 µm. It observed the first vortex at 42 µT and then one more for every 5 µT, which matches one flux quantum per bulge area. The cell reports this step as bulge_flux_step \(= \Phi_0 / (w_\text{b} l_\text{b})\). The taper length is not given in the paper. The default bulge_width is close to the paper’s width ratio (8/3) on the PDK’s 10 µm CPW. To reproduce the paper use cross_section=coplanar_waveguide(width=3, gap=2) and bulge_width=8.

For the bulge to trap first it must be the widest conductor in the resonator: in the paper the 6 µm coupler trapped next, at 72 µT. Ground planes need flux-trap holes whose web is narrower than the line, for example qpdk.utils.fill_magnetic_vortices().

            ┌────────┐ o1 ────────/          \──────── o2            \          /             └────────┘             ┌────────┐ o1 ────────/          \──────── o2            \          /             └────────┘
Parameters:
  • cross_section (CrossSectionSpec) – CPW cross-section at both ports.

  • bulge_width (float) – Width of the widened centre conductor in µm.

  • bulge_length (float) – Length of the full-width section in µm.

  • taper_length (float) – Length of each linear taper in µm.

Returns:

Component with ports o1 and o2.

Raises:

ValueError – If a dimension is out of range.

Return type:

Component

cpw_bulge

hyperbolic_cpw_path#

waveguides

qpdk.cells.hyperbolic_cpw_path(points=((0.0, 0.0), (100.0, 0.0)), radius=100.0, shorted=False, cross_section='cpw')[source]#

CPW along points with rounded corners, ports at the first and last point.

hyperbolic_lattice() uses it for the boundary stubs and probe feeds. The direction is baked into the cell so it can be placed off-axis without an off-grid rotation. With shorted the far end is a short like straight_shorted() and o2 only marks it.

Parameters:
  • points (tuple[tuple[float, float], ...]) – Waypoints in µm; consecutive segments must leave room for the arcs.

  • radius (float) – Corner radius in µm.

  • shorted (bool) – Short the far end instead of leaving a port there.

  • cross_section (CrossSectionSpec) – CPW cross-section.

Returns:

Component with ports o1 (start) and o2 (end).

Return type:

Component

hyperbolic_cpw_path

nxn#

waveguides

qpdk.cells.nxn(xsize=10.0, ysize=10.0, wg_width=10.0, layer=<LayerMapQPDK.M1_DRAW: 1>, wg_margin=0.0, north=1, east=1, south=1, west=1, cross_section=<function coplanar_waveguide>)[source]#

Returns an NxN junction with ports on each side.

Parameters:
  • xsize (float) – Horizontal size of the junction in μm.

  • ysize (float) – Vertical size of the junction in μm.

  • wg_width (float) – Width of the waveguides in μm.

  • layer (LayerSpec) – Layer specification.

  • wg_margin (float) – Margin from edge to waveguide in μm.

  • north (int) – Number of ports on the north side.

  • east (int) – Number of ports on the east side.

  • south (int) – Number of ports on the south side.

  • west (int) – Number of ports on the west side.

  • cross_section (CrossSectionSpec) – Cross-section specification.

Return type:

Component

nxn

rectangle#

waveguides

qpdk.cells.rectangle(size=(4.0, 2.0), layer='M1_DRAW', centered=False, port_type='electrical', port_orientations=(180, 90, 0, -90))[source]#

Returns a rectangle.

Parameters:
  • size (Size) – (tuple) Width and height of rectangle.

  • layer (LayerSpec) – Specific layer to put polygon geometry on.

  • centered (bool) – True sets center to (0.0, 0.0), False sets south-west to (0.0, 0.0).

  • port_type (str | None) – optical, electrical.

  • port_orientations (Ints | None) – list of port_orientations to add. None adds no ports.

Return type:

Component

rectangle

straight#

waveguides

qpdk.cells.straight(length=10.0, cross_section=<function coplanar_waveguide>, npoints=2)[source]#

Returns a straight waveguide.

Parameters:
  • length (float) – Length of the straight waveguide in μm.

  • cross_section (CrossSectionSpec) – Cross-section specification.

  • npoints (int) – Number of points for the waveguide.

Return type:

Component

straight

straight_all_angle#

waveguides

qpdk.cells.straight_all_angle(length=10.0, npoints=2, cross_section=<function coplanar_waveguide>)[source]#

Returns a Straight waveguide with offgrid ports.

Parameters:
  • length (float) – Length of the straight waveguide in μm.

  • npoints (int) – Number of points for the waveguide.

  • cross_section (CrossSectionSpec) – Cross-section specification.

Return type:

ComponentAllAngle

o1  ──────────────── o2
        length
straight_all_angle

tee#

waveguides

qpdk.cells.tee(cross_section='cpw')[source]#

Returns a three-way tee waveguide.

Parameters:

cross_section (CrossSectionSpec) – specification (CrossSection, string or dict).

Return type:

Component

tee

Chip#

chip_edge#

chip

qpdk.cells.chip_edge(size=(10000.0, 10000.0), width=200.0, layer='M1_ETCH', footprint_layer=None)[source]#

Returns a chip edge component with hollow rectangle frame.

Creates a rectangular frame (hollow rectangle) on an etched metal layer, typically used to define chip edge regions for proper fabrication.

Parameters:
  • size (tuple[float, float]) – (tuple) Width and height of the chip edge area.

  • width (float) – Width/thickness of the etched frame border.

  • layer (LayerSpec) – Layer to put the etched frame on.

  • footprint_layer (LayerSpec | None) – Optional layer to fill the whole chip area on, such as SUBSTRATE for the bottom chip or SUBSTRATE_TOP for the flip-chip top chip. The 3D preview builds that chip’s substrate and ground planes from it.

Return type:

Component

chip_edge

References#

[BKM+13]

R. Barends, J. Kelly, A. Megrant, D. Sank, E. Jeffrey, Y. Chen, Y. Yin, B. Chiaro, J. Mutus, C. Neill, P. O'Malley, P. Roushan, J. Wenner, T. C. White, A. N. Cleland, and John M. Martinis. Coherent Josephson Qubit Suitable for Scalable Quantum Integrated Circuits. Physical Review Letters, 111(8):080502, August 2013. doi:10.1103/PhysRevLett.111.080502.

[BM18]

Ilya Besedin and Alexey P Menushenkov. Quality factor of a transmission line coupled coplanar waveguide resonator. EPJ Quantum Technology, 5(1):2, December 2018. doi:10.1140/epjqt/s40507-018-0066-3.

[BPK+16]

A. Bienfait, J. J. Pla, Y. Kubo, M. Stern, X. Zhou, C. C. Lo, C. D. Weis, T. Schenkel, M. L. W. Thewalt, D. Vion, D. Esteve, B. Julsgaard, K. Mølmer, J. J. L. Morton, and P. Bertet. Reaching the quantum limit of sensitivity in electron spin resonance. Nature Nanotechnology, 11(3):253–257, March 2016. doi:10.1038/nnano.2015.282.

[CSD+23] (1,2)

Qi-Ming Chen, Priyank Singh, Rostislav Duda, Giacomo Catto, Aarne Keränen, Arman Alizadeh, Timm Mörstedt, Aashish Sah, András Gunyhó, Wei Liu, and Mikko Möttönen. Compact inductor-capacitor resonators at sub-gigahertz frequencies. Physical Review Research, 5(4):043126, November 2023. doi:10.1103/PhysRevResearch.5.043126.

[CMD+16]

B. Chiaro, A. Megrant, A. Dunsworth, Z. Chen, R. Barends, B. Campbell, Y. Chen, A. Fowler, I. C. Hoi, E. Jeffrey, J. Kelly, J. Mutus, C. Neill, P. J. J. O'Malley, C. Quintana, P. Roushan, D. Sank, A. Vainsencher, J. Wenner, T. C. White, and John M. Martinis. Dielectric surface loss in superconducting resonators with flux-trapping holes. Superconductor Science and Technology, 29(10):104006, 2016. doi:10.1088/0953-2048/29/10/104006.

[CLS+10]

Katarina Cicak, Dale Li, Joshua A. Strong, Michael S. Allman, Fabio Altomare, Adam J. Sirois, Jed D. Whittaker, John D. Teufel, and Raymond W. Simmonds. Low-loss superconducting resonant circuits using vacuum-gap-based microwave components. Applied Physics Letters, 96(9):093502, March 2010. doi:10.1063/1.3304168.

[CB04]

John Clarke and Alex I. Braginski. The SQUID Handbook. Wiley-VCH, Weinheim, 2004. ISBN 978-3-527-40229-8.

[CB11] (1,2)

John R. Clem and Karl K. Berggren. Geometry-dependent critical currents in superconducting nanocircuits. Physical Review B, 84(17):174510, November 2011. doi:10.1103/PhysRevB.84.174510.

[FML+17]

B. Foxen, J. Y. Mutus, E. Lucero, R. Graff, A. Megrant, Yu Chen, C. Quintana, B. Burkett, J. Kelly, E. Jeffrey, Yan Yang, Anthony Yu, K. Arya, R. Barends, Zijun Chen, B. Chiaro, A. Dunsworth, A. Fowler, C. Gidney, M. Giustina, T. Huang, P. Klimov, M. Neeley, C. Neill, P. Roushan, D. Sank, A. Vainsencher, J. Wenner, T. C. White, and John M. Martinis. Qubit compatible superconducting interconnects. Quantum Science and Technology, 3(1):014005, December 2017. arXiv:1708.04270, doi:10.1088/2058-9565/aa94fc.

[HH63]

F. B. Hagedorn and P. M. Hall. Right-angle bends in thin strip conductors. Journal of Applied Physics, 34(1):128–133, January 1963. doi:10.1063/1.1729052.

[HKC+22]

Eric Hyyppa, Suman Kundu, Chun Fai Chan, András Gunyhó, Juho Hotari, David Janzso, Kristinn Juliusson, Olavi Kiuru, Janne Kotilahti, Alessandro Landra, Wei Liu, Fabian Marxer, Akseli Mäkinen, Jean-Luc Orgiazzi, Mario Partanen, Jukka Räbinä, Joni Rönkkö, Mykhailo Seppälä, Slawomir Simbierowicz, Vasilii Sokolov, Jani Suuronen, Francesca Tozzini, Mikko Tuokkola, Jami Viitanen, Visa Vesterinen, Zijun Zhang, Leif Grönberg, Joonas Govenius, and Mikko Möttönen. Unimon qubit. Nature Communications, 13(1):6895, November 2022. doi:10.1038/s41467-022-34614-w.

[JCL+22]

Chaitali Joshi, Wenyuan Chen, Henry G. LeDuc, Peter K. Day, and Mohammad Mirhosseini. Strong kinetic-inductance kerr nonlinearity with titanium nitride nanowires. Physical Review Applied, 18(6):064088, December 2022. doi:10.1103/PhysRevApplied.18.064088.

[KVK+26]

Dmitrii S. Kalashnikov, Denis Yu. Vodolazov, Ruslan I. Kinzibaev, Andrei G. Shishkin, and Vasily S. Stolyarov. Equidistant resonance jumps in superconducting coplanar resonators driven by Abrikosov vortices. Physical Review B, 114:024502, 2026. doi:10.1103/d3wg-6ls3.

[KVH+11] (1,2)

Z. Kim, C. P. Vlahacos, J. E. Hoffman, J. A. Grover, K. D. Voigt, B. K. Cooper, C. J. Ballard, B. S. Palmer, M. Hafezi, J. M. Taylor, J. R. Anderson, A. J. Dragt, C. J. Lobb, L. A. Orozco, S. L. Rolston, and F. C. Wellstood. Thin-film superconducting resonator tunable to the ground-state hyperfine splitting of ⁸⁷Rb. AIP Advances, 1(4):042107, December 2011. doi:10.1063/1.3651466.

[KYG+07]

Jens Koch, Terri M. Yu, Jay Gambetta, A. A. Houck, D. I. Schuster, J. Majer, Alexandre Blais, M. H. Devoret, S. M. Girvin, and R. J. Schoelkopf. Charge-insensitive qubit design derived from the Cooper pair box. Physical Review A, 76(4):042319, October 2007. doi:10.1103/PhysRevA.76.042319.

[KollarFH19] (1,2)

Alicia J. Kollár, Mattias Fitzpatrick, and Andrew A. Houck. Hyperbolic lattices in circuit quantum electrodynamics. Nature, 571(7763):45–50, July 2019. arXiv:1802.09549, doi:10.1038/s41586-019-1348-3.

[LWJ+25]

Xuegang Li, Junhua Wang, Yao-Yao Jiang, Guang-Ming Xue, Xiaoxia Cai, Jun Zhou, Ming Gong, Zhao-Feng Liu, Shuang-Yu Zheng, Deng-Ke Ma, Mo Chen, Wei-Jie Sun, Shuang Yang, Fei Yan, Yi-Rong Jin, S. P. Zhao, Xue-Feng Ding, and Hai-Feng Yu. Cosmic-ray-induced correlated errors in superconducting qubit array. Nature Communications, 16(1):4677, May 2025. doi:10.1038/s41467-025-59778-z.

[LZY+21]

Xuegang Li, Yingshan Zhang, Chuhong Yang, Zhiyuan Li, Junhua Wang, Tang Su, Mo Chen, Yongchao Li, Chengyao Li, Zhenyu Mi, Xuehui Liang, Chenlu Wang, Zhen Yang, Yulong Feng, Kehuan Linghu, Huikai Xu, Jiaxiu Han, Weiyang Liu, Peng Zhao, Teng Ma, Ruixia Wang, Jingning Zhang, Yu Song, Pei Liu, Ziting Wang, Zhaohua Yang, Guangming Xue, Yirong Jin, and Haifeng Yu. Vacuum-gap transmon qubits realized using flip-chip technology. Applied Physics Letters, 119(18):184003, November 2021. doi:10.1063/5.0068255.

[LIK+14]

Z. R. Lin, K. Inomata, K. Koshino, W. D. Oliver, Y. Nakamura, J. S. Tsai, and T. Yamamoto. Josephson parametric phase-locked oscillator and its application to dispersive readout of superconducting qubits. Nature Communications, 5(1):4480, 2014. doi:10.1038/ncomms5480.

[MP12]

David M. Pozar. Microwave Engineering. John Wiley & Sons, Inc., 4 edition, 2012. ISBN 978-0-470-63155-3.

[MGK+18]

N. Maleeva, L. Grünhaupt, T. Klein, F. Levy-Bertrand, O. Dupre, M. Calvo, F. Valenti, P. Winkel, F. Friedrich, W. Wernsdorfer, A. V. Ustinov, H. Rotzinger, A. Monfardini, M. V. Fistul, and I. M. Pop. Circuit quantum electrodynamics of granular aluminum resonators. Nature Communications, 9(1):3889, September 2018. doi:10.1038/s41467-018-06386-9.

[MYR+21] (1,2,3)

Justin L. Mallek, Donna-Ruth W. Yost, Danna Rosenberg, Jonilyn L. Yoder, Gregory Calusine, Matt Cook, Rabindra Das, Alexandra Day, Evan Golden, David K. Kim, Jeffery Knecht, Bethany M. Niedzielski, Mollie Schwartz, Arjan Sevi, Corey Stull, Wayne Woods, Andrew J. Kerman, and William D. Oliver. Fabrication of superconducting through-silicon vias. March 2021. doi:10.48550/arXiv.2103.08536.

[MKGD09] (1,2,3,4,5,6)

Vladimir E. Manucharyan, Jens Koch, Leonid I. Glazman, and Michel H. Devoret. Fluxonium: Single Cooper-Pair Circuit Free of Charge Offsets. Science, 326(5949):113–116, October 2009. doi:10.1126/science.1175552.

[MPK+12] (1,2)

Nicholas A. Masluk, Ioan M. Pop, Archana Kamal, Zlatko K. Minev, and Michel H. Devoret. Microwave Characterization of Josephson Junction Arrays: Implementing a Low Loss Superinductance. Physical Review Letters, 109(13):137002, September 2012. doi:10.1103/PhysRevLett.109.137002.

[MdLepinayDamskaggOKSillanpaa19]

Laure Mercier de Lépinay, Erno Damskägg, Caspar F. Ockeloen-Korppi, and Mika A. Sillanpää. Realization of directional amplification in a microwave optomechanical device. Physical Review Applied, 11(3):034027, March 2019. doi:10.1103/PhysRevApplied.11.034027.

[NLS+19]

Long B. Nguyen, Yen-Hsiang Lin, Aaron Somoroff, Raymond Mencia, Nicholas Grabon, and Vladimir E. Manucharyan. High-Coherence Fluxonium Qubit. Physical Review X, 9(4):041041, December 2019. doi:10.1103/PhysRevX.9.041041.

[NP14] (1,2,3,4)

I. Nsanzineza and B. L. T. Plourde. Trapping a single vortex and reducing quasiparticles in a superconducting resonator. Physical Review Letters, 113(11):117002, 2014. doi:10.1103/PhysRevLett.113.117002.

[OKDamskaggP+16]

C. F. Ockeloen-Korppi, E. Damskägg, J.-M. Pirkkalainen, T. T. Heikkilä, F. Massel, and M. A. Sillanpää. Low-noise amplification and frequency conversion with a multiport microwave optomechanical device. Physical Review X, 6(4):041024, October 2016. doi:10.1103/PhysRevX.6.041024.

[PDamskaggB+15] (1,2,3,4)

J.-M. Pirkkalainen, E. Damskägg, M. Brandt, F. Massel, and M. A. Sillanpää. Squeezing of quantum noise of motion in a micromechanical resonator. Physical Review Letters, 115(24):243601, December 2015. doi:10.1103/PhysRevLett.115.243601.

[PFZ+17] (1,2)

S. Pogorzalek, K. G. Fedorov, L. Zhong, J. Goetz, F. Wulschner, M. Fischer, P. Eder, E. Xie, K. Inomata, T. Yamamoto, Y. Nakamura, A. Marx, F. Deppe, and R. Gross. Hysteretic flux response and nondegenerate gain of flux-driven Josephson parametric amplifiers. Physical Review Applied, 8(2):024012, 2017. doi:10.1103/PhysRevApplied.8.024012.

[RPA+20] (1,2)

V. Ranjan, S. Probst, B. Albanese, T. Schenkel, D. Vion, D. Esteve, J. J. L. Morton, and P. Bertet. Electron spin resonance spectroscopy with femtoliter detection volume. Applied Physics Letters, 116(18):184002, May 2020. doi:10.1063/5.0004322.

[RBF+26]

L. Richard, N. Bruckmoser, J. Feigl, D. Bunch, A. Bhattacharjee, L. Koch, I. Tsitsilin, V. P. Bader, H. Hu, L. Södergren, and S. Filipp. Accurate gap control of 3D-integrated superconducting quantum circuits using asymmetric indium architecture and multi-angle flip-chip bonding. October 2026. doi:10.48550/arXiv.2610.21435.

[RAP+25]

H. Riechert, S. Annabi, A. Peugeot, H. Duprez, M. Hantute, K. Watanabe, T. Taniguchi, E. Arrighi, J. Griesmar, J.-D. Pillet, and L. Bretheau. The carbon nanotube gatemon qubit. Nature Communications, 16(1):7197, August 2025. doi:10.1038/s41467-025-62283-y.

[RKD+17] (1,2)

D. Rosenberg, D. Kim, R. Das, D. Yost, S. Gustavsson, D. Hover, P. Krantz, A. Melville, L. Racz, G. O. Samach, S. J. Weber, F. Yan, J. L. Yoder, A. J. Kerman, and W. D. Oliver. 3D integrated superconducting qubits. npj Quantum Information, 3(1):42, October 2017. doi:10.1038/s41534-017-0044-0.

[SNV+26] (1,2)

Kirill Shulga, Shunsuke Nishimura, Pavel A. Volkov, Miu Hirano, Toshiaki Inada, Ryota Hasegawa, Takeyuki Tsuji, Takayuki Iwasaki, Mutsuko Hatano, Kento Sasaki, and Kensuke Kobayashi. Observation of individual vortex penetration in a coplanar superconducting resonator. Physical Review Letters, 137:116001, 2026. doi:10.1103/4zw3-hm6t.

[TVT+24]

Sasu Tuohino, Vasilii Vadimov, Wallace Teixeira, Tommi Malmelin, Matti Silveri, and Mikko Möttönen. Multimode physics of the unimon circuit. Physical Review Research, 6(3):033001, July 2024. doi:10.1103/PhysRevResearch.6.033001.

[TSK+25]

Mikko Tuokkola, Yoshiki Sunada, Heidi Kivijärvi, Jonatan Albanese, Leif Grönberg, Jukka-Pekka Kaikkonen, Visa Vesterinen, Joonas Govenius, and Mikko Möttönen. Methods to achieve near-millisecond energy relaxation and dephasing times for a superconducting transmon qubit. Nature Communications, 16(1):5421, July 2025. doi:10.1038/s41467-025-61126-0.

[YIW+08] (1,2,3)

T. Yamamoto, K. Inomata, M. Watanabe, K. Matsuba, T. Miyazaki, W. D. Oliver, Y. Nakamura, and J. S. Tsai. Flux-driven Josephson parametric amplifier. Applied Physics Letters, 93(4):042510, July 2008. arXiv:0808.1386, doi:10.1063/1.2964182.

[YSM+20]

D. R. W. Yost, M. E. Schwartz, J. Mallek, D. Rosenberg, C. Stull, J. L. Yoder, G. Calusine, M. Cook, R. Das, A. L. Day, E. B. Golden, D. K. Kim, A. Melville, B. M. Niedzielski, W. Woods, A. J. Kerman, and W. D. Oliver. Solid-state qubits integrated with superconducting through-silicon vias. npj Quantum Information, 6(1):59, July 2020. doi:10.1038/s41534-020-00289-8.

[LeiZhuW00]

Lei Zhu and Ke Wu. Accurate circuit model of interdigital capacitor and its application to design of new quasi-lumped miniaturized filters with suppression of harmonic resonance. IEEE Transactions on Microwave Theory and Techniques, 48(3):347–356, March 2000. doi:10.1109/22.826833.