Source code for gdsfactory.components.coupler90
from __future__ import annotations
from functools import partial
import gdsfactory as gf
from gdsfactory.component import Component
from gdsfactory.components.bend_circular import bend_circular
from gdsfactory.components.bend_euler import bend_euler
from gdsfactory.components.straight import straight
from gdsfactory.typings import ComponentSpec, CrossSectionSpec
[docs]
@gf.cell
def coupler90(
gap: float = 0.2,
radius: float = 10.0,
bend: ComponentSpec = bend_euler,
straight: ComponentSpec = straight,
cross_section: CrossSectionSpec = "xs_sc",
cross_section_bend: CrossSectionSpec | None = None,
) -> Component:
r"""Straight coupled to a bend.
Args:
gap: um.
radius: um.
straight: for straight.
bend: bend spec.
cross_section: cross_section spec.
cross_section_bend: optional bend cross_section spec.
.. code::
o3
|
/
/
o2_/
o1___o4
"""
c = Component()
x = gf.get_cross_section(cross_section, radius=radius)
x.copy(radius=radius)
xs_bend = cross_section_bend or cross_section
bend90 = gf.get_component(
bend,
cross_section=xs_bend,
)
bend_ref = c << bend90
straight_component = gf.get_component(
straight,
cross_section=cross_section,
length=bend90.ports["o2"].center[0] - bend90.ports["o1"].center[0],
)
wg_ref = c << straight_component
width = x.width
pbw = bend_ref.ports["o1"]
bend_ref.movey(pbw.center[1] + gap + width)
c.add_ports(wg_ref.ports, prefix="wg")
c.add_ports(bend_ref.ports, prefix="bend")
c.auto_rename_ports()
return c
coupler90circular = partial(coupler90, bend=bend_circular)
if __name__ == "__main__":
c = coupler90(radius=10, cross_section_bend="xs_sc_heater_metal")
c.show(show_ports=False)