Source code for qpdk.cells.waveguides

"""Primitives."""

import gdsfactory as gf
from gdsfactory.cross_section import port_names_electrical, port_types_electrical
from gdsfactory.typings import CrossSectionSpec, Ints, LayerSpec, Size


[docs] @gf.cell def rectangle( size: Size = (4.0, 2.0), layer: LayerSpec = "M1_DRAW", centered: bool = False, port_type: str | None = "electrical", port_orientations: Ints | None = (180, 90, 0, -90), ) -> gf.Component: """Returns a rectangle. Args: size: (tuple) Width and height of rectangle. layer: Specific layer to put polygon geometry on. centered: True sets center to (0, 0), False sets south-west to (0, 0). port_type: optical, electrical. port_orientations: list of port_orientations to add. None adds no ports. """ c = gf.Component() ref = c << gf.c.compass( size=size, layer=layer, port_type=port_type, port_orientations=port_orientations ) if not centered: ref.move((size[0] / 2, size[1] / 2)) if port_type: c.add_ports(ref.ports) c.flatten() return c
[docs] @gf.cell def straight( length: float = 10, cross_section: CrossSectionSpec = "strip", width: float | None = None, npoints: int = 2, ) -> gf.Component: """Returns a Straight waveguide. Args: length: straight length (um). cross_section: specification (CrossSection, string or dict). width: width of the waveguide. If None, it will use the width of the cross_section. npoints: number of points. """ return gf.c.straight( length=length, cross_section=cross_section, width=width, npoints=npoints )
[docs] @gf.cell def bend_euler( radius: float | None = None, angle: float = 90, p: float = 0.5, width: float | None = None, cross_section: CrossSectionSpec = "strip", allow_min_radius_violation: bool = False, ) -> gf.Component: """Regular degree euler bend. Args: radius: in um. Defaults to cross_section_radius. angle: total angle of the curve. p: Proportion of the curve that is an Euler curve. width: width to use. Defaults to cross_section.width. cross_section: specification (CrossSection, string, CrossSectionFactory dict). allow_min_radius_violation: if True allows radius to be smaller than cross_section radius. """ return gf.c.bend_euler( radius=radius, angle=angle, p=p, width=width, cross_section=cross_section, allow_min_radius_violation=allow_min_radius_violation, with_arc_floorplan=True, npoints=None, layer=None, )
[docs] @gf.cell def bend_s( size: Size = (11, 1.8), cross_section: CrossSectionSpec = "strip", width: float | None = None, allow_min_radius_violation: bool = False, ) -> gf.Component: """Return S bend with bezier curve. stores min_bend_radius property in self.info['min_bend_radius'] min_bend_radius depends on height and length Args: size: in x and y direction. cross_section: spec. width: width of the waveguide. If None, it will use the width of the cross_section. allow_min_radius_violation: allows min radius violations. """ return gf.c.bend_s( size=size, cross_section=cross_section, npoints=99, allow_min_radius_violation=allow_min_radius_violation, width=width, )
[docs] @gf.cell def wire_corner( cross_section: CrossSectionSpec = "metal_routing", width: float | None = None ) -> gf.Component: """Returns 45 degrees electrical corner wire. Args: cross_section: spec. width: optional width. Defaults to cross_section width. """ return gf.c.wire_corner( cross_section=cross_section, width=width, port_names=port_names_electrical, port_types=port_types_electrical, radius=None, )
[docs] @gf.cell def wire_corner45( cross_section: CrossSectionSpec = "metal_routing", radius: float = 10, width: float | None = None, layer: LayerSpec | None = None, with_corner90_ports: bool = True, ) -> gf.Component: """Returns 90 degrees electrical corner wire. Args: cross_section: spec. radius: ignored. width: optional width. Defaults to cross_section width. layer: ignored. with_corner90_ports: if True, adds ports at 90 degrees. """ return gf.c.wire_corner45( cross_section=cross_section, radius=radius, width=width, layer=layer, with_corner90_ports=with_corner90_ports, )
if __name__ == "__main__": from qpdk import PDK PDK.activate() c = bend_s() c.pprint_ports() c.show()