Source code for gdsfactory.components.coupler_ring
from __future__ import annotations
import gdsfactory as gf
from gdsfactory.component import Component
from gdsfactory.components.coupler90 import coupler90
from gdsfactory.components.coupler_straight import coupler_straight
from gdsfactory.typings import (
ComponentSpec,
CrossSectionSpec,
)
[docs]
@gf.cell
def coupler_ring(
gap: float = 0.2,
radius: float = 5.0,
length_x: float = 4.0,
bend: ComponentSpec = "bend_euler",
straight: ComponentSpec = "straight",
cross_section: CrossSectionSpec = "strip",
cross_section_bend: CrossSectionSpec | None = None,
length_extension: float = 3,
) -> Component:
r"""Coupler for ring.
Args:
gap: spacing between parallel coupled straight waveguides.
radius: of the bends.
length_x: length of the parallel coupled straight waveguides.
bend: 90 degrees bend spec.
straight: straight spec.
cross_section: cross_section spec.
cross_section_bend: optional bend cross_section spec.
length_extension: for the ports.
.. code::
o2 o3
| |
\ /
\ /
---=========---
o1 length_x o4
"""
c = Component()
gap = gf.snap.snap_to_grid(gap, grid_factor=2)
cross_section_bend = cross_section_bend or cross_section
# define subcells
coupler90_component = gf.get_component(
coupler90,
gap=gap,
radius=radius,
bend=bend,
straight=straight,
cross_section=cross_section,
cross_section_bend=cross_section_bend,
)
coupler_straight_component = gf.get_component(
coupler_straight,
gap=gap,
length=length_x,
cross_section=cross_section,
)
# add references to subcells
cbl = c << coupler90_component
cbr = c << coupler90_component
cs = c << coupler_straight_component
# connect references
cs.connect(port="o4", other=cbr.ports["o1"])
cbl.connect(port="o2", other=cs.ports["o2"], mirror=True)
s = gf.get_component(straight, length=length_extension, cross_section=cross_section)
s1 = c << s
s2 = c << s
s1.connect("o2", cbl.ports["o4"])
s2.connect("o1", cbr.ports["o4"])
c.add_port("o1", port=s1.ports["o1"])
c.add_port("o2", port=cbl.ports["o3"])
c.add_port("o3", port=cbr.ports["o3"])
c.add_port("o4", port=s2.ports["o2"])
c.add_ports(
gf.port.select_ports_list(ports=cbl.ports, port_type="electrical"), prefix="cbl"
)
c.add_ports(
gf.port.select_ports_list(ports=cbr.ports, port_type="electrical"), prefix="cbr"
)
c.auto_rename_ports()
c.flatten()
return c
if __name__ == "__main__":
c = coupler_ring()
c.show()