On the use of Qiskit Metal coded in Python to generate design files for building quantum devices on a chip, performed via direct-write lithography. Depending on the resolution of desired quantum device features, LASER, scanning thermal probe, and electron-beam techniques are applicable options for patterning your design. - Onri Jay Benally
(Note: in the patterned 400-transmon example below, the ground contacts were excluded from layout as the design was to demonstrate process feasibility from Qiskit Metal design-to-real-chip. However, the main features are clearly visible under optical microscopy. Also, I included a DXF/GDS design output for a full quantum chip, ready for fabrication [electrodes, ground, and all], available to download in the file directories above).
| It Is Important to Know That There Are 2 Main Types of Patterning With the E-Beam Writer (EBPG) Equipment: | Description |
|---|---|
| Marker-based using "rp" commands | This is used if your sample has pre-existing markers patterned on it already [ex. sample WITH purposely-designed reference points that can be automatically located by the EBPG's built-in SEM tool]. |
| Marker-free-based using "joyplus" commands | This is used if your sample has no pre-existing referencing patterns [ex. bare substrate or other sample WITHOUT purposely-designed reference points]. |
| Terms To Be Aware Of: | Description |
|---|---|
| BEAMER | Desktop software for importing GDSII or GDS files stored on WinSCP, beam step, size, and error correction (heal) paramters are set here and subsequently exported as GPF files that can be read by the EBPG equipment. Additionally the parameters can be downloaded as a Python script (.py). An example of a Python script used in BEAMER is available for reference in the file directory above. |
| CJOB | Software tool that is accessed on the EBPG equipment itself using the EBPG's terminal. From here, the GPF files can be uploaded and programmed with virtual alignment marker locations based on the uploaded design. Once the file is ready, it will export as a JOB file (.job). The JOB file name is what gets copied into the EBPG's terminal along with 4 coordinates validated by the built-in SEM. |
| Marker | The use of reference points on a coordinate plane that are assigned to a pre-existing, detectable pattern on a chip sample. Detection is performed automatically by the lithography equipment using commands such as "rp20". |
| Marker-free | The use of virtual reference points assigned to the region of interest to be patterned on a bare chip sample, wafer substrate, or other sample with without detectable markers. |
| If You Need to Install pip Through Python (Locally), Follow These Steps: |
|---|
| • First, install an EXE file of Python from: https://www.python.org/downloads |
| • Then, install pip by entering the following command into local terminal: |
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py |
| • Now, pip is ready for use! |
| Local Installation Steps for Qiskit Metal: |
|---|
| Installing Qiskit Metal Using Git+URL_by Onri Jay Benally |
To Install and Run Qiskit Metal for Layout Generation Fully in Google Colab, Run These 2 Code Cells Up Front (By Onri)
(This will clone the official Qiskit Metal GitHub repository into Google Colab on any browser)
#@title Headless (Qt off) + dependencies
import os
os.environ["QT_QPA_PLATFORM"] = "offscreen"
os.environ["MPLBACKEND"] = "Agg"
import matplotlib as mpl
try:
mpl.use("Agg", force=True)
except TypeError:
mpl.use("Agg")
print("Matplotlib backend:", mpl.get_backend())
# Scientific + GDS toolchain (incl. Descartes)
!pip install "jedi>=0.16"
%pip -q install --upgrade pip wheel setuptools
%pip -q install "numpy>=1.24" "matplotlib>=3.8" \
"gdstk>=0.9.61" "shapely>=2.0" "ezdxf>=1.2.0" \
"pandas>=2.0" "scipy>=1.10" "networkx>=2.8" \
"pint>=0.20" "addict>=2.4.0" "pyyaml>=6.0.1" \
"qutip>=4.7" "h5py>=3.8" "descartes>=1.1" "jedi>=0.19.1"
#@title Clone Qiskit Metal; bind to /content/qiskit-metal; headless, layout-only init (Dict + is_component)
# pylint: disable=invalid-name
import os, sys, re, textwrap
from pathlib import Path
# Fresh clone
!rm -rf /content/qiskit-metal
!git clone --depth 1 https://github.com/qiskit-community/qiskit-metal /content/qiskit-metal
root = Path("/content/qiskit-metal")
pkg = root / "qiskit_metal"
assert pkg.exists(), f"Package folder missing: {pkg}"
# Force Python to import FROM THIS FOLDER (no editable install)
if str(root) not in sys.path:
sys.path.insert(0, str(root))
os.environ["PYTHONPATH"] = str(root) + (":" + os.environ.get("PYTHONPATH",""))
# --- Replace qiskit_metal/__init__.py with a minimal but compatible headless init ---
orig_init = (pkg / "__init__.py").read_text(encoding="utf-8")
(pkg / "__init__orig.py").write_text(orig_init, encoding="utf-8")
minimal_init = textwrap.dedent("""
# [colab] Headless, layout-only __init__ (no GUI, no analyses), keep essentials.
import logging as _logging
try:
from addict import Dict as Dict
except Exception:
from .toolbox_python.attr_dict import Dict
logger = _logging.getLogger("qiskit_metal_colab")
class _Config:
@staticmethod
def is_building_docs():
return False
config = _Config()
def is_design(obj):
try:
from .designs.design_base import QDesign
return isinstance(obj, QDesign)
except Exception:
return False
def is_component(obj):
try:
from .qlibrary.core.base import QComponent
return isinstance(obj, QComponent)
except Exception:
return False
__all__ = ["Dict", "config", "logger", "is_design", "is_component"]
""").strip()+"\n"
(pkg / "__init__.py").write_text(minimal_init, encoding="utf-8")
# --- Scrub ALL draw.mpl imports to avoid PySide2 at import time ---
draw_init = pkg / "draw" / "__init__.py"
if draw_init.exists():
d = draw_init.read_text(encoding="utf-8")
# Guard "from . import mpl"
d = re.sub(r'^\s*from\s+\.\s*import\s+mpl\s*$',
"try:\n from . import mpl\n"
"except Exception as _e:\n"
" print('[colab] draw.mpl disabled (headless):', _e)\n",
d, flags=re.MULTILINE)
# Guard "from .mpl import ..." and any other .mpl imports
d = re.sub(r'^\s*from\s+\.\s*mpl\s+import[^\n]*$',
"try:\n from .mpl import render, figure_spawn\n"
"except Exception as _e:\n"
" print('[colab] draw.mpl (named) disabled (headless):', _e)\n"
" def render(*a, **k):\n"
" raise RuntimeError('draw.mpl unavailable in headless mode')\n"
" def figure_spawn(*a, **k):\n"
" raise RuntimeError('draw.mpl unavailable in headless mode')\n",
d, flags=re.MULTILINE)
draw_init.write_text(d, encoding="utf-8")
# Optional: ensure renderers package never drags Qt; keep explicit imports only
rndr_init = pkg / "renderers" / "__init__.py"
if rndr_init.exists():
(rndr_init.parent / "__init__orig.py").write_text(rndr_init.read_text(encoding="utf-8"), encoding="utf-8")
rndr_init.write_text("# [colab] minimal renderers package (explicit imports only; no Qt/MPL)\n__all__ = []\n",
encoding="utf-8")
# Verify: import the package *from this folder* and keep it light
import importlib, sys as _sys
importlib.invalidate_caches()
import qiskit_metal
print("qiskit_metal from:", qiskit_metal.__file__)
assert qiskit_metal.__file__.startswith(str(pkg)), "Not importing from /content/qiskit-metal!"
| Quantum Chip Rendering Steps: |
|---|
| Qiskit Metal + KLayout + Blender |
| Required Software (Some Free, Open-Sourced Versions Are Linked Below): |
|---|
| Qiskit Metal |
| 2D CAD program |
| Pattern layout viewer & editor (GDS-to-DXF/DXF-to-GDS converter) |
| Electron- & LASER-beam lithography software (GDS-to-GPF converter for equipment) |
| 2D CAD Programs Available: | Description |
|---|---|
| AutoCAD or AutoCAD Web | Cost effective alternative to locally-installed AutoCAD: https://www.autodesk.com/products/autocad-web/overview?term=1-YEAR&tab=subscription&plc=A360PP |
| QCAD | Open-sourced & simple: https://qcad.org/en |
| LibreCAD | Open-sourced & feature-packed: https://librecad.org |
| FreeCAD | Open-sourced & feature-packed: https://www.freecad.org |
| Salome | Open-sourced & feature-packed: https://www.salome-platform.org/?page_id=2430 |
| Pattern Layout Viewers & Editors: | Description |
|---|---|
| KLayout | Open-sourced & feature-packed: https://www.klayout.de/build.html |
| LinkCAD | Paid version: https://www.linkcad.com/download.php [usually purchased by your lab] |
| Raith_GDSII MATLAB Toolbox | Public licensed: https://github.com/ahryciw/Raith_GDSII |
| Octave/ MATLAB Toolbox for GDSII | Public domain: https://github.com/ulfgri/gdsii-toolbox |
| Free or Open-Source Software for Design, Analysis, or Large Data Visualization: |
|---|
| https://dev.opencascade.org/about/projects_and_products |
| https://www.paraview.org/download |
| Open-Source Finite Element Method Software (Alternative to Ansys): |
|---|
| https://github.com/ElmerCSC/elmerfem |
| Open-Source Mesh Generators (To Prepare Design for Use in Finite Element Method Software): |
|---|
| https://gmsh.info/#Download |
| https://www.salome-platform.org/?page_id=2430 |
| Open-Source Device Simulation Tools: |
|---|
| https://gdsfactory.github.io/gdsfactory/plugins_process.html |
| Electron- & LASER-Beam Lithography Software: |
|---|
| BEAMER (from GenIsys: https://www.genisys-gmbh.com/beamer.html [usually purchased by your lab]) |
| Slides & Webinars for Using Electron-Beam Lithography Software: |
|---|
| https://www.genisys-gmbh.com/webinar-series-beamer-training.html |
| List of Available Process Recipes: |
|---|
| https://lab.kni.caltech.edu/Process_Recipe_Library |
| https://nano.yale.edu/manuals-documentation |
| Examples of Green [Sustainable] Lithography-Based Direct-Write Patterning: |
|---|
| https://onlinelibrary.wiley.com/doi/full/10.1002/admi.201601223 |
| https://onlinelibrary.wiley.com/doi/10.1002/adfm.202101533 |
| List of Standard Negative/ Positive Tone Resist Materials: |
|---|
| https://www.microresist.de/en/products/?jet-smart-filters=jet-engine/products&_tax_query_pa_resist-alliance=534 |
| https://www.epfl.ch/about/campus/neuchatel-en/daily-life/page-119059-en-html/page-126398-en-html |
| List of Open-Source Process Development Kits & More (Optional): |
|---|
| SiEPIC Ebeam PDK: https://gdsfactory.github.io/ubc |
| Skywater 130 PDK: https://gdsfactory.github.io/skywater130 |
| GlobalFoundries 180 PDK: https://gdsfactory.github.io/gf180 |
| Python library to design chips [Photonics, Analog, Quantum, MEMs, etc.]: https://github.com/gdsfactory/gdsfactory |
| Some of the Code Used Here are Borrowed or Inspired From the Qiskit Metal Page: |
|---|
| https://github.com/qiskit-community/qiskit-metal |


















