Schematic Cells¶
This notebook demonstrates how to use kfactory for schematic-driven
photonic design. We will:
- Build higher-level schematic cells
- Create basic parametric cells (PCell) such as straights and bends
 - Define routing strategies
 
 - Compare schematic vs. extracted layouts (LVS)
 - Generate reusable code from schematics
 
# Imports
import kfactory as kf
import numpy as np
from IPython.core.getipython import get_ipython
from pprint import pformat
Basic example with routing¶
In order to avoid name conflicts, let's create a new clean KCLayout (our PDK container).
A PDK (Process Design Kit) defines the available layers, devices, and design rules
for a given process. Here we’ll create a lightweight one for demonstration.
class Layers(kf.LayerInfos):
    WG: kf.kdb.LayerInfo = kf.kdb.LayerInfo(1, 0)
    WGEX: kf.kdb.LayerInfo = kf.kdb.LayerInfo(2,0)
layers = Layers()
pdk = kf.KCLayout("SCHEMA_PDK_ROUTING", infos=Layers)
Cell functions¶
To begin, we define the basic building blocks for routing:
- A straight waveguide of given length and width
 - A 90° Euler bend for turning corners
 
These primitives are enough to assemble larger routed networks.
@pdk.cell
def straight(width: int, length: int) -> kf.KCell:
    c = pdk.kcell()
    c.shapes(layers.WG).insert(kf.kdb.Box(0, -width // 2, length, width // 2))
    c.create_port(
        name="o1",
        width=width,
        trans=kf.kdb.Trans(rot=2, mirrx=False, x=0, y=0),
        layer_info=layers.WG,
    )
    c.create_port(
        name="o2",
        width=width,
        trans=kf.kdb.Trans(x=length, y=0),
        layer_info=layers.WG,
    )
    return c
bend90_function = kf.factories.euler.bend_euler_factory(kcl=pdk)
bend90 = bend90_function(width=0.500, radius=10, layer=layers.WG)
Routing strategy¶
Next we define a routing strategy (route_bundle).
This specifies how to connect groups of ports with straight sections and bends.
- It ensures separation between parallel routes
 - Reuses our basic cells (
straight,bend90) - Can be applied consistently across designs
 
@pdk.routing_strategy
def route_bundle(
    c: kf.KCell,
    start_ports: list[kf.Port],
    end_ports: list[kf.Port],
    separation: int = 5000,
) -> list[kf.routing.generic.ManhattanRoute]:
    return kf.routing.optical.route_bundle(
        c=kf.KCell(base=c._base),
        start_ports=[kf.Port(base=sp.base) for sp in start_ports],
        end_ports=[kf.Port(base=ep.base) for ep in end_ports],
        separation=separation,
        straight_factory=straight,
        bend90_cell=bend90,
    )
Example schematic with routing¶
Now we can demonstrate usage in a schematic:
- Two straight sections (
s1ands2) - Positioned apart vertically
 - Connected automatically by our routing strategy
 
This shows how schematics carry both connectivity and layout placement information.
@pdk.schematic_cell
def route_example() -> kf.schematic.TSchematic[int]:
    schematic = kf.Schematic(kcl=pdk)
    s1 = schematic.create_inst(
        name="s1", component="straight", settings={"length": 5000, "width": 500}
    )
    s2 = schematic.create_inst(
        name="s2", component="straight", settings={"length": 5000, "width": 500}
    )
    s1.place(x=1000, y=10_000)
    s2.place(x=1000, y=210_000)
    schematic.add_route(
        "s1-s2", [s1["o2"]], [s2["o2"]], "route_bundle", separation=20_000
    )
    return schematic
route_example()
Example: 45 Degrees Crossing with virtual cells¶
We’ll now construct a more advanced schematic: a grid of 45° crossings. This introduces:
- Direct polygon construction
 - Use of virtual parametric cells (
vcellandVKCell) - Hierarchical design through schematic instantiation
 
Setup pdk¶
Let’s define a new KCLayout for this example, including
a cross-section definition for a wide waveguide.
pdk = kf.KCLayout("CROSSING_PDK", infos=Layers)
LAYER = Layers()
xs_wg1 = pdk.get_icross_section(
    kf.SymmetricalCrossSection(
        width=1000,
        enclosure=kf.LayerEnclosure(
            [(LAYER.WGEX, 3000)], name="WG", main_layer=LAYER.WG
        ),
        name="WG1000",
    )
)
# Ensure the same cross_section is also available in the target layout as well
kf.kcl.get_icross_section(xs_wg1)
<kfactory.cross_section.CrossSection at 0x7f324cea4980>
PDK Cells¶
The cross cell builds a single 45° crossing:
- Constructs polygons for waveguide arms
 - Ensures spacing rules are met via 
fix_spacing_tiled - Adds enclosures for cladding / fill excludes
 - Creates ports in four directions for connectivity
 
@pdk.cell
def cross(cross_section: str) -> kf.KCell:
    c = pdk.kcell()
    xs = c.kcl.get_icross_section(cross_section)
    # calculate points for one arm of the cross
    points = [
        kf.kdb.DPoint(
            x * 0.075, c.kcl.to_um(xs.width // 2) + float(np.sin(x / 125 * np.pi))
        )
        for x in range(101)
    ]
    mt = kf.kdb.DTrans.M0
    poly = kf.kdb.DPolygon(points + list(reversed([mt * p for p in points]))).to_itype(
        c.kcl.dbu
    )
    center_dist = c.kcl.to_dbu(points[-1].y)
    base_trans = kf.kdb.Trans(-poly.bbox().right - center_dist, 0)
    r = kf.kdb.Region(
        [
            poly.transformed(base_trans) * kf.kdb.Trans(rot, False, 0, 0)
            for rot in range(4)
        ]
    ).hulls()
    shapes = c.shapes(LAYER.WG)
    shapes.insert(r)
    # fix minimum space violations for 300 dbu (.3um)
    fix = kf.utils.fix_spacing_tiled(c, 300, layer=LAYER.WG)
    # remove unfixed polygons
    shapes.clear()
    # add fixed polygon
    shapes.insert(fix)
    bb = c.bbox(c.kcl.layer(xs.main_layer))
    c.create_port(trans=kf.kdb.Trans(0, False, bb.right, 0), cross_section=xs)
    c.create_port(trans=kf.kdb.Trans(1, False, 0, bb.top), cross_section=xs)
    c.create_port(trans=kf.kdb.Trans(2, False, bb.left, 0), cross_section=xs)
    c.create_port(trans=kf.kdb.Trans(3, False, 0, bb.bottom), cross_section=xs)
    xs.enclosure.apply_minkowski_tiled(c, xs.main_layer)
    c.auto_rename_ports()
    return c
Virtual cells¶
Unlike physical cells, virtual cells are defined parametrically:
- Only generate geometry when needed
 - Lightweight and efficient
 
Here we define:
bend_euler: a parametric Euler bendeuler_term: a bend tapering to a terminationstraight: a parametric straight section
@pdk.vcell
def bend_euler(
    radius: float,
    cross_section: str,
    angle: float = 90,
    resolution: float = 150,
) -> kf.VKCell:
    """Create a virtual euler bend.
    Args:
        radius: Radius of the backbone. [um]
        cross_section: Name of the CrossSection of the bend.
        angle: Angle of the bend.
        resolution: Angle resolution for the backbone.
    """
    c = pdk.vkcell()
    xs = c.kcl.get_dcross_section(cross_section)
    dbu = c.kcl.dbu
    backbone = kf.factories.virtual.euler.euler_bend_points(
        angle, radius=radius, resolution=resolution
    )
    kf.factories.virtual.utils.extrude_backbone(
        c=c,
        backbone=backbone,
        width=xs.width,
        layer=xs.main_layer,
        enclosure=xs.enclosure,
        start_angle=0,
        end_angle=angle,
        dbu=dbu,
    )
    c.create_port(
        name="o1",
        cross_section=xs,
        dcplx_trans=kf.kdb.DCplxTrans(1, 180, False, backbone[0].to_v()),
    )
    c.create_port(
        name="o2",
        cross_section=xs,
        dcplx_trans=kf.kdb.DCplxTrans(1, angle, False, backbone[-1].to_v()),
    )
    return c
@pdk.vcell
def euler_term(radius: float, cross_section: str, term_width: float) -> kf.VKCell:
    angle = 45
    resolution = 150
    c = pdk.vkcell()
    xs = c.kcl.get_dcross_section(cross_section)
    dbu = c.kcl.dbu
    backbone = kf.factories.virtual.euler.euler_bend_points(
        angle, radius=xs.radius, resolution=resolution
    )
    kf.factories.virtual.utils.extrude_backbone_dynamic(
        c=c,
        backbone=backbone,
        width1=xs.width,
        width2=term_width,
        layer=xs.main_layer,
        enclosure=xs.enclosure,
        start_angle=0,
        end_angle=angle,
        dbu=dbu,
    )
    c.create_port(
        name="o1",
        cross_section=xs,
        dcplx_trans=kf.kdb.DCplxTrans(1, 180, False, backbone[0].to_v()),
    )
    return c
@pdk.vcell
def straight(length: float, cross_section: str) -> kf.VKCell:
    c = pdk.vkcell()
    xs = c.kcl.get_dcross_section(cross_section)
    kf.factories.virtual.utils.extrude_backbone(
        c,
        [kf.kdb.DPoint(0, 0), kf.kdb.DPoint(length, 0)],
        start_angle=0,
        end_angle=0,
        width=xs.width,
        layer=xs.main_layer,
        enclosure=xs.enclosure,
        dbu=c.kcl.dbu,
    )
    c.create_port(
        name="o2",
        dcplx_trans=kf.kdb.DCplxTrans(mag=1, rot=0, mirrx=False, x=length, y=0),
        cross_section=xs,
    )
    c.create_port(
        name="o1",
        dcplx_trans=kf.kdb.DCplxTrans(mag=1, rot=180, mirrx=False, x=0, y=0),
        cross_section=xs,
    )
    return c
Crossing schematic¶
The crossing45 schematic builds an array of crossings:
- Tiles multiple 
crossinstances - Adds spacers and bends to enforce pitch
 - Places input/output ports systematically
 
This results in a scalable crossing matrix driven entirely by schematic logic.
@kf.kcl.schematic_cell(output_type=kf.DKCell)
def crossing45(n: int, pitch: kf.typings.um, cross_section: str) -> kf.DSchematic:
    s = kf.DSchematic(kcl=kf.kcl)
    xs = s.kcl.get_dcross_section(cross_section)
    cross_cell = cross(cross_section=cross_section)
    cross_port_delta = (
        cross_cell.ports["o1"].dcplx_trans.disp
        - cross_cell.ports["o2"].dcplx_trans.disp
    ).length()
    width = cross_cell.dbbox(cross_cell.kcl.layer(xs.main_layer)).width()
    bend_cell = bend_euler(radius=30, cross_section=cross_section, angle=45)
    dy = abs(bend_cell.ports["o1"].y - bend_cell.ports["o2"].y)
    dl = float((pitch - cross_port_delta - dy * 2) / np.sqrt(2))
    d_w = float(pitch * np.sqrt(2) - width)
    if d_w < 0:
        raise ValueError(
            f"Pitch must be bigger than the crossing's size: crossing_width={width}, {pitch=}"
        )
    for i in range(n // 2):
        for j in range(n // 2):
            crossing = s.create_inst(
                name=f"crossing_{i}_{j}",
                component="cross",
                virtual=True,
                kcl=pdk,
                settings={"cross_section": xs.name},
            )
            if d_w > 0:
                match i, j:
                    case 0, 0:
                        crossing.place(orientation=45)
                    case 0, j:
                        wg_ij = s.create_inst(
                            name=f"spacer_{i}_{j}_1",
                            component="straight",
                            settings={"length": d_w, "cross_section": cross_section},
                            kcl=pdk,
                            virtual=True,
                        )
                        wg_ij.connect(
                            "o1", s.instances[f"crossing_{i}_{j - 1}"].ports["o4"]
                        )
                        crossing.connect("o2", wg_ij.ports["o2"])
                    case i, 0:
                        wg_ij = s.create_inst(
                            name=f"spacer_{i}_{j}_2",
                            component="straight",
                            settings={"length": d_w, "cross_section": cross_section},
                            kcl=pdk,
                            virtual=True,
                        )
                        wg_ij.connect(
                            "o1", s.instances[f"crossing_{i - 1}_{j}"].ports["o3"]
                        )
                        crossing.connect("o1", wg_ij.ports["o2"])
                    case i, j:
                        wg_ij1 = s.create_inst(
                            name=f"spacer_{i}_{j}_1",
                            component="straight",
                            settings={"length": d_w, "cross_section": cross_section},
                            kcl=pdk,
                            virtual=True,
                        )
                        wg_ij1.connect(
                            "o1", s.instances[f"crossing_{i}_{j - 1}"].ports["o4"]
                        )
                        wg_ij2 = s.create_inst(
                            name=f"spacer_{i}_{j}_2",
                            component="straight",
                            settings={"length": d_w, "cross_section": cross_section},
                            kcl=pdk,
                            virtual=True,
                        )
                        wg_ij2.connect(
                            "o1", s.instances[f"crossing_{i - 1}_{j}"].ports["o3"]
                        )
                        crossing.connect("o2", wg_ij1.ports["o2"])
                        crossing.connect("o1", wg_ij2.ports["o2"])
            else:
                match i, j:
                    case 0, 0:
                        crossing.place()
                    case 0, j:
                        crossing.connect(
                            "o2", s.instances[f"crossing_{i}_{j - 1}"].ports["o4"]
                        )
                    case i, 0:
                        crossing.connect(
                            "o1", s.instances[f"crossing_{i - 1}_{j}"].ports["o3"]
                        )
                    case i, j:
                        crossing.connect(
                            "o2", s.instances[f"crossing_{i}_{j - 1}"].ports["o4"]
                        )
                        crossing.connect(
                            "o1", s.instances[f"crossing_{i - 1}_{j}"].ports["o3"]
                        )
    for i in range(n // 2):
        spacer_start_top = s.create_inst(
            name=f"io_spacer_{i}",
            component="straight",
            settings={"length": dl, "cross_section": cross_section},
            kcl=pdk,
            virtual=True,
        )
        bend_start_top = s.create_inst(
            name=f"bend45_{i}",
            component="bend_euler",
            settings={"angle": 45, "cross_section": cross_section, "radius": 30},
            kcl=pdk,
            virtual=True,
        )
        bend_start_top.mirror = True
        spacer_start_top.connect("o2", s.instances[f"crossing_{i}_0"].ports["o2"])
        spacer_start_top.connect("o1", bend_start_top.ports["o2"])
        spacer_start_bot = s.create_inst(
            name=f"io_spacer_{n - 1 - i}",
            component="straight",
            settings={"length": dl, "cross_section": cross_section},
            kcl=pdk,
            virtual=True,
        )
        bend_start_bot = s.create_inst(
            name=f"bend45_{n - i - 1}",
            component="bend_euler",
            settings={"angle": 45, "cross_section": cross_section, "radius": 30},
            kcl=pdk,
            virtual=True,
        )
        spacer_start_bot.connect("o2", s.instances[f"crossing_0_{i}"].ports["o1"])
        spacer_start_bot.connect("o1", bend_start_bot.ports["o2"])
        spacer_end_top = s.create_inst(
            name=f"io_spacer_{n + i}",
            component="straight",
            settings={"length": dl, "cross_section": cross_section},
            kcl=pdk,
            virtual=True,
        )
        bend_end_top = s.create_inst(
            name=f"bend45_{n + i}",
            component="bend_euler",
            settings={"angle": 45, "cross_section": cross_section, "radius": 30},
            kcl=pdk,
            virtual=True,
        )
        bend_end_top.mirror = True
        spacer_end_top.connect(
            "o1", s.instances[f"crossing_{i}_{n // 2 - 1}"].ports["o4"]
        )
        spacer_end_top.connect("o2", bend_end_top.ports["o2"])
        spacer_end_bot = s.create_inst(
            name=f"io_spacer_{2 * n - i - 1}",
            component="straight",
            settings={"length": dl, "cross_section": cross_section},
            kcl=pdk,
            virtual=True,
        )
        bend_end_bot = s.create_inst(
            name=f"bend45_{2 * n - i - 1}",
            component="bend_euler",
            settings={"angle": 45, "cross_section": cross_section, "radius": 30},
            kcl=pdk,
            virtual=True,
        )
        spacer_end_bot.connect(
            "o1", s.instances[f"crossing_{n // 2 - 1}_{i}"].ports["o3"]
        )
        spacer_end_bot.connect("o2", bend_end_bot.ports["o2"])
        io_l_start = float(pitch * i)
        io_l_end = float((n // 2 - i - 1) * pitch)
        if io_l_start:
            io_straight_start_top = s.create_inst(
                name=f"io_straight_{i}",
                component="straight",
                settings={"length": io_l_start, "cross_section": cross_section},
                kcl=pdk,
                virtual=True,
            )
            io_straight_start_top.connect("o2", bend_start_top.ports["o1"])
            io_straight_start_bot = s.create_inst(
                name=f"io_straight_{n - 1 - i}",
                component="straight",
                settings={"length": io_l_start, "cross_section": cross_section},
                kcl=pdk,
                virtual=True,
            )
            io_straight_start_bot.connect("o2", bend_start_bot.ports["o1"])
            s.add_port(name=f"in_{n // 2 + i}", port=io_straight_start_top.ports["o1"])
            s.add_port(
                name=f"in_{n // 2 - 1 - i}", port=io_straight_start_bot.ports["o1"]
            )
        else:
            s.add_port(name=f"in_{n // 2 + i}", port=bend_start_top.ports["o1"])
            s.add_port(name=f"in_{n // 2 - 1 - i}", port=bend_start_bot.ports["o1"])
        if io_l_end:
            io_straight_end_top = s.create_inst(
                name=f"io_straight_{n + i}",
                component="straight",
                settings={"length": io_l_end, "cross_section": cross_section},
                kcl=pdk,
                virtual=True,
            )
            io_straight_end_top.connect("o2", bend_end_top.ports["o1"])
            io_straight_end_bot = s.create_inst(
                name=f"io_straight_{2 * n - 1 - i}",
                component="straight",
                settings={"length": io_l_end, "cross_section": cross_section},
                kcl=pdk,
                virtual=True,
            )
            io_straight_end_bot.connect("o2", bend_end_bot.ports["o1"])
            s.add_port(name=f"out_{n // 2 + i}", port=io_straight_end_top.ports["o1"])
            s.add_port(
                name=f"out_{n // 2 - 1 - i}", port=io_straight_end_bot.ports["o1"]
            )
        else:
            s.add_port(name=f"out_{n // 2 + i}", port=bend_end_top.ports["o1"])
            s.add_port(name=f"out_{n // 2 - 1 - i}", port=bend_end_bot.ports["o1"])
    return s
c = crossing45(8, pitch=30, cross_section="WG1000")
c
scrollable_text(pformat(c.schematic.model_dump(exclude_defaults=True)))
/home/runner/work/_temp/setup-uv-cache/archive-v0/Yv02LrUJTu7KV3UuM_7W_/lib/python3.12/site-packages/pydantic/main.py:464: UserWarning: Pydantic serializer warnings: PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_0_1_1', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_0_1_1', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_0_2_1', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_0_2_1', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_0_3_1', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_0_3_1', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_1_0_2', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_1_0_2', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_1_1_1', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_1_1_2', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_1_1_1', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_1_1_2', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_1_2_1', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_1_2_2', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_1_2_1', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_1_2_2', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_1_3_1', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_1_3_2', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_1_3_1', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_1_3_2', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_2_0_2', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_2_0_2', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_2_1_1', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_2_1_2', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_2_1_1', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_2_1_2', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_2_2_1', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_2_2_2', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_2_2_1', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_2_2_2', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_2_3_1', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_2_3_2', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_2_3_1', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_2_3_2', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_3_0_2', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_3_0_2', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_3_1_1', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_3_1_2', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_3_1_1', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_3_1_2', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_3_2_1', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_3_2_2', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_3_2_1', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_3_2_2', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_3_3_1', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_3_3_2', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_3_3_1', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...cer_3_3_2', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(..._spacer_0', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(..._spacer_0', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(..._spacer_7', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(..._spacer_7', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(..._spacer_8', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(..._spacer_8', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...spacer_15', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...spacer_15', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...traight_8', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...raight_15', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(..._spacer_1', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(..._spacer_1', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(..._spacer_6', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(..._spacer_6', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(..._spacer_9', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(..._spacer_9', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...spacer_14', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...spacer_14', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...traight_1', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...traight_6', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...traight_9', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...raight_14', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(..._spacer_2', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(..._spacer_2', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(..._spacer_5', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(..._spacer_5', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...spacer_10', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...spacer_10', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...spacer_13', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...spacer_13', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...traight_2', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...traight_5', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...raight_10', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...raight_13', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(..._spacer_3', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(..._spacer_3', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(..._spacer_4', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(..._spacer_4', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...spacer_11', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...spacer_11', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...spacer_12', port='o1'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...spacer_12', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...traight_3', port='o2'))), input_type=Connection]) PydanticSerializationUnexpectedValue(Expected `Connection[Annotated[float, str]]` - serialized value may not be as expected [field_name='connections', input_value=Connection(root=(PortRef(...traight_4', port='o2'))), input_type=Connection]) return self.__pydantic_serializer__.to_python(
{'connections': [({'instance': 'crossing_0_0', 'port': 'o4'},
                  {'instance': 'spacer_0_1_1', 'port': 'o1'}),
                 ({'instance': 'crossing_0_1', 'port': 'o2'},
                  {'instance': 'spacer_0_1_1', 'port': 'o2'}),
                 ({'instance': 'crossing_0_1', 'port': 'o4'},
                  {'instance': 'spacer_0_2_1', 'port': 'o1'}),
                 ({'instance': 'crossing_0_2', 'port': 'o2'},
                  {'instance': 'spacer_0_2_1', 'port': 'o2'}),
                 ({'instance': 'crossing_0_2', 'port': 'o4'},
                  {'instance': 'spacer_0_3_1', 'port': 'o1'}),
                 ({'instance': 'crossing_0_3', 'port': 'o2'},
                  {'instance': 'spacer_0_3_1', 'port': 'o2'}),
                 ({'instance': 'crossing_0_0', 'port': 'o3'},
                  {'instance': 'spacer_1_0_2', 'port': 'o1'}),
                 ({'instance': 'crossing_1_0', 'port': 'o1'},
                  {'instance': 'spacer_1_0_2', 'port': 'o2'}),
                 ({'instance': 'crossing_1_0', 'port': 'o4'},
                  {'instance': 'spacer_1_1_1', 'port': 'o1'}),
                 ({'instance': 'crossing_0_1', 'port': 'o3'},
                  {'instance': 'spacer_1_1_2', 'port': 'o1'}),
                 ({'instance': 'crossing_1_1', 'port': 'o2'},
                  {'instance': 'spacer_1_1_1', 'port': 'o2'}),
                 ({'instance': 'crossing_1_1', 'port': 'o1'},
                  {'instance': 'spacer_1_1_2', 'port': 'o2'}),
                 ({'instance': 'crossing_1_1', 'port': 'o4'},
                  {'instance': 'spacer_1_2_1', 'port': 'o1'}),
                 ({'instance': 'crossing_0_2', 'port': 'o3'},
                  {'instance': 'spacer_1_2_2', 'port': 'o1'}),
                 ({'instance': 'crossing_1_2', 'port': 'o2'},
                  {'instance': 'spacer_1_2_1', 'port': 'o2'}),
                 ({'instance': 'crossing_1_2', 'port': 'o1'},
                  {'instance': 'spacer_1_2_2', 'port': 'o2'}),
                 ({'instance': 'crossing_1_2', 'port': 'o4'},
                  {'instance': 'spacer_1_3_1', 'port': 'o1'}),
                 ({'instance': 'crossing_0_3', 'port': 'o3'},
                  {'instance': 'spacer_1_3_2', 'port': 'o1'}),
                 ({'instance': 'crossing_1_3', 'port': 'o2'},
                  {'instance': 'spacer_1_3_1', 'port': 'o2'}),
                 ({'instance': 'crossing_1_3', 'port': 'o1'},
                  {'instance': 'spacer_1_3_2', 'port': 'o2'}),
                 ({'instance': 'crossing_1_0', 'port': 'o3'},
                  {'instance': 'spacer_2_0_2', 'port': 'o1'}),
                 ({'instance': 'crossing_2_0', 'port': 'o1'},
                  {'instance': 'spacer_2_0_2', 'port': 'o2'}),
                 ({'instance': 'crossing_2_0', 'port': 'o4'},
                  {'instance': 'spacer_2_1_1', 'port': 'o1'}),
                 ({'instance': 'crossing_1_1', 'port': 'o3'},
                  {'instance': 'spacer_2_1_2', 'port': 'o1'}),
                 ({'instance': 'crossing_2_1', 'port': 'o2'},
                  {'instance': 'spacer_2_1_1', 'port': 'o2'}),
                 ({'instance': 'crossing_2_1', 'port': 'o1'},
                  {'instance': 'spacer_2_1_2', 'port': 'o2'}),
                 ({'instance': 'crossing_2_1', 'port': 'o4'},
                  {'instance': 'spacer_2_2_1', 'port': 'o1'}),
                 ({'instance': 'crossing_1_2', 'port': 'o3'},
                  {'instance': 'spacer_2_2_2', 'port': 'o1'}),
                 ({'instance': 'crossing_2_2', 'port': 'o2'},
                  {'instance': 'spacer_2_2_1', 'port': 'o2'}),
                 ({'instance': 'crossing_2_2', 'port': 'o1'},
                  {'instance': 'spacer_2_2_2', 'port': 'o2'}),
                 ({'instance': 'crossing_2_2', 'port': 'o4'},
                  {'instance': 'spacer_2_3_1', 'port': 'o1'}),
                 ({'instance': 'crossing_1_3', 'port': 'o3'},
                  {'instance': 'spacer_2_3_2', 'port': 'o1'}),
                 ({'instance': 'crossing_2_3', 'port': 'o2'},
                  {'instance': 'spacer_2_3_1', 'port': 'o2'}),
                 ({'instance': 'crossing_2_3', 'port': 'o1'},
                  {'instance': 'spacer_2_3_2', 'port': 'o2'}),
                 ({'instance': 'crossing_2_0', 'port': 'o3'},
                  {'instance': 'spacer_3_0_2', 'port': 'o1'}),
                 ({'instance': 'crossing_3_0', 'port': 'o1'},
                  {'instance': 'spacer_3_0_2', 'port': 'o2'}),
                 ({'instance': 'crossing_3_0', 'port': 'o4'},
                  {'instance': 'spacer_3_1_1', 'port': 'o1'}),
                 ({'instance': 'crossing_2_1', 'port': 'o3'},
                  {'instance': 'spacer_3_1_2', 'port': 'o1'}),
                 ({'instance': 'crossing_3_1', 'port': 'o2'},
                  {'instance': 'spacer_3_1_1', 'port': 'o2'}),
                 ({'instance': 'crossing_3_1', 'port': 'o1'},
                  {'instance': 'spacer_3_1_2', 'port': 'o2'}),
                 ({'instance': 'crossing_3_1', 'port': 'o4'},
                  {'instance': 'spacer_3_2_1', 'port': 'o1'}),
                 ({'instance': 'crossing_2_2', 'port': 'o3'},
                  {'instance': 'spacer_3_2_2', 'port': 'o1'}),
                 ({'instance': 'crossing_3_2', 'port': 'o2'},
                  {'instance': 'spacer_3_2_1', 'port': 'o2'}),
                 ({'instance': 'crossing_3_2', 'port': 'o1'},
                  {'instance': 'spacer_3_2_2', 'port': 'o2'}),
                 ({'instance': 'crossing_3_2', 'port': 'o4'},
                  {'instance': 'spacer_3_3_1', 'port': 'o1'}),
                 ({'instance': 'crossing_2_3', 'port': 'o3'},
                  {'instance': 'spacer_3_3_2', 'port': 'o1'}),
                 ({'instance': 'crossing_3_3', 'port': 'o2'},
                  {'instance': 'spacer_3_3_1', 'port': 'o2'}),
                 ({'instance': 'crossing_3_3', 'port': 'o1'},
                  {'instance': 'spacer_3_3_2', 'port': 'o2'}),
                 ({'instance': 'crossing_0_0', 'port': 'o2'},
                  {'instance': 'io_spacer_0', 'port': 'o2'}),
                 ({'instance': 'bend45_0', 'port': 'o2'},
                  {'instance': 'io_spacer_0', 'port': 'o1'}),
                 ({'instance': 'crossing_0_0', 'port': 'o1'},
                  {'instance': 'io_spacer_7', 'port': 'o2'}),
                 ({'instance': 'bend45_7', 'port': 'o2'},
                  {'instance': 'io_spacer_7', 'port': 'o1'}),
                 ({'instance': 'crossing_0_3', 'port': 'o4'},
                  {'instance': 'io_spacer_8', 'port': 'o1'}),
                 ({'instance': 'bend45_8', 'port': 'o2'},
                  {'instance': 'io_spacer_8', 'port': 'o2'}),
                 ({'instance': 'crossing_3_0', 'port': 'o3'},
                  {'instance': 'io_spacer_15', 'port': 'o1'}),
                 ({'instance': 'bend45_15', 'port': 'o2'},
                  {'instance': 'io_spacer_15', 'port': 'o2'}),
                 ({'instance': 'bend45_8', 'port': 'o1'},
                  {'instance': 'io_straight_8', 'port': 'o2'}),
                 ({'instance': 'bend45_15', 'port': 'o1'},
                  {'instance': 'io_straight_15', 'port': 'o2'}),
                 ({'instance': 'crossing_1_0', 'port': 'o2'},
                  {'instance': 'io_spacer_1', 'port': 'o2'}),
                 ({'instance': 'bend45_1', 'port': 'o2'},
                  {'instance': 'io_spacer_1', 'port': 'o1'}),
                 ({'instance': 'crossing_0_1', 'port': 'o1'},
                  {'instance': 'io_spacer_6', 'port': 'o2'}),
                 ({'instance': 'bend45_6', 'port': 'o2'},
                  {'instance': 'io_spacer_6', 'port': 'o1'}),
                 ({'instance': 'crossing_1_3', 'port': 'o4'},
                  {'instance': 'io_spacer_9', 'port': 'o1'}),
                 ({'instance': 'bend45_9', 'port': 'o2'},
                  {'instance': 'io_spacer_9', 'port': 'o2'}),
                 ({'instance': 'crossing_3_1', 'port': 'o3'},
                  {'instance': 'io_spacer_14', 'port': 'o1'}),
                 ({'instance': 'bend45_14', 'port': 'o2'},
                  {'instance': 'io_spacer_14', 'port': 'o2'}),
                 ({'instance': 'bend45_1', 'port': 'o1'},
                  {'instance': 'io_straight_1', 'port': 'o2'}),
                 ({'instance': 'bend45_6', 'port': 'o1'},
                  {'instance': 'io_straight_6', 'port': 'o2'}),
                 ({'instance': 'bend45_9', 'port': 'o1'},
                  {'instance': 'io_straight_9', 'port': 'o2'}),
                 ({'instance': 'bend45_14', 'port': 'o1'},
                  {'instance': 'io_straight_14', 'port': 'o2'}),
                 ({'instance': 'crossing_2_0', 'port': 'o2'},
                  {'instance': 'io_spacer_2', 'port': 'o2'}),
                 ({'instance': 'bend45_2', 'port': 'o2'},
                  {'instance': 'io_spacer_2', 'port': 'o1'}),
                 ({'instance': 'crossing_0_2', 'port': 'o1'},
                  {'instance': 'io_spacer_5', 'port': 'o2'}),
                 ({'instance': 'bend45_5', 'port': 'o2'},
                  {'instance': 'io_spacer_5', 'port': 'o1'}),
                 ({'instance': 'crossing_2_3', 'port': 'o4'},
                  {'instance': 'io_spacer_10', 'port': 'o1'}),
                 ({'instance': 'bend45_10', 'port': 'o2'},
                  {'instance': 'io_spacer_10', 'port': 'o2'}),
                 ({'instance': 'crossing_3_2', 'port': 'o3'},
                  {'instance': 'io_spacer_13', 'port': 'o1'}),
                 ({'instance': 'bend45_13', 'port': 'o2'},
                  {'instance': 'io_spacer_13', 'port': 'o2'}),
                 ({'instance': 'bend45_2', 'port': 'o1'},
                  {'instance': 'io_straight_2', 'port': 'o2'}),
                 ({'instance': 'bend45_5', 'port': 'o1'},
                  {'instance': 'io_straight_5', 'port': 'o2'}),
                 ({'instance': 'bend45_10', 'port': 'o1'},
                  {'instance': 'io_straight_10', 'port': 'o2'}),
                 ({'instance': 'bend45_13', 'port': 'o1'},
                  {'instance': 'io_straight_13', 'port': 'o2'}),
                 ({'instance': 'crossing_3_0', 'port': 'o2'},
                  {'instance': 'io_spacer_3', 'port': 'o2'}),
                 ({'instance': 'bend45_3', 'port': 'o2'},
                  {'instance': 'io_spacer_3', 'port': 'o1'}),
                 ({'instance': 'crossing_0_3', 'port': 'o1'},
                  {'instance': 'io_spacer_4', 'port': 'o2'}),
                 ({'instance': 'bend45_4', 'port': 'o2'},
                  {'instance': 'io_spacer_4', 'port': 'o1'}),
                 ({'instance': 'crossing_3_3', 'port': 'o4'},
                  {'instance': 'io_spacer_11', 'port': 'o1'}),
                 ({'instance': 'bend45_11', 'port': 'o2'},
                  {'instance': 'io_spacer_11', 'port': 'o2'}),
                 ({'instance': 'crossing_3_3', 'port': 'o3'},
                  {'instance': 'io_spacer_12', 'port': 'o1'}),
                 ({'instance': 'bend45_12', 'port': 'o2'},
                  {'instance': 'io_spacer_12', 'port': 'o2'}),
                 ({'instance': 'bend45_3', 'port': 'o1'},
                  {'instance': 'io_straight_3', 'port': 'o2'}),
                 ({'instance': 'bend45_4', 'port': 'o1'},
                  {'instance': 'io_straight_4', 'port': 'o2'})],
 'instances': {'bend45_0': {'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30},
                            'virtual': True},
               'bend45_1': {'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30},
                            'virtual': True},
               'bend45_10': {'component': 'bend_euler',
                             'kcl': 'CROSSING_PDK',
                             'settings': {'angle': 45,
                                          'cross_section': 'WG1000',
                                          'radius': 30},
                             'virtual': True},
               'bend45_11': {'component': 'bend_euler',
                             'kcl': 'CROSSING_PDK',
                             'settings': {'angle': 45,
                                          'cross_section': 'WG1000',
                                          'radius': 30},
                             'virtual': True},
               'bend45_12': {'component': 'bend_euler',
                             'kcl': 'CROSSING_PDK',
                             'settings': {'angle': 45,
                                          'cross_section': 'WG1000',
                                          'radius': 30},
                             'virtual': True},
               'bend45_13': {'component': 'bend_euler',
                             'kcl': 'CROSSING_PDK',
                             'settings': {'angle': 45,
                                          'cross_section': 'WG1000',
                                          'radius': 30},
                             'virtual': True},
               'bend45_14': {'component': 'bend_euler',
                             'kcl': 'CROSSING_PDK',
                             'settings': {'angle': 45,
                                          'cross_section': 'WG1000',
                                          'radius': 30},
                             'virtual': True},
               'bend45_15': {'component': 'bend_euler',
                             'kcl': 'CROSSING_PDK',
                             'settings': {'angle': 45,
                                          'cross_section': 'WG1000',
                                          'radius': 30},
                             'virtual': True},
               'bend45_2': {'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30},
                            'virtual': True},
               'bend45_3': {'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30},
                            'virtual': True},
               'bend45_4': {'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30},
                            'virtual': True},
               'bend45_5': {'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30},
                            'virtual': True},
               'bend45_6': {'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30},
                            'virtual': True},
               'bend45_7': {'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30},
                            'virtual': True},
               'bend45_8': {'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30},
                            'virtual': True},
               'bend45_9': {'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30},
                            'virtual': True},
               'crossing_0_0': {'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'},
                                'virtual': True},
               'crossing_0_1': {'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'},
                                'virtual': True},
               'crossing_0_2': {'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'},
                                'virtual': True},
               'crossing_0_3': {'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'},
                                'virtual': True},
               'crossing_1_0': {'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'},
                                'virtual': True},
               'crossing_1_1': {'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'},
                                'virtual': True},
               'crossing_1_2': {'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'},
                                'virtual': True},
               'crossing_1_3': {'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'},
                                'virtual': True},
               'crossing_2_0': {'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'},
                                'virtual': True},
               'crossing_2_1': {'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'},
                                'virtual': True},
               'crossing_2_2': {'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'},
                                'virtual': True},
               'crossing_2_3': {'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'},
                                'virtual': True},
               'crossing_3_0': {'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'},
                                'virtual': True},
               'crossing_3_1': {'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'},
                                'virtual': True},
               'crossing_3_2': {'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'},
                                'virtual': True},
               'crossing_3_3': {'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'},
                                'virtual': True},
               'io_spacer_0': {'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798},
                               'virtual': True},
               'io_spacer_1': {'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798},
                               'virtual': True},
               'io_spacer_10': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': -11.83950689958798},
                                'virtual': True},
               'io_spacer_11': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': -11.83950689958798},
                                'virtual': True},
               'io_spacer_12': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': -11.83950689958798},
                                'virtual': True},
               'io_spacer_13': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': -11.83950689958798},
                                'virtual': True},
               'io_spacer_14': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': -11.83950689958798},
                                'virtual': True},
               'io_spacer_15': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': -11.83950689958798},
                                'virtual': True},
               'io_spacer_2': {'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798},
                               'virtual': True},
               'io_spacer_3': {'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798},
                               'virtual': True},
               'io_spacer_4': {'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798},
                               'virtual': True},
               'io_spacer_5': {'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798},
                               'virtual': True},
               'io_spacer_6': {'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798},
                               'virtual': True},
               'io_spacer_7': {'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798},
                               'virtual': True},
               'io_spacer_8': {'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798},
                               'virtual': True},
               'io_spacer_9': {'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798},
                               'virtual': True},
               'io_straight_1': {'component': 'straight',
                                 'kcl': 'CROSSING_PDK',
                                 'settings': {'cross_section': 'WG1000',
                                              'length': 30.0},
                                 'virtual': True},
               'io_straight_10': {'component': 'straight',
                                  'kcl': 'CROSSING_PDK',
                                  'settings': {'cross_section': 'WG1000',
                                               'length': 30.0},
                                  'virtual': True},
               'io_straight_13': {'component': 'straight',
                                  'kcl': 'CROSSING_PDK',
                                  'settings': {'cross_section': 'WG1000',
                                               'length': 30.0},
                                  'virtual': True},
               'io_straight_14': {'component': 'straight',
                                  'kcl': 'CROSSING_PDK',
                                  'settings': {'cross_section': 'WG1000',
                                               'length': 60.0},
                                  'virtual': True},
               'io_straight_15': {'component': 'straight',
                                  'kcl': 'CROSSING_PDK',
                                  'settings': {'cross_section': 'WG1000',
                                               'length': 90.0},
                                  'virtual': True},
               'io_straight_2': {'component': 'straight',
                                 'kcl': 'CROSSING_PDK',
                                 'settings': {'cross_section': 'WG1000',
                                              'length': 60.0},
                                 'virtual': True},
               'io_straight_3': {'component': 'straight',
                                 'kcl': 'CROSSING_PDK',
                                 'settings': {'cross_section': 'WG1000',
                                              'length': 90.0},
                                 'virtual': True},
               'io_straight_4': {'component': 'straight',
                                 'kcl': 'CROSSING_PDK',
                                 'settings': {'cross_section': 'WG1000',
                                              'length': 90.0},
                                 'virtual': True},
               'io_straight_5': {'component': 'straight',
                                 'kcl': 'CROSSING_PDK',
                                 'settings': {'cross_section': 'WG1000',
                                              'length': 60.0},
                                 'virtual': True},
               'io_straight_6': {'component': 'straight',
                                 'kcl': 'CROSSING_PDK',
                                 'settings': {'cross_section': 'WG1000',
                                              'length': 30.0},
                                 'virtual': True},
               'io_straight_8': {'component': 'straight',
                                 'kcl': 'CROSSING_PDK',
                                 'settings': {'cross_section': 'WG1000',
                                              'length': 90.0},
                                 'virtual': True},
               'io_straight_9': {'component': 'straight',
                                 'kcl': 'CROSSING_PDK',
                                 'settings': {'cross_section': 'WG1000',
                                              'length': 60.0},
                                 'virtual': True},
               'spacer_0_1_1': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285},
                                'virtual': True},
               'spacer_0_2_1': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285},
                                'virtual': True},
               'spacer_0_3_1': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285},
                                'virtual': True},
               'spacer_1_0_2': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285},
                                'virtual': True},
               'spacer_1_1_1': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285},
                                'virtual': True},
               'spacer_1_1_2': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285},
                                'virtual': True},
               'spacer_1_2_1': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285},
                                'virtual': True},
               'spacer_1_2_2': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285},
                                'virtual': True},
               'spacer_1_3_1': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285},
                                'virtual': True},
               'spacer_1_3_2': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285},
                                'virtual': True},
               'spacer_2_0_2': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285},
                                'virtual': True},
               'spacer_2_1_1': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285},
                                'virtual': True},
               'spacer_2_1_2': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285},
                                'virtual': True},
               'spacer_2_2_1': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285},
                                'virtual': True},
               'spacer_2_2_2': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285},
                                'virtual': True},
               'spacer_2_3_1': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285},
                                'virtual': True},
               'spacer_2_3_2': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285},
                                'virtual': True},
               'spacer_3_0_2': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285},
                                'virtual': True},
               'spacer_3_1_1': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285},
                                'virtual': True},
               'spacer_3_1_2': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285},
                                'virtual': True},
               'spacer_3_2_1': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285},
                                'virtual': True},
               'spacer_3_2_2': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285},
                                'virtual': True},
               'spacer_3_3_1': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285},
                                'virtual': True},
               'spacer_3_3_2': {'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285},
                                'virtual': True}},
 'name': 'crossing45_N8_P30_CSWG1000',
 'placements': {'bend45_0': {'mirror': True},
                'bend45_1': {'mirror': True},
                'bend45_10': {'mirror': True},
                'bend45_11': {'mirror': True},
                'bend45_2': {'mirror': True},
                'bend45_3': {'mirror': True},
                'bend45_8': {'mirror': True},
                'bend45_9': {'mirror': True},
                'crossing_0_0': {}},
 'ports': {'in_0': {'instance': 'io_straight_4', 'port': 'o1'},
           'in_1': {'instance': 'io_straight_5', 'port': 'o1'},
           'in_2': {'instance': 'io_straight_6', 'port': 'o1'},
           'in_3': {'instance': 'bend45_7', 'port': 'o1'},
           'in_4': {'instance': 'bend45_0', 'port': 'o1'},
           'in_5': {'instance': 'io_straight_1', 'port': 'o1'},
           'in_6': {'instance': 'io_straight_2', 'port': 'o1'},
           'in_7': {'instance': 'io_straight_3', 'port': 'o1'},
           'out_0': {'instance': 'bend45_12', 'port': 'o1'},
           'out_1': {'instance': 'io_straight_13', 'port': 'o1'},
           'out_2': {'instance': 'io_straight_14', 'port': 'o1'},
           'out_3': {'instance': 'io_straight_15', 'port': 'o1'},
           'out_4': {'instance': 'io_straight_8', 'port': 'o1'},
           'out_5': {'instance': 'io_straight_9', 'port': 'o1'},
           'out_6': {'instance': 'io_straight_10', 'port': 'o1'},
           'out_7': {'instance': 'bend45_11', 'port': 'o1'}}}
