Bird’s eye view of Qiskit Metal

You’ll use Qiskit Metal in 4 stages

  1. Choose a design class to instantiate.

  2. Add and modify pre-built components (qubits, coplanar wave guides, etc.) from the QComponent library to your design. (Or, create your own components)

  3. Render to Simulate & Analyze

    • Current Rendering Options:

      • Ansys

        • HFSS Renderer - for high frequency simulations (eigenmode, modal, terminal)

          • EPR Analysis - Uses eigenmode simulation to perform energy participation ratio analysis

        • Q3D Renderer - for extracting equivalent circuit values of a layout, such as capacitance

          • LOM Analysis - Uses the capacitance matrix from Q3D to determine the parameters of a transmon qubit

  4. Render for Fabrication

    • Current Rendering Options:

      • GDS

These steps are shown visually below in the following diagram

QDesign Data Flow_accurate.jpg

This tutorial is for steps 1 and 2.

Using this Tutorial

Metal can be used three different ways: * Jupyter Notebooks * For interactive code * To Use: 1. Just press run :D * Python scripts * For setting internal breakpoints * To Use: 1. Copy snippets of code from these Notebooks and save as a Python file. 2. Run in your favorite editor. (We like VS Code!) * Metal GUI * In the future, we anticipate Metal GUI to have full functionality. * To Use: 1. You must first use either Jupyter Notebooks or Python Scripts to add components to your QDesign. 2. Use the GUI to visualize and manually edit your components.

Let’s dive in!

QDesign (need-to-know)

Each time you create a new quantum circuit design, you start by instantiating a QDesign class.

There are different design classes in the design library qiskit_metal.designs for different design layouts. For example the design class DesignPlanar is best for 2D circuit designs.

Every design class (except QDesign) inherits from the base QDesign class. QDesign defines basic functionality for all other design classes and should not be directly instantiated.

QDesign (in-depth)

QDesign keeps track of each of the components (qubits, coplanar wave guides, etc.) that you add to your circuit and the relationships between them.

As you can see below, QDesign keeps track of many things:

QDesign Data Flow_accurate_inside.jpg

  • QComponents - do not directly instantiate

    • Components of your design

    • Example:

      • Transmon Qubits

      • CPWs

      • etc.

    • Upon creation, the QComponent’s make function runs and adds the QComponent’s geometries (rectangles, line segments, etc.) to the QGeometryTables

  • QGeometryTables - instantiate during init of QDesign

    • Stores backend information about components

    • Populated when QComponents are added to QDesign

  • QNet.net_info - instantiate during init of QDesign

    • Stores backend information on existing connections between components

    • Instantiated in the backend by QDesign

    • Populated during connections of QComponents

  • QRenderer - instantiate during init of QDesign

    • This is what allows you to export your designs into Ansys, GDS, etc.

    • qiskit_metal/config.py contains list of all instantiated renderers

Coding Time!

Today we’ll be creating a 2D design and adding a single qcomponent

So, let us dive right in. For convenience, let’s begin by enabling automatic reloading of modules when they change.

[1]:
%load_ext autoreload
%autoreload 2
[2]:
import qiskit_metal as metal
from qiskit_metal import designs, draw
from qiskit_metal import MetalGUI, Dict, open_docs

%metal_heading Welcome to Qiskit Metal!

Welcome to Qiskit Metal!

Here, we import the folders designs, draw, MetalGUI, Dict, and open_docs from the qiskit_metal code.

Choose a design layout. We will start with the simple planar QDesign.

[3]:
design = designs.DesignPlanar()
[4]:
# Since we are likely to be making many changes while tuning and modifying our design, we will enable overwriting.
# If you disable the next line, then you will need to delete a component [<component>.delete()] before recreating it.

design.overwrite_enabled = True
[5]:
%metal_heading Hello Quantum World!

Hello Quantum World!

[6]:
# We can also check all of the chip properties to see if we want to change the size or any other parameter.
# By default the name of chip is "main".
design.chips.main
[6]:
{'material': 'silicon',
 'layer_start': '0',
 'layer_end': '2048',
 'size': {'center_x': '0.0mm',
  'center_y': '0.0mm',
  'center_z': '0.0mm',
  'size_x': '9mm',
  'size_y': '6mm',
  'size_z': '-750um',
  'sample_holder_top': '890um',
  'sample_holder_bottom': '1650um'}}
[7]:
design.chips.main.size.size_x = '11mm'
design.chips.main.size.size_y = '9mm'

Launch Qiskit Metal GUI to interactively view, edit, and simulate QDesign: Metal GUI

[8]:
gui = MetalGUI(design)

