예제 #1
0
    def init_primitives(self):
        origin = DPoint(0, 0)

        # square box that clears out the area of the mark
        self.primitives["empty_box"] = Rectangle(DPoint(
            -self.leaf_outer, -self.leaf_outer),
                                                 2 * self.leaf_outer,
                                                 2 * self.leaf_outer,
                                                 inverse=True)

        self.primitives["cross"] = Cross(
            DPoint(-self.cross_out_a / 2, -self.cross_out_a / 2),
            self.cross_in_a, self.cross_out_a)

        Z = CPWParameters(self.leaf_outer - self.leaf_inner, 0)

        for i in range(self.leafs_N):
            start_angle = i * (self.leaf_angle +
                               self.empty_leaf_angle) - self.leaf_angle / 2
            trans = DCplxTrans(1, start_angle + 90, False, 0, -self.avg_r)
            self.primitives["leaf_" + str(i)] = CPW_arc(Z,
                                                        origin,
                                                        self.avg_r,
                                                        self.leaf_angle * pi /
                                                        180,
                                                        trans_in=trans)

        Z_empty = CPWParameters(0, self.empty_rings_width / 2)
        for i in range(1, self.empty_rings_N + 1):
            r = self.leaf_inner + (self.leaf_outer - self.leaf_inner) / (
                self.empty_rings_N + 1) * i
            self.primitives["empty_ring_" + str(i)] = CPW_arc(
                Z_empty, DVector(0, -r), r, 2 * pi)
예제 #2
0
    def init_half(self, origin, side=-1):
        # side = -1 is left, 1 is right
        up_st_gap = self.sq_area / (2 * self.sq_len)
        low_st_gap = up_st_gap + self.low_lead_w * 2.5
        up_st_start_p = self.primitives["p_ext_up"].connections[1]
        low_st_start_p = self.primitives["p_ext_down"].connections[1]

        up_st_start = up_st_start_p + DVector(side * up_st_gap / 2, 0)
        up_st_stop = origin + DVector(side * up_st_gap / 2, self.bridge / 2)
        low_st_start = low_st_start_p + DVector(side * low_st_gap / 2, 0)
        low_st_stop = origin + DVector(side * (low_st_gap / 2 - self.b_ext),
                                       -self.bridge / 2)
        Z_low = CPWParameters(self.j_length, 0)
        Z_low2 = CPWParameters(self.low_lead_w, 0)
        len_ly = (low_st_stop - low_st_start).y - Z_low2.width / 2
        len_lb = side * (low_st_start - low_st_stop).x - Z_low2.width / 2

        suff = "_left" if side < 0 else "_right"
        self.primitives["upp_st" + suff] = Kolbaska(up_st_start, up_st_stop,
                                                    self.j_width,
                                                    self.j_width / 4)
        self.primitives["upp_st_thick" + suff] = Kolbaska(
            up_st_start, up_st_stop + DPoint(0, 400), self.low_lead_w,
            self.low_lead_w / 2)
        self.primitives["low_st" + suff] = CPW_RL_Path(low_st_start, 'LR', Z_low2, Z_low2.width/2,\
                                                    [len_ly],[side * pi/2],trans_in = DTrans.R90)
        self.primitives["low_st_jj" + suff] = CPW(Z_low.width, Z_low.gap, low_st_stop + DPoint(side * (self.b_ext - Z_low2.width/2),\
                                                 -self.j_length/2), low_st_stop + DPoint(0, -self.j_length/2))
예제 #3
0
    def __init__(self,
                 origin,
                 pcb_cpw_params=CPWParameters(width=200e3, gap=120e3),
                 chip_cpw_params=CPWParameters(width=24.1e3, gap=12.95e3),
                 pad_length=300e3,
                 back_metal_width=0,
                 back_metal_gap=None,
                 transition_len=150e3,
                 trans_in=None):

        self.pcb_cpw_params: CPWParameters = pcb_cpw_params
        self.chip_cpw_params: CPWParameters = chip_cpw_params
        self.pad_length = pad_length
        self.back_metal_length = back_metal_width
        if back_metal_gap is not None:
            self.back_metal_gap = back_metal_gap
        else:
            self.back_metal_gap = self.pcb_cpw_params.gap
        self.transition_length = transition_len

        super().__init__(origin, trans_in)

        self.start = self.connections[0]
        self.end = self.connections[1]
예제 #4
0
    def __init__(self,
                 origin,
                 w_JJ,
                 h_JJ,
                 asymmetry,
                 JJ_site_span,
                 frame_cpw_params=CPWParameters(200e3, 8e3),
                 frame_length=200e3,
                 trans_in=None,
                 use_cell=False):

        self._frame_cpw_params = frame_cpw_params
        self._frame_length = frame_length
        self._h_JJ, self._w_JJ = h_JJ, w_JJ
        self._asymmetry = asymmetry
        self._JJ_site_span = JJ_site_span
        self._use_cell = use_cell
        self._origin = origin

        super().__init__(origin, trans_in)

        self.start = self.connections[0]
        self.end = self.connections[1]
