Note
This page was generated from tut//quick-topics//Managing-pins.ipynb.
Managing pins#
[1]:
%load_ext autoreload
%autoreload 2
[2]:
import qiskit_metal as metal
from qiskit_metal import designs, draw
from qiskit_metal import MetalGUI, Dict, Headings
Headings.h1('Welcome to Qiskit Metal')
Welcome to Qiskit Metal
[3]:
design = designs.DesignPlanar()
gui = MetalGUI(design)
First we create some transmon pockets to have a number of pins generated for use.
[4]:
from qiskit_metal.qlibrary.qubits.transmon_pocket import TransmonPocket
## Custom options for all the transmons
options = dict(
# Some options we want to modify from the deafults
# (see below for defaults)
pad_width = '425 um',
pocket_height = '650um',
# Adding 4 connectors (see below for defaults)
connection_pads=dict(
a = dict(loc_W=+1,loc_H=+1),
b = dict(loc_W=-1,loc_H=+1, pad_height='30um'),
c = dict(loc_W=+1,loc_H=-1, pad_width='200um'),
d = dict(loc_W=-1,loc_H=-1, pad_height='50um')
)
)
## Create 4 transmons
q1 = TransmonPocket(design, 'Q1', options = dict(
pos_x='+2.4mm', pos_y='+0.0mm', **options))
q2 = TransmonPocket(design, 'Q2', options = dict(
pos_x='+0.0mm', pos_y='-0.9mm', orientation = '90', **options))
q3 = TransmonPocket(design, 'Q3', options = dict(
pos_x='-2.4mm', pos_y='+0.0mm', **options))
q4 = TransmonPocket(design, 'Q4', options = dict(
pos_x='+0.0mm', pos_y='+0.9mm', orientation = '90', **options))
## Rebuild the design
gui.rebuild()
gui.autoscale()
Selecting the different components via the GUI shows the pins said component has. You can also see this via;
[5]:
design.components.Q1.pins.keys()
[5]:
dict_keys(['a', 'b', 'c', 'd'])
Each pin contains a dictionary of information which can be used by other components or renderers.
[6]:
design.components.Q1.pins.a
[6]:
{'points': [array([2.825, 0.2 ]), array([2.825, 0.19 ])],
'middle': array([2.825, 0.195]),
'normal': array([1., 0.]),
'tangent': array([0., 1.]),
'width': 0.01,
'gap': 0.006,
'chip': 'main',
'parent_name': 1,
'net_id': 0,
'length': 0}
We can pass these pins into some components to auto generate connections, such as CPW lines.
[7]:
from qiskit_metal.qlibrary.tlines.straight_path import RouteStraight
c1 = RouteStraight(design, 'c1', type="Route", options=dict(pin_inputs=dict(start_pin = dict(component = 'Q1',
pin = 'd'),
end_pin=dict(component = 'Q2',
pin = 'c'))))
gui.rebuild()
gui.autoscale()
The example CPW also automatically generates it’s own pins based on the pin inputs it was given. This is to allow for such a component to not be destroyed if the component it is attached to is deleted.
[8]:
design.components.c1.pins
[8]:
{'start': {'points': array([[ 1.975, -0.19 ],
[ 1.975, -0.2 ]]),
'middle': array([ 1.975, -0.195]),
'normal': array([ 1., -0.]),
'tangent': array([ 0., -1.]),
'width': 0.01,
'gap': 0.006,
'chip': 'main',
'parent_name': 5,
'net_id': 3,
'length': 0},
'end': {'points': array([[ 0.2 , -0.475],
[ 0.19 , -0.475]]),
'middle': array([ 0.195, -0.475]),
'normal': array([-0., -1.]),
'tangent': array([-1., 0.]),
'width': 0.01,
'gap': 0.006,
'chip': 'main',
'parent_name': 5,
'net_id': 4,
'length': 0}}
We can also see what active connections there are from the netlist. Pins that share the same net_id indicate they are connected. Pins that are not on the net list are currently open.
[9]:
design.net_info
[9]:
net_id | component_id | pin_name | |
---|---|---|---|
0 | 3 | 1 | d |
1 | 3 | 5 | start |
2 | 4 | 2 | c |
3 | 4 | 5 | end |
What happens if we try to pass in a component/pin combo that doesn’t exist?
[10]:
#A component that doesn't exist
c2 = RouteStraight(design, 'c2', type="Route", options=dict(pin_inputs = dict(start_pin = dict(component = 'NotReallyHere',
pin = 'd'),
end_pin =dict(component = 'Q2',
pin = 'a'))))
04:25PM 48s WARNING [__init__]: Component NotReallyHere does not exist. c2 has not been built. Please check your pin_input values.
[11]:
#A pin that doesn't exist
c3 = RouteStraight(design, 'c3', type="Route", options=dict(pin_inputs = dict(start_pin = dict(component = 'Q1',
pin = 'NotReallyHere'),
end_pin =dict(component = 'Q2',
pin = 'a'))))
04:25PM 48s WARNING [__init__]: Pin NotReallyHere does not exist in component Q1. c3 has not been built. Please check your pin_input values.
Or if try to pass in a pin that is already connected.
[12]:
c4 = RouteStraight(design, 'c4', type="Route", options=dict(pin_inputs = dict(start_pin = dict(component = 'Q1',
pin = 'b'),
end_pin =dict(component = 'Q2',
pin = 'c'))))
04:25PM 48s WARNING [__init__]: Pin c of component Q2 is already in use. c4 has not been built. Please check your pin_input values.
pin_inputs is the default dictionary for passing pins into a component, BUT how the dictionary is structured is component dependent. Using the above structure (eg. start_pin, end_pin) is suggested for any 2 port type connection, but you should always check the documentation for the specific component you are wanting to use.
[13]:
Headings.h1('CPW Examples')
CPW Examples
An example set showing some current functional CPW components, including both simple auto-routing and meandering
[14]:
design.delete_all_components()
[15]:
from qiskit_metal.qlibrary.terminations.open_to_ground import OpenToGround
from qiskit_metal.qlibrary.tlines.framed_path import RouteFramed
from qiskit_metal.qlibrary.tlines.straight_path import RouteStraight
from qiskit_metal.qlibrary.tlines.meandered import RouteMeander
[16]:
open_start_straight = OpenToGround(design,'Open_straight_start',options=Dict(pos_x='0um',pos_y='0um',orientation = '-90'))
open_end_straight = OpenToGround(design,'Open_straight_end',options=Dict(pos_x='0um',pos_y='1500um',orientation = '90'))
open_start_auto = OpenToGround(design,'Open_auto_start',options=Dict(pos_x='250um',pos_y='0um',orientation = '-90'))
open_end_auto = OpenToGround(design,'Open_auto_end',options=Dict(pos_x='250um',pos_y='1500um',orientation = '0'))
open_start_meander = OpenToGround(design,'Open_meander_start',options=Dict(pos_x='1000um',pos_y='0um',orientation = '-90'))
open_end_meander = OpenToGround(design,'Open_meander_end',options=Dict(pos_x='1000um',pos_y='1500um',orientation = '90'))
testStraight = RouteStraight(design,'straightTest',options=Dict(pin_inputs=Dict(
start_pin=Dict(
component = 'Open_straight_start',
pin = 'open'),
end_pin=Dict(
component = 'Open_straight_end',
pin = 'open')
)))
testAuto = RouteFramed(design,'autoTest',options=Dict(pin_inputs=Dict(
start_pin=Dict(
component = 'Open_auto_start',
pin = 'open'),
end_pin=Dict(
component = 'Open_auto_end',
pin = 'open')
)))
testMeander = RouteMeander(design,'meanderTest',options=Dict(pin_inputs=Dict(
start_pin=Dict(
component = 'Open_meander_start',
pin = 'open'),
end_pin=Dict(
component = 'Open_meander_end',
pin = 'open')
)))
gui.rebuild()
gui.autoscale()
[17]:
gui.screenshot()
For more information, review the Introduction to Quantum Computing and Quantum Hardware lectures below
|
Lecture Video | Lecture Notes | Lab |
|
Lecture Video | Lecture Notes | Lab |
|
Lecture Video | Lecture Notes | Lab |
|
Lecture Video | Lecture Notes | Lab |
|
Lecture Video | Lecture Notes | Lab |
|
Lecture Video | Lecture Notes | Lab |