You can create a ready-made transmon qubit from the QComponent Library, qiskit_metal.qlibrary.qubits. transmon_pocket.py is the file containing our qubit so transmon_pocket is the module we import. The TransmonPocket class is our transmon qubit. Like all quantum components, TransmonPocket inherits from QComponent

  • Let’s create a new qubit by creating an object of this class.

[9]:
# Select a QComponent to create (The QComponent is a python class named `TransmonPocket`)
from qiskit_metal.qlibrary.qubits.transmon_pocket import TransmonPocket


q1 = TransmonPocket(design, 'Q1', options=dict(connection_pads=dict(a=dict()))) # Create a new Transmon Pocket object with name 'Q1'
gui.rebuild()  # rebuild the design and plot

gui.edit_component('Q1') # set Q1 as the editable component
gui.autoscale() #resize GUI to see QComponent
[10]:
gui.screenshot()
../../_images/tut_1-Overview_1.1-Bird%27s-eye-view-of-Qiskit-Metal_27_0.png

Let’s see what the Q1 object looks like

[11]:
q1 #print Q1 information
[11]:
name:    Q1
class:   TransmonPocket        
options: 
  'pos_x'             : '0um',
  'pos_y'             : '0um',
  'connection_pads'   : {
       'a'                 : {
            'pad_gap'           : '15um',
            'pad_width'         : '125um',
            'pad_height'        : '30um',
            'pad_cpw_shift'     : '5um',
            'pad_cpw_extent'    : '25um',
            'cpw_width'         : 'cpw_width',
            'cpw_gap'           : 'cpw_gap',
            'cpw_extend'        : '100um',
            'pocket_extent'     : '5um',
            'pocket_rise'       : '65um',
            'loc_W'             : '+1',
            'loc_H'             : '+1',
                             },
                        },
  'chip'              : 'main',
  'pad_gap'           : '30um',
  'inductor_width'    : '20um',
  'pad_width'         : '455um',
  'pad_height'        : '90um',
  'pocket_width'      : '650um',
  'pocket_height'     : '650um',
  'orientation'       : '0',
  'hfss_wire_bonds'   : False,
  'q3d_wire_bonds'    : False,
  'hfss_inductance'   : '10nH',
  'hfss_capacitance'  : 0,
  'hfss_resistance'   : 0,
  'hfss_mesh_kw_jj'   : 7e-06,
  'q3d_inductance'    : '10nH',
  'q3d_capacitance'   : 0,
  'q3d_resistance'    : 0,
  'q3d_mesh_kw_jj'    : 7e-06,
  'gds_cell_name'     : 'my_other_junction',
module:  qiskit_metal.qlibrary.qubits.transmon_pocket
id:      1

What are the default options?

The QComponent comes with some default options like the length of the pads for our transmon pocket. * Options are parsed internally by Qiskit Metal via the component’s make function. * You can change option parameters from the gui or the script api.

[12]:
%metal_print How do I edit options?  API or GUI
How do I edit options? API or GUI

You can now use the Metal GUI to edit, plot, and modify quantum components. Equivalently, you can also do everything from the Jupyter Notebooks/Python scripts (which call the Python API directly). The GUI is just calling the Python API for you.

*You must use a string when setting options!

[13]:
# Change options
q1.options.pos_x = '0.5 mm'
q1.options.pos_y = '0.25 mm'
q1.options.pad_height = '225 um'
q1.options.pad_width  = '250 um'
q1.options.pad_gap    = '50 um'
[14]:
gui.rebuild() # Update the component geoemtry, since we changed the options

# Get a list of all the qcomponents in QDesign and then zoom on them.
all_component_names = design.components.keys()

gui.zoom_on_components(all_component_names)

# An alternate way to view within GUI. If want to try it, remove the "#" from the beginning of line.
#gui.autoscale() #resize GUI
[15]:
# gui.main_window.close()

For more information, review the Introduction to Quantum Computing and Quantum Hardware lectures below

  • Superconducting Qubits I: Quantizing a Harmonic Oscillator, Josephson Junctions Part 1
Lecture Video Lecture Notes Lab
  • Superconducting Qubits I: Quantizing a Harmonic Oscillator, Josephson Junctions Part 2
Lecture Video Lecture Notes Lab
  • Superconducting Qubits I: Quantizing a Harmonic Oscillator, Josephson Junctions Part 3
Lecture Video Lecture Notes Lab
  • Superconducting Qubits II: Circuit Quantum Electrodynamics, Readout and Calibration Methods Part 1
Lecture Video Lecture Notes Lab
  • Superconducting Qubits II: Circuit Quantum Electrodynamics, Readout and Calibration Methods Part 2
Lecture Video Lecture Notes Lab
  • Superconducting Qubits II: Circuit Quantum Electrodynamics, Readout and Calibration Methods Part 3
Lecture Video Lecture Notes Lab