Skip to content

FanOut

Imports

from functools import partial

import gdsfactory as gf
from gdsfactory.gpdk import PDK

import doroutes as dr

PDK.activate()

import numpy as np

FanInOut Example

c = gf.Component()
ref = c << dr.pcells.fanout_frame2(transition=("e", "w"), add_frame=True)
c.add_ports(ref)
r = c << gf.components.mmi()
r.move((40, 120))
r = c << gf.components.mmi()
r.rotate(90)
r.move((60, 40))

straight = "straight"
bend = {"component": "bend_euler", "settings": {"radius": 5}}
spacing = 1.0

_starts, _legs1 = dr.add_fan_in(
    component=c,
    inputs=[p for p in c.ports if str(p.name).startswith("in")],
    straight=straight,
    bend=bend,
    spacing=spacing,
)
_stops, _legs2 = dr.add_fan_in(
    component=c,
    inputs=[p for p in c.ports if str(p.name).startswith("out")],
    straight=straight,
    bend=bend,
    spacing=spacing,
)

if len(_starts) != len(_stops):
    msg = "number of start ports is different than number of end ports"
    raise ValueError(msg)

dr.add_route_astar(
    component=c,
    start=(*np.mean(_starts, 0), "e"),
    stop=(*np.mean(_stops, 0), "e"),
    straight=partial(dr.pcells.straights, straight, len(_starts), spacing),
    bend=partial(dr.pcells.bends, bend, straight, len(_starts), spacing),
    layers=[(3, 0)],
    grid_unit=800,
)
c.show()
dr.util.show_cell(c)
API key for organization 'GDSFactory' found.