wg.py

The file mainly defines various waveguide types and their corresponding configurations such as width, simulation parameters.

waveguide configuration

In gpdk, three types of waveguides are defined, which are FWG, MWG, and SWG.

Each waveguide type will then create different band type based on the chosen band ( C-band, O-band ), and beyond each band type, 4 other types depends on the waveguide linewidth are generated ( WIRE, WIRE_TETM, EXPANDED, EXPANDED_TETM ).

O-band can be adjusted by O_BAND_RATIO = 0.8, TETM and EXPANDED can also be adjusted by WIRE_TETM_RATIO and EXPANDED_TETM_RATIO, so that the users don’t need to define every function.

First, we define the width of every waveguides that will be consider as a parameter and be send to each waveguide class.

FWG_C_WIRE_WIDTH = 0.45
FWG_C_EXPANDED_WIDTH = 0.8
FWG_C_TRENCH_WIDTH = 2.0

MWG_C_WIRE_WIDTH = 1
MWG_C_EXPANDED_WIDTH = 1.5
MWG_C_TRENCH_WIDTH = 5.0

SWG_C_WIRE_WIDTH = 1.0
SWG_C_EXPANDED_WIDTH = 1.5
SWG_C_TRENCH_WIDTH = 5.0

WIRE_TETM_RATIO = 1.2
EXPANDED_TETM_RATIO = 2.0

O_BAND_RATIO = 0.8

Define parameters in each waveguide types

The information of each waveguide type are then defined in each waveguide class, such as critical dimension bias, layer information.

The structure of each waveguide is build in technology > interfaces > wg.py, we can create a waveguide class (FWG_C) that inherits from the waveguide interface CoreCladdingWaveguideType which defines the structure of the waveguide type with one core layer and one cladding layer, including the profile, waveguide width, etc.

Since there could be many waveguide types (FWG_C, FWG_O, MWG_C, etc.) using the same waveguide interface (CoreCladdingWaveguideType), we then assign different parameters(CD bias, band, core/cladding layer) to those waveguide types in each class.

@fpt.hash_code
class FWG_C(CoreCladdingWaveguideType):
    @fpt.const_property
    def core_bias(self):
        return fpt.CDBiasLinear(0.1)

    @fpt.const_property
    def cladding_bias(self):
        return fpt.CDBiasLinear(0)

    @fpt.const_property
    def band(self):
        from gpdk.technology import get_technology

        return get_technology().BAND.C

    @fpt.const_property
    def core_layer(self):
        from gpdk.technology import get_technology

        return get_technology().LAYER.FWG_COR

    @fpt.const_property
    def cladding_layer(self):
        from gpdk.technology import get_technology

        return get_technology().LAYER.FWG_CLD

    @fpt.const_property
    def straight_factory(self):
        return StraightFactory()


@fpt.hash_code
class FWG_O(CoreCladdingWaveguideType):



@fpt.hash_code
class MWG_C(CoreCladdingWaveguideType):

Generate waveguide class

In this section, we used the class generated above as a parent class to create every waveguide class which parameters are defined in the above section. The bend factories of each specific waveguide are also defined in this section.

class WG:
    class FWG:
        class C(FWG_C):
            @fpt.staticconst
            def WIRE():
                class WIRE(__class__):
                    core_design_width: float = FWG_C_WIRE_WIDTH
                    cladding_design_width: float = FWG_C_WIRE_WIDTH + FWG_C_TRENCH_WIDTH * 2

                    @fpt.const_property
                    def bend_factory(self):
                        return self.BEND_EULER


                    @fpt.const_property
                    def BEND_CIRCULAR(self):
                        return CircularBendFactory(radius_eff=self.cladding_width / 2 + 1, waveguide_type=self)

                    @fpt.const_property
                    def BEND_EULER(self):
                        return EulerBendFactory(radius_min=self.cladding_width / 2 + 1, l_max=5, waveguide_type=self)

                return WIRE()

            @fpt.staticconst
            def WIRE_TETM():

                return WIRE_TETM()

            @fpt.staticconst
            def EXPANDED():

                return EXPANDED()

            @fpt.staticconst
            def EXPANDED_TETM():

                return EXPANDED_TETM()

        class O(FWG_O):

    class MWG:
        class C(MWG_C):

        class O(MWG_O):

Generate wg information to csv file

The above information of each waveguides will be export to a csv file, which stored under generated file. This allows users to check the information of each waveguide, including waveguide width, radius of each bend waveguide, and the port names.

