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)
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))
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]
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]
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
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]]