Source code for gdsfactory.components.straight_pin_slot
"""Straight Doped PIN waveguide."""
from __future__ import annotations
from functools import partial
import gdsfactory as gf
from gdsfactory.component import Component
from gdsfactory.components.taper import taper_strip_to_ridge
from gdsfactory.components.via_stack import via_stack_m1_m3
from gdsfactory.components.via_stack_slot import via_stack_slot_slab_m1
from gdsfactory.cross_section import pin, pn
from gdsfactory.typings import ComponentSpec, CrossSectionSpec
[docs]
@gf.cell
def straight_pin_slot(
length: float = 500.0,
cross_section: CrossSectionSpec = pin,
via_stack: ComponentSpec | None = via_stack_m1_m3,
via_stack_width: float = 10.0,
via_stack_slab: ComponentSpec | None = via_stack_slot_slab_m1,
via_stack_slab_top: ComponentSpec | None = None,
via_stack_slab_bot: ComponentSpec | None = None,
via_stack_slab_width: float | None = None,
via_stack_spacing: float = 3.0,
via_stack_slab_spacing: float = 2.0,
taper: ComponentSpec | None = taper_strip_to_ridge,
**kwargs,
) -> Component:
"""Returns a PIN straight waveguide with slotted via.
https://doi.org/10.1364/OE.26.029983
500um length for PI phase shift
https://ieeexplore.ieee.org/document/8268112
to go beyond 2PI, you will need at least 1mm
https://ieeexplore.ieee.org/document/8853396/
Args:
length: of the waveguide.
cross_section: for the waveguide.
via_stack: for via_stacking the metal.
via_stack_width: in um.
via_stack_slab: function for the component via_stacking the slab.
via_stack_slab_top: Optional, defaults to via_stack_slab.
via_stack_slab_bot: Optional, defaults to via_stack_slab.
via_stack_slab_width: defaults to via_stack_width.
via_stack_spacing: spacing between via_stacks.
via_stack_slab_spacing: spacing between via_stacks slabs.
taper: optional taper.
horizontal_via_stack: if True, the waveguide is horizontal.
kwargs: straight settings.
"""
c = Component()
if taper:
taper = gf.get_component(taper)
length -= 2 * taper.get_ports_xsize()
wg = c << gf.components.straight(
cross_section=cross_section,
length=length,
**kwargs,
)
via_stack_slab_width = via_stack_slab_width or via_stack_width
via_stack_slab_spacing = via_stack_slab_spacing or via_stack_spacing
if taper:
t1 = c << taper
t2 = c << taper
t1.connect("o2", wg.ports["o1"])
t2.connect("o2", wg.ports["o2"])
c.add_port("o1", port=t1.ports["o1"])
c.add_port("o2", port=t2.ports["o1"])
else:
c.add_ports(wg.get_ports_list())
via_stack_length = length
if via_stack:
via_stack_top = c << via_stack(
size=(via_stack_length, via_stack_width),
)
via_stack_bot = c << via_stack(
size=(via_stack_length, via_stack_width),
)
via_stack_bot.x = wg.x
via_stack_top.x = wg.x
via_stack_top.ymin = +via_stack_spacing / 2
via_stack_bot.ymax = -via_stack_spacing / 2
c.add_ports(via_stack_bot.ports, prefix="bot_")
c.add_ports(via_stack_top.ports, prefix="top_")
via_stack_slab_top = via_stack_slab_top or via_stack_slab
via_stack_slab_bot = via_stack_slab_bot or via_stack_slab
if via_stack_slab_top:
slot_top = c << via_stack_slab_top(
size=(via_stack_length, via_stack_slab_width),
)
slot_top.x = wg.x
slot_top.ymin = +via_stack_slab_spacing / 2
if via_stack_slab_bot:
slot_bot = c << via_stack_slab_bot(
size=(via_stack_length, via_stack_slab_width),
)
slot_bot.x = wg.x
slot_bot.ymax = -via_stack_slab_spacing / 2
return c
straight_pn_slot = partial(straight_pin_slot, cross_section=pn)
if __name__ == "__main__":
c = straight_pin_slot(via_stack_width=4, via_stack_slab_width=3, length=50)
c.show(show_ports=True)