if __name__ == "__main__":
    from pathlib import Path
    from fnpcell import all as fp
    from gpdk.technology import get_technology

    TECH = get_technology()
    folder = Path(__file__).parent
    generated_folder = folder / "generated"
    csv_file = generated_folder / "wg.csv"
    # ================================

    fp.util.generate_csv_from_waveguides(csv_file=csv_file, waveguides=TECH.WG, overwrite=True)

The final generated csv

NAME

CONFIGURATION

FWG.C.WIRE

core_layout_width=0.55, cladding_layout_width=4.45, core_design_width=0.45, cladding_design_width=4.45, port_names=(‘op_0’, ‘op_1’)

FWG.C.WIRE.BEND_CIRCULAR

radius_eff=3.225

FWG.C.WIRE.BEND_EULER

radius_min=3.225, l_max=5

FWG.C.EXPANDED

core_layout_width=0.9, cladding_layout_width=4.8, core_design_width=0.8, cladding_design_width=4.8, port_names=(‘op_0’, ‘op_1’)

FWG.C.EXPANDED.BEND_CIRCULAR

radius_eff=3.4

FWG.C.EXPANDED.BEND_EULER

radius_min=3.4, l_max=10

FWG.C.EXPANDED_TETM

core_layout_width=1.7000000000000002, cladding_layout_width=5.6, core_design_width=1.6, cladding_design_width=5.6, port_names=(‘op_0’, ‘op_1’)

FWG.C.EXPANDED_TETM.BEND_CIRCULAR

radius_eff=3.8

FWG.C.EXPANDED_TETM.BEND_EULER

radius_min=3.8, l_max=10

FWG.C.WIRE_TETM

core_layout_width=0.64, cladding_layout_width=4.54, core_design_width=0.54, cladding_design_width=4.54, port_names=(‘op_0’, ‘op_1’)

FWG.C.WIRE_TETM.BEND_CIRCULAR

radius_eff=10

FWG.C.WIRE_TETM.BEND_EULER

radius_min=3.27, l_max=5

FWG.O.WIRE

core_layout_width=0.4600000000000001, cladding_layout_width=3.5600000000000005, core_design_width=0.36000000000000004, cladding_design_width=3.5600000000000005, port_names=(‘op_0’, ‘op_1’)

FWG.O.EXPANDED

core_layout_width=0.7400000000000001, cladding_layout_width=3.84, core_design_width=0.6400000000000001, cladding_design_width=3.84, port_names=(‘op_0’, ‘op_1’)

FWG.O.EXPANDED_TETM

core_layout_width=1.3800000000000003, cladding_layout_width=4.4799999999999995, core_design_width=1.2800000000000002, cladding_design_width=4.4799999999999995, port_names=(‘op_0’, ‘op_1’)

FWG.O.WIRE_TETM

core_layout_width=0.532, cladding_layout_width=3.632, core_design_width=0.43200000000000005, cladding_design_width=3.632, port_names=(‘op_0’, ‘op_1’)

MWG.C.WIRE

core_layout_width=1.15, cladding_layout_width=11.0, core_design_width=1, cladding_design_width=11.0, port_names=(‘op_0’, ‘op_1’)

MWG.C.WIRE.BEND_CIRCULAR

radius_eff=6.5

MWG.C.WIRE.BEND_EULER

radius_min=6.5, l_max=15

MWG.C.EXPANDED

core_layout_width=1.65, cladding_layout_width=11.5, core_design_width=1.5, cladding_design_width=11.5, port_names=(‘op_0’, ‘op_1’)

MWG.C.EXPANDED.BEND_CIRCULAR

radius_eff=6.75

MWG.C.EXPANDED.BEND_EULER

radius_min=6.75, l_max=25

MWG.C.EXPANDED_TETM

core_layout_width=3.15, cladding_layout_width=13.0, core_design_width=3.0, cladding_design_width=13.0, port_names=(‘op_0’, ‘op_1’)

MWG.C.EXPANDED_TETM.BEND_CIRCULAR

radius_eff=7.5

MWG.C.EXPANDED_TETM.BEND_EULER

radius_min=7.5, l_max=25

MWG.C.WIRE_TETM

core_layout_width=1.3499999999999999, cladding_layout_width=11.2, core_design_width=1.2, cladding_design_width=11.2, port_names=(‘op_0’, ‘op_1’)

MWG.C.WIRE_TETM.BEND_CIRCULAR

radius_eff=6.6

MWG.C.WIRE_TETM.BEND_EULER

