Source code for gdsfactory.components.spiral_double

from __future__ import annotations

import gdsfactory as gf
from gdsfactory.components import bend_circular
from gdsfactory.path import spiral_archimedean


[docs] @gf.cell def spiral_double( min_bend_radius: float | None = None, separation: float = 2.0, number_of_loops: float = 3, npoints: int = 1000, cross_section: gf.typings.CrossSectionSpec = "xs_sc", bend: gf.typings.ComponentSpec = bend_circular, ) -> gf.Component: """Returns a spiral double (spiral in, and then out). Args: min_bend_radius: inner radius of the spiral. Defaults to cross_section radius. separation: separation between the loops. number_of_loops: number of loops per spiral. npoints: points for the spiral. cross_section: cross-section to extrude the structure with. bend: factory for the bends in the middle of the double spiral. """ component = gf.Component() xs = gf.get_cross_section(cross_section) min_bend_radius = min_bend_radius or xs.radius bend = gf.get_component( bend, radius=min_bend_radius / 2, angle=180, cross_section=cross_section ) bend1 = component.add_ref(bend).mirror() bend2 = component.add_ref(bend) bend2.connect("o2", bend1.ports["o1"]) path = spiral_archimedean( min_bend_radius=min_bend_radius, separation=separation, number_of_loops=number_of_loops, npoints=npoints, ) path.start_angle = 0 path.end_angle = 0 spiral = path.extrude(cross_section=cross_section) spiral1 = component.add_ref(spiral).connect("o1", bend1.ports["o2"]) spiral2 = component.add_ref(spiral).connect("o1", bend2.ports["o1"]) component.add_port("o1", port=spiral1.ports["o2"]) component.add_port("o2", port=spiral2.ports["o2"]) component.info["length"] = float(path.length() + bend.info["length"]) * 2 return component
if __name__ == "__main__": c = spiral_double( min_bend_radius=10, separation=2, number_of_loops=3, npoints=1000, cross_section="xs_sc", ) print(c.ports["o1"].orientation) print(c.ports["o2"].orientation) c.show(show_ports=True)