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()

../_images/d4ab74a33ec030c04feeb0250109c9e99966993e778318c4edab7abbf2c9a7a9.png

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'.

../_images/4d0d3a2820c7f345fe04b048de270178525933e623c3685f5d3595b5814c9554.png
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'.

../_images/fb71cc458077c6d4a32f54736520199d73fdbdc4ea6eb8308a0ef82366146113.png
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(

../_images/1a1e2c97320808a2972107f7f6212177dc8d999ff34b6240dc4cfa41c1343ee3.png

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'.

../_images/538cd448d455ecf65aefe370c7a46cf600c9279b3d0830b71143b35b2fd05545.png
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'.

../_images/95a105da5aa0bf9e3e21db21e79fa4b007998ac34d4965b0aacd1f13bdd8472d.png
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(

../_images/514fe379435f7920854eb03c8fa387d89b5b7118d2e717111aceeec3812a4919.png
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