Ring filter#
Calculations#
For a ring resonator we need to define:
Optical parameters:
coupling coefficient: will define resonance extinction ratio for a particular ring loss.
Free spectral range.
Electrical parameters:
VpiL
Resistance
try:
import google.colab
is_running_on_colab = True
!pip install gdsfactory gplugins[tidy3d,sax] > /dev/null
!apt install python3-gmsh gmsh > /dev/null
except ImportError:
is_running_on_colab = False
import numpy as np
import gdsfactory as gf
from gdsfactory.generic_tech import get_generic_pdk
gf.config.rich_output()
PDK = get_generic_pdk()
PDK.activate()
def ring(
wl: np.ndarray,
wl0: float,
neff: float,
ng: float,
ring_length: float,
coupling: float,
loss: float,
) -> np.ndarray:
"""Returns Frequency Domain Response of an all pass filter.
Args:
wl: wavelength in um.
wl0: center wavelength at which neff and ng are defined.
neff: effective index.
ng: group index.
ring_length: in um.
coupling: coupling coefficient.
loss: dB/um.
"""
transmission = 1 - coupling
neff_wl = (
neff + (wl0 - wl) * (ng - neff) / wl0
) # we expect a linear behavior with respect to wavelength
out = np.sqrt(transmission) - 10 ** (-loss * ring_length / 20.0) * np.exp(
2j * np.pi * neff_wl * ring_length / wl
)
out /= 1 - np.sqrt(transmission) * 10 ** (-loss * ring_length / 20.0) * np.exp(
2j * np.pi * neff_wl * ring_length / wl
)
return abs(out) ** 2
if __name__ == "__main__":
import matplotlib.pyplot as plt
loss = 0.03 # [dB/μm] (alpha) waveguide loss
neff = 2.46 # Effective index of the waveguides
wl0 = 1.55 # [μm] the wavelength at which neff and ng are defined
radius = 5
ring_length = 2 * np.pi * radius # [μm] Length of the ring
coupling = 0.5 # [] coupling of the coupler
wl = np.linspace(1.5, 1.6, 1000) # [μm] Wavelengths to sweep over
wl = np.linspace(1.55, 1.60, 1000) # [μm] Wavelengths to sweep over
ngs = [4.182551, 4.169563, 4.172917]
thicknesses = [210, 220, 230]
# widths = np.array([0.4, 0.45, 0.5, 0.55, 0.6])
# ngs = np.array([4.38215238, 4.27254985, 4.16956338, 4.13283219, 4.05791982])
widths = np.array([0.495, 0.5, 0.505])
neffs = np.array([2.40197253, 2.46586378, 2.46731758])
ng = 4.2 # Group index of the waveguides
for width, neff in zip(widths, neffs):
p = ring(
wl=wl,
wl0=wl0,
neff=neff,
ng=ng,
ring_length=ring_length,
coupling=coupling,
loss=loss,
)
plt.plot(wl, p, label=f"{int(width*1e3)}nm")
plt.title("ring resonator vs waveguide width")
plt.xlabel("wavelength (um)")
plt.ylabel("Power Transmission")
plt.grid()
plt.legend()
plt.show()
Layout#
gdsfactory easily enables you to layout Component with as many levels of hierarchy as you need.
A Component
is a canvas where we can add polygons, references to other components or ports.
Lets add two references in a component.
from typing import Optional
import toolz
from omegaconf import OmegaConf
from gdsfactory.component import Component
from gdsfactory.components.bend_euler import bend_euler
from gdsfactory.components.coupler90 import coupler90 as coupler90function
from gdsfactory.components.coupler_straight import (
coupler_straight as coupler_straight_function,
)
from gdsfactory.components.straight import straight
from gdsfactory.cross_section import strip
from gdsfactory.snap import assert_on_2nm_grid
from gdsfactory.typings import ComponentSpec, CrossSectionSpec
import gdsfactory as gf
c = gf.components.ring_single_heater(gap=0.2, radius=10, length_x=4)
c.plot()
2024-03-09 00:45:34.291 | INFO | gdsfactory.technology.layer_views:to_lyp:1017 - LayerViews written to '/tmp/gdsfactory/ring_single_heater_length_x4_radius10.lyp'.
scene = c.to_3d()
scene.show()
Lets define a ring function that also accepts other component specs for the subcomponents (straight, coupler, bend)
ring = gf.components.ring_single_heater(
gap=0.2, radius=10, length_x=4, via_stack_offset=(2, 0)
)
ring_with_grating_couplers = gf.routing.add_fiber_array(ring)
ring_with_grating_couplers.plot()
2024-03-09 00:45:34.886 | INFO | gdsfactory.technology.layer_views:to_lyp:1017 - LayerViews written to '/tmp/gdsfactory/ring_single_heater_add_fiber_array_5a7dbfd4.lyp'.
port_names = ["l_e1", "r_e3"]
port_names = ["l_e4", "r_e4"]
c = gf.routing.add_pads_top(
ring,
port_names=port_names,
)
c = gf.routing.add_fiber_array(c)
c.plot()
c.show()
2024-03-09 00:45:35.087 | INFO | gdsfactory.technology.layer_views:to_lyp:1017 - LayerViews written to '/tmp/gdsfactory/add_pads_top_add_fiber_array_b23520fa.lyp'.
2024-03-09 00:45:35.133 | WARNING | gdsfactory.klive:show:49 - UserWarning: Could not connect to klive server. Is klayout open and klive plugin installed?
/opt/hostedtoolcache/Python/3.11.8/x64/lib/python3.11/site-packages/gdsfactory/klive.py:49: UserWarning: Could not connect to klive server. Is klayout open and klive plugin installed?
warnings.warn(
Top reticle assembly#
Once you have your components and circuits defined, you can add them into a top reticle Component for fabrication.
You need to consider:
what design variations do you want to include in the mask? You need to define your Design Of Experiment or DOE
obey DRC (Design rule checking) foundry rules for manufacturability. Foundry usually provides those rules for each layer (min width, min space, min density, max density)
make sure you will be able to test te devices after fabrication. Obey DFT (design for testing) rules. For example, if your test setup works only for fiber array, what is the fiber array spacing (127 or 250um?)
if you plan to package your device, make sure you follow your packaging guidelines from your packaging house (min pad size, min pad pitch, max number of rows for wire bonding …)
nm = 1e-3
ring_te = toolz.compose(gf.routing.add_fiber_array, gf.components.ring_single)
rings = gf.grid(
[
ring_te(radius=r, decorator=gf.labels.add_label_json, name=f"ring_{r}")
for r in [10, 20, 50]
]
)
@gf.cell
def reticle(size=(1000, 1000)):
c = gf.Component()
r = c << rings
m = c << gf.components.pack_doe(
gf.components.mzi,
settings=dict(delta_length=[100, 200]),
function=gf.routing.add_fiber_single,
)
m.xmin = r.xmax + 10
m.ymin = r.ymin
c << gf.components.seal_ring(c.bbox)
return c
m = reticle()
gf.remove_from_cache(m)
m.show()
m.plot()
2024-03-09 00:45:35.227 | WARNING | gdsfactory.cell:wrapper:161 - UserWarning: name is deprecated and will be removed soon. ring_single
2024-03-09 00:45:35.229 | WARNING | gdsfactory.cell:wrapper:250 - UserWarning: decorator is deprecated and will be removed soon. ring_single
/opt/hostedtoolcache/Python/3.11.8/x64/lib/python3.11/site-packages/toolz/functoolz.py:487: UserWarning: name is deprecated and will be removed soon. ring_single
ret = self.first(*args, **kwargs)
/opt/hostedtoolcache/Python/3.11.8/x64/lib/python3.11/site-packages/toolz/functoolz.py:487: UserWarning: decorator is deprecated and will be removed soon. ring_single
ret = self.first(*args, **kwargs)
2024-03-09 00:45:35.456 | INFO | gdsfactory.technology.layer_views:to_lyp:1017 - LayerViews written to '/tmp/gdsfactory/reticle.lyp'.
nm = 1e-3
ring_te = toolz.compose(gf.routing.add_fiber_array, gf.components.ring_single)
gaps = [210 * nm, 220 * nm, 230 * nm]
rings = [ring_te(gap=gap) for gap in gaps]
rings_grid = gf.grid(rings)
rings_heater = [
gf.components.ring_single_heater(
gap=0.2,
radius=10,
length_x=4,
via_stack_offset=(2, 0),
name=f"ring_heater_{int(gap*1e3)}",
)
for gap in gaps
]
rings_with_pads = [
gf.routing.add_fiber_array(
gf.routing.add_pads_top(ring, port_names=port_names),
decorator=gf.labels.add_label_json,
name=f"{ring.name}_te",
)
for ring in rings_heater
]
@gf.cell
def reticle(size=(1000, 1000)):
c = gf.Component()
p = c << gf.pack(rings_with_pads + rings)[0]
c.add_ports(p.ports)
c << gf.components.seal_ring(c.bbox)
return c
m = reticle()
gf.remove_from_cache(m)
m.show()
m.plot()
2024-03-09 00:45:35.689 | WARNING | gdsfactory.cell:wrapper:161 - UserWarning: name is deprecated and will be removed soon. ring_single_heater
2024-03-09 00:45:35.713 | WARNING | gdsfactory.cell:wrapper:161 - UserWarning: name is deprecated and will be removed soon. add_fiber_array
2024-03-09 00:45:35.714 | WARNING | gdsfactory.cell:wrapper:250 - UserWarning: decorator is deprecated and will be removed soon. add_fiber_array
/tmp/ipykernel_3019/2858029588.py:8: UserWarning: name is deprecated and will be removed soon. ring_single_heater
gf.components.ring_single_heater(
/tmp/ipykernel_3019/2858029588.py:18: UserWarning: name is deprecated and will be removed soon. add_fiber_array
gf.routing.add_fiber_array(
/tmp/ipykernel_3019/2858029588.py:18: UserWarning: decorator is deprecated and will be removed soon. add_fiber_array
gf.routing.add_fiber_array(
2024-03-09 00:45:35.929 | INFO | gdsfactory.technology.layer_views:to_lyp:1017 - LayerViews written to '/tmp/gdsfactory/reticle.lyp'.
gdspath = m.write_gds(gdspath="mask.gds")
2024-03-09 00:45:36.121 | INFO | gdsfactory.component:_write_library:2021 - Wrote to 'mask.gds'
m.pprint_ports()
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━┓ ┃ name ┃ width ┃ center ┃ orientation ┃ layer ┃ port_type ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━┩ │ add_fiber_array_add_label_yaml_2b7c9fca-l_e1 │ 4.0 │ [200.52, 608.451] │ 180.0 │ [49, 0] │ electrical │ │ add_fiber_array_add_label_yaml_2b7c9fca-l_e2 │ 4.0 │ [202.52, 606.451] │ 270.0 │ [49, 0] │ electrical │ │ add_fiber_array_add_label_yaml_2b7c9fca-l_e3 │ 4.0 │ [204.52, 608.451] │ 0.0 │ [49, 0] │ electrical │ │ add_fiber_array_add_label_yaml_2b7c9fca-loopb… │ 0.5 │ [18.02, 538.451] │ 90.0 │ [1, 0] │ optical │ │ add_fiber_array_add_label_yaml_2b7c9fca-loopb… │ 0.5 │ [399.02, 538.451] │ 90.0 │ [1, 0] │ optical │ │ add_fiber_array_add_label_yaml_2b7c9fca-o1 │ 0.5 │ [145.02, 538.451] │ 90.0 │ [1, 0] │ optical │ │ add_fiber_array_add_label_yaml_2b7c9fca-o2 │ 0.5 │ [272.02, 538.451] │ 90.0 │ [1, 0] │ optical │ │ add_fiber_array_add_label_yaml_2b7c9fca-pad_1 │ 80.0 │ [158.52, 646.451] │ 270.0 │ [49, 0] │ electrical │ │ add_fiber_array_add_label_yaml_2b7c9fca-pad_2 │ 80.0 │ [258.52, 646.451] │ 270.0 │ [49, 0] │ electrical │ │ add_fiber_array_add_label_yaml_2b7c9fca-r_e1 │ 4.0 │ [212.52, 608.451] │ 180.0 │ [49, 0] │ electrical │ │ add_fiber_array_add_label_yaml_2b7c9fca-r_e2 │ 4.0 │ [214.52, 606.451] │ 270.0 │ [49, 0] │ electrical │ │ add_fiber_array_add_label_yaml_2b7c9fca-r_e3 │ 4.0 │ [216.52, 608.451] │ 0.0 │ [49, 0] │ electrical │ │ add_fiber_array_add_label_yaml_7e8e0431-l_e1 │ 4.0 │ [200.52, 120.851] │ 180.0 │ [49, 0] │ electrical │ │ add_fiber_array_add_label_yaml_7e8e0431-l_e2 │ 4.0 │ [202.52, 118.851] │ 270.0 │ [49, 0] │ electrical │ │ add_fiber_array_add_label_yaml_7e8e0431-l_e3 │ 4.0 │ [204.52, 120.851] │ 0.0 │ [49, 0] │ electrical │ │ add_fiber_array_add_label_yaml_7e8e0431-loopb… │ 0.5 │ [18.02, 50.851] │ 90.0 │ [1, 0] │ optical │ │ add_fiber_array_add_label_yaml_7e8e0431-loopb… │ 0.5 │ [399.02, 50.851] │ 90.0 │ [1, 0] │ optical │ │ add_fiber_array_add_label_yaml_7e8e0431-o1 │ 0.5 │ [145.02, 50.851] │ 90.0 │ [1, 0] │ optical │ │ add_fiber_array_add_label_yaml_7e8e0431-o2 │ 0.5 │ [272.02, 50.851] │ 90.0 │ [1, 0] │ optical │ │ add_fiber_array_add_label_yaml_7e8e0431-pad_1 │ 80.0 │ [158.52, 158.851] │ 270.0 │ [49, 0] │ electrical │ │ add_fiber_array_add_label_yaml_7e8e0431-pad_2 │ 80.0 │ [258.52, 158.851] │ 270.0 │ [49, 0] │ electrical │ │ add_fiber_array_add_label_yaml_7e8e0431-r_e1 │ 4.0 │ [212.52, 120.851] │ 180.0 │ [49, 0] │ electrical │ │ add_fiber_array_add_label_yaml_7e8e0431-r_e2 │ 4.0 │ [214.52, 118.851] │ 270.0 │ [49, 0] │ electrical │ │ add_fiber_array_add_label_yaml_7e8e0431-r_e3 │ 4.0 │ [216.52, 120.851] │ 0.0 │ [49, 0] │ electrical │ │ add_fiber_array_add_label_yaml_ec614ff3-l_e1 │ 4.0 │ [200.52, 364.651] │ 180.0 │ [49, 0] │ electrical │ │ add_fiber_array_add_label_yaml_ec614ff3-l_e2 │ 4.0 │ [202.52, 362.651] │ 270.0 │ [49, 0] │ electrical │ │ add_fiber_array_add_label_yaml_ec614ff3-l_e3 │ 4.0 │ [204.52, 364.651] │ 0.0 │ [49, 0] │ electrical │ │ add_fiber_array_add_label_yaml_ec614ff3-loopb… │ 0.5 │ [18.02, 294.651] │ 90.0 │ [1, 0] │ optical │ │ add_fiber_array_add_label_yaml_ec614ff3-loopb… │ 0.5 │ [399.02, 294.651] │ 90.0 │ [1, 0] │ optical │ │ add_fiber_array_add_label_yaml_ec614ff3-o1 │ 0.5 │ [145.02, 294.651] │ 90.0 │ [1, 0] │ optical │ │ add_fiber_array_add_label_yaml_ec614ff3-o2 │ 0.5 │ [272.02, 294.651] │ 90.0 │ [1, 0] │ optical │ │ add_fiber_array_add_label_yaml_ec614ff3-pad_1 │ 80.0 │ [158.52, 402.651] │ 270.0 │ [49, 0] │ electrical │ │ add_fiber_array_add_label_yaml_ec614ff3-pad_2 │ 80.0 │ [258.52, 402.651] │ 270.0 │ [49, 0] │ electrical │ │ add_fiber_array_add_label_yaml_ec614ff3-r_e1 │ 4.0 │ [212.52, 364.651] │ 180.0 │ [49, 0] │ electrical │ │ add_fiber_array_add_label_yaml_ec614ff3-r_e2 │ 4.0 │ [214.52, 362.651] │ 270.0 │ [49, 0] │ electrical │ │ add_fiber_array_add_label_yaml_ec614ff3-r_e3 │ 4.0 │ [216.52, 364.651] │ 0.0 │ [49, 0] │ electrical │ │ ring_single_add_fiber_array_0ea792f3-loopback1 │ 0.5 │ [434.96, 155.921] │ 90.0 │ [1, 0] │ optical │ │ ring_single_add_fiber_array_0ea792f3-loopback2 │ 0.5 │ [815.96, 155.921] │ 90.0 │ [1, 0] │ optical │ │ ring_single_add_fiber_array_0ea792f3-o1 │ 0.5 │ [561.96, 155.921] │ 90.0 │ [1, 0] │ optical │ │ ring_single_add_fiber_array_0ea792f3-o2 │ 0.5 │ [688.96, 155.921] │ 90.0 │ [1, 0] │ optical │ │ ring_single_add_fiber_array_6989065d-loopback1 │ 0.5 │ [434.96, 50.851] │ 90.0 │ [1, 0] │ optical │ │ ring_single_add_fiber_array_6989065d-loopback2 │ 0.5 │ [815.96, 50.851] │ 90.0 │ [1, 0] │ optical │ │ ring_single_add_fiber_array_6989065d-o1 │ 0.5 │ [561.96, 50.851] │ 90.0 │ [1, 0] │ optical │ │ ring_single_add_fiber_array_6989065d-o2 │ 0.5 │ [688.96, 50.851] │ 90.0 │ [1, 0] │ optical │ │ ring_single_add_fiber_array_cd4d2efc-loopback1 │ 0.5 │ [18.02, 782.251] │ 90.0 │ [1, 0] │ optical │ │ ring_single_add_fiber_array_cd4d2efc-loopback2 │ 0.5 │ [399.02, 782.251] │ 90.0 │ [1, 0] │ optical │ │ ring_single_add_fiber_array_cd4d2efc-o1 │ 0.5 │ [145.02, 782.251] │ 90.0 │ [1, 0] │ optical │ │ ring_single_add_fiber_array_cd4d2efc-o2 │ 0.5 │ [272.02, 782.251] │ 90.0 │ [1, 0] │ optical │ └────────────────────────────────────────────────┴───────┴───────────────────┴─────────────┴─────────┴────────────┘
You can also write the test sequence in CSV from the component
df = gf.labels.get_test_manifest(m)
df
cell | measurement | measurement_settings | analysis | analysis_settings | doe | parent | |
---|---|---|---|---|---|---|---|
0 | add_fiber_array_add_label_yaml_2b7c9fca | None | None | None | None | None | add_fiber_array_add_label_yaml_2b7c9fca |
1 | add_fiber_array_add_label_yaml_7e8e0431 | None | None | None | None | None | add_fiber_array_add_label_yaml_7e8e0431 |
2 | add_fiber_array_add_label_yaml_ec614ff3 | None | None | None | None | None | add_fiber_array_add_label_yaml_ec614ff3 |
3 | ring_single_add_fiber_array_0ea792f3 | None | None | None | None | None | ring_single_add_fiber_array_0ea792f3 |
4 | ring_single_add_fiber_array_6989065d | None | None | None | None | None | ring_single_add_fiber_array_6989065d |
5 | ring_single_add_fiber_array_cd4d2efc | None | None | None | None | None | ring_single_add_fiber_array_cd4d2efc |
As you can see there are 6 devices with optical and electrical ports.
You can turn each label into a test manifest CSV file to interface with your lab instrumentation functions.
Each measurement will use a different measurement procedure and settings measurement_settings
The default measurement settings for each functions can also be defined in a separate CSV file and easily editable with Excel or LibreOffice.
df.to_csv("test_manifest.csv")
def sample_reticle(grid: bool = False, **kwargs) -> gf.Component:
"""Returns MZI with TE grating couplers.
Args:
grid: if True returns components on a regular grid. False packs them as close as possible.
kwargs: passed to pack or grid.
"""
test_info_mzi_heaters = dict(
doe="mzis_heaters",
analysis="mzi_heater",
measurement="optical_loopback4_heater_sweep",
)
test_info_ring_heaters = dict(
doe="ring_heaters",
analysis="ring_heater",
measurement="optical_loopback2_heater_sweep",
)
mzis = [
gf.components.mzi2x2_2x2_phase_shifter(
length_x=length, name=f"mzi_heater_{length}"
)
for length in [100, 200, 300]
]
rings = [
gf.components.ring_single_heater(
length_x=length_x, name=f"ring_single_heater_{length_x}"
)
for length_x in [10, 20, 30]
]
spirals_sc = [
gf.components.spiral_inner_io_fiber_array(
name=f"spiral_sc_{int(length/1e3)}mm",
length=length,
info=dict(
doe="spirals_sc",
measurement="optical_loopback4",
analysis="optical_loopback4_spirals",
),
)
for length in [20e3, 40e3, 60e3]
]
mzis_te = [
gf.components.add_fiber_array_optical_south_electrical_north(
mzi,
electrical_port_names=["top_l_e2", "top_r_e2"],
info=test_info_mzi_heaters,
name=f"{mzi.name}_te",
)
for mzi in mzis
]
rings_te = [
gf.components.add_fiber_array_optical_south_electrical_north(
ring,
electrical_port_names=["l_e2", "r_e2"],
info=test_info_ring_heaters,
name=f"{ring.name}_te",
)
for ring in rings
]
components = mzis_te + rings_te + spirals_sc
if grid:
return gf.grid(components, name_ports_with_component_name=True, **kwargs)
c = gf.pack(components, **kwargs)
if len(c) > 1:
raise ValueError(f"failed to pack into single group. Made {len(c)} groups.")
return c[0]
m = sample_reticle()
gf.remove_from_cache(m)
m.show()
m.plot()
2024-03-09 00:45:36.201 | WARNING | gdsfactory.cell:wrapper:161 - UserWarning: name is deprecated and will be removed soon. mzi
2024-03-09 00:45:36.281 | WARNING | gdsfactory.cell:wrapper:161 - UserWarning: name is deprecated and will be removed soon. ring_single_heater
2024-03-09 00:45:36.327 | WARNING | gdsfactory.cell:wrapper:161 - UserWarning: name is deprecated and will be removed soon. spiral_inner_io_fiber_array
/tmp/ipykernel_3019/3673358333.py:20: UserWarning: name is deprecated and will be removed soon. mzi
gf.components.mzi2x2_2x2_phase_shifter(
/tmp/ipykernel_3019/3673358333.py:26: UserWarning: name is deprecated and will be removed soon. ring_single_heater
gf.components.ring_single_heater(
/tmp/ipykernel_3019/3673358333.py:33: UserWarning: name is deprecated and will be removed soon. spiral_inner_io_fiber_array
gf.components.spiral_inner_io_fiber_array(
2024-03-09 00:45:36.789 | WARNING | gdsfactory.cell:wrapper:161 - UserWarning: name is deprecated and will be removed soon. add_fiber_array_optical_south_electrical_north
2024-03-09 00:45:36.981 | WARNING | gdsfactory.cell:wrapper:161 - UserWarning: name is deprecated and will be removed soon. add_fiber_array_optical_south_electrical_north
/tmp/ipykernel_3019/3673358333.py:46: UserWarning: name is deprecated and will be removed soon. add_fiber_array_optical_south_electrical_north
gf.components.add_fiber_array_optical_south_electrical_north(
/tmp/ipykernel_3019/3673358333.py:55: UserWarning: name is deprecated and will be removed soon. add_fiber_array_optical_south_electrical_north
gf.components.add_fiber_array_optical_south_electrical_north(
2024-03-09 00:45:37.087 | WARNING | gdsfactory.klive:show:49 - UserWarning: Could not connect to klive server. Is klayout open and klive plugin installed?
2024-03-09 00:45:37.108 | INFO | gdsfactory.technology.layer_views:to_lyp:1017 - LayerViews written to '/tmp/gdsfactory/pack_0$2.lyp'.
/opt/hostedtoolcache/Python/3.11.8/x64/lib/python3.11/site-packages/gdsfactory/klive.py:49: UserWarning: Could not connect to klive server. Is klayout open and klive plugin installed?
warnings.warn(
m.pprint_ports()
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━┓ ┃ name ┃ width ┃ center ┃ orientation ┃ layer ┃ port_type ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━┩ │ mzi_mzi_heater_100_te-e4_1_1 │ 80.0 │ [285.635, 580.05] │ 270.0 │ [49, 0] │ electrical │ │ mzi_mzi_heater_100_te-e4_1_2 │ 80.0 │ [385.635, 580.05] │ 270.0 │ [49, 0] │ electrical │ │ mzi_mzi_heater_100_te-loopback1 │ 0.5 │ [18.135, 375.495] │ 90.0 │ [1, 0] │ optical │ │ mzi_mzi_heater_100_te-loopback2 │ 0.5 │ [653.135, 375.495] │ 90.0 │ [1, 0] │ optical │ │ mzi_mzi_heater_100_te-o1 │ 0.5 │ [145.135, 375.495] │ 90.0 │ [1, 0] │ optical │ │ mzi_mzi_heater_100_te-o2 │ 0.5 │ [272.135, 375.495] │ 90.0 │ [1, 0] │ optical │ │ mzi_mzi_heater_100_te-o3 │ 0.5 │ [399.135, 375.495] │ 90.0 │ [1, 0] │ optical │ │ mzi_mzi_heater_100_te-o4 │ 0.5 │ [526.135, 375.495] │ 90.0 │ [1, 0] │ optical │ │ mzi_mzi_heater_200_te-e4_1_1 │ 80.0 │ [285.635, 920.05] │ 270.0 │ [49, 0] │ electrical │ │ mzi_mzi_heater_200_te-e4_1_2 │ 80.0 │ [385.635, 920.05] │ 270.0 │ [49, 0] │ electrical │ │ mzi_mzi_heater_200_te-loopback1 │ 0.5 │ [18.135, 715.495] │ 90.0 │ [1, 0] │ optical │ │ mzi_mzi_heater_200_te-loopback2 │ 0.5 │ [653.135, 715.495] │ 90.0 │ [1, 0] │ optical │ │ mzi_mzi_heater_200_te-o1 │ 0.5 │ [145.135, 715.495] │ 90.0 │ [1, 0] │ optical │ │ mzi_mzi_heater_200_te-o2 │ 0.5 │ [272.135, 715.495] │ 90.0 │ [1, 0] │ optical │ │ mzi_mzi_heater_200_te-o3 │ 0.5 │ [399.135, 715.495] │ 90.0 │ [1, 0] │ optical │ │ mzi_mzi_heater_200_te-o4 │ 0.5 │ [526.135, 715.495] │ 90.0 │ [1, 0] │ optical │ │ mzi_mzi_heater_300_te-e4_1_1 │ 80.0 │ [285.635, 1260.05] │ 270.0 │ [49, 0] │ electrical │ │ mzi_mzi_heater_300_te-e4_1_2 │ 80.0 │ [385.635, 1260.05] │ 270.0 │ [49, 0] │ electrical │ │ mzi_mzi_heater_300_te-loopback1 │ 0.5 │ [18.135, 1055.495] │ 90.0 │ [1, 0] │ optical │ │ mzi_mzi_heater_300_te-loopback2 │ 0.5 │ [653.135, 1055.495] │ 90.0 │ [1, 0] │ optical │ │ mzi_mzi_heater_300_te-o1 │ 0.5 │ [145.135, 1055.495] │ 90.0 │ [1, 0] │ optical │ │ mzi_mzi_heater_300_te-o2 │ 0.5 │ [272.135, 1055.495] │ 90.0 │ [1, 0] │ optical │ │ mzi_mzi_heater_300_te-o3 │ 0.5 │ [399.135, 1055.495] │ 90.0 │ [1, 0] │ optical │ │ mzi_mzi_heater_300_te-o4 │ 0.5 │ [526.135, 1055.495] │ 90.0 │ [1, 0] │ optical │ │ ring_single_heater_ring_single_heater_10_t… │ 80.0 │ [829.805, 580.05] │ 270.0 │ [49, 0] │ electrical │ │ ring_single_heater_ring_single_heater_10_t… │ 80.0 │ [929.805, 580.05] │ 270.0 │ [49, 0] │ electrical │ │ ring_single_heater_ring_single_heater_10_t… │ 0.5 │ [689.305, 375.494] │ 90.0 │ [1, 0] │ optical │ │ ring_single_heater_ring_single_heater_10_t… │ 0.5 │ [1070.305, 375.494] │ 90.0 │ [1, 0] │ optical │ │ ring_single_heater_ring_single_heater_10_t… │ 0.5 │ [816.305, 375.494] │ 90.0 │ [1, 0] │ optical │ │ ring_single_heater_ring_single_heater_10_t… │ 0.5 │ [943.305, 375.494] │ 90.0 │ [1, 0] │ optical │ │ ring_single_heater_ring_single_heater_20_t… │ 80.0 │ [829.805, 920.05] │ 270.0 │ [49, 0] │ electrical │ │ ring_single_heater_ring_single_heater_20_t… │ 80.0 │ [929.805, 920.05] │ 270.0 │ [49, 0] │ electrical │ │ ring_single_heater_ring_single_heater_20_t… │ 0.5 │ [689.305, 715.494] │ 90.0 │ [1, 0] │ optical │ │ ring_single_heater_ring_single_heater_20_t… │ 0.5 │ [1070.305, 715.494] │ 90.0 │ [1, 0] │ optical │ │ ring_single_heater_ring_single_heater_20_t… │ 0.5 │ [816.305, 715.494] │ 90.0 │ [1, 0] │ optical │ │ ring_single_heater_ring_single_heater_20_t… │ 0.5 │ [943.305, 715.494] │ 90.0 │ [1, 0] │ optical │ │ ring_single_heater_ring_single_heater_30_t… │ 80.0 │ [829.805, 1260.05] │ 270.0 │ [49, 0] │ electrical │ │ ring_single_heater_ring_single_heater_30_t… │ 80.0 │ [929.805, 1260.05] │ 270.0 │ [49, 0] │ electrical │ │ ring_single_heater_ring_single_heater_30_t… │ 0.5 │ [689.305, 1055.494] │ 90.0 │ [1, 0] │ optical │ │ ring_single_heater_ring_single_heater_30_t… │ 0.5 │ [1070.305, 1055.494] │ 90.0 │ [1, 0] │ optical │ │ ring_single_heater_ring_single_heater_30_t… │ 0.5 │ [816.305, 1055.494] │ 90.0 │ [1, 0] │ optical │ │ ring_single_heater_ring_single_heater_30_t… │ 0.5 │ [943.305, 1055.494] │ 90.0 │ [1, 0] │ optical │ │ spiral_sc_20mm-loopback1 │ 0.5 │ [360.824, 1455.3] │ 90.0 │ [1, 0] │ optical │ │ spiral_sc_20mm-loopback2 │ 0.5 │ [741.824, 1455.3] │ 90.0 │ [1, 0] │ optical │ │ spiral_sc_20mm-o1 │ 0.5 │ [487.824, 1459.3] │ 90.0 │ [1, 0] │ optical │ │ spiral_sc_20mm-o2 │ 0.5 │ [614.824, 1459.3] │ 90.0 │ [1, 0] │ optical │ │ spiral_sc_40mm-loopback1 │ 0.5 │ [1269.914, 272.8] │ 90.0 │ [1, 0] │ optical │ │ spiral_sc_40mm-loopback2 │ 0.5 │ [1650.914, 272.8] │ 90.0 │ [1, 0] │ optical │ │ spiral_sc_40mm-o1 │ 0.5 │ [1396.914, 276.8] │ 90.0 │ [1, 0] │ optical │ │ spiral_sc_40mm-o2 │ 0.5 │ [1523.914, 276.8] │ 90.0 │ [1, 0] │ optical │ │ spiral_sc_60mm-loopback1 │ 0.5 │ [2179.01, 110.3] │ 90.0 │ [1, 0] │ optical │ │ spiral_sc_60mm-loopback2 │ 0.5 │ [2560.01, 110.3] │ 90.0 │ [1, 0] │ optical │ │ spiral_sc_60mm-o1 │ 0.5 │ [2306.01, 114.3] │ 90.0 │ [1, 0] │ optical │ │ spiral_sc_60mm-o2 │ 0.5 │ [2433.01, 114.3] │ 90.0 │ [1, 0] │ optical │ └─────────────────────────────────────────────┴───────┴──────────────────────┴─────────────┴─────────┴────────────┘
df = gf.labels.get_test_manifest(m)
df
cell | measurement | measurement_settings | analysis | analysis_settings | doe | measurement | length | polarization | parent | doe | analysis | wavelength | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | mzi_mzi_heater_100_te | optical_loopback4_heater_sweep | None | mzi_heater | None | mzis_heaters | optical_loopback4_heater_sweep | NaN | None | mzi_mzi_heater_100_te | mzis_heaters | mzi_heater | NaN |
1 | mzi_mzi_heater_200_te | optical_loopback4_heater_sweep | None | mzi_heater | None | mzis_heaters | optical_loopback4_heater_sweep | NaN | None | mzi_mzi_heater_200_te | mzis_heaters | mzi_heater | NaN |
2 | mzi_mzi_heater_300_te | optical_loopback4_heater_sweep | None | mzi_heater | None | mzis_heaters | optical_loopback4_heater_sweep | NaN | None | mzi_mzi_heater_300_te | mzis_heaters | mzi_heater | NaN |
3 | ring_single_heater_ring_single_heater_10_te | optical_loopback2_heater_sweep | None | ring_heater | None | ring_heaters | optical_loopback2_heater_sweep | NaN | None | ring_single_heater_ring_single_heater_10_te | ring_heaters | ring_heater | NaN |
4 | ring_single_heater_ring_single_heater_20_te | optical_loopback2_heater_sweep | None | ring_heater | None | ring_heaters | optical_loopback2_heater_sweep | NaN | None | ring_single_heater_ring_single_heater_20_te | ring_heaters | ring_heater | NaN |
5 | ring_single_heater_ring_single_heater_30_te | optical_loopback2_heater_sweep | None | ring_heater | None | ring_heaters | optical_loopback2_heater_sweep | NaN | None | ring_single_heater_ring_single_heater_30_te | ring_heaters | ring_heater | NaN |
6 | spiral_sc_20mm | None | None | None | None | None | None | 20000.009 | te | spiral_sc_20mm | None | None | 1.53 |
7 | spiral_sc_40mm | None | None | None | None | None | None | 39999.989 | te | spiral_sc_40mm | None | None | 1.53 |
8 | spiral_sc_60mm | None | None | None | None | None | None | 60000.013 | te | spiral_sc_60mm | None | None | 1.53 |