Source code for gdsfactory.components.cutback_splitter
from __future__ import annotations
import gdsfactory as gf
from gdsfactory.component import Component
from gdsfactory.components.bend_euler import bend_euler180
from gdsfactory.components.component_sequence import component_sequence
from gdsfactory.components.mmi1x2 import mmi1x2
from gdsfactory.components.straight import straight
from gdsfactory.typings import ComponentSpec, CrossSectionSpec
[docs]
@gf.cell_with_child
def cutback_splitter(
component: ComponentSpec = mmi1x2,
cols: int = 4,
rows: int = 5,
port1: str = "o1",
port2: str = "o2",
port3: str = "o3",
bend180: ComponentSpec = bend_euler180,
mirror: bool = False,
straight_length: float | None = None,
cross_section: CrossSectionSpec = "xs_sc",
**kwargs,
) -> Component:
"""Returns a daisy chain of splitters for measuring their loss.
Args:
component: for cutback.
cols: number of columns.
rows: number of rows.
port1: name of first optical port.
port2: name of second optical port.
bend180: ubend.
straight: waveguide spec to connect both sides.
mirror: Flips component. Useful when 'o2' is the port that you want to route to.
straight_length: length of the straight section between cutbacks.
cross_section: specification (CrossSection, string or dict).
kwargs: cross_section settings.
"""
xs = gf.get_cross_section(cross_section, **kwargs)
component = gf.get_component(component)
bendu = gf.get_component(bend180, cross_section=xs)
straight_component = straight(
length=straight_length or xs.radius * 2, cross_section=xs
)
# Define a map between symbols and (component, input port, output port)
symbol_to_component = {
"A": (component, port1, port2),
"B": (component, port3, port1),
"D": (bendu, "o1", "o2"),
"C": (bendu, "o2", "o1"),
"-": (straight_component, "o1", "o2"),
"_": (straight_component, "o2", "o1"),
}
s = ""
for i in range(rows):
s += "AB" * cols
if mirror:
s += "C" if i % 2 == 0 else "D"
else:
s += "D" if i % 2 == 0 else "C"
s = s[:-1]
s += "-_"
for i in range(rows):
s += "AB" * cols
s += "D" if (i + rows) % 2 == 0 else "C"
s = s[:-1]
seq = component_sequence(sequence=s, symbol_to_component=symbol_to_component)
c = gf.Component()
ref = c << seq
c.add_ports(ref.ports)
n = len(s) - 2
c.copy_child_info(component)
c.info["components"] = n
return c
if __name__ == "__main__":
c = cutback_splitter()
c.show(show_ports=True)