Source code for qiskit_metal.qlibrary.qubits.transmon_pocket_cl

# -*- 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.
"""Transmon Pocket CL.

Pocket "axis"
        _________________
        |               |
        |_______________|       ^
        ________x________       |  N
        |               |       |
        |_______________|

Child of 'standard' transmon pocket.
"""
# pylint: disable=invalid-name
# Modification of Transmon Pocket Object to include a charge line (would be better to just make as a child)

import numpy as np
from qiskit_metal import draw, Dict
from qiskit_metal.qlibrary.qubits.transmon_pocket import TransmonPocket


[docs] class TransmonPocketCL(TransmonPocket): # pylint: disable=invalid-name """The base `TransmonPocketCL` class. Inherits `TransmonPocket` class. Create a standard pocket transmon qubit for a ground plane, with two pads connected by a junction (see drawing below). Connector lines can be added using the `connection_pads` dictionary. Each connector line has a name and a list of default properties. This is a child of TransmonPocket, see TransmonPocket for the variables and description of that class. :: _________________ | | |_______________| ^ ________x________ | N | | | |_______________| .. image:: transmon_pocket_cl.png .. meta:: Transmon Pocket Charge Line BaseQubit Default Options: * connection_pads: empty Dict -- The dictionary which contains all active connection lines for the qubit. * _default_connection_pads: empty Dict -- The default values for the (if any) connection lines of the qubit. TransmonPocket Default Options: * pad_gap: '30um' -- The distance between the two charge islands, which is also the resulting 'length' of the pseudo junction * inductor_width: '20um' -- Width of the pseudo junction between the two charge islands (if in doubt, make the same as pad_gap). Really just for simulating in HFSS / other EM software * pad_width: '455um' -- The width (x-axis) of the charge island pads * pad_height: '90um' -- The size (y-axis) of the charge island pads * pocket_width: '650um' -- Size of the pocket (cut out in ground) along x-axis * pocket_height: '650um' -- Size of the pocket (cut out in ground) along y-axis * _default_connection_pads: Dict * pad_gap: '15um' -- Space between the connector pad and the charge island it is nearest to * pad_width: '125um' -- Width (x-axis) of the connector pad * pad_height: '30um' -- Height (y-axis) of the connector pad * pad_cpw_shift: '5um' -- Shift the connector pad cpw line by this much away from qubit * pad_cpw_extent: '25um' -- Shift the connector pad cpw line by this much away from qubit * cpw_width: 'cpw_width' -- Center trace width of the CPW line * cpw_gap: 'cpw_gap' -- Dielectric gap width of the CPW line * cpw_extend: '100um' -- Depth the connector line extends into ground (past the pocket edge) * pocket_extent: '5um' -- How deep into the pocket should we penetrate with the cpw connector (into the fround plane) * pocket_rise: '65um' -- How far up or downrelative to the center of the transmon should we elevate the cpw connection point on the ground plane * loc_W: '+1' -- Width location only +-1 * loc_H: '+1' -- Height location only +-1 Default Options: * make_CL: True -- If a charge line should be included. * cl_gap: '6um' -- The cpw dielectric gap of the charge line * cl_width: '10um' -- The cpw trace width of the charge line * cl_length: '20um' -- The length of the charge line 'arm' coupling the the qubit pocket. Measured from the base of the 90 degree bend. * cl_ground_gap: '6um' -- How much ground is present between the charge line and the qubit pocket. * cl_pocket_edge: '0' -- What side of the pocket the charge line is. -180 to +180 from the 'west edge', will round to the nearest 90. * cl_off_center: '50um' -- Distance from the center axis the qubit pocket is referenced to """ component_metadata = Dict(short_name='Q', _qgeometry_table_poly='True') """Component metadata""" default_options = Dict( make_CL=True, cl_gap='6um', # the cpw dielectric gap of the charge line cl_width='10um', # the cpw trace width of the charge line # the length of the charge line 'arm' coupling the the qubit pocket. cl_length='20um', # Measured from the base of the 90 degree bend cl_ground_gap= '6um', # how much ground between the charge line and the qubit pocket # -180 to +180 from the 'left edge', will round to the nearest 90. cl_pocket_edge='0', cl_off_center= '50um', # distance from the center axis the qubit pocket is built on ) """Default drawing options""" TOOLTIP = """Create a standard pocket transmon qubit for a ground plane, with two pads connected by a junction"""
[docs] def make(self): """Define the way the options are turned into QGeometry.""" super().make() if self.options.make_CL == True: self.make_charge_line()
#####################################################################
[docs] def make_charge_line(self): """Creates the charge line if the user has charge line option to TRUE.""" # Grab option values name = 'Charge_Line' p = self.p cl_arm = draw.box(0, 0, -p.cl_width, p.cl_length) cl_cpw = draw.box(0, 0, -8 * p.cl_width, p.cl_width) cl_metal = draw.unary_union([cl_arm, cl_cpw]) cl_etcher = draw.buffer(cl_metal, p.cl_gap) port_line = draw.LineString([(-8 * p.cl_width, 0), (-8 * p.cl_width, p.cl_width)]) polys = [cl_metal, cl_etcher, port_line] # Move the charge line to the side user requested cl_rotate = 0 if (abs(p.cl_pocket_edge) > 135) or (abs(p.cl_pocket_edge) < 45): polys = draw.translate( polys, -(p.pocket_width / 2 + p.cl_ground_gap + p.cl_gap), p.cl_off_center) if (abs(p.cl_pocket_edge) > 135): cl_rotate = 180 else: polys = draw.translate( polys, -(p.pocket_height / 2 + p.cl_ground_gap + p.cl_gap), p.cl_off_center) cl_rotate = 90 if (p.cl_pocket_edge < 0): cl_rotate = -90 # Rotate it to the pockets orientation polys = draw.rotate(polys, p.orientation + cl_rotate, origin=(0, 0)) # Move to the final position polys = draw.translate(polys, p.pos_x, p.pos_y) [cl_metal, cl_etcher, port_line] = polys # Generating pins points = list(draw.shapely.geometry.shape(port_line).coords) self.add_pin(name, points, p.cl_width) # Adding to qgeometry table self.add_qgeometry('poly', dict(cl_metal=cl_metal)) self.add_qgeometry('poly', dict(cl_etcher=cl_etcher), subtract=True)