Source code for qiskit_metal.qlibrary.terminations.launchpad_wb_driven

# -*- 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 LaunchpadWirebondDriven(QComponent): r"""Launch pad to feed/read signals to/from the chip. Inherits 'QComponent' class. Creates a 50 ohm launch pad with a ground pocket cutout. Parameters 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. There is also a pin at the back of the pad for DrivenModal simulations. 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:: ----------- | \ | ---------\\ in| | 0 | (0,0) pin at midpoint of necking, before the lead | ---------// | / ----------- y ^ | |------> x .. image:: LaunchpadWirebond.png .. meta:: :description: Launchpad Wirebond Driven Default Options: * trace_width: 'cpw_width' -- Width of the transmission line attached to the launch pad * trace_gap: 'cpw_gap' -- Gap of the transmission line * lead_length: '25um' -- Length of the transmission line attached to the launch pad * pad_width: '80um' -- Width of the launch pad * pad_height: '80um' -- Height of the launch pad * pad_gap: '58um' -- Gap of the launch pad * taper_height: '122um' -- Height of the taper from the launch pad to the transmission line """ default_options = Dict(trace_width='cpw_width', trace_gap='cpw_gap', lead_length='25um', pad_width='80um', pad_height='80um', pad_gap='58um', taper_height='122um') """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 pad_width = p.pad_width pad_height = p.pad_height pad_gap = p.pad_gap trace_width = p.trace_width trace_width_half = trace_width / 2. pad_width_half = pad_width / 2. lead_length = p.lead_length taper_height = p.taper_height trace_gap = p.trace_gap pad_gap = p.pad_gap ######################################################### # Geometry of main launch structure # The shape is a polygon and we prepare this point as orientation is 0 degree launch_pad = draw.Polygon([ (0, trace_width_half), (-taper_height, pad_width_half), (-(pad_height + taper_height), pad_width_half), (-(pad_height + taper_height), -pad_width_half), (-taper_height, -pad_width_half), (0, -trace_width_half), (lead_length, -trace_width_half), (lead_length, trace_width_half), (0, trace_width_half) ]) # Geometry pocket (gap) # Same way applied for pocket pocket = draw.Polygon([(0, trace_width_half + trace_gap), (-taper_height, pad_width_half + pad_gap), (-(pad_height + taper_height + pad_gap), pad_width_half + pad_gap), (-(pad_height + taper_height + pad_gap), -(pad_width_half + pad_gap)), (-taper_height, -(pad_width_half + pad_gap)), (0, -(trace_width_half + trace_gap)), (lead_length, -(trace_width_half + trace_gap)), (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_length, trace_width_half), (lead_length, -trace_width_half)]) driven_pin_line = draw.LineString([ (-(pad_height + taper_height + pad_gap), pad_width_half), (-(pad_height + taper_height + pad_gap), -pad_width_half) ]) # Create polygon object list polys1 = [main_pin_line, driven_pin_line, launch_pad, 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, driven_pin_line, launch_pad, pocket] = polys1 # Adds the object to the qgeometry table self.add_qgeometry('poly', dict(launch_pad=launch_pad), 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) self.add_pin('in', driven_pin_line.coords, pad_width, gap=pad_gap)