radius_min=6.6, l_max=15

MWG.O.WIRE

core_layout_width=0.9500000000000001, cladding_layout_width=8.8, core_design_width=0.8, cladding_design_width=8.8, port_names=(‘op_0’, ‘op_1’)

MWG.O.EXPANDED

core_layout_width=1.35, cladding_layout_width=9.200000000000001, core_design_width=1.2000000000000002, cladding_design_width=9.200000000000001, port_names=(‘op_0’, ‘op_1’)

MWG.O.EXPANDED_TETM

core_layout_width=2.5500000000000003, cladding_layout_width=10.4, core_design_width=2.4000000000000004, cladding_design_width=10.4, port_names=(‘op_0’, ‘op_1’)

MWG.O.WIRE_TETM

core_layout_width=1.1099999999999999, cladding_layout_width=8.959999999999999, core_design_width=0.96, cladding_design_width=8.959999999999999, port_names=(‘op_0’, ‘op_1’)

SLOT.C.WIRE

core_layout_width=1.15, slot_layout_width=0.3, cladding_layout_width=11.0, core_design_width=1.0, slot_design_width=0.3, cladding_design_width=11.0, port_names=(‘op_0’, ‘op_1’)

SLOT.O.WIRE

core_layout_width=0.9500000000000001, slot_layout_width=0.24, cladding_layout_width=8.8, core_design_width=0.8, slot_design_width=0.24, cladding_design_width=8.8, port_names=(‘op_0’, ‘op_1’)

SWG.C.WIRE

core_layout_width=1.15, cladding_layout_width=11.0, core_design_width=1.0, cladding_design_width=11.0, port_names=(‘op_0’, ‘op_1’)

SWG.C.WIRE.BEND_CIRCULAR

radius_eff=6.5

SWG.C.WIRE.BEND_EULER

radius_min=6.5, l_max=15

SWG.C.EXPANDED

core_layout_width=3.15, cladding_layout_width=13.0, core_design_width=3.0, cladding_design_width=13.0, port_names=(‘op_0’, ‘op_1’)

SWG.C.EXPANDED.BEND_CIRCULAR

radius_eff=7.5

SWG.C.EXPANDED.BEND_EULER

radius_min=7.5, l_max=25

SWG.C.EXPANDED_TETM

core_layout_width=3.15, cladding_layout_width=13.0, core_design_width=3.0, cladding_design_width=13.0, port_names=(‘op_0’, ‘op_1’)

SWG.C.EXPANDED_TETM.BEND_CIRCULAR

radius_eff=7.5

SWG.C.EXPANDED_TETM.BEND_EULER

radius_min=7.5, l_max=25

SWG.C.WIRE_TETM

core_layout_width=1.3499999999999999, cladding_layout_width=11.2, core_design_width=1.2, cladding_design_width=11.2, port_names=(‘op_0’, ‘op_1’)

SWG.C.WIRE_TETM.BEND_CIRCULAR

radius_eff=6.6

SWG.C.WIRE_TETM.BEND_EULER

radius_min=6.6, l_max=15

SWG.O.WIRE

core_layout_width=0.9500000000000001, cladding_layout_width=8.8, core_design_width=0.8, cladding_design_width=8.8, port_names=(‘op_0’, ‘op_1’)

SWG.O.EXPANDED

core_layout_width=1.35, cladding_layout_width=9.200000000000001, core_design_width=1.2000000000000002, cladding_design_width=9.200000000000001, port_names=(‘op_0’, ‘op_1’)

SWG.O.EXPANDED_TETM

core_layout_width=2.5500000000000003, cladding_layout_width=10.4, core_design_width=2.4000000000000004, cladding_design_width=10.4, port_names=(‘op_0’, ‘op_1’)

SWG.O.WIRE_TETM

core_layout_width=1.1099999999999999, cladding_layout_width=8.959999999999999, core_design_width=0.96, cladding_design_width=8.959999999999999, port_names=(‘op_0’, ‘op_1’)

SWGR.C.WIRE

core_layout_width=1.15, cladding_layout_width=11.0, core_design_width=1.0, cladding_design_width=11.0, port_names=(‘op_0’, ‘op_1’), period=1.0, duty_cycle=0.5

SWGR.O.WIRE

core_layout_width=0.9500000000000001, cladding_layout_width=8.8, core_design_width=0.8, cladding_design_width=8.8, port_names=(‘op_0’, ‘op_1’), period=1.0, duty_cycle=0.5