.. _wg.py : 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 | +-----------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+