Netlist extractor YAML#
Any component can extract its netlist with get_netlist
While gf.read.from_yaml converts a YAML Dict into a Component
get_netlist converts Component into a YAML Dict
import gdsfactory as gf
import yaml
c = gf.components.mzi()
c.plot()
c.plot_netlist()
<networkx.classes.graph.Graph at 0x7f64bd467c50>
c = gf.components.ring_single()
c.plot()
c.plot_netlist()
<networkx.classes.graph.Graph at 0x7f64bd4727b0>
n = c.get_netlist()
netlist_string = c.write_netlist(n)
n = yaml.safe_load(netlist_string)
i = list(n["instances"].keys())
i
['bend_euler',
'bend_euler2',
'coupler_ring',
'straight',
'straight2',
'straight3']
instance_name0 = i[0]
n["instances"][instance_name0]["settings"]
{'allow_min_radius_violation': False,
'angle': 90,
'angular_step': None,
'cross_section': 'strip',
'layer': None,
'npoints': None,
'p': 0.5,
'radius': None,
'width': None,
'with_arc_floorplan': True}
Instance names#
By default get netlist names each instance with the name of the reference
@gf.cell
def mzi_with_bend_automatic_naming():
c = gf.Component()
mzi = c.add_ref(gf.components.mzi())
bend = c.add_ref(gf.components.bend_euler())
bend.connect("o1", mzi.ports["o2"])
return c
c = mzi_with_bend_automatic_naming()
c.plot_netlist()
/home/runner/work/gplugins/gplugins/.venv/lib/python3.12/site-packages/gdsfactory/component.py:577: UserWarning: Unconnected ports: ['bend_euler,o2', 'mzi,o1']
return get_netlist(
<networkx.classes.graph.Graph at 0x7f64bd0d8170>
@gf.cell
def mzi_with_bend_deterministic_names_using_alias():
c = gf.Component()
mzi = c.add_ref(gf.components.mzi(), name="my_mzi")
bend = c.add_ref(gf.components.bend_euler(), name="my_bend")
bend.connect("o1", mzi.ports["o2"])
return c
c = mzi_with_bend_deterministic_names_using_alias()
c.plot_netlist()
/home/runner/work/gplugins/gplugins/.venv/lib/python3.12/site-packages/gdsfactory/component.py:577: UserWarning: Unconnected ports: ['my_bend,o2', 'my_mzi,o1']
return get_netlist(
<networkx.classes.graph.Graph at 0x7f64bd0eb3b0>
c = gf.components.mzi()
c.plot()
c = gf.components.mzi()
n = c.get_netlist()
print(c.get_netlist().keys())
dict_keys(['instances', 'placements', 'ports', 'nets'])
c.plot_netlist()
<networkx.classes.graph.Graph at 0x7f64bd44b110>
n.keys()
dict_keys(['instances', 'placements', 'ports', 'nets'])
warnings#
Lets make a connectivity error, for example connecting ports on the wrong layer
@gf.cell
def mmi_with_bend():
c = gf.Component()
mmi = c.add_ref(gf.components.mmi1x2(), name="mmi")
bend = c.add_ref(gf.components.bend_euler(layer=(2, 0)), name="bend")
bend.connect("o1", mmi.ports["o2"], allow_layer_mismatch=True)
return c
c = mmi_with_bend()
c.plot()
n = c.get_netlist()
/home/runner/work/gplugins/gplugins/.venv/lib/python3.12/site-packages/gdsfactory/component.py:577: UserWarning: Unconnected ports: ['bend,o2', 'mmi,o1', 'mmi,o3']
return get_netlist(
print(n.get("warnings", {}))
{}
c.plot_netlist()
<networkx.classes.graph.Graph at 0x7f64bd01c4a0>
get_netlist_recursive#
When you do get_netlist() for a component it will only show connections for the instances that belong to that component.
So despite having a lot of connections, it will show only the meaningful connections for that component.
For example, a ring has a ring_coupler. If you want to dig deeper, the connections that made that ring coupler are still available.
get_netlist_recursive() returns a recursive netlist.
c = gf.components.ring_single()
c.plot()
c.plot_netlist()
<networkx.classes.graph.Graph at 0x7f64bcf07500>
c = gf.components.ring_double()
c.plot()
c.plot_netlist()
<networkx.classes.graph.Graph at 0x7f64bd473da0>
c = gf.components.mzit()
c.plot()
c.plot_netlist()
<networkx.classes.graph.Graph at 0x7f64bd4a9760>
coupler_lengths = (10, 20, 30)
coupler_gaps = (0.1, 0.2, 0.3)
delta_lengths = (10, 100)
c = gf.components.mzi_lattice(
coupler_lengths=coupler_lengths,
coupler_gaps=coupler_gaps,
delta_lengths=delta_lengths,
)
c.plot()
c.plot_netlist()
<networkx.classes.graph.Graph at 0x7f64bd050ef0>
coupler_lengths = (10, 20, 30, 40)
coupler_gaps = (0.1, 0.2, 0.4, 0.5)
delta_lengths = (10, 100, 200)
c = gf.components.mzi_lattice(
coupler_lengths=coupler_lengths,
coupler_gaps=coupler_gaps,
delta_lengths=delta_lengths,
)
c.plot()
n = c.get_netlist()
c.plot_netlist()
<networkx.classes.graph.Graph at 0x7f64bced7c50>
n_recursive = c.get_netlist(recursive=True)
n_recursive.keys()
dict_keys(['mzi_lattice', 'mzi', 'mzi2', 'mzi3'])
Placement information is accumulated, and connections and ports are mapped, respectively, to the ports of the unique instances or the component top level ports. This can be plotted:
c.plot_netlist(with_labels=False) # labels get cluttered
<networkx.classes.graph.Graph at 0x7f64bd0db290>