Source code for gdsfactory.routing.fanout2x2
from __future__ import annotations
from collections.abc import Callable
import gdsfactory as gf
from gdsfactory.component import Component
from gdsfactory.components.bend_s import bend_s
from gdsfactory.components.straight import straight
from gdsfactory.port import select_ports_optical
from gdsfactory.typings import ComponentSpec, CrossSectionSpec
[docs]
@gf.cell_with_child
def fanout2x2(
component: ComponentSpec = straight,
port_spacing: float = 20.0,
bend_length: float | None = None,
npoints: int = 101,
select_ports: Callable = select_ports_optical,
cross_section: CrossSectionSpec = "xs_sc",
**kwargs,
) -> Component:
"""Returns component with Sbend fanout routes.
Args:
component: to fanout.
port_spacing: for the returned component.
bend_length: length of the bend (defaults to port_spacing).
npoints: for sbend.
select_ports: function to select optical_ports ports.
cross_section: cross_section spec.
kwargs: cross_section settings.
.. plot::
:include-source:
import gdsfactory as gf
c = gf.components.nxn(west=2, east=2)
cc = gf.routing.fanout2x2(component=c, port_spacing=20)
cc.plot()
"""
c = gf.Component()
component = gf.get_component(component)
component.component = component
ref = c << component
ref.movey(-ref.y)
if bend_length is None:
bend_length = port_spacing
dx = bend_length
y = port_spacing / 2.0
p_w0 = ref.ports["o1"].center
p_w1 = ref.ports["o2"].center
p_e1 = ref.ports["o3"].center
p_e0 = ref.ports["o4"].center
y0 = p_e1[1]
dy = y - y0
x = gf.get_cross_section(cross_section, **kwargs)
bend = bend_s(size=(dx, dy), npoints=npoints, cross_section=x)
b_tr = bend.ref(port_id="o1", position=p_e1)
b_br = bend.ref(port_id="o1", position=p_e0, v_mirror=True)
b_tl = bend.ref(port_id="o1", position=p_w1, h_mirror=True)
b_bl = bend.ref(port_id="o1", position=p_w0, rotation=180)
c.add([b_tr, b_br, b_tl, b_bl])
c.add_port("o1", port=b_bl.ports["o2"])
c.add_port("o2", port=b_tl.ports["o2"])
c.add_port("o3", port=b_tr.ports["o2"])
c.add_port("o4", port=b_br.ports["o2"])
c.min_bend_radius = bend.info["min_bend_radius"]
optical_ports = select_ports(ref.ports)
for port_name in ref.ports.keys():
if port_name not in optical_ports:
c.add_port(port_name, port=ref.ports[port_name])
c.copy_child_info(component)
return c
if __name__ == "__main__":
# c =gf.components.coupler(gap=1.0)
c = gf.components.nxn(west=2, east=2)
cc = fanout2x2(component=c, port_spacing=20)
print(cc.ports["o3"].y - cc.ports["o4"].y)
# print(cc.ports)
cc.show(show_ports=True)