Source code for gdsfactory.components.ring_double

from __future__ import annotations

import gdsfactory as gf
from gdsfactory.component import Component
from gdsfactory.components.bend_euler import bend_euler
from gdsfactory.components.coupler_ring import coupler_ring as coupler_ring_function
from gdsfactory.components.straight import straight
from gdsfactory.typings import ComponentSpec, CrossSectionSpec


[docs] @gf.cell def ring_double( gap: float = 0.2, gap_top: float | None = None, radius: float = 10.0, length_x: float = 0.01, length_y: float = 0.01, coupler_ring: ComponentSpec = coupler_ring_function, bend: ComponentSpec = bend_euler, straight: ComponentSpec = straight, cross_section: CrossSectionSpec = "xs_sc", ) -> Component: """Returns a double bus ring. two couplers (ct: top, cb: bottom) connected with two vertical straights (sl: left, sr: right) Args: gap: gap between for coupler. gap_top: optional gap between top waveguides. Defaults to gap. radius: for the bend and coupler. length_x: ring coupler length. length_y: vertical straight length. coupler: ring coupler spec. bend: bend spec. straight: straight spec. cross_section: cross_section spec. .. code:: o2──────▲─────────o3 │gap_top xx──────▼─────────xxx xxx xxx xxx xxx xx xxx x xxx xx xx▲ xx xx│length_y xx xx▼ xx xx xx length_x x xx ◄───────────────► x xx xxx xx xxx xxx──────▲─────────xxx │gap o1──────▼─────────o4 """ gap_top = gap_top or gap gap = gf.snap.snap_to_grid(gap, grid_factor=2) gap_top = gf.snap.snap_to_grid(gap_top, grid_factor=2) xs = gf.get_cross_section(cross_section) radius = radius or xs.radius cross_section = xs.copy(radius=radius) coupler_component_top = gf.get_component( coupler_ring, gap=gap_top, radius=radius, length_x=length_x, bend=bend, cross_section=cross_section, ) coupler_component_bot = gf.get_component( coupler_ring, gap=gap, radius=radius, length_x=length_x, bend=bend, cross_section=cross_section, ) straight_component = straight(length=length_y, cross_section=cross_section) c = Component() cb = c.add_ref(coupler_component_bot) ct = c.add_ref(coupler_component_top) sl = straight_component.ref() sr = straight_component.ref() if length_y > 0: c.add(sl) c.add(sr) sl.connect(port="o1", destination=cb.ports["o2"]) ct.connect(port="o3", destination=sl.ports["o2"]) sr.connect(port="o2", destination=ct.ports["o2"]) c.add_port("o1", port=cb.ports["o1"]) c.add_port("o2", port=cb.ports["o4"]) c.add_port("o3", port=ct.ports["o4"]) c.add_port("o4", port=ct.ports["o1"]) return c
if __name__ == "__main__": c = ring_double(length_x=10, radius=15, length_y=5) c.get_netlist() c.show(show_subports=False)