예제 #5
0
class CHIP:
    """
    10x10 mm chip
    PCB design located here:
    https://drive.google.com/drive/folders/1TGjD5wwC28ZiLln_W8M6gFJpl6MoqZWF?usp=sharing
    """
    dx = 10e6
    dy = 10e6

    pcb_width = 260e3  # 0.26 mm
    pcb_gap = 190e3  # (0.64 - 0.26) / 2 = 0.19 mm
    pcb_feedline_d = 2500e3  # 2.5 mm
    pcb_Z = CPWParameters(pcb_width, pcb_gap)

    cpw_width = 24.1e3
    cpw_gap = 12.95e3
    chip_Z = CPWParameters(cpw_width, cpw_gap)

    @staticmethod
    def get_contact_pads():
        dx = CHIP.dx
        dy = CHIP.dy
        pcb_feedline_d = CHIP.pcb_feedline_d
        pcb_Z = CHIP.pcb_Z
        chip_Z = CHIP.chip_Z

        contact_pads_left = [
            ContactPad(
                DPoint(0, dy - pcb_feedline_d * (i + 1)), pcb_Z, chip_Z, back_metal_width=50e3,
                back_metal_gap=100e3
            ) for i in range(3)
        ]

        contact_pads_bottom = [
            ContactPad(
                DPoint(pcb_feedline_d * (i + 1), 0), pcb_Z, chip_Z, back_metal_width=50e3,
                back_metal_gap=100e3,
                trans_in=Trans.R90
            ) for i in range(3)
        ]

        contact_pads_right = [
            ContactPad(
                DPoint(dx, pcb_feedline_d*(i+1)), pcb_Z, chip_Z, back_metal_width=50e3,
                back_metal_gap=100e3,
                trans_in=Trans.R180
            ) for i in range(3)
        ]

        contact_pads_top = [
            ContactPad(
                DPoint(dx - pcb_feedline_d * (i + 1), dy), pcb_Z, chip_Z, back_metal_width=50e3,
                back_metal_gap=100e3,
                trans_in=Trans.R270
            ) for i in range(3)
        ]

        # contact pads are ordered starting with top-left corner in counter-clockwise direction
        contact_pads = itertools.chain(
            contact_pads_left, contact_pads_bottom,
            contact_pads_right, contact_pads_top
        )

        return list(contact_pads)

    origin = DPoint(0, 0)
    box = pya.DBox(origin, origin + DPoint(dx, dy))

    @staticmethod
    def get_geometry_params_dict(prefix="", postfix=""):
        from collections import OrderedDict
        geometry_params = OrderedDict(
            [
                ("dx, um", CHIP.dx / 1e3),
                ("dy, um", CHIP.dy / 1e3),
                ("nX", CHIP.nX),
                ("nY", CHIP.nY)
            ]
        )
        modified_dict = OrderedDict()
        for key, val in geometry_params.items():
            modified_dict[prefix + key + postfix] = val
        return modified_dict
예제 #6
0
    origin = DPoint(0, 0)
    # clear this cell and layer
    cell.clear()
    tmp_reg = Region()  # faster to call `place` on single region

    # place chip metal layer
    chip_box = pya.Box(DPoint(0, 0), DPoint(CHIP.dx, CHIP.dy))
    tmp_reg.insert(chip_box)
    contact_pads = CHIP.get_contact_pads()
    for contact_pad in contact_pads:
        contact_pad.place(tmp_reg)

    # place readout waveguide
    ro_line_turn_radius = 200e3
    ro_line_dy = 600e3
    Z0 = CPWParameters(CHIP.cpw_width, CHIP.cpw_gap)
    cpwrl_ro = CPW_RL_Path(
        contact_pads[-1].end,
        shape="LRLRL",
        cpw_parameters=Z0,
        turn_radiuses=[ro_line_turn_radius] * 2,
        segment_lengths=[ro_line_dy, CHIP.pcb_feedline_d, ro_line_dy],
        turn_angles=[pi / 2, pi / 2],
        trans_in=Trans.R270)
    cpwrl_ro.place(tmp_reg)

    # resonators parameters
    L_coupling_list = [1e3 * x for x in [255, 250, 250, 240, 230]]
    # corresponding to resonanse freq is linspaced in interval [6,9) GHz
    L0 = 1600e3
    L1_list = [1e3 * x for x in [37.7039, 67.6553, 90.925, 81.5881, 39.9021]]