Source code for gdsfactory.routing.add_fiber_array

from __future__ import annotations

from typing import Any

import gdsfactory as gf
from gdsfactory.component import Component
from gdsfactory.port import select_ports_optical
from gdsfactory.routing.route_fiber_array import route_fiber_array
from gdsfactory.typings import (
    ComponentSpec,
    ComponentSpecOrList,
    CrossSectionSpec,
    PortsFactory,
)


[docs] def add_fiber_array( component: ComponentSpec = "straight", grating_coupler: ComponentSpecOrList = "grating_coupler_te", gc_port_name: str = "o1", select_ports: PortsFactory = select_ports_optical, cross_section: CrossSectionSpec = "strip", start_straight_length: float = 0, end_straight_length: float = 0, mirror_grating_coupler: bool = False, **kwargs: Any, ) -> Component: """Returns component with south routes and grating_couplers. You can also use pads or other terminations instead of grating couplers. Args: component: component spec to connect to grating couplers. grating_coupler: spec for route terminations. gc_port_name: grating coupler input port name. select_ports: function to select ports. cross_section: cross_section function. mirror_grating_coupler: if True, mirrors the grating coupler. kwargs: additional arguments. Keyword Args: bend: bend spec. straight: straight spec. fanout_length: if None, automatic calculation of fanout length. max_y0_optical: in um. with_loopback: True, adds loopback structures. with_loopback_inside: True, adds loopback structures inside the component. straight_separation: from edge to edge. list_port_labels: None, adds TM labels to port indices in this list. nb_optical_ports_lines: number of grating coupler lines. force_manhattan: False excluded_ports: list of port names to exclude when adding gratings. grating_indices: list of grating coupler indices. routing_straight: function to route. routing_method: route_single. gc_rotation: fiber coupler rotation in degrees. Defaults to -90. input_port_indexes: to connect. pitch: in um. radius: optional radius of the bend. Defaults to the cross_section. radius_loopback: optional radius of the loopback bend. Defaults to the cross_section. start_straight_length: length of the start straight. end_straight_length: length of the end straight. .. plot:: :include-source: import gdsfactory as gf c = gf.components.crossing() cc = gf.routing.add_fiber_array( component=c, grating_coupler=gf.components.grating_coupler_elliptical_te, with_loopback=False ) cc.plot() """ component = gf.get_component(component) if isinstance(grating_coupler, list): gc = grating_coupler[0] else: gc = grating_coupler gc = gf.get_component(gc) if mirror_grating_coupler: gc = gf.functions.mirror(gc) gc_port_names = [port.name for port in gc.ports] if gc_port_name not in gc_port_names: raise ValueError(f"gc_port_name = {gc_port_name!r} not in {gc_port_names}") orientation = gc.ports[gc_port_name].orientation grating_coupler = ( [gf.get_component(i) for i in grating_coupler] if isinstance(grating_coupler, list) else gf.get_component(grating_coupler) ) if int(orientation) != 180: raise ValueError( "add_fiber_array requires a grating coupler port facing west " f"(orientation = 180). " f"Got orientation = {orientation} degrees for port {gc_port_name!r}" ) if gc_port_name not in gc.ports: raise ValueError(f"gc_port_name={gc_port_name!r} not in {list(gc.ports)}") component_new = Component() optical_ports = select_ports(component.ports) if not optical_ports: raise ValueError(f"No optical ports found in {component.name!r}") ref = component_new.add_ref(component) route_fiber_array( component_new, ref, grating_coupler=grating_coupler, gc_port_name=gc_port_name, cross_section=cross_section, select_ports=select_ports, start_straight_length=start_straight_length, end_straight_length=end_straight_length, **kwargs, ) component_new.copy_child_info(component) return component_new