def coupler_straight( length: float = 10.0, width: float = 0.5, gap: float = 0.27, layer: Tuple[int, int] = pp.LAYER.WG, layers_cladding: List[Tuple[int, int]] = [pp.LAYER.WGCLAD], cladding_offset: float = 3.0, ) -> Component: """ straight coupled waveguides. Two multimode ports .. plot:: :include-source: import pp c = pp.c.coupler_straight() pp.plotgds(c) """ c = Component() # Top path c.add_polygon([(0, 0), (length, 0), (length, width), (0, width)], layer=layer) y = width + gap # Bottom path c.add_polygon([(0, y), (length, y), (length, width + y), (0, width + y)], layer=layer) # One multimode port on each side port_w = width * 2 + gap c.add_port(name="W0", midpoint=[0, port_w / 2], width=port_w, orientation=180) c.add_port(name="E0", midpoint=[length, port_w / 2], width=port_w, orientation=0) c.width = width c.length = length # cladding ymax = 2 * width + gap + cladding_offset for layer_cladding in layers_cladding: c.add_polygon( [ (0, -cladding_offset), (length, -cladding_offset), (length, ymax), (0, ymax), ], layer=layer_cladding, ) return c
def waveguide( length: float = 10.0, width: float = 0.5, layer: Tuple[int, int] = pp.LAYER.WG, layers_cladding: Optional[Iterable[Tuple[int, int]]] = None, cladding_offset: float = pp.conf.tech.cladding_offset, ) -> Component: """Straight waveguide Args: length: in X direction width: in Y direction layer layers_cladding cladding_offset .. plot:: :include-source: import pp c = pp.c.waveguide(length=10, width=0.5) pp.plotgds(c) """ c = Component() w = width / 2 c.add_polygon([(0, -w), (length, -w), (length, w), (0, w)], layer=layer) wc = w + cladding_offset if layers_cladding: for layer_cladding in layers_cladding: c.add_polygon([(0, -wc), (length, -wc), (length, wc), (0, wc)], layer=layer_cladding) c.add_port(name="W0", midpoint=[0, 0], width=width, orientation=180, layer=layer) c.add_port(name="E0", midpoint=[length, 0], width=width, orientation=0, layer=layer) c.width = width c.length = length return c