Tracking which device instances came from which design cells is straightforward when you generate the layout, but that information is easy to lose by the time measurements arrive. This notebook writes a design manifest alongside the GDS so that every downstream step can look up waveguide type, width, and length from a table rather than re-parsing the geometry.
Propagation loss is one of the most important performance metrics for a silicon photonics process. It tells you how much optical power the waveguide itself absorbs or scatters per unit length, independent of coupling or device effects. A common way to measure it is the cutback method: fabricate a set of waveguides with identical cross-sections but increasing lengths, measure the transmitted power through each, and fit the slope of power vs. length. The slope gives you loss in dB per centimetre.
Spiral waveguides are the standard vehicle for cutback measurements in silicon photonics because they pack a long waveguide into a compact area. A 2 cm spiral fits within a few hundred microns of chip area, whereas a 2 cm straight waveguide would not fit on a reticle at all.
This series covers two waveguide types: - Rib waveguides: partially etched silicon, lower propagation loss, wider mode. - Ridge waveguides: fully etched silicon, higher confinement but more sensitive to sidewall roughness and typically higher loss.
For each type we sweep three widths (0.3, 0.5, and 0.8 µm) at six spiral lengths (0 to 25 mm in 5 mm steps). The length-zero device is just the grating coupler loopback with no waveguide, which serves as the reference for extracting the grating coupler insertion loss from the fit intercept.
The layout is built with kfactory. Because the spiral geometry is complex, the cell definitions live in layout.py alongside this notebook. You do not need to understand the layout details to follow the analysis.
Before you start, make sure your credentials are configured in
~/.gdsfactory/gdsfactoryplus.toml:
Setup¶
import getpass
from pathlib import Path
import gfhub
import pandas as pd
from layout import top
client = gfhub.Client()
user = getpass.getuser()
print(f"Running as user: {user}")
Running as user: runner
Generate the layout¶
top() returns a kfactory top cell containing two sub-cells: rib_loss and ridge_loss. Each sub-cell holds 18 spiral assemblies (3 widths × 6 lengths). The spiral and grating coupler routing is defined in layout.py, which you can inspect if you want to see how the geometry is constructed.
Calling c.write("spirals.gds") serialises the full hierarchy to a GDS file. The cell references are preserved, so the file size stays compact even with many device instances.
[32m2026-05-04 15:57:13.370[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:13.380[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:13.473[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:13.476[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:13.554[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:13.556[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:13.629[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:13.631[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:13.705[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:13.707[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:13.781[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:13.783[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:13.886[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:13.897[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:13.978[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:13.980[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:14.046[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:14.048[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:14.114[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:14.117[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:14.182[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:14.184[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:14.245[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:14.247[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:14.395[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:14.403[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:14.486[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:14.488[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:14.566[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:14.568[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:14.648[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:14.650[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:14.728[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:14.730[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:14.808[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:14.810[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:14.931[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:14.938[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:15.017[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:15.019[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:15.093[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:15.095[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:15.170[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:15.173[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:15.249[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:15.251[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:15.329[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:15.332[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:15.417[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:15.424[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:15.508[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:15.510[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:15.578[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:15.580[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:15.651[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:15.654[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:15.724[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:15.727[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:15.788[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:15.790[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:15.918[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:15.926[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:16.017[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:16.019[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:16.225[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:16.227[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:16.309[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:16.311[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:16.394[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:16.396[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:16.480[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m
[32m2026-05-04 15:57:16.482[0m | [33m[1mWARNING [0m | [36mkfactory.decorators[0m:[36mwrapped_cell[0m:[36m406[0m - [33m[1m`kfactory.routing.optical.route` is deprecated, please use `route_bundle` instead. `route` will be removed in kfactory 3[0m

Build the design manifest¶
The design manifest is a table that maps each device instance to its physical parameters: waveguide type, width, length, and position on the chip. Downstream analysis will read width_um and length_um directly from this table rather than parsing the GDS again.
kfactory stores the parameters used to construct each cell in cell.settings. We walk the instance hierarchy of the rib_loss and ridge_loss sub-cells with begin_instances_rec(), filter on the assembled device cell names, and collect the settings for each instance.
def generate_design_manifest(c) -> pd.DataFrame:
"""Walk the GDS hierarchy and build a manifest of spiral device instances."""
rows = []
for waveguide_type, top_cell_name, target_pattern in [
("rib", "rib_loss", "cutback_rib_assembled*"),
("ridge", "ridge_loss", "cutback_ridge_assembled*"),
]:
parent = c.kcl[top_cell_name]
it = parent.begin_instances_rec()
it.targets = target_pattern
while not it.at_end():
cell = c.kcl[it.inst_cell().cell_index()]
disp = (it.trans() * it.inst_trans()).disp
rows.append({
"cell": cell.name,
"waveguide_type": waveguide_type,
"width_um": cell.settings["width"],
"length_um": cell.settings["length"],
"x": disp.x,
"y": disp.y,
})
it.next()
return pd.DataFrame(rows)
manifest = generate_design_manifest(c)
manifest.to_csv("spirals_manifest.csv", index=False)
print(f"{len(manifest)} devices total")
manifest.head(10)
36 devices total
| cell | waveguide_type | width_um | length_um | x | y | |
|---|---|---|---|---|---|---|
| 0 | cutback_rib_assembled_MFalse_W0p3_L0 | rib | 0.3 | 0 | 20150 | 60150 |
| 1 | cutback_rib_assembled_MTrue_W0p3_L25000 | rib | 0.3 | 25000 | 1039250 | 60150 |
| 2 | cutback_rib_assembled_MFalse_W0p3_L5000 | rib | 0.3 | 5000 | 20150 | 204150 |
| 3 | cutback_rib_assembled_MTrue_W0p3_L20000 | rib | 0.3 | 20000 | 1039250 | 204150 |
| 4 | cutback_rib_assembled_MFalse_W0p3_L10000 | rib | 0.3 | 10000 | 20150 | 348150 |
| 5 | cutback_rib_assembled_MTrue_W0p3_L15000 | rib | 0.3 | 15000 | 1039250 | 348150 |
| 6 | cutback_rib_assembled_MFalse_W0p5_L0 | rib | 0.5 | 0 | 20250 | 492250 |
| 7 | cutback_rib_assembled_MTrue_W0p5_L25000 | rib | 0.5 | 25000 | 1058750 | 492250 |
| 8 | cutback_rib_assembled_MFalse_W0p5_L5000 | rib | 0.5 | 5000 | 20250 | 646250 |
| 9 | cutback_rib_assembled_MTrue_W0p5_L20000 | rib | 0.5 | 20000 | 1058750 | 646250 |
Clean up existing files (optional)¶
If you want a fresh start, this cell deletes any previously uploaded GDS and manifest files for this project.
from contextlib import suppress
for name in ("spirals.gds", "spirals_manifest.csv"):
for f in client.query_files(name=name, tags=["project:tutorial_spirals", user]):
with suppress(RuntimeError):
client.delete_file(f["id"])
print(f"Deleted {f['original_name']} (id={f['id']})")
Deleted spirals.gds (id=019df1ef-7f03-76d0-82e2-8b4fadc8c33c)
Deleted spirals_manifest.csv (id=019df1ef-82b9-78e0-9ea0-1c3589403874)
Upload the GDS and manifest¶
gds_entry = client.add_file("spirals.gds", tags=["project:tutorial_spirals", user])
print(f"GDS uploaded: id={gds_entry['id']}")
manifest_entry = client.add_file("spirals_manifest.csv", tags=["project:tutorial_spirals", user])
print(f"Manifest uploaded: id={manifest_entry['id']}")
GDS uploaded: id=019df3b5-48df-7410-b2c0-b0a6038321e8
Manifest uploaded: id=019df3b5-4c9a-7692-a397-84adcafb7f99
What's next?¶
The GDS and design manifest are now in DataLab. The next notebook reads the manifest, simulates swept-wavelength transmission spectra for each spiral device, and uploads them with tags encoding the waveguide type, width, and length so that all downstream analysis can group and query by these parameters.