Source code for gvtt.components.mmi1x2

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

from gvtt.tech import TECH


[docs] @gf.cell def mmi1x2( width: float = TECH.width_strip, width_taper: float = TECH.width_strip, length_taper: float = 1.0, length_mmi: float = 43.25, width_mmi: float = 6.25, gap_mmi=(6.25 - 2 * TECH.width_strip) / 2, taper: ComponentSpec = taper_function, straight: ComponentSpec = straight_function, cross_section: CrossSectionSpec = "xs_sc", ) -> Component: r"""1x2 MultiMode Interferometer (MMI). Args: width: input and output straight width. Defaults to cross_section width. width_taper: interface between input straights and mmi region. length_taper: into the mmi region. length_mmi: in x direction. width_mmi: in y direction. gap_mmi: gap between tapered wg. taper: taper function. straight: straight function. cross_section: specification (CrossSection, string or dict). .. code:: length_mmi <------> ________ | | | \__ | __ o2 __/ /_ _ _ _ o1 __ | _ _ _ _| gap_mmi \ \__ | __ o3 | / |________| <-> length_taper """ c = Component() gap_mmi = gf.snap.snap_to_grid(gap_mmi, grid_factor=2) x = gf.get_cross_section(cross_section) xs_mmi = gf.get_cross_section(cross_section, width=width_mmi) width = width or x.width _taper = gf.get_component( taper, length=length_taper, width1=width, width2=width_taper, cross_section=cross_section, ) a = gap_mmi / 2 + width_taper / 2 _ = c << gf.get_component(straight, length=length_mmi, cross_section=xs_mmi) ports = [ gf.Port( "o1", orientation=180, center=(0, 0), width=width_taper, layer=x.layer, cross_section=x, ), gf.Port( "o2", orientation=0, center=(+length_mmi, +a), width=width_taper, layer=x.layer, cross_section=x, ), gf.Port( "o3", orientation=0, center=(+length_mmi, -a), width=width_taper, layer=x.layer, cross_section=x, ), ] for port in ports: taper_ref = c << _taper taper_ref.connect(port="o2", other=port, allow_width_mismatch=True) c.add_port(name=port.name, port=taper_ref.ports["o1"]) c.flatten() return c
if __name__ == "__main__": c = mmi1x2() c.show()