Source code for gdsfactory.components.grating_coupler_array

from __future__ import annotations

import gdsfactory as gf
from gdsfactory.component import Component
from gdsfactory.components.bend_euler import bend_euler
from gdsfactory.components.grating_coupler_elliptical import grating_coupler_elliptical
from gdsfactory.typings import ComponentSpec


[docs] @gf.cell def grating_coupler_array( grating_coupler: ComponentSpec = grating_coupler_elliptical, pitch: float = 127.0, n: int = 6, port_name: str = "o1", rotation: int = 0, with_loopback: bool = False, cross_section: str = "xs_sc", bend: ComponentSpec = bend_euler, grating_coupler_spacing: float = 0.0, **kwargs, ) -> Component: """Array of grating couplers. Args: grating_coupler: ComponentSpec. pitch: x spacing. n: number of grating couplers. port_name: port name. rotation: rotation angle for each reference. with_loopback: if True, adds a loopback between edge GCs. Only works for rotation = 90 for now. cross_section: cross_section for the routing. bend: bend component. grating_coupler_spacing: spacing between grating couplers. kwargs: cross_section settings. """ c = Component() grating_coupler = gf.get_component(grating_coupler) for i in range(n): gc = c << grating_coupler gc.rotate(rotation) gc.x = i * pitch port_name_new = f"o{i+1}" c.add_port(port=gc.ports[port_name], name=port_name_new) if with_loopback: if rotation != 90: raise ValueError( "with_loopback is currently only programmed to work with rotation = 90" ) routing_xs = gf.get_cross_section(cross_section, **kwargs) radius = routing_xs.radius bend = bend(radius=radius, angle=180, cross_section=routing_xs) sw = gf.c.straight( cross_section=routing_xs, length=max(gc.size) + grating_coupler_spacing ) b1 = c << bend b2 = c << bend b1.mirror() b1.connect("o1", c.ports["o1"]) b2.connect("o1", c.ports[f"o{n}"]) s1 = c << sw s2 = c << sw s1.connect("o1", b1.ports["o2"]) s2.connect("o1", b2.ports["o2"]) route = gf.routing.get_route( s1.ports["o2"], s2.ports["o2"], cross_section=routing_xs, ) c.add(route.references) c.ports.pop("o1") c.ports.pop(f"o{n}") return c
if __name__ == "__main__": # c = grating_coupler_array() c = grating_coupler_array(rotation=90, with_loopback=True, radius=50) c.show(show_ports=True)