auto_transition_py

该脚本主要定义了端口连接时的波导类型与默认弯曲波导:

from typing import Tuple, cast
from fnpcell.pdk.technology import all as fpt
from .interfaces import CoreCladdingWaveguideType
from .wg import WG

def _c_fwg2mwg(end_types: Tuple[fpt.IWaveguideType, fpt.IWaveguideType]):
    from ..components.transition.fwg2mwg_transition import FWG2MWGTransition

    a = end_types[0]
    b = end_types[1]
    assert isinstance(a, WG.FWG.C)
    assert isinstance(b, WG.MWG.C)

    return FWG2MWGTransition(name="auto", length=20, fwg_type=a, mwg_type=b), ("op_0", "op_1")


def _c_fwg2swg(end_types: Tuple[fpt.IWaveguideType, fpt.IWaveguideType]):
    from ..components.transition.fwg2swg_transition import FWG2SWGTransition

    a = end_types[0]
    b = end_types[1]
    assert isinstance(a, WG.FWG.C)
    assert isinstance(b, WG.SWG.C)

    return FWG2SWGTransition(name="auto", length=20, fwg_type=a, swg_type=b), ("op_0", "op_1")


def _c_swg2mwg(end_types: Tuple[fpt.IWaveguideType, fpt.IWaveguideType]):
    from ..components.transition.swg2mwg_transition import SWG2MWGTransition

    a = end_types[0]
    b = end_types[1]
    assert isinstance(a, WG.SWG.C)
    assert isinstance(b, WG.MWG.C)

    return SWG2MWGTransition(name="auto", swg_length=10, mwg_length=10, swg_type=a, mwg_type=b), ("op_0", "op_1")


class _Taper:
    def __init__(self, slope: float) -> None:
        self.slope = slope

    def __call__(self, end_types: Tuple[fpt.IWaveguideType, fpt.IWaveguideType]):
        from ..components.taper.taper_linear import TaperLinear

        a = cast(CoreCladdingWaveguideType, end_types[0])
        b = cast(CoreCladdingWaveguideType, end_types[1])
        k = self.slope
        length = max(0.01, abs(a.core_width - b.core_width) / k)
        return TaperLinear(name="auto", length=length, left_type=a, right_type=b), ("op_0", "op_1")


class AUTO_TRANSITION:
    @fpt.classconst
    @classmethod
    def DEFAULT(cls):
        return fpt.AutoTransition().updated(
            [
                (WG.FWG.C >> WG.MWG.C, _c_fwg2mwg),
                (WG.FWG.C >> WG.SWG.C, _c_fwg2swg),
                (WG.SWG.C >> WG.MWG.C, _c_swg2mwg),
                #
                (WG.FWG.C >> WG.FWG.C, _Taper(0.2)),
                (WG.SWG.C >> WG.SWG.C, _Taper(0.2)),
                (WG.MWG.C >> WG.MWG.C, _Taper(0.2)),
            ]
        )