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 (
s1
ands2
) - 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 (
vcell
andVKCell
) - 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 0x7f2577c1f6e0>
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
cross
instances - 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)))
{'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 7f25a511d940, execution_count=None error_before_exec=None error_in_exec=None info=<ExecutionInfo object at 7f25a511d640, 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_4 │ 1.0 │ WG (1/0) │ -39.465 │ 15.0 │ 2 │ False │ {} │ ├────────┼───────┼──────────┼─────────┼────────┼───────┼────────┼──────┤ │ in_3 │ 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 │ {} │ ├────────┼───────┼──────────┼─────────┼────────┼───────┼────────┼──────┤ │ 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_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 │ {} │ ├────────┼───────┼──────────┼─────────┼────────┼───────┼────────┼──────┤ │ out_2 │ 1.0 │ WG (1/0) │ 219.465 │ 75.0 │ 0 │ False │ {} │ ├────────┼───────┼──────────┼─────────┼────────┼───────┼────────┼──────┤ │ out_5 │ 1.0 │ WG (1/0) │ 219.465 │ -75.0 │ 0 │ False │ {} │ ├────────┼───────┼──────────┼─────────┼────────┼───────┼────────┼──────┤ │ out_1 │ 1.0 │ WG (1/0) │ 219.465 │ 45.0 │ 0 │ False │ {} │ ├────────┼───────┼──────────┼─────────┼────────┼───────┼────────┼──────┤ │ out_6 │ 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 │ {} │ └────────┴───────┴──────────┴─────────┴────────┴───────┴────────┴──────┘