Source code for qpdk.cells.derived.transmon_with_resonator

"""Transmons with resonators coupled."""

from __future__ import annotations

from functools import partial

import gdsfactory as gf
from gdsfactory.component import Component
from gdsfactory.typings import ComponentSpec
from klayout.db import DCplxTrans

from qpdk.cells.capacitor import plate_capacitor_single
from qpdk.cells.resonator import ResonatorParams, resonator_quarter_wave
from qpdk.tech import LAYER, route_single_cpw


[docs] @gf.cell_with_module_name def transmon_with_resonator( transmon: ComponentSpec = "double_pad_transmon_with_bbox", resonator: ComponentSpec = partial(resonator_quarter_wave, length=4000, meanders=6), resonator_meander_start: tuple[float, float] = (-700, -1300), resonator_length: float = 5000.0, resonator_params: ResonatorParams | None = None, coupler: ComponentSpec = partial(plate_capacitor_single, thickness=20, fingers=18), ) -> Component: """Returns a transmon qubit coupled to a quarter wave resonator. Args: transmon: Transmon component. resonator: Resonator component. resonator_meander_start: (x, y) position of the start of the resonator meander. resonator_length: Length of the resonator in µm. resonator_params: Parameters for the resonator component if it accepts any. coupler: Coupler component. """ c = Component() resonator_params = resonator_params or ResonatorParams(meanders=5) transmon_ref = c << gf.get_component(transmon) transmon_ref.rotate(90) coupler_ref = c << gf.get_component(coupler) # Position coupler close to transmon coupler_ref.transform( transmon_ref.ports["left_pad"].dcplx_trans * DCplxTrans.R180 * DCplxTrans(-45, 0) ) # Route to resonator input resonator_input_port = gf.Port( name="resonator_input", center=resonator_meander_start, orientation=0, layer=LAYER.M1_DRAW, width=10.0, ) route = route_single_cpw( component=c, port1=resonator_input_port, port2=coupler_ref.ports["o1"], steps=[{"x": coupler_ref.ports["o1"].x}], auto_taper=False, ) resonator_ref = c << gf.get_component( resonator, length=resonator_length - route.length * c.kcl.dbu, **resonator_params, ) resonator_ref.rotate(180) resonator_ref.transform(resonator_input_port.dcplx_trans) c.info["qubit_type"] = transmon_ref.cell.info.get("qubit_type") c.info["resonator_type"] = resonator_ref.cell.info.get("resonator_type") c.info["coupler_type"] = coupler_ref.cell.info.get("coupler_type") c.info["length"] = resonator_ref.cell.info.get("length") + route.length * c.kcl.dbu c.add_ports([p for p in transmon_ref.ports if p.name == "junction"]) c.add_ports([p for p in resonator_ref.ports if p.name == "o1"]) return c
if __name__ == "__main__": from qpdk import PDK PDK.activate() c = transmon_with_resonator() c.show()