Note
This page was generated from tut/full-design-examples/Reference-design-2-Two-coupled-transmons.ipynb.
Reference design 2 — Two coupled transmons¶
Two transmons, each with its own multiplexed readout resonator, joined by a meandered coplanar-waveguide coupling bus — the building block of a two-qubit gate.
Reference design — attribution. Adapted, with attribution, from the open-source SQDMetal project (Apache-2.0) and its benchmark devices in D. Sommers, P. Pakkiam, Z. Degnan, C.-C. Chiu, D. Gautam, Y.-H. Chen, and A. Fedorov, “Open-Source Highly Parallel Electromagnetic Simulations for Superconducting Circuits,” arXiv:2511.01220 (2025). Re-implemented here with stock Quantum Metal components.
[1]:
# In Colab / Binder, uncomment to install Quantum Metal (lite, no Qt):
# !pip install -q quantum-metal
[2]:
import qiskit_metal as qm
from qiskit_metal import Dict, designs
from qiskit_metal.qlibrary.qubits.transmon_pocket import TransmonPocket
from qiskit_metal.qlibrary.tlines.meandered import RouteMeander
from qiskit_metal.qlibrary.tlines.pathfinder import RoutePathfinder
from qiskit_metal.qlibrary.couplers.coupled_line_tee import CoupledLineTee
from qiskit_metal.qlibrary.terminations.launchpad_wb import LaunchpadWirebond
design = designs.DesignPlanar()
design.overwrite_enabled = True
09:27PM 19s INFO [_start_renderers]: Renderer=gmsh skipped: runtime dependency not installed (renderer_gmsh requires gmsh. Install with: pip install 'quantum-metal[mesh]' (or the legacy alias 'quantum-metal[fem]')).
[3]:
def feed(a, ap, b, bp, name):
"""Auto-route a coplanar-waveguide feedline segment between two pins."""
RoutePathfinder(
design,
name,
options=dict(
fillet="90um",
pin_inputs=Dict(
start_pin=Dict(component=a, pin=ap), end_pin=Dict(component=b, pin=bp)
),
),
)
def readout(clt, q, name, length):
"""Meandered lambda/4 readout resonator: coupled-line tee -> qubit readout pad."""
RouteMeander(
design,
name,
options=dict(
fillet="90um",
total_length=length,
lead=Dict(start_straight="100um", end_straight="100um"),
pin_inputs=Dict(
start_pin=Dict(component=clt, pin="second_end"),
end_pin=Dict(component=q, pin="readout"),
),
),
)
1. Two transmons¶
Each transmon gets a readout pad (top, outward) and a coupler pad (bottom, facing its neighbour).
[4]:
TransmonPocket(
design,
"Q1",
options=dict(
pos_x="-2.5mm",
pos_y="-1.5mm",
pad_width="425um",
pocket_height="650um",
connection_pads=dict(
readout=dict(loc_W=-1, loc_H=1), coupler=dict(loc_W=1, loc_H=-1)
),
),
)
TransmonPocket(
design,
"Q2",
options=dict(
pos_x="2.5mm",
pos_y="-1.5mm",
pad_width="425um",
pocket_height="650um",
connection_pads=dict(
readout=dict(loc_W=1, loc_H=1), coupler=dict(loc_W=-1, loc_H=-1)
),
),
)
[4]:
name: Q2
class: TransmonPocket
options:
'pos_x' : '2.5mm',
'pos_y' : '-1.5mm',
'orientation' : '0.0',
'chip' : 'main',
'layer' : '1',
'connection_pads' : {
'readout' : {
'pad_gap' : '15um',
'pad_width' : '125um',
'pad_height' : '30um',
'pad_cpw_shift' : '5um',
'pad_cpw_extent' : '25um',
'cpw_width' : 'cpw_width',
'cpw_gap' : 'cpw_gap',
'cpw_extend' : '100um',
'pocket_extent' : '5um',
'pocket_rise' : '65um',
'loc_W' : 1,
'loc_H' : 1,
},
'coupler' : {
'pad_gap' : '15um',
'pad_width' : '125um',
'pad_height' : '30um',
'pad_cpw_shift' : '5um',
'pad_cpw_extent' : '25um',
'cpw_width' : 'cpw_width',
'cpw_gap' : 'cpw_gap',
'cpw_extend' : '100um',
'pocket_extent' : '5um',
'pocket_rise' : '65um',
'loc_W' : -1,
'loc_H' : -1,
},
},
'pad_gap' : '30um',
'inductor_width' : '20um',
'pad_width' : '425um',
'pad_height' : '90um',
'pocket_width' : '650um',
'pocket_height' : '650um',
'hfss_wire_bonds' : False,
'q3d_wire_bonds' : False,
'aedt_q3d_wire_bonds': False,
'aedt_hfss_wire_bonds': False,
'hfss_inductance' : '10nH',
'hfss_capacitance' : 0,
'hfss_resistance' : 0,
'hfss_mesh_kw_jj' : 7e-06,
'q3d_inductance' : '10nH',
'q3d_capacitance' : 0,
'q3d_resistance' : 0,
'q3d_mesh_kw_jj' : 7e-06,
'gds_cell_name' : 'my_other_junction',
'aedt_q3d_inductance': 1e-08,
'aedt_q3d_capacitance': 0,
'aedt_hfss_inductance': 1e-08,
'aedt_hfss_capacitance': 0,
module: qiskit_metal.qlibrary.qubits.transmon_pocket
id: 2
3. Qubit-qubit coupling bus¶
A meandered CPW between the two coupler pads sets the exchange coupling.
[6]:
RouteMeander(
design,
"coupler_bus",
options=dict(
fillet="90um",
total_length="8mm",
lead=Dict(start_straight="150um", end_straight="150um"),
meander=Dict(asymmetry="200um"),
pin_inputs=Dict(
start_pin=Dict(component="Q1", pin="coupler"),
end_pin=Dict(component="Q2", pin="coupler"),
),
),
)
09:27PM 19s WARNING [check_lengths]: For path table, component=coupler_bus, key=trace has short segments that could cause issues with fillet. Values in (37-38) are index(es) in shapely geometry.
09:27PM 19s WARNING [check_lengths]: For path table, component=coupler_bus, key=cut has short segments that could cause issues with fillet. Values in (37-38) are index(es) in shapely geometry.
[6]:
name: coupler_bus
class: RouteMeander
options:
'chip' : 'main',
'layer' : '1',
'pin_inputs' : {
'start_pin' : {
'component' : 'Q1',
'pin' : 'coupler',
},
'end_pin' : {
'component' : 'Q2',
'pin' : 'coupler',
},
},
'fillet' : '90um',
'lead' : {
'start_straight' : '150um',
'end_straight' : '150um',
'start_jogged_extension': '',
'end_jogged_extension': '',
},
'total_length' : '8mm',
'trace_width' : 'cpw_width',
'meander' : {
'spacing' : '200um',
'asymmetry' : '200um',
},
'snap' : 'true',
'prevent_short_edges': 'true',
'hfss_wire_bonds' : False,
'q3d_wire_bonds' : False,
'aedt_q3d_wire_bonds': False,
'aedt_hfss_wire_bonds': False,
'trace_gap' : 'cpw_gap',
'_actual_length' : '7.898275863494531 mm',
module: qiskit_metal.qlibrary.tlines.meandered
id: 12
4. Visualize¶
Next steps¶
Inspect the design tree:
design.components.keys()anddesign.qgeometry.tables.Export GDS for fabrication:
design.renderers.gds.export_to_gds('chip.gds')(Quantum Metal uses the moderngdstkbackend).Simulate: render to Ansys HFSS/Q3D (the validation gold standard) or to the open-source FEM path (Gmsh + Elmer today; AWS Palace on the roadmap) to extract eigenmodes, Q, and the capacitance matrix.
Tweak: every dimension above is a parameter — change
total_lengthto retune resonator frequencies, orpos_x/pos_yto relayout.
[7]:
design.components.keys()
[7]:
['Q1',
'Q2',
'clt1',
'clt2',
'LP1',
'LP2',
'feed_L',
'feed_M',
'feed_R',
'read1',
'read2',
'coupler_bus']
[8]:
fig = qm.view(design)
qm.show_inline(fig)
For more information, review the Introduction to Quantum Computing and Quantum Hardware lectures below
|
Lecture Video | Lecture Notes | Lab |
|
Lecture Video | Lecture Notes | Lab |
|
Lecture Video | Lecture Notes | Lab |
|
Lecture Video | Lecture Notes | Lab |
|
Lecture Video | Lecture Notes | Lab |
|
Lecture Video | Lecture Notes | Lab |