Sample LVS of schematic vs extracted (Connection) Netlist¶
With both schematic and extracted netlists, we can perform a partial Layout vs. Schematic (LVS):
schematic_netlist: direct from schematic definitionextracted_netlist: derived from the physical layout
Matching them ensures the layout faithfully implements the intended connectivity.
schematic_netlist = c.schematic.netlist()
scrollable_text(pformat(schematic_netlist.model_dump()))
{'instances': {'bend45_0': {'array': None,
                            'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30,
                                         'resolution': 150}},
               'bend45_1': {'array': None,
                            'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30,
                                         'resolution': 150}},
               'bend45_10': {'array': None,
                             'component': 'bend_euler',
                             'kcl': 'CROSSING_PDK',
                             'settings': {'angle': 45,
                                          'cross_section': 'WG1000',
                                          'radius': 30,
                                          'resolution': 150}},
               'bend45_11': {'array': None,
                             'component': 'bend_euler',
                             'kcl': 'CROSSING_PDK',
                             'settings': {'angle': 45,
                                          'cross_section': 'WG1000',
                                          'radius': 30,
                                          'resolution': 150}},
               'bend45_12': {'array': None,
                             'component': 'bend_euler',
                             'kcl': 'CROSSING_PDK',
                             'settings': {'angle': 45,
                                          'cross_section': 'WG1000',
                                          'radius': 30,
                                          'resolution': 150}},
               'bend45_13': {'array': None,
                             'component': 'bend_euler',
                             'kcl': 'CROSSING_PDK',
                             'settings': {'angle': 45,
                                          'cross_section': 'WG1000',
                                          'radius': 30,
                                          'resolution': 150}},
               'bend45_14': {'array': None,
                             'component': 'bend_euler',
                             'kcl': 'CROSSING_PDK',
                             'settings': {'angle': 45,
                                          'cross_section': 'WG1000',
                                          'radius': 30,
                                          'resolution': 150}},
               'bend45_15': {'array': None,
                             'component': 'bend_euler',
                             'kcl': 'CROSSING_PDK',
                             'settings': {'angle': 45,
                                          'cross_section': 'WG1000',
                                          'radius': 30,
                                          'resolution': 150}},
               'bend45_2': {'array': None,
                            'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30,
                                         'resolution': 150}},
               'bend45_3': {'array': None,
                            'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30,
                                         'resolution': 150}},
               'bend45_4': {'array': None,
                            'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30,
                                         'resolution': 150}},
               'bend45_5': {'array': None,
                            'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30,
                                         'resolution': 150}},
               'bend45_6': {'array': None,
                            'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30,
                                         'resolution': 150}},
               'bend45_7': {'array': None,
                            'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30,
                                         'resolution': 150}},
               'bend45_8': {'array': None,
                            'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30,
                                         'resolution': 150}},
               'bend45_9': {'array': None,
                            'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30,
                                         'resolution': 150}},
               'crossing_0_0': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_0_1': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_0_2': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_0_3': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_1_0': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_1_1': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_1_2': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_1_3': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_2_0': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_2_1': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_2_2': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_2_3': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_3_0': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_3_1': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_3_2': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_3_3': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'io_spacer_0': {'array': None,
                               'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798}},
               'io_spacer_1': {'array': None,
                               'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798}},
               'io_spacer_10': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': -11.83950689958798}},
               'io_spacer_11': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': -11.83950689958798}},
               'io_spacer_12': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': -11.83950689958798}},
               'io_spacer_13': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': -11.83950689958798}},
               'io_spacer_14': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': -11.83950689958798}},
               'io_spacer_15': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': -11.83950689958798}},
               'io_spacer_2': {'array': None,
                               'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798}},
               'io_spacer_3': {'array': None,
                               'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798}},
               'io_spacer_4': {'array': None,
                               'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798}},
               'io_spacer_5': {'array': None,
                               'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798}},
               'io_spacer_6': {'array': None,
                               'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798}},
               'io_spacer_7': {'array': None,
                               'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798}},
               'io_spacer_8': {'array': None,
                               'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798}},
               'io_spacer_9': {'array': None,
                               'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798}},
               'io_straight_1': {'array': None,
                                 'component': 'straight',
                                 'kcl': 'CROSSING_PDK',
                                 'settings': {'cross_section': 'WG1000',
                                              'length': 30.0}},
               'io_straight_10': {'array': None,
                                  'component': 'straight',
                                  'kcl': 'CROSSING_PDK',
                                  'settings': {'cross_section': 'WG1000',
                                               'length': 30.0}},
               'io_straight_13': {'array': None,
                                  'component': 'straight',
                                  'kcl': 'CROSSING_PDK',
                                  'settings': {'cross_section': 'WG1000',
                                               'length': 30.0}},
               'io_straight_14': {'array': None,
                                  'component': 'straight',
                                  'kcl': 'CROSSING_PDK',
                                  'settings': {'cross_section': 'WG1000',
                                               'length': 60.0}},
               'io_straight_15': {'array': None,
                                  'component': 'straight',
                                  'kcl': 'CROSSING_PDK',
                                  'settings': {'cross_section': 'WG1000',
                                               'length': 90.0}},
               'io_straight_2': {'array': None,
                                 'component': 'straight',
                                 'kcl': 'CROSSING_PDK',
                                 'settings': {'cross_section': 'WG1000',
                                              'length': 60.0}},
               'io_straight_3': {'array': None,
                                 'component': 'straight',
                                 'kcl': 'CROSSING_PDK',
                                 'settings': {'cross_section': 'WG1000',
                                              'length': 90.0}},
               'io_straight_4': {'array': None,
                                 'component': 'straight',
                                 'kcl': 'CROSSING_PDK',
                                 'settings': {'cross_section': 'WG1000',
                                              'length': 90.0}},
               'io_straight_5': {'array': None,
                                 'component': 'straight',
                                 'kcl': 'CROSSING_PDK',
                                 'settings': {'cross_section': 'WG1000',
                                              'length': 60.0}},
               'io_straight_6': {'array': None,
                                 'component': 'straight',
                                 'kcl': 'CROSSING_PDK',
                                 'settings': {'cross_section': 'WG1000',
                                              'length': 30.0}},
               'io_straight_8': {'array': None,
                                 'component': 'straight',
                                 'kcl': 'CROSSING_PDK',
                                 'settings': {'cross_section': 'WG1000',
                                              'length': 90.0}},
               'io_straight_9': {'array': None,
                                 'component': 'straight',
                                 'kcl': 'CROSSING_PDK',
                                 'settings': {'cross_section': 'WG1000',
                                              'length': 60.0}},
               'spacer_0_1_1': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_0_2_1': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_0_3_1': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_1_0_2': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_1_1_1': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_1_1_2': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_1_2_1': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_1_2_2': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_1_3_1': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_1_3_2': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_2_0_2': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_2_1_1': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_2_1_2': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_2_2_1': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_2_2_2': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_2_3_1': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_2_3_2': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_3_0_2': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_3_1_1': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_3_1_2': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_3_2_1': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_3_2_2': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_3_3_1': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_3_3_2': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}}},
 'nets': [[{'name': 'in_0'}, {'instance': 'io_straight_4', 'port': 'o1'}],
          [{'name': 'in_1'}, {'instance': 'io_straight_5', 'port': 'o1'}],
          [{'name': 'in_2'}, {'instance': 'io_straight_6', 'port': 'o1'}],
          [{'name': 'in_5'}, {'instance': 'io_straight_1', 'port': 'o1'}],
          [{'name': 'in_6'}, {'instance': 'io_straight_2', 'port': 'o1'}],
          [{'name': 'in_7'}, {'instance': 'io_straight_3', 'port': 'o1'}],
          [{'instance': 'bend45_0', 'port': 'o1'}, {'name': 'in_4'}],
          [{'instance': 'bend45_0', 'port': 'o2'},
           {'instance': 'io_spacer_0', 'port': 'o1'}],
          [{'instance': 'bend45_1', 'port': 'o1'},
           {'instance': 'io_straight_1', 'port': 'o2'}],
          [{'instance': 'bend45_1', 'port': 'o2'},
           {'instance': 'io_spacer_1', 'port': 'o1'}],
          [{'instance': 'bend45_10', 'port': 'o1'},
           {'instance': 'io_straight_10', 'port': 'o2'}],
          [{'instance': 'bend45_10', 'port': 'o2'},
           {'instance': 'io_spacer_10', 'port': 'o2'}],
          [{'instance': 'bend45_11', 'port': 'o1'}, {'name': 'out_7'}],
          [{'instance': 'bend45_11', 'port': 'o2'},
           {'instance': 'io_spacer_11', 'port': 'o2'}],
          [{'instance': 'bend45_12', 'port': 'o1'}, {'name': 'out_0'}],
          [{'instance': 'bend45_12', 'port': 'o2'},
           {'instance': 'io_spacer_12', 'port': 'o2'}],
          [{'instance': 'bend45_13', 'port': 'o1'},
           {'instance': 'io_straight_13', 'port': 'o2'}],
          [{'instance': 'bend45_13', 'port': 'o2'},
           {'instance': 'io_spacer_13', 'port': 'o2'}],
          [{'instance': 'bend45_14', 'port': 'o1'},
           {'instance': 'io_straight_14', 'port': 'o2'}],
          [{'instance': 'bend45_14', 'port': 'o2'},
           {'instance': 'io_spacer_14', 'port': 'o2'}],
          [{'instance': 'bend45_15', 'port': 'o1'},
           {'instance': 'io_straight_15', 'port': 'o2'}],
          [{'instance': 'bend45_15', 'port': 'o2'},
           {'instance': 'io_spacer_15', 'port': 'o2'}],
          [{'instance': 'bend45_2', 'port': 'o1'},
           {'instance': 'io_straight_2', 'port': 'o2'}],
          [{'instance': 'bend45_2', 'port': 'o2'},
           {'instance': 'io_spacer_2', 'port': 'o1'}],
          [{'instance': 'bend45_3', 'port': 'o1'},
           {'instance': 'io_straight_3', 'port': 'o2'}],
          [{'instance': 'bend45_3', 'port': 'o2'},
           {'instance': 'io_spacer_3', 'port': 'o1'}],
          [{'instance': 'bend45_4', 'port': 'o1'},
           {'instance': 'io_straight_4', 'port': 'o2'}],
          [{'instance': 'bend45_4', 'port': 'o2'},
           {'instance': 'io_spacer_4', 'port': 'o1'}],
          [{'instance': 'bend45_5', 'port': 'o1'},
           {'instance': 'io_straight_5', 'port': 'o2'}],
          [{'instance': 'bend45_5', 'port': 'o2'},
           {'instance': 'io_spacer_5', 'port': 'o1'}],
          [{'instance': 'bend45_6', 'port': 'o1'},
           {'instance': 'io_straight_6', 'port': 'o2'}],
          [{'instance': 'bend45_6', 'port': 'o2'},
           {'instance': 'io_spacer_6', 'port': 'o1'}],
          [{'instance': 'bend45_7', 'port': 'o1'}, {'name': 'in_3'}],
          [{'instance': 'bend45_7', 'port': 'o2'},
           {'instance': 'io_spacer_7', 'port': 'o1'}],
          [{'instance': 'bend45_8', 'port': 'o1'},
           {'instance': 'io_straight_8', 'port': 'o2'}],
          [{'instance': 'bend45_8', 'port': 'o2'},
           {'instance': 'io_spacer_8', 'port': 'o2'}],
          [{'instance': 'bend45_9', 'port': 'o1'},
           {'instance': 'io_straight_9', 'port': 'o2'}],
          [{'instance': 'bend45_9', 'port': 'o2'},
           {'instance': 'io_spacer_9', 'port': 'o2'}],
          [{'instance': 'crossing_0_0', 'port': 'o1'},
           {'instance': 'io_spacer_7', 'port': 'o2'}],
          [{'instance': 'crossing_0_0', 'port': 'o2'},
           {'instance': 'io_spacer_0', 'port': 'o2'}],
          [{'instance': 'crossing_0_0', 'port': 'o3'},
           {'instance': 'spacer_1_0_2', 'port': 'o1'}],
          [{'instance': 'crossing_0_0', 'port': 'o4'},
           {'instance': 'spacer_0_1_1', 'port': 'o1'}],
          [{'instance': 'crossing_0_1', 'port': 'o1'},
           {'instance': 'io_spacer_6', 'port': 'o2'}],
          [{'instance': 'crossing_0_1', 'port': 'o2'},
           {'instance': 'spacer_0_1_1', 'port': 'o2'}],
          [{'instance': 'crossing_0_1', 'port': 'o3'},
           {'instance': 'spacer_1_1_2', 'port': 'o1'}],
          [{'instance': 'crossing_0_1', 'port': 'o4'},
           {'instance': 'spacer_0_2_1', 'port': 'o1'}],
          [{'instance': 'crossing_0_2', 'port': 'o1'},
           {'instance': 'io_spacer_5', 'port': 'o2'}],
          [{'instance': 'crossing_0_2', 'port': 'o2'},
           {'instance': 'spacer_0_2_1', 'port': 'o2'}],
          [{'instance': 'crossing_0_2', 'port': 'o3'},
           {'instance': 'spacer_1_2_2', 'port': 'o1'}],
          [{'instance': 'crossing_0_2', 'port': 'o4'},
           {'instance': 'spacer_0_3_1', 'port': 'o1'}],
          [{'instance': 'crossing_0_3', 'port': 'o1'},
           {'instance': 'io_spacer_4', 'port': 'o2'}],
          [{'instance': 'crossing_0_3', 'port': 'o2'},
           {'instance': 'spacer_0_3_1', 'port': 'o2'}],
          [{'instance': 'crossing_0_3', 'port': 'o3'},
           {'instance': 'spacer_1_3_2', 'port': 'o1'}],
          [{'instance': 'crossing_0_3', 'port': 'o4'},
           {'instance': 'io_spacer_8', 'port': 'o1'}],
          [{'instance': 'crossing_1_0', 'port': 'o1'},
           {'instance': 'spacer_1_0_2', 'port': 'o2'}],
          [{'instance': 'crossing_1_0', 'port': 'o2'},
           {'instance': 'io_spacer_1', 'port': 'o2'}],
          [{'instance': 'crossing_1_0', 'port': 'o3'},
           {'instance': 'spacer_2_0_2', 'port': 'o1'}],
          [{'instance': 'crossing_1_0', 'port': 'o4'},
           {'instance': 'spacer_1_1_1', 'port': 'o1'}],
          [{'instance': 'crossing_1_1', 'port': 'o1'},
           {'instance': 'spacer_1_1_2', 'port': 'o2'}],
          [{'instance': 'crossing_1_1', 'port': 'o2'},
           {'instance': 'spacer_1_1_1', 'port': 'o2'}],
          [{'instance': 'crossing_1_1', 'port': 'o3'},
           {'instance': 'spacer_2_1_2', 'port': 'o1'}],
          [{'instance': 'crossing_1_1', 'port': 'o4'},
           {'instance': 'spacer_1_2_1', 'port': 'o1'}],
          [{'instance': 'crossing_1_2', 'port': 'o1'},
           {'instance': 'spacer_1_2_2', 'port': 'o2'}],
          [{'instance': 'crossing_1_2', 'port': 'o2'},
           {'instance': 'spacer_1_2_1', 'port': 'o2'}],
          [{'instance': 'crossing_1_2', 'port': 'o3'},
           {'instance': 'spacer_2_2_2', 'port': 'o1'}],
          [{'instance': 'crossing_1_2', 'port': 'o4'},
           {'instance': 'spacer_1_3_1', 'port': 'o1'}],
          [{'instance': 'crossing_1_3', 'port': 'o1'},
           {'instance': 'spacer_1_3_2', 'port': 'o2'}],
          [{'instance': 'crossing_1_3', 'port': 'o2'},
           {'instance': 'spacer_1_3_1', 'port': 'o2'}],
          [{'instance': 'crossing_1_3', 'port': 'o3'},
           {'instance': 'spacer_2_3_2', 'port': 'o1'}],
          [{'instance': 'crossing_1_3', 'port': 'o4'},
           {'instance': 'io_spacer_9', 'port': 'o1'}],
          [{'instance': 'crossing_2_0', 'port': 'o1'},
           {'instance': 'spacer_2_0_2', 'port': 'o2'}],
          [{'instance': 'crossing_2_0', 'port': 'o2'},
           {'instance': 'io_spacer_2', 'port': 'o2'}],
          [{'instance': 'crossing_2_0', 'port': 'o3'},
           {'instance': 'spacer_3_0_2', 'port': 'o1'}],
          [{'instance': 'crossing_2_0', 'port': 'o4'},
           {'instance': 'spacer_2_1_1', 'port': 'o1'}],
          [{'instance': 'crossing_2_1', 'port': 'o1'},
           {'instance': 'spacer_2_1_2', 'port': 'o2'}],
          [{'instance': 'crossing_2_1', 'port': 'o2'},
           {'instance': 'spacer_2_1_1', 'port': 'o2'}],
          [{'instance': 'crossing_2_1', 'port': 'o3'},
           {'instance': 'spacer_3_1_2', 'port': 'o1'}],
          [{'instance': 'crossing_2_1', 'port': 'o4'},
           {'instance': 'spacer_2_2_1', 'port': 'o1'}],
          [{'instance': 'crossing_2_2', 'port': 'o1'},
           {'instance': 'spacer_2_2_2', 'port': 'o2'}],
          [{'instance': 'crossing_2_2', 'port': 'o2'},
           {'instance': 'spacer_2_2_1', 'port': 'o2'}],
          [{'instance': 'crossing_2_2', 'port': 'o3'},
           {'instance': 'spacer_3_2_2', 'port': 'o1'}],
          [{'instance': 'crossing_2_2', 'port': 'o4'},
           {'instance': 'spacer_2_3_1', 'port': 'o1'}],
          [{'instance': 'crossing_2_3', 'port': 'o1'},
           {'instance': 'spacer_2_3_2', 'port': 'o2'}],
          [{'instance': 'crossing_2_3', 'port': 'o2'},
           {'instance': 'spacer_2_3_1', 'port': 'o2'}],
          [{'instance': 'crossing_2_3', 'port': 'o3'},
           {'instance': 'spacer_3_3_2', 'port': 'o1'}],
          [{'instance': 'crossing_2_3', 'port': 'o4'},
           {'instance': 'io_spacer_10', 'port': 'o1'}],
          [{'instance': 'crossing_3_0', 'port': 'o1'},
           {'instance': 'spacer_3_0_2', 'port': 'o2'}],
          [{'instance': 'crossing_3_0', 'port': 'o2'},
           {'instance': 'io_spacer_3', 'port': 'o2'}],
          [{'instance': 'crossing_3_0', 'port': 'o3'},
           {'instance': 'io_spacer_15', 'port': 'o1'}],
          [{'instance': 'crossing_3_0', 'port': 'o4'},
           {'instance': 'spacer_3_1_1', 'port': 'o1'}],
          [{'instance': 'crossing_3_1', 'port': 'o1'},
           {'instance': 'spacer_3_1_2', 'port': 'o2'}],
          [{'instance': 'crossing_3_1', 'port': 'o2'},
           {'instance': 'spacer_3_1_1', 'port': 'o2'}],
          [{'instance': 'crossing_3_1', 'port': 'o3'},
           {'instance': 'io_spacer_14', 'port': 'o1'}],
          [{'instance': 'crossing_3_1', 'port': 'o4'},
           {'instance': 'spacer_3_2_1', 'port': 'o1'}],
          [{'instance': 'crossing_3_2', 'port': 'o1'},
           {'instance': 'spacer_3_2_2', 'port': 'o2'}],
          [{'instance': 'crossing_3_2', 'port': 'o2'},
           {'instance': 'spacer_3_2_1', 'port': 'o2'}],
          [{'instance': 'crossing_3_2', 'port': 'o3'},
           {'instance': 'io_spacer_13', 'port': 'o1'}],
          [{'instance': 'crossing_3_2', 'port': 'o4'},
           {'instance': 'spacer_3_3_1', 'port': 'o1'}],
          [{'instance': 'crossing_3_3', 'port': 'o1'},
           {'instance': 'spacer_3_3_2', 'port': 'o2'}],
          [{'instance': 'crossing_3_3', 'port': 'o2'},
           {'instance': 'spacer_3_3_1', 'port': 'o2'}],
          [{'instance': 'crossing_3_3', 'port': 'o3'},
           {'instance': 'io_spacer_12', 'port': 'o1'}],
          [{'instance': 'crossing_3_3', 'port': 'o4'},
           {'instance': 'io_spacer_11', 'port': 'o1'}],
          [{'instance': 'io_straight_10', 'port': 'o1'}, {'name': 'out_6'}],
          [{'instance': 'io_straight_13', 'port': 'o1'}, {'name': 'out_1'}],
          [{'instance': 'io_straight_14', 'port': 'o1'}, {'name': 'out_2'}],
          [{'instance': 'io_straight_15', 'port': 'o1'}, {'name': 'out_3'}],
          [{'instance': 'io_straight_8', 'port': 'o1'}, {'name': 'out_4'}],
          [{'instance': 'io_straight_9', 'port': 'o1'}, {'name': 'out_5'}]],
 'ports': [{'name': 'in_0'},
           {'name': 'in_1'},
           {'name': 'in_2'},
           {'name': 'in_3'},
           {'name': 'in_4'},
           {'name': 'in_5'},
           {'name': 'in_6'},
           {'name': 'in_7'},
           {'name': 'out_0'},
           {'name': 'out_1'},
           {'name': 'out_2'},
           {'name': 'out_3'},
           {'name': 'out_4'},
           {'name': 'out_5'},
           {'name': 'out_6'},
           {'name': 'out_7'}]}
extracted_netlist = c.netlist()[
    c.name
]  # the extracted netlist is hierarchical by default
scrollable_text(pformat(extracted_netlist.model_dump()))
{'instances': {'bend45_0': {'array': None,
                            'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30,
                                         'resolution': 150}},
               'bend45_1': {'array': None,
                            'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30,
                                         'resolution': 150}},
               'bend45_10': {'array': None,
                             'component': 'bend_euler',
                             'kcl': 'CROSSING_PDK',
                             'settings': {'angle': 45,
                                          'cross_section': 'WG1000',
                                          'radius': 30,
                                          'resolution': 150}},
               'bend45_11': {'array': None,
                             'component': 'bend_euler',
                             'kcl': 'CROSSING_PDK',
                             'settings': {'angle': 45,
                                          'cross_section': 'WG1000',
                                          'radius': 30,
                                          'resolution': 150}},
               'bend45_12': {'array': None,
                             'component': 'bend_euler',
                             'kcl': 'CROSSING_PDK',
                             'settings': {'angle': 45,
                                          'cross_section': 'WG1000',
                                          'radius': 30,
                                          'resolution': 150}},
               'bend45_13': {'array': None,
                             'component': 'bend_euler',
                             'kcl': 'CROSSING_PDK',
                             'settings': {'angle': 45,
                                          'cross_section': 'WG1000',
                                          'radius': 30,
                                          'resolution': 150}},
               'bend45_14': {'array': None,
                             'component': 'bend_euler',
                             'kcl': 'CROSSING_PDK',
                             'settings': {'angle': 45,
                                          'cross_section': 'WG1000',
                                          'radius': 30,
                                          'resolution': 150}},
               'bend45_15': {'array': None,
                             'component': 'bend_euler',
                             'kcl': 'CROSSING_PDK',
                             'settings': {'angle': 45,
                                          'cross_section': 'WG1000',
                                          'radius': 30,
                                          'resolution': 150}},
               'bend45_2': {'array': None,
                            'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30,
                                         'resolution': 150}},
               'bend45_3': {'array': None,
                            'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30,
                                         'resolution': 150}},
               'bend45_4': {'array': None,
                            'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30,
                                         'resolution': 150}},
               'bend45_5': {'array': None,
                            'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30,
                                         'resolution': 150}},
               'bend45_6': {'array': None,
                            'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30,
                                         'resolution': 150}},
               'bend45_7': {'array': None,
                            'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30,
                                         'resolution': 150}},
               'bend45_8': {'array': None,
                            'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30,
                                         'resolution': 150}},
               'bend45_9': {'array': None,
                            'component': 'bend_euler',
                            'kcl': 'CROSSING_PDK',
                            'settings': {'angle': 45,
                                         'cross_section': 'WG1000',
                                         'radius': 30,
                                         'resolution': 150}},
               'crossing_0_0': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_0_1': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_0_2': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_0_3': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_1_0': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_1_1': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_1_2': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_1_3': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_2_0': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_2_1': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_2_2': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_2_3': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_3_0': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_3_1': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_3_2': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'crossing_3_3': {'array': None,
                                'component': 'cross',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000'}},
               'io_spacer_0': {'array': None,
                               'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798}},
               'io_spacer_1': {'array': None,
                               'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798}},
               'io_spacer_10': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': -11.83950689958798}},
               'io_spacer_11': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': -11.83950689958798}},
               'io_spacer_12': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': -11.83950689958798}},
               'io_spacer_13': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': -11.83950689958798}},
               'io_spacer_14': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': -11.83950689958798}},
               'io_spacer_15': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': -11.83950689958798}},
               'io_spacer_2': {'array': None,
                               'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798}},
               'io_spacer_3': {'array': None,
                               'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798}},
               'io_spacer_4': {'array': None,
                               'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798}},
               'io_spacer_5': {'array': None,
                               'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798}},
               'io_spacer_6': {'array': None,
                               'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798}},
               'io_spacer_7': {'array': None,
                               'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798}},
               'io_spacer_8': {'array': None,
                               'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798}},
               'io_spacer_9': {'array': None,
                               'component': 'straight',
                               'kcl': 'CROSSING_PDK',
                               'settings': {'cross_section': 'WG1000',
                                            'length': -11.83950689958798}},
               'io_straight_1': {'array': None,
                                 'component': 'straight',
                                 'kcl': 'CROSSING_PDK',
                                 'settings': {'cross_section': 'WG1000',
                                              'length': 30.0}},
               'io_straight_10': {'array': None,
                                  'component': 'straight',
                                  'kcl': 'CROSSING_PDK',
                                  'settings': {'cross_section': 'WG1000',
                                               'length': 30.0}},
               'io_straight_13': {'array': None,
                                  'component': 'straight',
                                  'kcl': 'CROSSING_PDK',
                                  'settings': {'cross_section': 'WG1000',
                                               'length': 30.0}},
               'io_straight_14': {'array': None,
                                  'component': 'straight',
                                  'kcl': 'CROSSING_PDK',
                                  'settings': {'cross_section': 'WG1000',
                                               'length': 60.0}},
               'io_straight_15': {'array': None,
                                  'component': 'straight',
                                  'kcl': 'CROSSING_PDK',
                                  'settings': {'cross_section': 'WG1000',
                                               'length': 90.0}},
               'io_straight_2': {'array': None,
                                 'component': 'straight',
                                 'kcl': 'CROSSING_PDK',
                                 'settings': {'cross_section': 'WG1000',
                                              'length': 60.0}},
               'io_straight_3': {'array': None,
                                 'component': 'straight',
                                 'kcl': 'CROSSING_PDK',
                                 'settings': {'cross_section': 'WG1000',
                                              'length': 90.0}},
               'io_straight_4': {'array': None,
                                 'component': 'straight',
                                 'kcl': 'CROSSING_PDK',
                                 'settings': {'cross_section': 'WG1000',
                                              'length': 90.0}},
               'io_straight_5': {'array': None,
                                 'component': 'straight',
                                 'kcl': 'CROSSING_PDK',
                                 'settings': {'cross_section': 'WG1000',
                                              'length': 60.0}},
               'io_straight_6': {'array': None,
                                 'component': 'straight',
                                 'kcl': 'CROSSING_PDK',
                                 'settings': {'cross_section': 'WG1000',
                                              'length': 30.0}},
               'io_straight_8': {'array': None,
                                 'component': 'straight',
                                 'kcl': 'CROSSING_PDK',
                                 'settings': {'cross_section': 'WG1000',
                                              'length': 90.0}},
               'io_straight_9': {'array': None,
                                 'component': 'straight',
                                 'kcl': 'CROSSING_PDK',
                                 'settings': {'cross_section': 'WG1000',
                                              'length': 60.0}},
               'spacer_0_1_1': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_0_2_1': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_0_3_1': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_1_0_2': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_1_1_1': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_1_1_2': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_1_2_1': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_1_2_2': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_1_3_1': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_1_3_2': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_2_0_2': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_2_1_1': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_2_1_2': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_2_2_1': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_2_2_2': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_2_3_1': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_2_3_2': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_3_0_2': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_3_1_1': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_3_1_2': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_3_2_1': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_3_2_2': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_3_3_1': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}},
               'spacer_3_3_2': {'array': None,
                                'component': 'straight',
                                'kcl': 'CROSSING_PDK',
                                'settings': {'cross_section': 'WG1000',
                                             'length': 25.25040687119285}}},
 'nets': [[{'name': 'in_0'}, {'instance': 'io_straight_4', 'port': 'o1'}],
          [{'name': 'in_1'}, {'instance': 'io_straight_5', 'port': 'o1'}],
          [{'name': 'in_2'}, {'instance': 'io_straight_6', 'port': 'o1'}],
          [{'name': 'in_5'}, {'instance': 'io_straight_1', 'port': 'o1'}],
          [{'name': 'in_6'}, {'instance': 'io_straight_2', 'port': 'o1'}],
          [{'name': 'in_7'}, {'instance': 'io_straight_3', 'port': 'o1'}],
          [{'instance': 'bend45_0', 'port': 'o1'}, {'name': 'in_4'}],
          [{'instance': 'bend45_0', 'port': 'o2'},
           {'instance': 'io_spacer_0', 'port': 'o1'}],
          [{'instance': 'bend45_1', 'port': 'o1'},
           {'instance': 'io_straight_1', 'port': 'o2'}],
          [{'instance': 'bend45_1', 'port': 'o2'},
           {'instance': 'io_spacer_1', 'port': 'o1'}],
          [{'instance': 'bend45_10', 'port': 'o1'},
           {'instance': 'io_straight_10', 'port': 'o2'}],
          [{'instance': 'bend45_10', 'port': 'o2'},
           {'instance': 'io_spacer_10', 'port': 'o2'}],
          [{'instance': 'bend45_11', 'port': 'o1'}, {'name': 'out_7'}],
          [{'instance': 'bend45_11', 'port': 'o2'},
           {'instance': 'io_spacer_11', 'port': 'o2'}],
          [{'instance': 'bend45_12', 'port': 'o1'}, {'name': 'out_0'}],
          [{'instance': 'bend45_12', 'port': 'o2'},
           {'instance': 'io_spacer_12', 'port': 'o2'}],
          [{'instance': 'bend45_13', 'port': 'o1'},
           {'instance': 'io_straight_13', 'port': 'o2'}],
          [{'instance': 'bend45_13', 'port': 'o2'},
           {'instance': 'io_spacer_13', 'port': 'o2'}],
          [{'instance': 'bend45_14', 'port': 'o1'},
           {'instance': 'io_straight_14', 'port': 'o2'}],
          [{'instance': 'bend45_14', 'port': 'o2'},
           {'instance': 'io_spacer_14', 'port': 'o2'}],
          [{'instance': 'bend45_15', 'port': 'o1'},
           {'instance': 'io_straight_15', 'port': 'o2'}],
          [{'instance': 'bend45_15', 'port': 'o2'},
           {'instance': 'io_spacer_15', 'port': 'o2'}],
          [{'instance': 'bend45_2', 'port': 'o1'},
           {'instance': 'io_straight_2', 'port': 'o2'}],
          [{'instance': 'bend45_2', 'port': 'o2'},
           {'instance': 'io_spacer_2', 'port': 'o1'}],
          [{'instance': 'bend45_3', 'port': 'o1'},
           {'instance': 'io_straight_3', 'port': 'o2'}],
          [{'instance': 'bend45_3', 'port': 'o2'},
           {'instance': 'io_spacer_3', 'port': 'o1'}],
          [{'instance': 'bend45_4', 'port': 'o1'},
           {'instance': 'io_straight_4', 'port': 'o2'}],
          [{'instance': 'bend45_4', 'port': 'o2'},
           {'instance': 'io_spacer_4', 'port': 'o1'}],
          [{'instance': 'bend45_5', 'port': 'o1'},
           {'instance': 'io_straight_5', 'port': 'o2'}],
          [{'instance': 'bend45_5', 'port': 'o2'},
           {'instance': 'io_spacer_5', 'port': 'o1'}],
          [{'instance': 'bend45_6', 'port': 'o1'},
           {'instance': 'io_straight_6', 'port': 'o2'}],
          [{'instance': 'bend45_6', 'port': 'o2'},
           {'instance': 'io_spacer_6', 'port': 'o1'}],
          [{'instance': 'bend45_7', 'port': 'o1'}, {'name': 'in_3'}],
          [{'instance': 'bend45_7', 'port': 'o2'},
           {'instance': 'io_spacer_7', 'port': 'o1'}],
          [{'instance': 'bend45_8', 'port': 'o1'},
           {'instance': 'io_straight_8', 'port': 'o2'}],
          [{'instance': 'bend45_8', 'port': 'o2'},
           {'instance': 'io_spacer_8', 'port': 'o2'}],
          [{'instance': 'bend45_9', 'port': 'o1'},
           {'instance': 'io_straight_9', 'port': 'o2'}],
          [{'instance': 'bend45_9', 'port': 'o2'},
           {'instance': 'io_spacer_9', 'port': 'o2'}],
          [{'instance': 'crossing_0_0', 'port': 'o1'},
           {'instance': 'io_spacer_7', 'port': 'o2'}],
          [{'instance': 'crossing_0_0', 'port': 'o2'},
           {'instance': 'io_spacer_0', 'port': 'o2'}],
          [{'instance': 'crossing_0_0', 'port': 'o3'},
           {'instance': 'spacer_1_0_2', 'port': 'o1'}],
          [{'instance': 'crossing_0_0', 'port': 'o4'},
           {'instance': 'spacer_0_1_1', 'port': 'o1'}],
          [{'instance': 'crossing_0_1', 'port': 'o1'},
           {'instance': 'io_spacer_6', 'port': 'o2'}],
          [{'instance': 'crossing_0_1', 'port': 'o2'},
           {'instance': 'spacer_0_1_1', 'port': 'o2'}],
          [{'instance': 'crossing_0_1', 'port': 'o3'},
           {'instance': 'spacer_1_1_2', 'port': 'o1'}],
          [{'instance': 'crossing_0_1', 'port': 'o4'},
           {'instance': 'spacer_0_2_1', 'port': 'o1'}],
          [{'instance': 'crossing_0_2', 'port': 'o1'},
           {'instance': 'io_spacer_5', 'port': 'o2'}],
          [{'instance': 'crossing_0_2', 'port': 'o2'},
           {'instance': 'spacer_0_2_1', 'port': 'o2'}],
          [{'instance': 'crossing_0_2', 'port': 'o3'},
           {'instance': 'spacer_1_2_2', 'port': 'o1'}],
          [{'instance': 'crossing_0_2', 'port': 'o4'},
           {'instance': 'spacer_0_3_1', 'port': 'o1'}],
          [{'instance': 'crossing_0_3', 'port': 'o1'},
           {'instance': 'io_spacer_4', 'port': 'o2'}],
          [{'instance': 'crossing_0_3', 'port': 'o2'},
           {'instance': 'spacer_0_3_1', 'port': 'o2'}],
          [{'instance': 'crossing_0_3', 'port': 'o3'},
           {'instance': 'spacer_1_3_2', 'port': 'o1'}],
          [{'instance': 'crossing_0_3', 'port': 'o4'},
           {'instance': 'io_spacer_8', 'port': 'o1'}],
          [{'instance': 'crossing_1_0', 'port': 'o1'},
           {'instance': 'spacer_1_0_2', 'port': 'o2'}],
          [{'instance': 'crossing_1_0', 'port': 'o2'},
           {'instance': 'io_spacer_1', 'port': 'o2'}],
          [{'instance': 'crossing_1_0', 'port': 'o3'},
           {'instance': 'spacer_2_0_2', 'port': 'o1'}],
          [{'instance': 'crossing_1_0', 'port': 'o4'},
           {'instance': 'spacer_1_1_1', 'port': 'o1'}],
          [{'instance': 'crossing_1_1', 'port': 'o1'},
           {'instance': 'spacer_1_1_2', 'port': 'o2'}],
          [{'instance': 'crossing_1_1', 'port': 'o2'},
           {'instance': 'spacer_1_1_1', 'port': 'o2'}],
          [{'instance': 'crossing_1_1', 'port': 'o3'},
           {'instance': 'spacer_2_1_2', 'port': 'o1'}],
          [{'instance': 'crossing_1_1', 'port': 'o4'},
           {'instance': 'spacer_1_2_1', 'port': 'o1'}],
          [{'instance': 'crossing_1_2', 'port': 'o1'},
           {'instance': 'spacer_1_2_2', 'port': 'o2'}],
          [{'instance': 'crossing_1_2', 'port': 'o2'},
           {'instance': 'spacer_1_2_1', 'port': 'o2'}],
          [{'instance': 'crossing_1_2', 'port': 'o3'},
           {'instance': 'spacer_2_2_2', 'port': 'o1'}],
          [{'instance': 'crossing_1_2', 'port': 'o4'},
           {'instance': 'spacer_1_3_1', 'port': 'o1'}],
          [{'instance': 'crossing_1_3', 'port': 'o1'},
           {'instance': 'spacer_1_3_2', 'port': 'o2'}],
          [{'instance': 'crossing_1_3', 'port': 'o2'},
           {'instance': 'spacer_1_3_1', 'port': 'o2'}],
          [{'instance': 'crossing_1_3', 'port': 'o3'},
           {'instance': 'spacer_2_3_2', 'port': 'o1'}],
          [{'instance': 'crossing_1_3', 'port': 'o4'},
           {'instance': 'io_spacer_9', 'port': 'o1'}],
          [{'instance': 'crossing_2_0', 'port': 'o1'},
           {'instance': 'spacer_2_0_2', 'port': 'o2'}],
          [{'instance': 'crossing_2_0', 'port': 'o2'},
           {'instance': 'io_spacer_2', 'port': 'o2'}],
          [{'instance': 'crossing_2_0', 'port': 'o3'},
           {'instance': 'spacer_3_0_2', 'port': 'o1'}],
          [{'instance': 'crossing_2_0', 'port': 'o4'},
           {'instance': 'spacer_2_1_1', 'port': 'o1'}],
          [{'instance': 'crossing_2_1', 'port': 'o1'},
           {'instance': 'spacer_2_1_2', 'port': 'o2'}],
          [{'instance': 'crossing_2_1', 'port': 'o2'},
           {'instance': 'spacer_2_1_1', 'port': 'o2'}],
          [{'instance': 'crossing_2_1', 'port': 'o3'},
           {'instance': 'spacer_3_1_2', 'port': 'o1'}],
          [{'instance': 'crossing_2_1', 'port': 'o4'},
           {'instance': 'spacer_2_2_1', 'port': 'o1'}],
          [{'instance': 'crossing_2_2', 'port': 'o1'},
           {'instance': 'spacer_2_2_2', 'port': 'o2'}],
          [{'instance': 'crossing_2_2', 'port': 'o2'},
           {'instance': 'spacer_2_2_1', 'port': 'o2'}],
          [{'instance': 'crossing_2_2', 'port': 'o3'},
           {'instance': 'spacer_3_2_2', 'port': 'o1'}],
          [{'instance': 'crossing_2_2', 'port': 'o4'},
           {'instance': 'spacer_2_3_1', 'port': 'o1'}],
          [{'instance': 'crossing_2_3', 'port': 'o1'},
           {'instance': 'spacer_2_3_2', 'port': 'o2'}],
          [{'instance': 'crossing_2_3', 'port': 'o2'},
           {'instance': 'spacer_2_3_1', 'port': 'o2'}],
          [{'instance': 'crossing_2_3', 'port': 'o3'},
           {'instance': 'spacer_3_3_2', 'port': 'o1'}],
          [{'instance': 'crossing_2_3', 'port': 'o4'},
           {'instance': 'io_spacer_10', 'port': 'o1'}],
          [{'instance': 'crossing_3_0', 'port': 'o1'},
           {'instance': 'spacer_3_0_2', 'port': 'o2'}],
          [{'instance': 'crossing_3_0', 'port': 'o2'},
           {'instance': 'io_spacer_3', 'port': 'o2'}],
          [{'instance': 'crossing_3_0', 'port': 'o3'},
           {'instance': 'io_spacer_15', 'port': 'o1'}],
          [{'instance': 'crossing_3_0', 'port': 'o4'},
           {'instance': 'spacer_3_1_1', 'port': 'o1'}],
          [{'instance': 'crossing_3_1', 'port': 'o1'},
           {'instance': 'spacer_3_1_2', 'port': 'o2'}],
          [{'instance': 'crossing_3_1', 'port': 'o2'},
           {'instance': 'spacer_3_1_1', 'port': 'o2'}],
          [{'instance': 'crossing_3_1', 'port': 'o3'},
           {'instance': 'io_spacer_14', 'port': 'o1'}],
          [{'instance': 'crossing_3_1', 'port': 'o4'},
           {'instance': 'spacer_3_2_1', 'port': 'o1'}],
          [{'instance': 'crossing_3_2', 'port': 'o1'},
           {'instance': 'spacer_3_2_2', 'port': 'o2'}],
          [{'instance': 'crossing_3_2', 'port': 'o2'},
           {'instance': 'spacer_3_2_1', 'port': 'o2'}],
          [{'instance': 'crossing_3_2', 'port': 'o3'},
           {'instance': 'io_spacer_13', 'port': 'o1'}],
          [{'instance': 'crossing_3_2', 'port': 'o4'},
           {'instance': 'spacer_3_3_1', 'port': 'o1'}],
          [{'instance': 'crossing_3_3', 'port': 'o1'},
           {'instance': 'spacer_3_3_2', 'port': 'o2'}],
          [{'instance': 'crossing_3_3', 'port': 'o2'},
           {'instance': 'spacer_3_3_1', 'port': 'o2'}],
          [{'instance': 'crossing_3_3', 'port': 'o3'},
           {'instance': 'io_spacer_12', 'port': 'o1'}],
          [{'instance': 'crossing_3_3', 'port': 'o4'},
           {'instance': 'io_spacer_11', 'port': 'o1'}],
          [{'instance': 'io_straight_10', 'port': 'o1'}, {'name': 'out_6'}],
          [{'instance': 'io_straight_13', 'port': 'o1'}, {'name': 'out_1'}],
          [{'instance': 'io_straight_14', 'port': 'o1'}, {'name': 'out_2'}],
          [{'instance': 'io_straight_15', 'port': 'o1'}, {'name': 'out_3'}],
          [{'instance': 'io_straight_8', 'port': 'o1'}, {'name': 'out_4'}],
          [{'instance': 'io_straight_9', 'port': 'o1'}, {'name': 'out_5'}]],
 'ports': [{'name': 'in_0'},
           {'name': 'in_1'},
           {'name': 'in_2'},
           {'name': 'in_3'},
           {'name': 'in_4'},
           {'name': 'in_5'},
           {'name': 'in_6'},
           {'name': 'in_7'},
           {'name': 'out_0'},
           {'name': 'out_1'},
           {'name': 'out_2'},
           {'name': 'out_3'},
           {'name': 'out_4'},
           {'name': 'out_5'},
           {'name': 'out_6'},
           {'name': 'out_7'}]}
Let’s make an LVS check, i.e. compare the extracted netlist versus the netlist directly from the schematic.
assert schematic_netlist == extracted_netlist
Converting a Schematic to a cell function (parametric cell (PCell))¶
Another powerful feature: exporting schematics as code.
code_str()generates a self-contained Python function- The result is a reusable parametric cell (PCell)
 - This makes schematics portable and automatable across environments
 
from IPython.display import Code
Code(c.schematic.code_str())
import kfactory as kf
kcl = kf.kcls["DEFAULT"]
@kcl.schematic_cell(output_type=kf.DKCell)
def crossing45_N8_P30_CSWG1000() -> kf.DSchematic:
    schematic = kf.DSchematic(kcl=kcl)
    # Create the schematic instances
    bend45_0 = schematic.create_inst(
        name="bend45_0",
        component="bend_euler",
        settings={"angle": 45, "cross_section": "WG1000", "radius": 30},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    bend45_1 = schematic.create_inst(
        name="bend45_1",
        component="bend_euler",
        settings={"angle": 45, "cross_section": "WG1000", "radius": 30},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    bend45_10 = schematic.create_inst(
        name="bend45_10",
        component="bend_euler",
        settings={"angle": 45, "cross_section": "WG1000", "radius": 30},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    bend45_11 = schematic.create_inst(
        name="bend45_11",
        component="bend_euler",
        settings={"angle": 45, "cross_section": "WG1000", "radius": 30},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    bend45_12 = schematic.create_inst(
        name="bend45_12",
        component="bend_euler",
        settings={"angle": 45, "cross_section": "WG1000", "radius": 30},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    bend45_13 = schematic.create_inst(
        name="bend45_13",
        component="bend_euler",
        settings={"angle": 45, "cross_section": "WG1000", "radius": 30},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    bend45_14 = schematic.create_inst(
        name="bend45_14",
        component="bend_euler",
        settings={"angle": 45, "cross_section": "WG1000", "radius": 30},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    bend45_15 = schematic.create_inst(
        name="bend45_15",
        component="bend_euler",
        settings={"angle": 45, "cross_section": "WG1000", "radius": 30},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    bend45_2 = schematic.create_inst(
        name="bend45_2",
        component="bend_euler",
        settings={"angle": 45, "cross_section": "WG1000", "radius": 30},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    bend45_3 = schematic.create_inst(
        name="bend45_3",
        component="bend_euler",
        settings={"angle": 45, "cross_section": "WG1000", "radius": 30},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    bend45_4 = schematic.create_inst(
        name="bend45_4",
        component="bend_euler",
        settings={"angle": 45, "cross_section": "WG1000", "radius": 30},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    bend45_5 = schematic.create_inst(
        name="bend45_5",
        component="bend_euler",
        settings={"angle": 45, "cross_section": "WG1000", "radius": 30},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    bend45_6 = schematic.create_inst(
        name="bend45_6",
        component="bend_euler",
        settings={"angle": 45, "cross_section": "WG1000", "radius": 30},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    bend45_7 = schematic.create_inst(
        name="bend45_7",
        component="bend_euler",
        settings={"angle": 45, "cross_section": "WG1000", "radius": 30},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    bend45_8 = schematic.create_inst(
        name="bend45_8",
        component="bend_euler",
        settings={"angle": 45, "cross_section": "WG1000", "radius": 30},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    bend45_9 = schematic.create_inst(
        name="bend45_9",
        component="bend_euler",
        settings={"angle": 45, "cross_section": "WG1000", "radius": 30},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    crossing_0_0 = schematic.create_inst(
        name="crossing_0_0",
        component="cross",
        settings={"cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    crossing_0_1 = schematic.create_inst(
        name="crossing_0_1",
        component="cross",
        settings={"cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    crossing_0_2 = schematic.create_inst(
        name="crossing_0_2",
        component="cross",
        settings={"cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    crossing_0_3 = schematic.create_inst(
        name="crossing_0_3",
        component="cross",
        settings={"cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    crossing_1_0 = schematic.create_inst(
        name="crossing_1_0",
        component="cross",
        settings={"cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    crossing_1_1 = schematic.create_inst(
        name="crossing_1_1",
        component="cross",
        settings={"cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    crossing_1_2 = schematic.create_inst(
        name="crossing_1_2",
        component="cross",
        settings={"cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    crossing_1_3 = schematic.create_inst(
        name="crossing_1_3",
        component="cross",
        settings={"cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    crossing_2_0 = schematic.create_inst(
        name="crossing_2_0",
        component="cross",
        settings={"cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    crossing_2_1 = schematic.create_inst(
        name="crossing_2_1",
        component="cross",
        settings={"cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    crossing_2_2 = schematic.create_inst(
        name="crossing_2_2",
        component="cross",
        settings={"cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    crossing_2_3 = schematic.create_inst(
        name="crossing_2_3",
        component="cross",
        settings={"cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    crossing_3_0 = schematic.create_inst(
        name="crossing_3_0",
        component="cross",
        settings={"cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    crossing_3_1 = schematic.create_inst(
        name="crossing_3_1",
        component="cross",
        settings={"cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    crossing_3_2 = schematic.create_inst(
        name="crossing_3_2",
        component="cross",
        settings={"cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    crossing_3_3 = schematic.create_inst(
        name="crossing_3_3",
        component="cross",
        settings={"cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    io_spacer_0 = schematic.create_inst(
        name="io_spacer_0",
        component="straight",
        settings={"length": -11.83950689958798, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    io_spacer_1 = schematic.create_inst(
        name="io_spacer_1",
        component="straight",
        settings={"length": -11.83950689958798, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    io_spacer_10 = schematic.create_inst(
        name="io_spacer_10",
        component="straight",
        settings={"length": -11.83950689958798, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    io_spacer_11 = schematic.create_inst(
        name="io_spacer_11",
        component="straight",
        settings={"length": -11.83950689958798, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    io_spacer_12 = schematic.create_inst(
        name="io_spacer_12",
        component="straight",
        settings={"length": -11.83950689958798, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    io_spacer_13 = schematic.create_inst(
        name="io_spacer_13",
        component="straight",
        settings={"length": -11.83950689958798, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    io_spacer_14 = schematic.create_inst(
        name="io_spacer_14",
        component="straight",
        settings={"length": -11.83950689958798, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    io_spacer_15 = schematic.create_inst(
        name="io_spacer_15",
        component="straight",
        settings={"length": -11.83950689958798, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    io_spacer_2 = schematic.create_inst(
        name="io_spacer_2",
        component="straight",
        settings={"length": -11.83950689958798, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    io_spacer_3 = schematic.create_inst(
        name="io_spacer_3",
        component="straight",
        settings={"length": -11.83950689958798, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    io_spacer_4 = schematic.create_inst(
        name="io_spacer_4",
        component="straight",
        settings={"length": -11.83950689958798, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    io_spacer_5 = schematic.create_inst(
        name="io_spacer_5",
        component="straight",
        settings={"length": -11.83950689958798, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    io_spacer_6 = schematic.create_inst(
        name="io_spacer_6",
        component="straight",
        settings={"length": -11.83950689958798, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    io_spacer_7 = schematic.create_inst(
        name="io_spacer_7",
        component="straight",
        settings={"length": -11.83950689958798, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    io_spacer_8 = schematic.create_inst(
        name="io_spacer_8",
        component="straight",
        settings={"length": -11.83950689958798, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    io_spacer_9 = schematic.create_inst(
        name="io_spacer_9",
        component="straight",
        settings={"length": -11.83950689958798, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    io_straight_1 = schematic.create_inst(
        name="io_straight_1",
        component="straight",
        settings={"length": 30.0, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    io_straight_10 = schematic.create_inst(
        name="io_straight_10",
        component="straight",
        settings={"length": 30.0, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    io_straight_13 = schematic.create_inst(
        name="io_straight_13",
        component="straight",
        settings={"length": 30.0, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    io_straight_14 = schematic.create_inst(
        name="io_straight_14",
        component="straight",
        settings={"length": 60.0, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    io_straight_15 = schematic.create_inst(
        name="io_straight_15",
        component="straight",
        settings={"length": 90.0, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    io_straight_2 = schematic.create_inst(
        name="io_straight_2",
        component="straight",
        settings={"length": 60.0, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    io_straight_3 = schematic.create_inst(
        name="io_straight_3",
        component="straight",
        settings={"length": 90.0, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    io_straight_4 = schematic.create_inst(
        name="io_straight_4",
        component="straight",
        settings={"length": 90.0, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    io_straight_5 = schematic.create_inst(
        name="io_straight_5",
        component="straight",
        settings={"length": 60.0, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    io_straight_6 = schematic.create_inst(
        name="io_straight_6",
        component="straight",
        settings={"length": 30.0, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    io_straight_8 = schematic.create_inst(
        name="io_straight_8",
        component="straight",
        settings={"length": 90.0, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    io_straight_9 = schematic.create_inst(
        name="io_straight_9",
        component="straight",
        settings={"length": 60.0, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    spacer_0_1_1 = schematic.create_inst(
        name="spacer_0_1_1",
        component="straight",
        settings={"length": 25.25040687119285, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    spacer_0_2_1 = schematic.create_inst(
        name="spacer_0_2_1",
        component="straight",
        settings={"length": 25.25040687119285, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    spacer_0_3_1 = schematic.create_inst(
        name="spacer_0_3_1",
        component="straight",
        settings={"length": 25.25040687119285, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    spacer_1_0_2 = schematic.create_inst(
        name="spacer_1_0_2",
        component="straight",
        settings={"length": 25.25040687119285, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    spacer_1_1_1 = schematic.create_inst(
        name="spacer_1_1_1",
        component="straight",
        settings={"length": 25.25040687119285, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    spacer_1_1_2 = schematic.create_inst(
        name="spacer_1_1_2",
        component="straight",
        settings={"length": 25.25040687119285, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    spacer_1_2_1 = schematic.create_inst(
        name="spacer_1_2_1",
        component="straight",
        settings={"length": 25.25040687119285, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    spacer_1_2_2 = schematic.create_inst(
        name="spacer_1_2_2",
        component="straight",
        settings={"length": 25.25040687119285, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    spacer_1_3_1 = schematic.create_inst(
        name="spacer_1_3_1",
        component="straight",
        settings={"length": 25.25040687119285, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    spacer_1_3_2 = schematic.create_inst(
        name="spacer_1_3_2",
        component="straight",
        settings={"length": 25.25040687119285, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    spacer_2_0_2 = schematic.create_inst(
        name="spacer_2_0_2",
        component="straight",
        settings={"length": 25.25040687119285, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    spacer_2_1_1 = schematic.create_inst(
        name="spacer_2_1_1",
        component="straight",
        settings={"length": 25.25040687119285, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    spacer_2_1_2 = schematic.create_inst(
        name="spacer_2_1_2",
        component="straight",
        settings={"length": 25.25040687119285, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    spacer_2_2_1 = schematic.create_inst(
        name="spacer_2_2_1",
        component="straight",
        settings={"length": 25.25040687119285, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    spacer_2_2_2 = schematic.create_inst(
        name="spacer_2_2_2",
        component="straight",
        settings={"length": 25.25040687119285, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    spacer_2_3_1 = schematic.create_inst(
        name="spacer_2_3_1",
        component="straight",
        settings={"length": 25.25040687119285, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    spacer_2_3_2 = schematic.create_inst(
        name="spacer_2_3_2",
        component="straight",
        settings={"length": 25.25040687119285, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    spacer_3_0_2 = schematic.create_inst(
        name="spacer_3_0_2",
        component="straight",
        settings={"length": 25.25040687119285, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    spacer_3_1_1 = schematic.create_inst(
        name="spacer_3_1_1",
        component="straight",
        settings={"length": 25.25040687119285, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    spacer_3_1_2 = schematic.create_inst(
        name="spacer_3_1_2",
        component="straight",
        settings={"length": 25.25040687119285, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    spacer_3_2_1 = schematic.create_inst(
        name="spacer_3_2_1",
        component="straight",
        settings={"length": 25.25040687119285, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    spacer_3_2_2 = schematic.create_inst(
        name="spacer_3_2_2",
        component="straight",
        settings={"length": 25.25040687119285, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    spacer_3_3_1 = schematic.create_inst(
        name="spacer_3_3_1",
        component="straight",
        settings={"length": 25.25040687119285, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    spacer_3_3_2 = schematic.create_inst(
        name="spacer_3_3_2",
        component="straight",
        settings={"length": 25.25040687119285, "cross_section": "WG1000"},
        kcl=kf.kcls["CROSSING_PDK"],
        virtual=True,
    )
    # Schematic ports
    schematic.add_port(name="in_0", port=io_straight_4["o1"])
    schematic.add_port(name="in_1", port=io_straight_5["o1"])
    schematic.add_port(name="in_2", port=io_straight_6["o1"])
    schematic.add_port(name="in_3", port=bend45_7["o1"])
    schematic.add_port(name="in_4", port=bend45_0["o1"])
    schematic.add_port(name="in_5", port=io_straight_1["o1"])
    schematic.add_port(name="in_6", port=io_straight_2["o1"])
    schematic.add_port(name="in_7", port=io_straight_3["o1"])
    schematic.add_port(name="out_0", port=bend45_12["o1"])
    schematic.add_port(name="out_1", port=io_straight_13["o1"])
    schematic.add_port(name="out_2", port=io_straight_14["o1"])
    schematic.add_port(name="out_3", port=io_straight_15["o1"])
    schematic.add_port(name="out_4", port=io_straight_8["o1"])
    schematic.add_port(name="out_5", port=io_straight_9["o1"])
    schematic.add_port(name="out_6", port=io_straight_10["o1"])
    schematic.add_port(name="out_7", port=bend45_11["o1"])
    # Schematic instance placements
    bend45_0.mirror = True
    bend45_1.mirror = True
    bend45_10.mirror = True
    bend45_11.mirror = True
    bend45_2.mirror = True
    bend45_3.mirror = True
    bend45_8.mirror = True
    bend45_9.mirror = True
    crossing_0_0.place(
        orientation=45.0,
    )
    # Schematic connections
    crossing_0_0.connect(
        port="o4",
        other=spacer_0_1_1["o1"],
    )
    crossing_0_1.connect(
        port="o2",
        other=spacer_0_1_1["o2"],
    )
    crossing_0_1.connect(
        port="o4",
        other=spacer_0_2_1["o1"],
    )
    crossing_0_2.connect(
        port="o2",
        other=spacer_0_2_1["o2"],
    )
    crossing_0_2.connect(
        port="o4",
        other=spacer_0_3_1["o1"],
    )
    crossing_0_3.connect(
        port="o2",
        other=spacer_0_3_1["o2"],
    )
    crossing_0_0.connect(
        port="o3",
        other=spacer_1_0_2["o1"],
    )
    crossing_1_0.connect(
        port="o1",
        other=spacer_1_0_2["o2"],
    )
    crossing_1_0.connect(
        port="o4",
        other=spacer_1_1_1["o1"],
    )
    crossing_0_1.connect(
        port="o3",
        other=spacer_1_1_2["o1"],
    )
    crossing_1_1.connect(
        port="o2",
        other=spacer_1_1_1["o2"],
    )
    crossing_1_1.connect(
        port="o1",
        other=spacer_1_1_2["o2"],
    )
    crossing_1_1.connect(
        port="o4",
        other=spacer_1_2_1["o1"],
    )
    crossing_0_2.connect(
        port="o3",
        other=spacer_1_2_2["o1"],
    )
    crossing_1_2.connect(
        port="o2",
        other=spacer_1_2_1["o2"],
    )
    crossing_1_2.connect(
        port="o1",
        other=spacer_1_2_2["o2"],
    )
    crossing_1_2.connect(
        port="o4",
        other=spacer_1_3_1["o1"],
    )
    crossing_0_3.connect(
        port="o3",
        other=spacer_1_3_2["o1"],
    )
    crossing_1_3.connect(
        port="o2",
        other=spacer_1_3_1["o2"],
    )
    crossing_1_3.connect(
        port="o1",
        other=spacer_1_3_2["o2"],
    )
    crossing_1_0.connect(
        port="o3",
        other=spacer_2_0_2["o1"],
    )
    crossing_2_0.connect(
        port="o1",
        other=spacer_2_0_2["o2"],
    )
    crossing_2_0.connect(
        port="o4",
        other=spacer_2_1_1["o1"],
    )
    crossing_1_1.connect(
        port="o3",
        other=spacer_2_1_2["o1"],
    )
    crossing_2_1.connect(
        port="o2",
        other=spacer_2_1_1["o2"],
    )
    crossing_2_1.connect(
        port="o1",
        other=spacer_2_1_2["o2"],
    )
    crossing_2_1.connect(
        port="o4",
        other=spacer_2_2_1["o1"],
    )
    crossing_1_2.connect(
        port="o3",
        other=spacer_2_2_2["o1"],
    )
    crossing_2_2.connect(
        port="o2",
        other=spacer_2_2_1["o2"],
    )
    crossing_2_2.connect(
        port="o1",
        other=spacer_2_2_2["o2"],
    )
    crossing_2_2.connect(
        port="o4",
        other=spacer_2_3_1["o1"],
    )
    crossing_1_3.connect(
        port="o3",
        other=spacer_2_3_2["o1"],
    )
    crossing_2_3.connect(
        port="o2",
        other=spacer_2_3_1["o2"],
    )
    crossing_2_3.connect(
        port="o1",
        other=spacer_2_3_2["o2"],
    )
    crossing_2_0.connect(
        port="o3",
        other=spacer_3_0_2["o1"],
    )
    crossing_3_0.connect(
        port="o1",
        other=spacer_3_0_2["o2"],
    )
    crossing_3_0.connect(
        port="o4",
        other=spacer_3_1_1["o1"],
    )
    crossing_2_1.connect(
        port="o3",
        other=spacer_3_1_2["o1"],
    )
    crossing_3_1.connect(
        port="o2",
        other=spacer_3_1_1["o2"],
    )
    crossing_3_1.connect(
        port="o1",
        other=spacer_3_1_2["o2"],
    )
    crossing_3_1.connect(
        port="o4",
        other=spacer_3_2_1["o1"],
    )
    crossing_2_2.connect(
        port="o3",
        other=spacer_3_2_2["o1"],
    )
    crossing_3_2.connect(
        port="o2",
        other=spacer_3_2_1["o2"],
    )
    crossing_3_2.connect(
        port="o1",
        other=spacer_3_2_2["o2"],
    )
    crossing_3_2.connect(
        port="o4",
        other=spacer_3_3_1["o1"],
    )
    crossing_2_3.connect(
        port="o3",
        other=spacer_3_3_2["o1"],
    )
    crossing_3_3.connect(
        port="o2",
        other=spacer_3_3_1["o2"],
    )
    crossing_3_3.connect(
        port="o1",
        other=spacer_3_3_2["o2"],
    )
    crossing_0_0.connect(
        port="o2",
        other=io_spacer_0["o2"],
    )
    bend45_0.connect(
        port="o2",
        other=io_spacer_0["o1"],
    )
    crossing_0_0.connect(
        port="o1",
        other=io_spacer_7["o2"],
    )
    bend45_7.connect(
        port="o2",
        other=io_spacer_7["o1"],
    )
    crossing_0_3.connect(
        port="o4",
        other=io_spacer_8["o1"],
    )
    bend45_8.connect(
        port="o2",
        other=io_spacer_8["o2"],
    )
    crossing_3_0.connect(
        port="o3",
        other=io_spacer_15["o1"],
    )
    bend45_15.connect(
        port="o2",
        other=io_spacer_15["o2"],
    )
    bend45_8.connect(
        port="o1",
        other=io_straight_8["o2"],
    )
    bend45_15.connect(
        port="o1",
        other=io_straight_15["o2"],
    )
    crossing_1_0.connect(
        port="o2",
        other=io_spacer_1["o2"],
    )
    bend45_1.connect(
        port="o2",
        other=io_spacer_1["o1"],
    )
    crossing_0_1.connect(
        port="o1",
        other=io_spacer_6["o2"],
    )
    bend45_6.connect(
        port="o2",
        other=io_spacer_6["o1"],
    )
    crossing_1_3.connect(
        port="o4",
        other=io_spacer_9["o1"],
    )
    bend45_9.connect(
        port="o2",
        other=io_spacer_9["o2"],
    )
    crossing_3_1.connect(
        port="o3",
        other=io_spacer_14["o1"],
    )
    bend45_14.connect(
        port="o2",
        other=io_spacer_14["o2"],
    )
    bend45_1.connect(
        port="o1",
        other=io_straight_1["o2"],
    )
    bend45_6.connect(
        port="o1",
        other=io_straight_6["o2"],
    )
    bend45_9.connect(
        port="o1",
        other=io_straight_9["o2"],
    )
    bend45_14.connect(
        port="o1",
        other=io_straight_14["o2"],
    )
    crossing_2_0.connect(
        port="o2",
        other=io_spacer_2["o2"],
    )
    bend45_2.connect(
        port="o2",
        other=io_spacer_2["o1"],
    )
    crossing_0_2.connect(
        port="o1",
        other=io_spacer_5["o2"],
    )
    bend45_5.connect(
        port="o2",
        other=io_spacer_5["o1"],
    )
    crossing_2_3.connect(
        port="o4",
        other=io_spacer_10["o1"],
    )
    bend45_10.connect(
        port="o2",
        other=io_spacer_10["o2"],
    )
    crossing_3_2.connect(
        port="o3",
        other=io_spacer_13["o1"],
    )
    bend45_13.connect(
        port="o2",
        other=io_spacer_13["o2"],
    )
    bend45_2.connect(
        port="o1",
        other=io_straight_2["o2"],
    )
    bend45_5.connect(
        port="o1",
        other=io_straight_5["o2"],
    )
    bend45_10.connect(
        port="o1",
        other=io_straight_10["o2"],
    )
    bend45_13.connect(
        port="o1",
        other=io_straight_13["o2"],
    )
    crossing_3_0.connect(
        port="o2",
        other=io_spacer_3["o2"],
    )
    bend45_3.connect(
        port="o2",
        other=io_spacer_3["o1"],
    )
    crossing_0_3.connect(
        port="o1",
        other=io_spacer_4["o2"],
    )
    bend45_4.connect(
        port="o2",
        other=io_spacer_4["o1"],
    )
    crossing_3_3.connect(
        port="o4",
        other=io_spacer_11["o1"],
    )
    bend45_11.connect(
        port="o2",
        other=io_spacer_11["o2"],
    )
    crossing_3_3.connect(
        port="o3",
        other=io_spacer_12["o1"],
    )
    bend45_12.connect(
        port="o2",
        other=io_spacer_12["o2"],
    )
    bend45_3.connect(
        port="o1",
        other=io_straight_3["o2"],
    )
    bend45_4.connect(
        port="o1",
        other=io_straight_4["o2"],
    )
    return schematic
To avoid name conflicts with our existing schematic, let’s make a copy and rename it before execution.
new_schematic = c.schematic.model_copy()
new_schematic.name = new_schematic.name + "_copy"
Executing generated code¶
We can directly execute the generated code string in this notebook, which defines a new PCell function. This closes the loop:
- Design a schematic
 - Generate its layout and netlist
 - Export as reusable code
 
get_ipython().run_cell(new_schematic.code_str())
<ExecutionResult object at 7f32485a0560, execution_count=None error_before_exec=None error_in_exec=None info=<ExecutionInfo object at 7f324880a450, raw_cell="import kfactory as kf kcl = kf.kcls["DEFAULT"] .." transformed_cell="import kfactory as kf kcl = kf.kcls["DEFAULT"] .." store_history=False silent=False shell_futures=True cell_id=None> result=None>
Now we can instantiate the newly generated PCell and visualize it.
c_new = crossing45_N8_P30_CSWG1000_copy()
c_new
c_new.ports.print()
┏━━━━━━━━┳━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━┳━━━━━━━┳━━━━━━━━┳━━━━━━┓ ┃ Name ┃ Width ┃ Layer ┃ X ┃ Y ┃ Angle ┃ Mirror ┃ Info ┃ ┡━━━━━━━━╇━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━╇━━━━━━━╇━━━━━━━━╇━━━━━━┩ │ in_3 │ 1.0 │ WG (1/0) │ -39.465 │ -15.0 │ 2 │ False │ {} │ ├────────┼───────┼──────────┼─────────┼────────┼───────┼────────┼──────┤ │ in_4 │ 1.0 │ WG (1/0) │ -39.465 │ 15.0 │ 2 │ False │ {} │ ├────────┼───────┼──────────┼─────────┼────────┼───────┼────────┼──────┤ │ in_2 │ 1.0 │ WG (1/0) │ -39.465 │ -45.0 │ 2 │ False │ {} │ ├────────┼───────┼──────────┼─────────┼────────┼───────┼────────┼──────┤ │ in_5 │ 1.0 │ WG (1/0) │ -39.465 │ 45.0 │ 2 │ False │ {} │ ├────────┼───────┼──────────┼─────────┼────────┼───────┼────────┼──────┤ │ in_6 │ 1.0 │ WG (1/0) │ -39.465 │ 75.0 │ 2 │ False │ {} │ ├────────┼───────┼──────────┼─────────┼────────┼───────┼────────┼──────┤ │ in_1 │ 1.0 │ WG (1/0) │ -39.465 │ -75.0 │ 2 │ False │ {} │ ├────────┼───────┼──────────┼─────────┼────────┼───────┼────────┼──────┤ │ out_3 │ 1.0 │ WG (1/0) │ 219.465 │ 105.0 │ 0 │ False │ {} │ ├────────┼───────┼──────────┼─────────┼────────┼───────┼────────┼──────┤ │ in_7 │ 1.0 │ WG (1/0) │ -39.465 │ 105.0 │ 2 │ False │ {} │ ├────────┼───────┼──────────┼─────────┼────────┼───────┼────────┼──────┤ │ in_0 │ 1.0 │ WG (1/0) │ -39.465 │ -105.0 │ 2 │ False │ {} │ ├────────┼───────┼──────────┼─────────┼────────┼───────┼────────┼──────┤ │ out_4 │ 1.0 │ WG (1/0) │ 219.465 │ -105.0 │ 0 │ False │ {} │ ├────────┼───────┼──────────┼─────────┼────────┼───────┼────────┼──────┤ │ out_5 │ 1.0 │ WG (1/0) │ 219.465 │ -75.0 │ 0 │ False │ {} │ ├────────┼───────┼──────────┼─────────┼────────┼───────┼────────┼──────┤ │ out_2 │ 1.0 │ WG (1/0) │ 219.465 │ 75.0 │ 0 │ False │ {} │ ├────────┼───────┼──────────┼─────────┼────────┼───────┼────────┼──────┤ │ out_6 │ 1.0 │ WG (1/0) │ 219.465 │ -45.0 │ 0 │ False │ {} │ ├────────┼───────┼──────────┼─────────┼────────┼───────┼────────┼──────┤ │ out_1 │ 1.0 │ WG (1/0) │ 219.465 │ 45.0 │ 0 │ False │ {} │ ├────────┼───────┼──────────┼─────────┼────────┼───────┼────────┼──────┤ │ out_7 │ 1.0 │ WG (1/0) │ 219.465 │ -15.0 │ 0 │ False │ {} │ ├────────┼───────┼──────────┼─────────┼────────┼───────┼────────┼──────┤ │ out_0 │ 1.0 │ WG (1/0) │ 219.465 │ 15.0 │ 0 │ False │ {} │ └────────┴───────┴──────────┴─────────┴────────┴───────┴────────┴──────┘