Source code for qpdk.samples.sample_to_3d

# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: percent
#       format_version: '1.3'
#       jupytext_version: 1.17.3
# ---

# %% [markdown]
# # Sample 3D Visualization
#
# This sample demonstrates how to create a 3D visualization of a layout with different cross-sections.

# %%
import gdsfactory as gf

from qpdk import PDK, cells, tech
from qpdk.cells.helpers import apply_additive_metals, fill_magnetic_vortices

# %% [markdown]
# ## 3D Sample Function
#
# Creates a transmon coupled to a resonator with a chip edge for 3D visualization.


# %%
[docs] @gf.cell def sample_to_3d() -> gf.Component: """Returns a transmon with a resonator and chip edge for 3D visualization. This function demonstrates the full workflow of adding logical components, filling with magnetic vortices, adding a simulation area, and finally applying the additive metal transformation for mask generation and 3D visualization. """ c = gf.Component() # Create the transmon with resonator tr = c << cells.double_pad_transmon_with_resonator() # Add a chip edge around the component bbox = tr.bbox() margin = 100.0 chip_size = (bbox.width() + 2 * margin, bbox.height() + 2 * margin) ce = c << cells.chip_edge(size=chip_size, width=20.0) ce.center = tr.center # fill_magnetic_vortices adds small etch holes for magnetic flux trapping. # It returns a new component cell. c = fill_magnetic_vortices(c) # We must use .dup() because apply_additive_metals flattens the component and removes layers, # and we want to perform these modifications on a fresh copy to avoid LockedErrors # since we are inside a @cell-decorated function and the result of fill_magnetic_vortices is also a cell. c = c.dup() # For 3D visualization, we need to add the SIM_AREA layer which acts as the bulk metal/substrate # from which etched regions are subtracted in the LayerStack. # We match the SIM_AREA to the chip edge area. bbox_total = c.bbox() c.add_polygon( [ (bbox_total.left, bbox_total.bottom), (bbox_total.right, bbox_total.bottom), (bbox_total.right, bbox_total.top), (bbox_total.left, bbox_total.top), ], layer=tech.LAYER.SIM_AREA, ) # apply_additive_metals generates the final negative mask on M1_ETCH by subtracting M1_DRAW. return apply_additive_metals(c)
# %% [markdown] # ## Visualization # # Shows the component in 2D (KLayout) and 3D. # %% if __name__ == "__main__": PDK.activate() c = sample_to_3d() c.show() s = c.to_3d(layer_stack=tech.LAYER_STACK_NO_VACUUM) s.show()