Source code for gdsfactory.components.ring_single

from __future__ import annotations

import gdsfactory as gf
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 ComponentFactory, CrossSectionSpec


[docs] @gf.cell def ring_single( gap: float = 0.2, radius: float = 10.0, length_x: float = 4.0, length_y: float = 0.6, coupler_ring: ComponentFactory = coupler_ring_function, bend: ComponentFactory = bend_euler, bend_coupler: ComponentFactory | None = bend_euler, straight: ComponentFactory = straight, cross_section: CrossSectionSpec = "xs_sc", pass_cross_section_to_bend: bool = True, ) -> gf.Component: """Returns a single ring. ring coupler (cb: bottom) connects to two vertical straights (sl: left, sr: right), two bends (bl, br) and horizontal straight (wg: top) Args: gap: gap between for coupler. radius: for the bend and coupler. length_x: ring coupler length. length_y: vertical straight length. coupler_ring: ring coupler spec. bend: 90 degrees bend spec. bend_coupler: optional bend for coupler. straight: straight spec. cross_section: cross_section spec. pass_cross_section_to_bend: pass cross_section to bend. .. code:: xxxxxxxxxxxxx xxxxx xxxx 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──────▼─────────o2 """ gap = gf.snap.snap_to_grid2x(gap) xs = gf.get_cross_section(cross_section) radius = radius or xs.radius cross_section = xs.copy(radius=radius) bend_coupler = bend_coupler or bend c = gf.Component() cb = c << coupler_ring( bend=bend_coupler, gap=gap, radius=radius, length_x=length_x, cross_section=cross_section, ) sy = straight(length=length_y, cross_section=cross_section) b = ( bend(cross_section=cross_section) if pass_cross_section_to_bend else bend(radius=radius) ) sx = straight(length=length_x, cross_section=cross_section) sl = sy.ref() sr = sy.ref() st = sx.ref() if length_y > 0: c.add(sl) c.add(sr) if length_x > 0: c.add(st) bl = c << b br = c << b sl.connect(port="o1", destination=cb.ports["o2"]) bl.connect(port="o2", destination=sl.ports["o2"]) st.connect(port="o2", destination=bl.ports["o1"]) br.connect(port="o2", destination=st.ports["o1"]) sr.connect(port="o1", destination=br.ports["o1"]) sr.connect(port="o2", destination=cb.ports["o3"]) c.add_port("o2", port=cb.ports["o4"]) c.add_port("o1", port=cb.ports["o1"]) return c
if __name__ == "__main__": # c = ring_single(layer=(2, 0), cross_section_factory=gf.cross_section.pin, width=1) # c = ring_single(width=2, gap=1, layer=(2, 0), radius=7, length_y=1) # print(c.ports) # c = gf.routing.add_fiber_array(ring_single) # c = ring_single(cross_section="xs_rc", width=2) c = ring_single( length_y=10, length_x=10, radius=12, cross_section="xs_rc", layer=(2, 0) ) c.get_netlist() c.show(show_ports=True) # cc = gf.add_pins(c) # print(c.settings) # print(c.settings) # cc.show(show_ports=True)