Source code for gdsfactory.components.delay_snake_sbend

from __future__ import annotations

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

diagram = r"""

                         length1
         <----------------------------
               length2    spacing    |
                _______              |
               |        \            |
               |          \          | bend1 radius
               |            \sbend   |
          bend2|              \      |
               |                \    |
               |                  \__|
               |
               ---------------------->----------->
                   length3              length4
"""


[docs] @gf.cell def delay_snake_sbend( length: float = 100.0, length1: float = 0.0, length4: float = 0.0, radius: float = 5.0, waveguide_spacing: float = 5.0, bend: ComponentSpec = "bend_euler", sbend: ComponentSpec = "bend_s", sbend_xsize: float = 100.0, cross_section: CrossSectionSpec = "xs_sc", **kwargs, ) -> Component: r"""Returns compact Snake with sbend in the middle. Input port faces west and output port faces east. Args: length: total length. length1: first straight section length in um. length3: third straight section length in um. radius: u bend radius in um. waveguide_spacing: waveguide pitch in um. bend: bend spec. sbend: sbend spec. sbend_size: sbend size. cross_section: cross_section spec. kwargs: cross_section settings. .. code:: length1 <---------------------------- length2 spacing | _______ | | \ | | \ | bend1 radius | \sbend | bend2| \ | | \ | | \__| | ---------------------->-----------> length3 length4 We adjust length2 and length3 """ c = Component() bend180_radius = (radius + waveguide_spacing) / 2 bend = gf.get_component( bend, radius=bend180_radius, angle=180, cross_section=cross_section, **kwargs ) sbend = gf.get_component( sbend, size=(sbend_xsize, radius), cross_section=cross_section, **kwargs ) b1 = c << bend b2 = c << bend bs = c << sbend bs.mirror() length23 = ( length - (2 * bend.info["length"] - bs.info["length"]) - length1 - length4 ) length2 = length23 / 2 length3 = length23 / 2 if length2 < 0: raise ValueError( f"length2 = {length2} < 0. You need to reduce length1 = {length1} " f"or length3 = {length3} or increase length = {length}\n" + diagram ) straight1 = straight(length=length1, cross_section=cross_section, **kwargs) straight2 = straight(length=length2, cross_section=cross_section, **kwargs) straight3 = straight(length=length3, cross_section=cross_section, **kwargs) straight4 = straight(length=length4, cross_section=cross_section, **kwargs) s1 = c << straight1 s2 = c << straight2 s3 = c << straight3 s4 = c << straight4 b1.connect("o2", s1.ports["o2"]) bs.connect("o2", b1.ports["o1"]) s2.connect("o2", bs.ports["o1"]) b2.connect("o1", s2.ports["o1"]) s3.connect("o1", b2.ports["o2"]) s4.connect("o1", s3.ports["o2"]) c.add_port("o1", port=s1.ports["o1"]) c.add_port("o2", port=s4.ports["o2"]) c.info["min_bend_radius"] = sbend.info["min_bend_radius"] c.info["bend180_radius"] = bend180_radius return c
def test_delay_snake_sbend_length() -> None: import numpy as np length = 200.0 c = delay_snake_sbend(length=length, cross_section="xs_sc") length_computed = c.area() / 0.5 np.isclose(length, length_computed) if __name__ == "__main__": c = test_delay_snake_sbend_length() # c = gf.grid( # [ # delay_snake_sbend(length=length, cross_section="xs_rc") # for length in [500, 3000] # ] # ) c.show(show_ports=True)