Source code for qiskit_metal.qlibrary.terminations.launchpad_wb_coupled

# -*- coding: utf-8 -*-

# This code is part of Qiskit.
#
# (C) Copyright IBM 2017, 2021.
#
# This code is licensed under the Apache License, Version 2.0. You may
# obtain a copy of this license in the LICENSE.txt file in the root directory
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
#
# Any modifications or derivative works of this code must retain this
# copyright notice, and modified files need to carry a notice indicating
# that they have been altered from the originals.

#  This a launch structure used on BlueJayV2, used for wire bonding
#  There is no CPW tee attached to this p#

# Imports required for drawing

# import numpy as np # (currently not used, may be needed later for component customization)
from qiskit_metal import draw
from qiskit_metal.toolbox_python.attr_dict import Dict
from qiskit_metal.qlibrary.core import QComponent

# Define class and options for the launch geometry


[docs] class LaunchpadWirebondCoupled(QComponent): """Launch pad to feed/read signals to/from the chip. Inherits 'QComponent' class. .. image: LaunchpadWirebondCoupled.png .. meta:: Launchpad Wirebond Coupled Creates a 50 ohm launch pad with a ground pocket cutout. Limited but expandable parameters to control the launchpad polygons. The (0,0) point is the center of the necking of the launch tip. The pin attaches directly to the built in lead length at its midpoint This launch has an inductive coupler section. Pocket and pad: Pocket and launch pad geometries are currently fixed. (0,0) point is the midpoint of the necking of the launch tip. Pocket is a negative shape that is cut out of the ground plane Values (unless noted) are strings with units included, (e.g., '30um') Sketch: Below is a sketch of the launch :: ----------- | \ | ------------\\ |-- | | O --------| (0,0) pin at midpoint of necking, before the coupling section | ------------// |-- | / ----------- y ^ | |------> x .. image:: LaunchpadWirebondCoupled.png Default Options: * trace_width: 'cpw_width' -- center trace width of the terminating transmission line * trace_gap: 'cpw_gap' -- gap of the transmission line * coupler_length: '62.5um' -- distance between the necking and the end of the coupler external finger * lead_length: '25um' -- length of the cpw line attached to the end of the launch pad """ default_options = Dict(trace_width='cpw_width', trace_gap='cpw_gap', coupler_length='62.5um', lead_length='25um') """Default options""" TOOLTIP = """Launch pad to feed/read signals to/from the chip."""
[docs] def make(self): """This is executed by the user to generate the qgeometry for the component.""" p = self.p lead_length = p.lead_length trace_width = p.trace_width trace_width_half = trace_width / 2 trace_gap = p.trace_gap inner_finger_width = .001 inner_finger_width_half = inner_finger_width / 2 inner_finger_offset = .015 finger_side_gap = .002 outer_finger_tip_gap = .0075 inner_finger_tip_gap = .05 + inner_finger_offset outer_finger_width = (trace_width - inner_finger_width - 2 * finger_side_gap) / 2 coupler_length = p.coupler_length lead_offset = coupler_length + outer_finger_tip_gap ######################################################### # Geometry of main launch structure launch_pad = draw.Polygon([ (0, trace_width_half), (-.122, trace_width_half + .035), (-.202, trace_width_half + .035), (-.202, -trace_width_half - .035), (-.122, -trace_width_half - .035), (0, -trace_width_half), (coupler_length, -trace_width_half), (coupler_length, -trace_width_half + outer_finger_width), (-inner_finger_tip_gap + inner_finger_offset, -trace_width_half + outer_finger_width), (-inner_finger_tip_gap + inner_finger_offset, trace_width_half - outer_finger_width), (coupler_length, trace_width_half - outer_finger_width), (coupler_length, trace_width_half), (0, trace_width / 2) ]) # Geometry of coupling structure ind_stub = draw.Polygon([ (inner_finger_offset, -inner_finger_width_half), (lead_offset, -inner_finger_width_half), (lead_offset, -trace_width_half), (lead_offset + lead_length, -trace_width_half), (lead_offset + lead_length, trace_width_half), (lead_offset, trace_width_half), (lead_offset, +inner_finger_width_half), (inner_finger_offset, +inner_finger_width_half), (inner_finger_offset, -inner_finger_width_half) ]) # Geometry pocket (gap) pocket = draw.Polygon([ (0, trace_width_half + trace_gap), (-.122, trace_width_half + trace_gap + .087), (-.25, trace_width_half + trace_gap + .087), (-.25, -trace_width_half - trace_gap - .087), (-.122, -trace_width_half - trace_gap - .087), (0, -trace_width_half - trace_gap), (lead_offset + lead_length, -trace_width_half - trace_gap), (lead_offset + lead_length, +trace_width_half + trace_gap), (0, trace_width_half + trace_gap) ]) # These variables are used to graphically locate the pin locations main_pin_line = draw.LineString([ (lead_offset + lead_length, trace_width_half), (lead_offset + lead_length, -trace_width_half) ]) # Create polygon object list polys1 = [main_pin_line, launch_pad, ind_stub, pocket] # Rotates and translates all the objects as requested. Uses package functions # in 'draw_utility' for easy rotation/translation polys1 = draw.rotate(polys1, p.orientation, origin=(0, 0)) polys1 = draw.translate(polys1, xoff=p.pos_x, yoff=p.pos_y) [main_pin_line, launch_pad, ind_stub, pocket] = polys1 # Adds the object to the qgeometry table self.add_qgeometry('poly', dict(launch_pad=launch_pad, ind_stub=ind_stub), layer=p.layer) # Subtracts out ground plane on the layer its on self.add_qgeometry('poly', dict(pocket=pocket), subtract=True, layer=p.layer) # Generates the pins self.add_pin('tie', main_pin_line.coords, trace_width)