Source code for qpdk.samples.filled_test_chip
# ---
# jupyter:
# jupytext:
# text_representation:
# extension: .py
# format_name: percent
# format_version: '1.3'
# jupytext_version: 1.17.3
# ---
# %% tags=["hide-input", "hide-output"]
from functools import partial
from pathlib import Path
import gdsfactory as gf
from gdsfactory.read import from_yaml
from qpdk import PDK, tech
from qpdk.cells.chip import chip_edge
from qpdk.cells.helpers import apply_additive_metals, fill_magnetic_vortices
from qpdk.helper import layerenum_to_tuple
# %% [markdown]
# # Filled Qubit Test Chip Example
#
# This example demonstrates creating a qubit test chip filled with magnetic vortex trapping rectangles.
#
# The design roughly corresponds to the sample described in Tuokkola et al. "Methods to achieve near-millisecond coherence times in superconducting quantum circuits" (2025).
# %% [markdown]
# ## Filled Qubit Test Chip Function
#
# Creates a qubit test chip from a YAML configuration and fills it with magnetic vortex trapping rectangles.
#
# See the YAML file for the original test chip layout.
# %% [rst]
#
# .. note::
#
# See the YAML file for the original test chip layout.
#
# .. include:: ./qubit_test_chip.pic.yml
#
# %%
[docs]
@gf.cell
def filled_qubit_test_chip(
yaml_path: str | Path = Path(__file__).parent / "qubit_test_chip.pic.yml",
):
"""Returns a qubit test chip filled with magnetic vortex trapping rectangles.
Rouhly corresponds to the sample in :cite:`tuokkolaMethodsAchieveNearmillisecond2025`.
"""
c = gf.Component()
test_chip = from_yaml(
yaml_path,
routing_strategies=tech.routing_strategies,
)
c << fill_magnetic_vortices(
component=test_chip,
rectangle_size=(15.0, 15.0),
gap=70.0,
stagger=2,
)
# Add chip edge component
chip_edge_ref = c << chip_edge(
size=(test_chip.xsize + 230, test_chip.ysize + 200),
width=100.0,
layer=tech.LAYER.M1_ETCH,
)
# Position chip edge to align with test chip bounds
chip_edge_ref.move((test_chip.xmin - 100, test_chip.ymin - 100))
# Flip-chip
if any(
layerenum_to_tuple(layer_enum) in c.layers
for layer_enum in (tech.LAYER.M2_DRAW, tech.LAYER.M2_ETCH)
):
chip_edge_ref = c << chip_edge(
size=(test_chip.xsize + 230, test_chip.ysize + 200),
width=100.0,
layer=tech.LAYER.M2_ETCH,
)
# Position chip edge to align with test chip bounds
chip_edge_ref.move((test_chip.xmin - 100, test_chip.ymin - 100))
c << fill_magnetic_vortices(
component=test_chip,
rectangle_size=(15.0, 15.0),
gap=70.0,
stagger=2,
exclude_layers=[
(tech.LAYER.M2_ETCH, 80),
(tech.LAYER.M2_DRAW, 80),
],
fill_layer=tech.LAYER.M2_ETCH,
)
# Get final 'negative' layout
return apply_additive_metals(c)
# %% [markdown]
# ## Filled Flipmon Test Chip Function
#
# Creates a flipmon test chip from a similar YAML configuration and fills it as well.
# This version uses flipmon qubits for flip-chip applications.
# See {cite:p}`liVacuumgapTransmonQubits2021` for more details.
# %%
filled_flipmon_test_chip = partial(
filled_qubit_test_chip, Path(__file__).parent / "flipmon_test_chip.pic.yml"
)
# %% [markdown]
# ## Examples
# %%
if __name__ == "__main__":
PDK.activate()
# Show original filled qubit test chip
filled_qubit_test_chip().show()
# %%
# Show new filled flipmon test chip
filled_flipmon_test_chip().show()