From 8852cae940ca71a2aa9339d217c6c613df07b489 Mon Sep 17 00:00:00 2001 From: Joaquin Matres <4514346+joamatab@users.noreply.github.com> Date: Tue, 30 Apr 2024 08:57:55 -0700 Subject: [PATCH 1/6] make CORNERSTONE package support all the different pdks --- cspdk/{ => si220}/__init__.py | 10 +++++----- cspdk/{ => si220}/cells.py | 4 ++-- cspdk/{ => si220}/config.py | 2 +- .../CORNERSTONE MPW SOI 220nm GDSII Template.gds | Bin cspdk/{ => si220}/gds/Cell0_Institution_Name.gds | Bin .../Cell0_SOI220_Full_1550nm_Packaging_Template.gds | Bin .../gds/Cell0_SOI_Full_Institution_Name.gds | Bin .../gds/Cell0_SOI_Half_Institution_Name.gds | Bin cspdk/{ => si220}/gds/Flip_Chip_Bonding_Example.gds | Bin cspdk/{ => si220}/gds/Heater.gds | Bin cspdk/{ => si220}/gds/Layer_Designations.gds | Bin .../gds/SOI220nm_1310nm_TE_RIB_2x1_MMI.gds | Bin .../gds/SOI220nm_1310nm_TE_RIB_2x2_MMI.gds | Bin .../gds/SOI220nm_1310nm_TE_RIB_90_Degree_Bend.gds | Bin .../gds/SOI220nm_1310nm_TE_RIB_Grating_Coupler.gds | Bin .../gds/SOI220nm_1310nm_TE_RIB_Waveguide.gds | Bin .../SOI220nm_1310nm_TE_RIB_Waveguide_Crossing.gds | Bin .../gds/SOI220nm_1310nm_TE_STRIP_2x1_MMI.gds | Bin .../gds/SOI220nm_1310nm_TE_STRIP_2x2_MMI.gds | Bin .../gds/SOI220nm_1310nm_TE_STRIP_90_Degree_Bend.gds | Bin .../SOI220nm_1310nm_TE_STRIP_Grating_Coupler.gds | Bin .../gds/SOI220nm_1310nm_TE_STRIP_Waveguide.gds | Bin .../SOI220nm_1310nm_TE_STRIP_Waveguide_Crossing.gds | Bin .../gds/SOI220nm_1550nm_TE_RIB_2x1_MMI.gds | Bin .../gds/SOI220nm_1550nm_TE_RIB_2x2_MMI.gds | Bin .../gds/SOI220nm_1550nm_TE_RIB_90_Degree_Bend.gds | Bin .../gds/SOI220nm_1550nm_TE_RIB_Grating_Coupler.gds | Bin .../gds/SOI220nm_1550nm_TE_RIB_Waveguide.gds | Bin .../SOI220nm_1550nm_TE_RIB_Waveguide_Crossing.gds | Bin .../gds/SOI220nm_1550nm_TE_STRIP_2x1_MMI.gds | Bin .../gds/SOI220nm_1550nm_TE_STRIP_2x2_MMI.gds | Bin .../gds/SOI220nm_1550nm_TE_STRIP_90_Degree_Bend.gds | Bin .../gds/SOI220nm_1550nm_TE_STRIP_Waveguide.gds | Bin .../SOI220nm_1550nm_TE_STRIP_Waveguide_Crossing.gds | Bin .../gds/SiN300nm_1310nm_TE_STRIP_2x1_MMI.gds | Bin .../gds/SiN300nm_1310nm_TE_STRIP_2x2_MMI.gds | Bin .../gds/SiN300nm_1310nm_TE_STRIP_90_Degr.gds | Bin .../gds/SiN300nm_1310nm_TE_STRIP_Grating.gds | Bin .../gds/SiN300nm_1310nm_TE_STRIP_Wavegui.gds | Bin .../gds/SiN300nm_1550nm_TE_STRIP_2x1_MMI.gds | Bin .../gds/SiN300nm_1550nm_TE_STRIP_2x2_MMI.gds | Bin .../gds/SiN300nm_1550nm_TE_STRIP_90_Degr.gds | Bin .../gds/SiN300nm_1550nm_TE_STRIP_Grating.gds | Bin .../gds/SiN300nm_1550nm_TE_STRIP_Wavegui.gds | Bin cspdk/{ => si220}/import_pdk.py | 0 cspdk/{ => si220}/klayout/d25/Cornerstone.lyd25 | 0 cspdk/{ => si220}/klayout/layers.lyp | 0 cspdk/{ => si220}/klayout/tech.lyt | 0 cspdk/{ => si220}/layers.yaml | 0 cspdk/{ => si220}/models.py | 0 cspdk/{ => si220}/samples/circuit_simulations.py | 2 +- .../samples/circuit_simulations_with_routing.py | 9 ++++----- cspdk/{ => si220}/samples/component_from_yaml.py | 2 +- cspdk/{ => si220}/samples/get_route.py | 8 ++++---- cspdk/{ => si220}/samples/mode_solver_n.py | 0 cspdk/{ => si220}/samples/mode_solver_r.py | 0 cspdk/{ => si220}/samples/mode_solver_s.py | 0 cspdk/{ => si220}/tech.py | 2 +- install_tech.py | 2 +- 59 files changed, 20 insertions(+), 21 deletions(-) rename cspdk/{ => si220}/__init__.py (73%) rename cspdk/{ => si220}/cells.py (99%) rename cspdk/{ => si220}/config.py (94%) rename cspdk/{ => si220}/gds/CORNERSTONE MPW SOI 220nm GDSII Template.gds (100%) rename cspdk/{ => si220}/gds/Cell0_Institution_Name.gds (100%) rename cspdk/{ => si220}/gds/Cell0_SOI220_Full_1550nm_Packaging_Template.gds (100%) rename cspdk/{ => si220}/gds/Cell0_SOI_Full_Institution_Name.gds (100%) rename cspdk/{ => si220}/gds/Cell0_SOI_Half_Institution_Name.gds (100%) rename cspdk/{ => si220}/gds/Flip_Chip_Bonding_Example.gds (100%) rename cspdk/{ => si220}/gds/Heater.gds (100%) rename cspdk/{ => si220}/gds/Layer_Designations.gds (100%) rename cspdk/{ => si220}/gds/SOI220nm_1310nm_TE_RIB_2x1_MMI.gds (100%) rename cspdk/{ => si220}/gds/SOI220nm_1310nm_TE_RIB_2x2_MMI.gds (100%) rename cspdk/{ => si220}/gds/SOI220nm_1310nm_TE_RIB_90_Degree_Bend.gds (100%) rename cspdk/{ => si220}/gds/SOI220nm_1310nm_TE_RIB_Grating_Coupler.gds (100%) rename cspdk/{ => si220}/gds/SOI220nm_1310nm_TE_RIB_Waveguide.gds (100%) rename cspdk/{ => si220}/gds/SOI220nm_1310nm_TE_RIB_Waveguide_Crossing.gds (100%) rename cspdk/{ => si220}/gds/SOI220nm_1310nm_TE_STRIP_2x1_MMI.gds (100%) rename cspdk/{ => si220}/gds/SOI220nm_1310nm_TE_STRIP_2x2_MMI.gds (100%) rename cspdk/{ => si220}/gds/SOI220nm_1310nm_TE_STRIP_90_Degree_Bend.gds (100%) rename cspdk/{ => si220}/gds/SOI220nm_1310nm_TE_STRIP_Grating_Coupler.gds (100%) rename cspdk/{ => si220}/gds/SOI220nm_1310nm_TE_STRIP_Waveguide.gds (100%) rename cspdk/{ => si220}/gds/SOI220nm_1310nm_TE_STRIP_Waveguide_Crossing.gds (100%) rename cspdk/{ => si220}/gds/SOI220nm_1550nm_TE_RIB_2x1_MMI.gds (100%) rename cspdk/{ => si220}/gds/SOI220nm_1550nm_TE_RIB_2x2_MMI.gds (100%) rename cspdk/{ => si220}/gds/SOI220nm_1550nm_TE_RIB_90_Degree_Bend.gds (100%) rename cspdk/{ => si220}/gds/SOI220nm_1550nm_TE_RIB_Grating_Coupler.gds (100%) rename cspdk/{ => si220}/gds/SOI220nm_1550nm_TE_RIB_Waveguide.gds (100%) rename cspdk/{ => si220}/gds/SOI220nm_1550nm_TE_RIB_Waveguide_Crossing.gds (100%) rename cspdk/{ => si220}/gds/SOI220nm_1550nm_TE_STRIP_2x1_MMI.gds (100%) rename cspdk/{ => si220}/gds/SOI220nm_1550nm_TE_STRIP_2x2_MMI.gds (100%) rename cspdk/{ => si220}/gds/SOI220nm_1550nm_TE_STRIP_90_Degree_Bend.gds (100%) rename cspdk/{ => si220}/gds/SOI220nm_1550nm_TE_STRIP_Waveguide.gds (100%) rename cspdk/{ => si220}/gds/SOI220nm_1550nm_TE_STRIP_Waveguide_Crossing.gds (100%) rename cspdk/{ => si220}/gds/SiN300nm_1310nm_TE_STRIP_2x1_MMI.gds (100%) rename cspdk/{ => si220}/gds/SiN300nm_1310nm_TE_STRIP_2x2_MMI.gds (100%) rename cspdk/{ => si220}/gds/SiN300nm_1310nm_TE_STRIP_90_Degr.gds (100%) rename cspdk/{ => si220}/gds/SiN300nm_1310nm_TE_STRIP_Grating.gds (100%) rename cspdk/{ => si220}/gds/SiN300nm_1310nm_TE_STRIP_Wavegui.gds (100%) rename cspdk/{ => si220}/gds/SiN300nm_1550nm_TE_STRIP_2x1_MMI.gds (100%) rename cspdk/{ => si220}/gds/SiN300nm_1550nm_TE_STRIP_2x2_MMI.gds (100%) rename cspdk/{ => si220}/gds/SiN300nm_1550nm_TE_STRIP_90_Degr.gds (100%) rename cspdk/{ => si220}/gds/SiN300nm_1550nm_TE_STRIP_Grating.gds (100%) rename cspdk/{ => si220}/gds/SiN300nm_1550nm_TE_STRIP_Wavegui.gds (100%) rename cspdk/{ => si220}/import_pdk.py (100%) rename cspdk/{ => si220}/klayout/d25/Cornerstone.lyd25 (100%) rename cspdk/{ => si220}/klayout/layers.lyp (100%) rename cspdk/{ => si220}/klayout/tech.lyt (100%) rename cspdk/{ => si220}/layers.yaml (100%) rename cspdk/{ => si220}/models.py (100%) rename cspdk/{ => si220}/samples/circuit_simulations.py (95%) rename cspdk/{ => si220}/samples/circuit_simulations_with_routing.py (77%) rename cspdk/{ => si220}/samples/component_from_yaml.py (97%) rename cspdk/{ => si220}/samples/get_route.py (67%) rename cspdk/{ => si220}/samples/mode_solver_n.py (100%) rename cspdk/{ => si220}/samples/mode_solver_r.py (100%) rename cspdk/{ => si220}/samples/mode_solver_s.py (100%) rename cspdk/{ => si220}/tech.py (99%) diff --git a/cspdk/__init__.py b/cspdk/si220/__init__.py similarity index 73% rename from cspdk/__init__.py rename to cspdk/si220/__init__.py index 4ee87eb..f6a468a 100644 --- a/cspdk/__init__.py +++ b/cspdk/si220/__init__.py @@ -2,11 +2,11 @@ from gdsfactory.get_factories import get_cells from gdsfactory.pdk import Pdk -from cspdk import cells, config, tech -from cspdk.cells import _bend, _straight, _taper -from cspdk.config import PATH -from cspdk.models import get_models -from cspdk.tech import LAYER, LAYER_STACK, LAYER_VIEWS, routing_strategies +from cspdk.si220 import cells, config, tech +from cspdk.si220.cells import _bend, _straight, _taper +from cspdk.si220.config import PATH +from cspdk.si220.models import get_models +from cspdk.si220.tech import LAYER, LAYER_STACK, LAYER_VIEWS, routing_strategies _models = get_models() _cells = get_cells(cells) diff --git a/cspdk/cells.py b/cspdk/si220/cells.py similarity index 99% rename from cspdk/cells.py rename to cspdk/si220/cells.py index 6f073fc..0ec2d81 100644 --- a/cspdk/cells.py +++ b/cspdk/si220/cells.py @@ -4,8 +4,8 @@ import gdsfactory as gf from gdsfactory.typings import ComponentSpec, CrossSectionSpec, LayerSpec -from cspdk.config import PATH -from cspdk.tech import LAYER, xs_nc, xs_no, xs_rc, xs_ro, xs_sc, xs_so +from cspdk.si220.config import PATH +from cspdk.si220.tech import LAYER, xs_nc, xs_no, xs_rc, xs_ro, xs_sc, xs_so ################ # Straights diff --git a/cspdk/config.py b/cspdk/si220/config.py similarity index 94% rename from cspdk/config.py rename to cspdk/si220/config.py index 0ef3f98..f3f88c7 100644 --- a/cspdk/config.py +++ b/cspdk/si220/config.py @@ -7,7 +7,7 @@ cwd = pathlib.Path.cwd() cwd_config = cwd / "config.yml" module = pathlib.Path(__file__).parent.absolute() -repo = module.parent +repo = module.parent.parent class Path: diff --git a/cspdk/gds/CORNERSTONE MPW SOI 220nm GDSII Template.gds b/cspdk/si220/gds/CORNERSTONE MPW SOI 220nm GDSII Template.gds similarity index 100% rename from cspdk/gds/CORNERSTONE MPW SOI 220nm GDSII Template.gds rename to cspdk/si220/gds/CORNERSTONE MPW SOI 220nm GDSII Template.gds diff --git a/cspdk/gds/Cell0_Institution_Name.gds b/cspdk/si220/gds/Cell0_Institution_Name.gds similarity index 100% rename from cspdk/gds/Cell0_Institution_Name.gds rename to cspdk/si220/gds/Cell0_Institution_Name.gds diff --git a/cspdk/gds/Cell0_SOI220_Full_1550nm_Packaging_Template.gds b/cspdk/si220/gds/Cell0_SOI220_Full_1550nm_Packaging_Template.gds similarity index 100% rename from cspdk/gds/Cell0_SOI220_Full_1550nm_Packaging_Template.gds rename to cspdk/si220/gds/Cell0_SOI220_Full_1550nm_Packaging_Template.gds diff --git a/cspdk/gds/Cell0_SOI_Full_Institution_Name.gds b/cspdk/si220/gds/Cell0_SOI_Full_Institution_Name.gds similarity index 100% rename from cspdk/gds/Cell0_SOI_Full_Institution_Name.gds rename to cspdk/si220/gds/Cell0_SOI_Full_Institution_Name.gds diff --git a/cspdk/gds/Cell0_SOI_Half_Institution_Name.gds b/cspdk/si220/gds/Cell0_SOI_Half_Institution_Name.gds similarity index 100% rename from cspdk/gds/Cell0_SOI_Half_Institution_Name.gds rename to cspdk/si220/gds/Cell0_SOI_Half_Institution_Name.gds diff --git a/cspdk/gds/Flip_Chip_Bonding_Example.gds b/cspdk/si220/gds/Flip_Chip_Bonding_Example.gds similarity index 100% rename from cspdk/gds/Flip_Chip_Bonding_Example.gds rename to cspdk/si220/gds/Flip_Chip_Bonding_Example.gds diff --git a/cspdk/gds/Heater.gds b/cspdk/si220/gds/Heater.gds similarity index 100% rename from cspdk/gds/Heater.gds rename to cspdk/si220/gds/Heater.gds diff --git a/cspdk/gds/Layer_Designations.gds b/cspdk/si220/gds/Layer_Designations.gds similarity index 100% rename from cspdk/gds/Layer_Designations.gds rename to cspdk/si220/gds/Layer_Designations.gds diff --git a/cspdk/gds/SOI220nm_1310nm_TE_RIB_2x1_MMI.gds b/cspdk/si220/gds/SOI220nm_1310nm_TE_RIB_2x1_MMI.gds similarity index 100% rename from cspdk/gds/SOI220nm_1310nm_TE_RIB_2x1_MMI.gds rename to cspdk/si220/gds/SOI220nm_1310nm_TE_RIB_2x1_MMI.gds diff --git a/cspdk/gds/SOI220nm_1310nm_TE_RIB_2x2_MMI.gds b/cspdk/si220/gds/SOI220nm_1310nm_TE_RIB_2x2_MMI.gds similarity index 100% rename from cspdk/gds/SOI220nm_1310nm_TE_RIB_2x2_MMI.gds rename to cspdk/si220/gds/SOI220nm_1310nm_TE_RIB_2x2_MMI.gds diff --git a/cspdk/gds/SOI220nm_1310nm_TE_RIB_90_Degree_Bend.gds b/cspdk/si220/gds/SOI220nm_1310nm_TE_RIB_90_Degree_Bend.gds similarity index 100% rename from cspdk/gds/SOI220nm_1310nm_TE_RIB_90_Degree_Bend.gds rename to cspdk/si220/gds/SOI220nm_1310nm_TE_RIB_90_Degree_Bend.gds diff --git a/cspdk/gds/SOI220nm_1310nm_TE_RIB_Grating_Coupler.gds b/cspdk/si220/gds/SOI220nm_1310nm_TE_RIB_Grating_Coupler.gds similarity index 100% rename from cspdk/gds/SOI220nm_1310nm_TE_RIB_Grating_Coupler.gds rename to cspdk/si220/gds/SOI220nm_1310nm_TE_RIB_Grating_Coupler.gds diff --git a/cspdk/gds/SOI220nm_1310nm_TE_RIB_Waveguide.gds b/cspdk/si220/gds/SOI220nm_1310nm_TE_RIB_Waveguide.gds similarity index 100% rename from cspdk/gds/SOI220nm_1310nm_TE_RIB_Waveguide.gds rename to cspdk/si220/gds/SOI220nm_1310nm_TE_RIB_Waveguide.gds diff --git a/cspdk/gds/SOI220nm_1310nm_TE_RIB_Waveguide_Crossing.gds b/cspdk/si220/gds/SOI220nm_1310nm_TE_RIB_Waveguide_Crossing.gds similarity index 100% rename from cspdk/gds/SOI220nm_1310nm_TE_RIB_Waveguide_Crossing.gds rename to cspdk/si220/gds/SOI220nm_1310nm_TE_RIB_Waveguide_Crossing.gds diff --git a/cspdk/gds/SOI220nm_1310nm_TE_STRIP_2x1_MMI.gds b/cspdk/si220/gds/SOI220nm_1310nm_TE_STRIP_2x1_MMI.gds similarity index 100% rename from cspdk/gds/SOI220nm_1310nm_TE_STRIP_2x1_MMI.gds rename to cspdk/si220/gds/SOI220nm_1310nm_TE_STRIP_2x1_MMI.gds diff --git a/cspdk/gds/SOI220nm_1310nm_TE_STRIP_2x2_MMI.gds b/cspdk/si220/gds/SOI220nm_1310nm_TE_STRIP_2x2_MMI.gds similarity index 100% rename from cspdk/gds/SOI220nm_1310nm_TE_STRIP_2x2_MMI.gds rename to cspdk/si220/gds/SOI220nm_1310nm_TE_STRIP_2x2_MMI.gds diff --git a/cspdk/gds/SOI220nm_1310nm_TE_STRIP_90_Degree_Bend.gds b/cspdk/si220/gds/SOI220nm_1310nm_TE_STRIP_90_Degree_Bend.gds similarity index 100% rename from cspdk/gds/SOI220nm_1310nm_TE_STRIP_90_Degree_Bend.gds rename to cspdk/si220/gds/SOI220nm_1310nm_TE_STRIP_90_Degree_Bend.gds diff --git a/cspdk/gds/SOI220nm_1310nm_TE_STRIP_Grating_Coupler.gds b/cspdk/si220/gds/SOI220nm_1310nm_TE_STRIP_Grating_Coupler.gds similarity index 100% rename from cspdk/gds/SOI220nm_1310nm_TE_STRIP_Grating_Coupler.gds rename to cspdk/si220/gds/SOI220nm_1310nm_TE_STRIP_Grating_Coupler.gds diff --git a/cspdk/gds/SOI220nm_1310nm_TE_STRIP_Waveguide.gds b/cspdk/si220/gds/SOI220nm_1310nm_TE_STRIP_Waveguide.gds similarity index 100% rename from cspdk/gds/SOI220nm_1310nm_TE_STRIP_Waveguide.gds rename to cspdk/si220/gds/SOI220nm_1310nm_TE_STRIP_Waveguide.gds diff --git a/cspdk/gds/SOI220nm_1310nm_TE_STRIP_Waveguide_Crossing.gds b/cspdk/si220/gds/SOI220nm_1310nm_TE_STRIP_Waveguide_Crossing.gds similarity index 100% rename from cspdk/gds/SOI220nm_1310nm_TE_STRIP_Waveguide_Crossing.gds rename to cspdk/si220/gds/SOI220nm_1310nm_TE_STRIP_Waveguide_Crossing.gds diff --git a/cspdk/gds/SOI220nm_1550nm_TE_RIB_2x1_MMI.gds b/cspdk/si220/gds/SOI220nm_1550nm_TE_RIB_2x1_MMI.gds similarity index 100% rename from cspdk/gds/SOI220nm_1550nm_TE_RIB_2x1_MMI.gds rename to cspdk/si220/gds/SOI220nm_1550nm_TE_RIB_2x1_MMI.gds diff --git a/cspdk/gds/SOI220nm_1550nm_TE_RIB_2x2_MMI.gds b/cspdk/si220/gds/SOI220nm_1550nm_TE_RIB_2x2_MMI.gds similarity index 100% rename from cspdk/gds/SOI220nm_1550nm_TE_RIB_2x2_MMI.gds rename to cspdk/si220/gds/SOI220nm_1550nm_TE_RIB_2x2_MMI.gds diff --git a/cspdk/gds/SOI220nm_1550nm_TE_RIB_90_Degree_Bend.gds b/cspdk/si220/gds/SOI220nm_1550nm_TE_RIB_90_Degree_Bend.gds similarity index 100% rename from cspdk/gds/SOI220nm_1550nm_TE_RIB_90_Degree_Bend.gds rename to cspdk/si220/gds/SOI220nm_1550nm_TE_RIB_90_Degree_Bend.gds diff --git a/cspdk/gds/SOI220nm_1550nm_TE_RIB_Grating_Coupler.gds b/cspdk/si220/gds/SOI220nm_1550nm_TE_RIB_Grating_Coupler.gds similarity index 100% rename from cspdk/gds/SOI220nm_1550nm_TE_RIB_Grating_Coupler.gds rename to cspdk/si220/gds/SOI220nm_1550nm_TE_RIB_Grating_Coupler.gds diff --git a/cspdk/gds/SOI220nm_1550nm_TE_RIB_Waveguide.gds b/cspdk/si220/gds/SOI220nm_1550nm_TE_RIB_Waveguide.gds similarity index 100% rename from cspdk/gds/SOI220nm_1550nm_TE_RIB_Waveguide.gds rename to cspdk/si220/gds/SOI220nm_1550nm_TE_RIB_Waveguide.gds diff --git a/cspdk/gds/SOI220nm_1550nm_TE_RIB_Waveguide_Crossing.gds b/cspdk/si220/gds/SOI220nm_1550nm_TE_RIB_Waveguide_Crossing.gds similarity index 100% rename from cspdk/gds/SOI220nm_1550nm_TE_RIB_Waveguide_Crossing.gds rename to cspdk/si220/gds/SOI220nm_1550nm_TE_RIB_Waveguide_Crossing.gds diff --git a/cspdk/gds/SOI220nm_1550nm_TE_STRIP_2x1_MMI.gds b/cspdk/si220/gds/SOI220nm_1550nm_TE_STRIP_2x1_MMI.gds similarity index 100% rename from cspdk/gds/SOI220nm_1550nm_TE_STRIP_2x1_MMI.gds rename to cspdk/si220/gds/SOI220nm_1550nm_TE_STRIP_2x1_MMI.gds diff --git a/cspdk/gds/SOI220nm_1550nm_TE_STRIP_2x2_MMI.gds b/cspdk/si220/gds/SOI220nm_1550nm_TE_STRIP_2x2_MMI.gds similarity index 100% rename from cspdk/gds/SOI220nm_1550nm_TE_STRIP_2x2_MMI.gds rename to cspdk/si220/gds/SOI220nm_1550nm_TE_STRIP_2x2_MMI.gds diff --git a/cspdk/gds/SOI220nm_1550nm_TE_STRIP_90_Degree_Bend.gds b/cspdk/si220/gds/SOI220nm_1550nm_TE_STRIP_90_Degree_Bend.gds similarity index 100% rename from cspdk/gds/SOI220nm_1550nm_TE_STRIP_90_Degree_Bend.gds rename to cspdk/si220/gds/SOI220nm_1550nm_TE_STRIP_90_Degree_Bend.gds diff --git a/cspdk/gds/SOI220nm_1550nm_TE_STRIP_Waveguide.gds b/cspdk/si220/gds/SOI220nm_1550nm_TE_STRIP_Waveguide.gds similarity index 100% rename from cspdk/gds/SOI220nm_1550nm_TE_STRIP_Waveguide.gds rename to cspdk/si220/gds/SOI220nm_1550nm_TE_STRIP_Waveguide.gds diff --git a/cspdk/gds/SOI220nm_1550nm_TE_STRIP_Waveguide_Crossing.gds b/cspdk/si220/gds/SOI220nm_1550nm_TE_STRIP_Waveguide_Crossing.gds similarity index 100% rename from cspdk/gds/SOI220nm_1550nm_TE_STRIP_Waveguide_Crossing.gds rename to cspdk/si220/gds/SOI220nm_1550nm_TE_STRIP_Waveguide_Crossing.gds diff --git a/cspdk/gds/SiN300nm_1310nm_TE_STRIP_2x1_MMI.gds b/cspdk/si220/gds/SiN300nm_1310nm_TE_STRIP_2x1_MMI.gds similarity index 100% rename from cspdk/gds/SiN300nm_1310nm_TE_STRIP_2x1_MMI.gds rename to cspdk/si220/gds/SiN300nm_1310nm_TE_STRIP_2x1_MMI.gds diff --git a/cspdk/gds/SiN300nm_1310nm_TE_STRIP_2x2_MMI.gds b/cspdk/si220/gds/SiN300nm_1310nm_TE_STRIP_2x2_MMI.gds similarity index 100% rename from cspdk/gds/SiN300nm_1310nm_TE_STRIP_2x2_MMI.gds rename to cspdk/si220/gds/SiN300nm_1310nm_TE_STRIP_2x2_MMI.gds diff --git a/cspdk/gds/SiN300nm_1310nm_TE_STRIP_90_Degr.gds b/cspdk/si220/gds/SiN300nm_1310nm_TE_STRIP_90_Degr.gds similarity index 100% rename from cspdk/gds/SiN300nm_1310nm_TE_STRIP_90_Degr.gds rename to cspdk/si220/gds/SiN300nm_1310nm_TE_STRIP_90_Degr.gds diff --git a/cspdk/gds/SiN300nm_1310nm_TE_STRIP_Grating.gds b/cspdk/si220/gds/SiN300nm_1310nm_TE_STRIP_Grating.gds similarity index 100% rename from cspdk/gds/SiN300nm_1310nm_TE_STRIP_Grating.gds rename to cspdk/si220/gds/SiN300nm_1310nm_TE_STRIP_Grating.gds diff --git a/cspdk/gds/SiN300nm_1310nm_TE_STRIP_Wavegui.gds b/cspdk/si220/gds/SiN300nm_1310nm_TE_STRIP_Wavegui.gds similarity index 100% rename from cspdk/gds/SiN300nm_1310nm_TE_STRIP_Wavegui.gds rename to cspdk/si220/gds/SiN300nm_1310nm_TE_STRIP_Wavegui.gds diff --git a/cspdk/gds/SiN300nm_1550nm_TE_STRIP_2x1_MMI.gds b/cspdk/si220/gds/SiN300nm_1550nm_TE_STRIP_2x1_MMI.gds similarity index 100% rename from cspdk/gds/SiN300nm_1550nm_TE_STRIP_2x1_MMI.gds rename to cspdk/si220/gds/SiN300nm_1550nm_TE_STRIP_2x1_MMI.gds diff --git a/cspdk/gds/SiN300nm_1550nm_TE_STRIP_2x2_MMI.gds b/cspdk/si220/gds/SiN300nm_1550nm_TE_STRIP_2x2_MMI.gds similarity index 100% rename from cspdk/gds/SiN300nm_1550nm_TE_STRIP_2x2_MMI.gds rename to cspdk/si220/gds/SiN300nm_1550nm_TE_STRIP_2x2_MMI.gds diff --git a/cspdk/gds/SiN300nm_1550nm_TE_STRIP_90_Degr.gds b/cspdk/si220/gds/SiN300nm_1550nm_TE_STRIP_90_Degr.gds similarity index 100% rename from cspdk/gds/SiN300nm_1550nm_TE_STRIP_90_Degr.gds rename to cspdk/si220/gds/SiN300nm_1550nm_TE_STRIP_90_Degr.gds diff --git a/cspdk/gds/SiN300nm_1550nm_TE_STRIP_Grating.gds b/cspdk/si220/gds/SiN300nm_1550nm_TE_STRIP_Grating.gds similarity index 100% rename from cspdk/gds/SiN300nm_1550nm_TE_STRIP_Grating.gds rename to cspdk/si220/gds/SiN300nm_1550nm_TE_STRIP_Grating.gds diff --git a/cspdk/gds/SiN300nm_1550nm_TE_STRIP_Wavegui.gds b/cspdk/si220/gds/SiN300nm_1550nm_TE_STRIP_Wavegui.gds similarity index 100% rename from cspdk/gds/SiN300nm_1550nm_TE_STRIP_Wavegui.gds rename to cspdk/si220/gds/SiN300nm_1550nm_TE_STRIP_Wavegui.gds diff --git a/cspdk/import_pdk.py b/cspdk/si220/import_pdk.py similarity index 100% rename from cspdk/import_pdk.py rename to cspdk/si220/import_pdk.py diff --git a/cspdk/klayout/d25/Cornerstone.lyd25 b/cspdk/si220/klayout/d25/Cornerstone.lyd25 similarity index 100% rename from cspdk/klayout/d25/Cornerstone.lyd25 rename to cspdk/si220/klayout/d25/Cornerstone.lyd25 diff --git a/cspdk/klayout/layers.lyp b/cspdk/si220/klayout/layers.lyp similarity index 100% rename from cspdk/klayout/layers.lyp rename to cspdk/si220/klayout/layers.lyp diff --git a/cspdk/klayout/tech.lyt b/cspdk/si220/klayout/tech.lyt similarity index 100% rename from cspdk/klayout/tech.lyt rename to cspdk/si220/klayout/tech.lyt diff --git a/cspdk/layers.yaml b/cspdk/si220/layers.yaml similarity index 100% rename from cspdk/layers.yaml rename to cspdk/si220/layers.yaml diff --git a/cspdk/models.py b/cspdk/si220/models.py similarity index 100% rename from cspdk/models.py rename to cspdk/si220/models.py diff --git a/cspdk/samples/circuit_simulations.py b/cspdk/si220/samples/circuit_simulations.py similarity index 95% rename from cspdk/samples/circuit_simulations.py rename to cspdk/si220/samples/circuit_simulations.py index 4b53482..945e13f 100644 --- a/cspdk/samples/circuit_simulations.py +++ b/cspdk/si220/samples/circuit_simulations.py @@ -3,7 +3,7 @@ import sax import cspdk -from cspdk import PDK +from cspdk.si220 import PDK if __name__ == "__main__": c = cspdk.cells.mzi_sc(delta_length=100) diff --git a/cspdk/samples/circuit_simulations_with_routing.py b/cspdk/si220/samples/circuit_simulations_with_routing.py similarity index 77% rename from cspdk/samples/circuit_simulations_with_routing.py rename to cspdk/si220/samples/circuit_simulations_with_routing.py index 6f40a05..0231f1c 100644 --- a/cspdk/samples/circuit_simulations_with_routing.py +++ b/cspdk/si220/samples/circuit_simulations_with_routing.py @@ -3,15 +3,14 @@ import matplotlib.pyplot as plt import sax -import cspdk -from cspdk import PDK +from cspdk.si220 import PDK, cells, tech if __name__ == "__main__": c = gf.Component() - mzi1 = c << cspdk.cells.mzi_sc(delta_length=10) - mzi2 = c << cspdk.cells.mzi_sc(delta_length=100) + mzi1 = c << cells.mzi_sc(delta_length=10) + mzi2 = c << cells.mzi_sc(delta_length=100) mzi2.move((200, 200)) - route = cspdk.tech.get_route_sc(mzi1.ports["o2"], mzi2.ports["o1"]) + route = tech.get_route_sc(mzi1.ports["o2"], mzi2.ports["o1"]) c.add(route.references) c.add_port(name="o1", port=mzi1.ports["o1"]) c.add_port(name="o2", port=mzi2.ports["o2"]) diff --git a/cspdk/samples/component_from_yaml.py b/cspdk/si220/samples/component_from_yaml.py similarity index 97% rename from cspdk/samples/component_from_yaml.py rename to cspdk/si220/samples/component_from_yaml.py index ee02e5c..edc8c1f 100644 --- a/cspdk/samples/component_from_yaml.py +++ b/cspdk/si220/samples/component_from_yaml.py @@ -1,6 +1,6 @@ sample_pads = """ name: pads -pdk: cspdk +pdk: cspdk.si220 instances: bl: diff --git a/cspdk/samples/get_route.py b/cspdk/si220/samples/get_route.py similarity index 67% rename from cspdk/samples/get_route.py rename to cspdk/si220/samples/get_route.py index 0473a92..980d432 100644 --- a/cspdk/samples/get_route.py +++ b/cspdk/si220/samples/get_route.py @@ -2,15 +2,15 @@ import gdsfactory as gf -import cspdk +from cspdk.si220 import cells, tech if __name__ == "__main__": c = gf.Component("sample_connect") - mmi1 = c << cspdk.cells.mmi1x2_nc() - mmi2 = c << cspdk.cells.mmi1x2_nc() + mmi1 = c << cells.mmi1x2_nc() + mmi2 = c << cells.mmi1x2_nc() mmi2.move((500, 50)) - route = cspdk.tech.get_route_nc( + route = tech.get_route_nc( mmi1.ports["o3"], mmi2.ports["o1"], ) diff --git a/cspdk/samples/mode_solver_n.py b/cspdk/si220/samples/mode_solver_n.py similarity index 100% rename from cspdk/samples/mode_solver_n.py rename to cspdk/si220/samples/mode_solver_n.py diff --git a/cspdk/samples/mode_solver_r.py b/cspdk/si220/samples/mode_solver_r.py similarity index 100% rename from cspdk/samples/mode_solver_r.py rename to cspdk/si220/samples/mode_solver_r.py diff --git a/cspdk/samples/mode_solver_s.py b/cspdk/si220/samples/mode_solver_s.py similarity index 100% rename from cspdk/samples/mode_solver_s.py rename to cspdk/si220/samples/mode_solver_s.py diff --git a/cspdk/tech.py b/cspdk/si220/tech.py similarity index 99% rename from cspdk/tech.py rename to cspdk/si220/tech.py index 9005025..a146a18 100644 --- a/cspdk/tech.py +++ b/cspdk/si220/tech.py @@ -9,7 +9,7 @@ from gdsfactory.technology import LayerLevel, LayerMap, LayerStack, LayerViews from gdsfactory.typings import ConnectivitySpec, Layer -from cspdk.config import PATH +from cspdk.si220.config import PATH nm = 1e-3 diff --git a/install_tech.py b/install_tech.py index 53aed55..7ae8a33 100644 --- a/install_tech.py +++ b/install_tech.py @@ -33,7 +33,7 @@ def make_link(src, dest, overwrite: bool = True) -> None: klayout_folder = "KLayout" if sys.platform == "win32" else ".klayout" cwd = pathlib.Path(__file__).resolve().parent home = pathlib.Path.home() - src = cwd / "cspdk" / "klayout" + src = cwd / "cspdk" / "si220" / "klayout" dest_folder = home / klayout_folder / "tech" dest_folder.mkdir(exist_ok=True, parents=True) dest = dest_folder / "cspdk" From 742f254d031ad46701688db77af48ca4463127ea Mon Sep 17 00:00:00 2001 From: Joaquin Matres <4514346+joamatab@users.noreply.github.com> Date: Thu, 2 May 2024 17:06:40 -0700 Subject: [PATCH 2/6] fix docs and tests --- .github/write_components_plot.py | 15 +- docs/cells.rst | 290 ++++++++++++++++--------------- tests/test_pdk.py | 2 +- 3 files changed, 158 insertions(+), 149 deletions(-) diff --git a/.github/write_components_plot.py b/.github/write_components_plot.py index 111ec7a..b2dff03 100644 --- a/.github/write_components_plot.py +++ b/.github/write_components_plot.py @@ -1,7 +1,7 @@ import inspect -from cspdk import _cells as cells -from cspdk.config import PATH +from cspdk.si220 import _cells as cells +from cspdk.si220.config import PATH filepath = PATH.repo / "docs" / "cells.rst" @@ -15,10 +15,7 @@ f.write( """ -Here are the components available in the PDK - - -Cells +Cells Si220 ============================= """ ) @@ -43,7 +40,7 @@ {name} ---------------------------------------------------- -.. autofunction:: cspdk.cells.{name} +.. autofunction:: cspdk.si220.cells.{name} """ ) @@ -54,14 +51,14 @@ {name} ---------------------------------------------------- -.. autofunction:: cspdk.cells.{name} +.. autofunction:: cspdk.si220.cells.{name} .. plot:: :include-source: import cspdk - c = cspdk.cells.{name}({kwargs}) + c = cspdk.si220.cells.{name}({kwargs}) c.plot() """ diff --git a/docs/cells.rst b/docs/cells.rst index 8873e8b..8bf25d4 100644 --- a/docs/cells.rst +++ b/docs/cells.rst @@ -1,23 +1,35 @@ -Here are the components available in the PDK +Cells Si220 +============================= -Cells -============================= +array +---------------------------------------------------- + +.. autofunction:: cspdk.si220.cells.array + +.. plot:: + :include-source: + + import cspdk + + c = cspdk.si220.cells.array(component='pad', spacing=(150.0, 150.0), columns=6, rows=1, add_ports=True, centered=False) + c.plot() + bend_nc ---------------------------------------------------- -.. autofunction:: cspdk.cells.bend_nc +.. autofunction:: cspdk.si220.cells.bend_nc .. plot:: :include-source: import cspdk - c = cspdk.cells.bend_nc(radius=25.0, angle=90.0) + c = cspdk.si220.cells.bend_nc(radius=25.0, angle=90.0) c.plot() @@ -25,14 +37,14 @@ bend_nc bend_no ---------------------------------------------------- -.. autofunction:: cspdk.cells.bend_no +.. autofunction:: cspdk.si220.cells.bend_no .. plot:: :include-source: import cspdk - c = cspdk.cells.bend_no(radius=25.0, angle=90.0) + c = cspdk.si220.cells.bend_no(radius=25.0, angle=90.0) c.plot() @@ -40,14 +52,14 @@ bend_no bend_rc ---------------------------------------------------- -.. autofunction:: cspdk.cells.bend_rc +.. autofunction:: cspdk.si220.cells.bend_rc .. plot:: :include-source: import cspdk - c = cspdk.cells.bend_rc(radius=25.0, angle=90.0) + c = cspdk.si220.cells.bend_rc(radius=25.0, angle=90.0) c.plot() @@ -55,14 +67,14 @@ bend_rc bend_ro ---------------------------------------------------- -.. autofunction:: cspdk.cells.bend_ro +.. autofunction:: cspdk.si220.cells.bend_ro .. plot:: :include-source: import cspdk - c = cspdk.cells.bend_ro(radius=25.0, angle=90.0) + c = cspdk.si220.cells.bend_ro(radius=25.0, angle=90.0) c.plot() @@ -70,14 +82,14 @@ bend_ro bend_s ---------------------------------------------------- -.. autofunction:: cspdk.cells.bend_s +.. autofunction:: cspdk.si220.cells.bend_s .. plot:: :include-source: import cspdk - c = cspdk.cells.bend_s(size=(11.0, 1.8), cross_section='xs_sc') + c = cspdk.si220.cells.bend_s(size=(11.0, 1.8), cross_section='xs_sc') c.plot() @@ -85,14 +97,14 @@ bend_s bend_sc ---------------------------------------------------- -.. autofunction:: cspdk.cells.bend_sc +.. autofunction:: cspdk.si220.cells.bend_sc .. plot:: :include-source: import cspdk - c = cspdk.cells.bend_sc(radius=10.0, angle=90.0) + c = cspdk.si220.cells.bend_sc(radius=10.0, angle=90.0) c.plot() @@ -100,14 +112,14 @@ bend_sc bend_so ---------------------------------------------------- -.. autofunction:: cspdk.cells.bend_so +.. autofunction:: cspdk.si220.cells.bend_so .. plot:: :include-source: import cspdk - c = cspdk.cells.bend_so(radius=10.0, angle=90.0) + c = cspdk.si220.cells.bend_so(radius=10.0, angle=90.0) c.plot() @@ -115,14 +127,14 @@ bend_so coupler_nc ---------------------------------------------------- -.. autofunction:: cspdk.cells.coupler_nc +.. autofunction:: cspdk.si220.cells.coupler_nc .. plot:: :include-source: import cspdk - c = cspdk.cells.coupler_nc(gap=0.4, length=20.0, dx=10.0, dy=4.0) + c = cspdk.si220.cells.coupler_nc(gap=0.4, length=20.0, dx=10.0, dy=4.0) c.plot() @@ -130,14 +142,14 @@ coupler_nc coupler_no ---------------------------------------------------- -.. autofunction:: cspdk.cells.coupler_no +.. autofunction:: cspdk.si220.cells.coupler_no .. plot:: :include-source: import cspdk - c = cspdk.cells.coupler_no(gap=0.4, length=20.0, dx=10.0, dy=4.0) + c = cspdk.si220.cells.coupler_no(gap=0.4, length=20.0, dx=10.0, dy=4.0) c.plot() @@ -145,14 +157,14 @@ coupler_no coupler_rc ---------------------------------------------------- -.. autofunction:: cspdk.cells.coupler_rc +.. autofunction:: cspdk.si220.cells.coupler_rc .. plot:: :include-source: import cspdk - c = cspdk.cells.coupler_rc(gap=0.236, length=20.0, dx=10.0, dy=4.0) + c = cspdk.si220.cells.coupler_rc(gap=0.236, length=20.0, dx=10.0, dy=4.0) c.plot() @@ -160,14 +172,14 @@ coupler_rc coupler_ro ---------------------------------------------------- -.. autofunction:: cspdk.cells.coupler_ro +.. autofunction:: cspdk.si220.cells.coupler_ro .. plot:: :include-source: import cspdk - c = cspdk.cells.coupler_ro(gap=0.236, length=20.0, dx=10.0, dy=4.0) + c = cspdk.si220.cells.coupler_ro(gap=0.236, length=20.0, dx=10.0, dy=4.0) c.plot() @@ -175,14 +187,14 @@ coupler_ro coupler_sc ---------------------------------------------------- -.. autofunction:: cspdk.cells.coupler_sc +.. autofunction:: cspdk.si220.cells.coupler_sc .. plot:: :include-source: import cspdk - c = cspdk.cells.coupler_sc(gap=0.236, length=20.0, dx=10.0, dy=4.0) + c = cspdk.si220.cells.coupler_sc(gap=0.236, length=20.0, dx=10.0, dy=4.0) c.plot() @@ -190,14 +202,14 @@ coupler_sc coupler_so ---------------------------------------------------- -.. autofunction:: cspdk.cells.coupler_so +.. autofunction:: cspdk.si220.cells.coupler_so .. plot:: :include-source: import cspdk - c = cspdk.cells.coupler_so(gap=0.236, length=20.0, dx=10.0, dy=4.0) + c = cspdk.si220.cells.coupler_so(gap=0.236, length=20.0, dx=10.0, dy=4.0) c.plot() @@ -205,14 +217,14 @@ coupler_so crossing_rc ---------------------------------------------------- -.. autofunction:: cspdk.cells.crossing_rc +.. autofunction:: cspdk.si220.cells.crossing_rc .. plot:: :include-source: import cspdk - c = cspdk.cells.crossing_rc() + c = cspdk.si220.cells.crossing_rc() c.plot() @@ -220,14 +232,14 @@ crossing_rc crossing_sc ---------------------------------------------------- -.. autofunction:: cspdk.cells.crossing_sc +.. autofunction:: cspdk.si220.cells.crossing_sc .. plot:: :include-source: import cspdk - c = cspdk.cells.crossing_sc() + c = cspdk.si220.cells.crossing_sc() c.plot() @@ -235,14 +247,14 @@ crossing_sc crossing_so ---------------------------------------------------- -.. autofunction:: cspdk.cells.crossing_so +.. autofunction:: cspdk.si220.cells.crossing_so .. plot:: :include-source: import cspdk - c = cspdk.cells.crossing_so() + c = cspdk.si220.cells.crossing_so() c.plot() @@ -250,14 +262,14 @@ crossing_so die_nc ---------------------------------------------------- -.. autofunction:: cspdk.cells.die_nc +.. autofunction:: cspdk.si220.cells.die_nc .. plot:: :include-source: import cspdk - c = cspdk.cells.die_nc() + c = cspdk.si220.cells.die_nc() c.plot() @@ -265,14 +277,14 @@ die_nc die_no ---------------------------------------------------- -.. autofunction:: cspdk.cells.die_no +.. autofunction:: cspdk.si220.cells.die_no .. plot:: :include-source: import cspdk - c = cspdk.cells.die_no() + c = cspdk.si220.cells.die_no() c.plot() @@ -280,14 +292,14 @@ die_no die_rc ---------------------------------------------------- -.. autofunction:: cspdk.cells.die_rc +.. autofunction:: cspdk.si220.cells.die_rc .. plot:: :include-source: import cspdk - c = cspdk.cells.die_rc() + c = cspdk.si220.cells.die_rc() c.plot() @@ -295,14 +307,14 @@ die_rc die_ro ---------------------------------------------------- -.. autofunction:: cspdk.cells.die_ro +.. autofunction:: cspdk.si220.cells.die_ro .. plot:: :include-source: import cspdk - c = cspdk.cells.die_ro() + c = cspdk.si220.cells.die_ro() c.plot() @@ -310,14 +322,14 @@ die_ro die_sc ---------------------------------------------------- -.. autofunction:: cspdk.cells.die_sc +.. autofunction:: cspdk.si220.cells.die_sc .. plot:: :include-source: import cspdk - c = cspdk.cells.die_sc() + c = cspdk.si220.cells.die_sc() c.plot() @@ -325,14 +337,14 @@ die_sc die_so ---------------------------------------------------- -.. autofunction:: cspdk.cells.die_so +.. autofunction:: cspdk.si220.cells.die_so .. plot:: :include-source: import cspdk - c = cspdk.cells.die_so() + c = cspdk.si220.cells.die_so() c.plot() @@ -340,14 +352,14 @@ die_so gc_elliptical_sc ---------------------------------------------------- -.. autofunction:: cspdk.cells.gc_elliptical_sc +.. autofunction:: cspdk.si220.cells.gc_elliptical_sc .. plot:: :include-source: import cspdk - c = cspdk.cells.gc_elliptical_sc(grating_line_width=0.343, fiber_angle=15, wavelength=1.53) + c = cspdk.si220.cells.gc_elliptical_sc(grating_line_width=0.343, fiber_angle=15, wavelength=1.53) c.plot() @@ -355,14 +367,14 @@ gc_elliptical_sc gc_elliptical_so ---------------------------------------------------- -.. autofunction:: cspdk.cells.gc_elliptical_so +.. autofunction:: cspdk.si220.cells.gc_elliptical_so .. plot:: :include-source: import cspdk - c = cspdk.cells.gc_elliptical_so(grating_line_width=0.343, fiber_angle=15, wavelength=1.31) + c = cspdk.si220.cells.gc_elliptical_so(grating_line_width=0.343, fiber_angle=15, wavelength=1.31) c.plot() @@ -370,14 +382,14 @@ gc_elliptical_so gc_rectangular_nc ---------------------------------------------------- -.. autofunction:: cspdk.cells.gc_rectangular_nc +.. autofunction:: cspdk.si220.cells.gc_rectangular_nc .. plot:: :include-source: import cspdk - c = cspdk.cells.gc_rectangular_nc() + c = cspdk.si220.cells.gc_rectangular_nc() c.plot() @@ -385,14 +397,14 @@ gc_rectangular_nc gc_rectangular_no ---------------------------------------------------- -.. autofunction:: cspdk.cells.gc_rectangular_no +.. autofunction:: cspdk.si220.cells.gc_rectangular_no .. plot:: :include-source: import cspdk - c = cspdk.cells.gc_rectangular_no() + c = cspdk.si220.cells.gc_rectangular_no() c.plot() @@ -400,14 +412,14 @@ gc_rectangular_no gc_rectangular_rc ---------------------------------------------------- -.. autofunction:: cspdk.cells.gc_rectangular_rc +.. autofunction:: cspdk.si220.cells.gc_rectangular_rc .. plot:: :include-source: import cspdk - c = cspdk.cells.gc_rectangular_rc() + c = cspdk.si220.cells.gc_rectangular_rc() c.plot() @@ -415,14 +427,14 @@ gc_rectangular_rc gc_rectangular_ro ---------------------------------------------------- -.. autofunction:: cspdk.cells.gc_rectangular_ro +.. autofunction:: cspdk.si220.cells.gc_rectangular_ro .. plot:: :include-source: import cspdk - c = cspdk.cells.gc_rectangular_ro() + c = cspdk.si220.cells.gc_rectangular_ro() c.plot() @@ -430,14 +442,14 @@ gc_rectangular_ro gc_rectangular_sc ---------------------------------------------------- -.. autofunction:: cspdk.cells.gc_rectangular_sc +.. autofunction:: cspdk.si220.cells.gc_rectangular_sc .. plot:: :include-source: import cspdk - c = cspdk.cells.gc_rectangular_sc() + c = cspdk.si220.cells.gc_rectangular_sc() c.plot() @@ -445,14 +457,14 @@ gc_rectangular_sc gc_rectangular_so ---------------------------------------------------- -.. autofunction:: cspdk.cells.gc_rectangular_so +.. autofunction:: cspdk.si220.cells.gc_rectangular_so .. plot:: :include-source: import cspdk - c = cspdk.cells.gc_rectangular_so() + c = cspdk.si220.cells.gc_rectangular_so() c.plot() @@ -460,14 +472,14 @@ gc_rectangular_so grating_coupler_array ---------------------------------------------------- -.. autofunction:: cspdk.cells.grating_coupler_array +.. autofunction:: cspdk.si220.cells.grating_coupler_array .. plot:: :include-source: import cspdk - c = cspdk.cells.grating_coupler_array(pitch=127.0, n=6, port_name='o1', rotation=0.0, with_loopback=False, grating_coupler_spacing=0.0, cross_section='xs_nc') + c = cspdk.si220.cells.grating_coupler_array(pitch=127.0, n=6, port_name='o1', rotation=0.0, with_loopback=False, grating_coupler_spacing=0.0, cross_section='xs_nc') c.plot() @@ -475,14 +487,14 @@ grating_coupler_array heater ---------------------------------------------------- -.. autofunction:: cspdk.cells.heater +.. autofunction:: cspdk.si220.cells.heater .. plot:: :include-source: import cspdk - c = cspdk.cells.heater() + c = cspdk.si220.cells.heater() c.plot() @@ -490,14 +502,14 @@ heater mmi1x2_nc ---------------------------------------------------- -.. autofunction:: cspdk.cells.mmi1x2_nc +.. autofunction:: cspdk.si220.cells.mmi1x2_nc .. plot:: :include-source: import cspdk - c = cspdk.cells.mmi1x2_nc() + c = cspdk.si220.cells.mmi1x2_nc() c.plot() @@ -505,14 +517,14 @@ mmi1x2_nc mmi1x2_no ---------------------------------------------------- -.. autofunction:: cspdk.cells.mmi1x2_no +.. autofunction:: cspdk.si220.cells.mmi1x2_no .. plot:: :include-source: import cspdk - c = cspdk.cells.mmi1x2_no() + c = cspdk.si220.cells.mmi1x2_no() c.plot() @@ -520,14 +532,14 @@ mmi1x2_no mmi1x2_rc ---------------------------------------------------- -.. autofunction:: cspdk.cells.mmi1x2_rc +.. autofunction:: cspdk.si220.cells.mmi1x2_rc .. plot:: :include-source: import cspdk - c = cspdk.cells.mmi1x2_rc() + c = cspdk.si220.cells.mmi1x2_rc() c.plot() @@ -535,14 +547,14 @@ mmi1x2_rc mmi1x2_ro ---------------------------------------------------- -.. autofunction:: cspdk.cells.mmi1x2_ro +.. autofunction:: cspdk.si220.cells.mmi1x2_ro .. plot:: :include-source: import cspdk - c = cspdk.cells.mmi1x2_ro() + c = cspdk.si220.cells.mmi1x2_ro() c.plot() @@ -550,14 +562,14 @@ mmi1x2_ro mmi1x2_sc ---------------------------------------------------- -.. autofunction:: cspdk.cells.mmi1x2_sc +.. autofunction:: cspdk.si220.cells.mmi1x2_sc .. plot:: :include-source: import cspdk - c = cspdk.cells.mmi1x2_sc() + c = cspdk.si220.cells.mmi1x2_sc() c.plot() @@ -565,14 +577,14 @@ mmi1x2_sc mmi1x2_so ---------------------------------------------------- -.. autofunction:: cspdk.cells.mmi1x2_so +.. autofunction:: cspdk.si220.cells.mmi1x2_so .. plot:: :include-source: import cspdk - c = cspdk.cells.mmi1x2_so() + c = cspdk.si220.cells.mmi1x2_so() c.plot() @@ -580,14 +592,14 @@ mmi1x2_so mmi2x2_nc ---------------------------------------------------- -.. autofunction:: cspdk.cells.mmi2x2_nc +.. autofunction:: cspdk.si220.cells.mmi2x2_nc .. plot:: :include-source: import cspdk - c = cspdk.cells.mmi2x2_nc() + c = cspdk.si220.cells.mmi2x2_nc() c.plot() @@ -595,14 +607,14 @@ mmi2x2_nc mmi2x2_no ---------------------------------------------------- -.. autofunction:: cspdk.cells.mmi2x2_no +.. autofunction:: cspdk.si220.cells.mmi2x2_no .. plot:: :include-source: import cspdk - c = cspdk.cells.mmi2x2_no() + c = cspdk.si220.cells.mmi2x2_no() c.plot() @@ -610,14 +622,14 @@ mmi2x2_no mmi2x2_rc ---------------------------------------------------- -.. autofunction:: cspdk.cells.mmi2x2_rc +.. autofunction:: cspdk.si220.cells.mmi2x2_rc .. plot:: :include-source: import cspdk - c = cspdk.cells.mmi2x2_rc() + c = cspdk.si220.cells.mmi2x2_rc() c.plot() @@ -625,14 +637,14 @@ mmi2x2_rc mmi2x2_ro ---------------------------------------------------- -.. autofunction:: cspdk.cells.mmi2x2_ro +.. autofunction:: cspdk.si220.cells.mmi2x2_ro .. plot:: :include-source: import cspdk - c = cspdk.cells.mmi2x2_ro() + c = cspdk.si220.cells.mmi2x2_ro() c.plot() @@ -640,14 +652,14 @@ mmi2x2_ro mmi2x2_sc ---------------------------------------------------- -.. autofunction:: cspdk.cells.mmi2x2_sc +.. autofunction:: cspdk.si220.cells.mmi2x2_sc .. plot:: :include-source: import cspdk - c = cspdk.cells.mmi2x2_sc() + c = cspdk.si220.cells.mmi2x2_sc() c.plot() @@ -655,14 +667,14 @@ mmi2x2_sc mmi2x2_so ---------------------------------------------------- -.. autofunction:: cspdk.cells.mmi2x2_so +.. autofunction:: cspdk.si220.cells.mmi2x2_so .. plot:: :include-source: import cspdk - c = cspdk.cells.mmi2x2_so() + c = cspdk.si220.cells.mmi2x2_so() c.plot() @@ -670,14 +682,14 @@ mmi2x2_so mzi_nc ---------------------------------------------------- -.. autofunction:: cspdk.cells.mzi_nc +.. autofunction:: cspdk.si220.cells.mzi_nc .. plot:: :include-source: import cspdk - c = cspdk.cells.mzi_nc(delta_length=10.0, length_y=2.0, length_x=0.1, add_electrical_ports_bot=True) + c = cspdk.si220.cells.mzi_nc(delta_length=10.0, length_y=2.0, length_x=0.1, add_electrical_ports_bot=True) c.plot() @@ -685,14 +697,14 @@ mzi_nc mzi_no ---------------------------------------------------- -.. autofunction:: cspdk.cells.mzi_no +.. autofunction:: cspdk.si220.cells.mzi_no .. plot:: :include-source: import cspdk - c = cspdk.cells.mzi_no(delta_length=10.0, length_y=2.0, length_x=0.1, add_electrical_ports_bot=True) + c = cspdk.si220.cells.mzi_no(delta_length=10.0, length_y=2.0, length_x=0.1, add_electrical_ports_bot=True) c.plot() @@ -700,14 +712,14 @@ mzi_no mzi_rc ---------------------------------------------------- -.. autofunction:: cspdk.cells.mzi_rc +.. autofunction:: cspdk.si220.cells.mzi_rc .. plot:: :include-source: import cspdk - c = cspdk.cells.mzi_rc(delta_length=10.0, length_y=2.0, length_x=0.1, add_electrical_ports_bot=True) + c = cspdk.si220.cells.mzi_rc(delta_length=10.0, length_y=2.0, length_x=0.1, add_electrical_ports_bot=True) c.plot() @@ -715,14 +727,14 @@ mzi_rc mzi_ro ---------------------------------------------------- -.. autofunction:: cspdk.cells.mzi_ro +.. autofunction:: cspdk.si220.cells.mzi_ro .. plot:: :include-source: import cspdk - c = cspdk.cells.mzi_ro(delta_length=10.0, length_y=2.0, length_x=0.1, add_electrical_ports_bot=True) + c = cspdk.si220.cells.mzi_ro(delta_length=10.0, length_y=2.0, length_x=0.1, add_electrical_ports_bot=True) c.plot() @@ -730,14 +742,14 @@ mzi_ro mzi_sc ---------------------------------------------------- -.. autofunction:: cspdk.cells.mzi_sc +.. autofunction:: cspdk.si220.cells.mzi_sc .. plot:: :include-source: import cspdk - c = cspdk.cells.mzi_sc(delta_length=10.0, length_y=2.0, length_x=0.1, add_electrical_ports_bot=True) + c = cspdk.si220.cells.mzi_sc(delta_length=10.0, length_y=2.0, length_x=0.1, add_electrical_ports_bot=True) c.plot() @@ -745,14 +757,14 @@ mzi_sc mzi_so ---------------------------------------------------- -.. autofunction:: cspdk.cells.mzi_so +.. autofunction:: cspdk.si220.cells.mzi_so .. plot:: :include-source: import cspdk - c = cspdk.cells.mzi_so(delta_length=10.0, length_y=2.0, length_x=0.1, add_electrical_ports_bot=True) + c = cspdk.si220.cells.mzi_so(delta_length=10.0, length_y=2.0, length_x=0.1, add_electrical_ports_bot=True) c.plot() @@ -760,14 +772,14 @@ mzi_so pad ---------------------------------------------------- -.. autofunction:: cspdk.cells.pad +.. autofunction:: cspdk.si220.cells.pad .. plot:: :include-source: import cspdk - c = cspdk.cells.pad(size=(100.0, 100.0), layer=(41, 0), port_inclusion=0.0) + c = cspdk.si220.cells.pad(size=(100.0, 100.0), layer=(41, 0), port_inclusion=0.0) c.plot() @@ -775,14 +787,14 @@ pad rectangle ---------------------------------------------------- -.. autofunction:: cspdk.cells.rectangle +.. autofunction:: cspdk.si220.cells.rectangle .. plot:: :include-source: import cspdk - c = cspdk.cells.rectangle(size=(4.0, 2.0), layer=(99, 0), centered=False, port_type='electrical', port_orientations=(180.0, 90.0, 0.0, -90.0), round_corners_east_west=False, round_corners_north_south=False) + c = cspdk.si220.cells.rectangle(size=(4.0, 2.0), layer=(99, 0), centered=False, port_type='electrical', port_orientations=(180.0, 90.0, 0.0, -90.0), round_corners_east_west=False, round_corners_north_south=False) c.plot() @@ -790,14 +802,14 @@ rectangle straight_nc ---------------------------------------------------- -.. autofunction:: cspdk.cells.straight_nc +.. autofunction:: cspdk.si220.cells.straight_nc .. plot:: :include-source: import cspdk - c = cspdk.cells.straight_nc(length=10.0) + c = cspdk.si220.cells.straight_nc(length=10.0) c.plot() @@ -805,14 +817,14 @@ straight_nc straight_no ---------------------------------------------------- -.. autofunction:: cspdk.cells.straight_no +.. autofunction:: cspdk.si220.cells.straight_no .. plot:: :include-source: import cspdk - c = cspdk.cells.straight_no(length=10.0) + c = cspdk.si220.cells.straight_no(length=10.0) c.plot() @@ -820,14 +832,14 @@ straight_no straight_rc ---------------------------------------------------- -.. autofunction:: cspdk.cells.straight_rc +.. autofunction:: cspdk.si220.cells.straight_rc .. plot:: :include-source: import cspdk - c = cspdk.cells.straight_rc(length=10.0) + c = cspdk.si220.cells.straight_rc(length=10.0) c.plot() @@ -835,14 +847,14 @@ straight_rc straight_ro ---------------------------------------------------- -.. autofunction:: cspdk.cells.straight_ro +.. autofunction:: cspdk.si220.cells.straight_ro .. plot:: :include-source: import cspdk - c = cspdk.cells.straight_ro(length=10.0) + c = cspdk.si220.cells.straight_ro(length=10.0) c.plot() @@ -850,14 +862,14 @@ straight_ro straight_sc ---------------------------------------------------- -.. autofunction:: cspdk.cells.straight_sc +.. autofunction:: cspdk.si220.cells.straight_sc .. plot:: :include-source: import cspdk - c = cspdk.cells.straight_sc(length=10.0) + c = cspdk.si220.cells.straight_sc(length=10.0) c.plot() @@ -865,14 +877,14 @@ straight_sc straight_so ---------------------------------------------------- -.. autofunction:: cspdk.cells.straight_so +.. autofunction:: cspdk.si220.cells.straight_so .. plot:: :include-source: import cspdk - c = cspdk.cells.straight_so(length=10.0) + c = cspdk.si220.cells.straight_so(length=10.0) c.plot() @@ -880,14 +892,14 @@ straight_so taper_nc ---------------------------------------------------- -.. autofunction:: cspdk.cells.taper_nc +.. autofunction:: cspdk.si220.cells.taper_nc .. plot:: :include-source: import cspdk - c = cspdk.cells.taper_nc(length=10.0, width1=0.5) + c = cspdk.si220.cells.taper_nc(length=10.0, width1=0.5) c.plot() @@ -895,14 +907,14 @@ taper_nc taper_no ---------------------------------------------------- -.. autofunction:: cspdk.cells.taper_no +.. autofunction:: cspdk.si220.cells.taper_no .. plot:: :include-source: import cspdk - c = cspdk.cells.taper_no(length=10.0, width1=0.5) + c = cspdk.si220.cells.taper_no(length=10.0, width1=0.5) c.plot() @@ -910,14 +922,14 @@ taper_no taper_rc ---------------------------------------------------- -.. autofunction:: cspdk.cells.taper_rc +.. autofunction:: cspdk.si220.cells.taper_rc .. plot:: :include-source: import cspdk - c = cspdk.cells.taper_rc(length=10.0, width1=0.5) + c = cspdk.si220.cells.taper_rc(length=10.0, width1=0.5) c.plot() @@ -925,14 +937,14 @@ taper_rc taper_ro ---------------------------------------------------- -.. autofunction:: cspdk.cells.taper_ro +.. autofunction:: cspdk.si220.cells.taper_ro .. plot:: :include-source: import cspdk - c = cspdk.cells.taper_ro(length=10.0, width1=0.5) + c = cspdk.si220.cells.taper_ro(length=10.0, width1=0.5) c.plot() @@ -940,14 +952,14 @@ taper_ro taper_sc ---------------------------------------------------- -.. autofunction:: cspdk.cells.taper_sc +.. autofunction:: cspdk.si220.cells.taper_sc .. plot:: :include-source: import cspdk - c = cspdk.cells.taper_sc(length=10.0, width1=0.5) + c = cspdk.si220.cells.taper_sc(length=10.0, width1=0.5) c.plot() @@ -955,14 +967,14 @@ taper_sc taper_so ---------------------------------------------------- -.. autofunction:: cspdk.cells.taper_so +.. autofunction:: cspdk.si220.cells.taper_so .. plot:: :include-source: import cspdk - c = cspdk.cells.taper_so(length=10.0, width1=0.5) + c = cspdk.si220.cells.taper_so(length=10.0, width1=0.5) c.plot() @@ -970,14 +982,14 @@ taper_so trans_sc_rc10 ---------------------------------------------------- -.. autofunction:: cspdk.cells.trans_sc_rc10 +.. autofunction:: cspdk.si220.cells.trans_sc_rc10 .. plot:: :include-source: import cspdk - c = cspdk.cells.trans_sc_rc10() + c = cspdk.si220.cells.trans_sc_rc10() c.plot() @@ -985,14 +997,14 @@ trans_sc_rc10 trans_sc_rc20 ---------------------------------------------------- -.. autofunction:: cspdk.cells.trans_sc_rc20 +.. autofunction:: cspdk.si220.cells.trans_sc_rc20 .. plot:: :include-source: import cspdk - c = cspdk.cells.trans_sc_rc20() + c = cspdk.si220.cells.trans_sc_rc20() c.plot() @@ -1000,14 +1012,14 @@ trans_sc_rc20 trans_sc_rc50 ---------------------------------------------------- -.. autofunction:: cspdk.cells.trans_sc_rc50 +.. autofunction:: cspdk.si220.cells.trans_sc_rc50 .. plot:: :include-source: import cspdk - c = cspdk.cells.trans_sc_rc50() + c = cspdk.si220.cells.trans_sc_rc50() c.plot() @@ -1015,12 +1027,12 @@ trans_sc_rc50 wire_corner ---------------------------------------------------- -.. autofunction:: cspdk.cells.wire_corner +.. autofunction:: cspdk.si220.cells.wire_corner .. plot:: :include-source: import cspdk - c = cspdk.cells.wire_corner(cross_section='xs_metal_routing') + c = cspdk.si220.cells.wire_corner(cross_section='xs_metal_routing') c.plot() diff --git a/tests/test_pdk.py b/tests/test_pdk.py index b4bf751..be87a90 100644 --- a/tests/test_pdk.py +++ b/tests/test_pdk.py @@ -4,7 +4,7 @@ from gdsfactory.difftest import difftest from pytest_regressions.data_regression import DataRegressionFixture -from cspdk import PDK +from cspdk.extra import PDK cells = PDK.cells From 1bbe7a570091a489aab70a049bca4d7bb9b753a2 Mon Sep 17 00:00:00 2001 From: Joaquin Matres <4514346+joamatab@users.noreply.github.com> Date: Thu, 2 May 2024 17:13:23 -0700 Subject: [PATCH 3/6] update gdsfactory to latest --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 871ebfc..7cc274d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,7 +14,7 @@ classifiers = [ "Operating System :: OS Independent" ] dependencies = [ - "gdsfactory==7.25.0", + "gdsfactory==7.25.1", "gplugins[sax]>=0.13,<0.14" ] description = "CornerStone PDK" From 071053310644542318739739fdf5793c099ad40a Mon Sep 17 00:00:00 2001 From: Joaquin Matres <4514346+joamatab@users.noreply.github.com> Date: Thu, 2 May 2024 17:15:28 -0700 Subject: [PATCH 4/6] add __init__ --- cspdk/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 cspdk/__init__.py diff --git a/cspdk/__init__.py b/cspdk/__init__.py new file mode 100644 index 0000000..e69de29 From e50976a55d0bc7ab1dadeda13a897045751ed7f3 Mon Sep 17 00:00:00 2001 From: Joaquin Matres <4514346+joamatab@users.noreply.github.com> Date: Fri, 3 May 2024 19:51:52 -0700 Subject: [PATCH 5/6] add tests --- cspdk/si220/__init__.py | 2 +- cspdk/si220/cells.py | 418 +-- cspdk/si220/import_pdk.py | 2 +- .../si220/klayout/d25/Cornerstone_si220.lyd25 | 34 + cspdk/si220/klayout/layers.lyp | 34 - cspdk/si220/klayout/tech.lyt | 4 +- cspdk/si220/layers.yaml | 12 - ...mulations.py => circuit_simulations_sc.py} | 0 ...=> circuit_simulations_sc_with_routing.py} | 0 ...from_yaml.py => component_from_yaml_sc.py} | 0 cspdk/si220/samples/get_route_sc.py | 18 + cspdk/si220/tech.py | 68 +- cspdk/sin300/__init__.py | 42 + cspdk/sin300/cells.py | 1005 +++++++ cspdk/sin300/config.py | 25 + ...RNERSTONE MPW SOI 220nm GDSII Template.gds | Bin 0 -> 90112 bytes cspdk/sin300/gds/Cell0_Institution_Name.gds | Bin 0 -> 192 bytes ..._SOI220_Full_1550nm_Packaging_Template.gds | Bin 0 -> 27216 bytes .../gds/Cell0_SOI_Full_Institution_Name.gds | Bin 0 -> 202 bytes .../gds/Cell0_SOI_Half_Institution_Name.gds | Bin 0 -> 202 bytes .../sin300/gds/Flip_Chip_Bonding_Example.gds | Bin 0 -> 1156 bytes .../heater.gds => cspdk/sin300/gds/Heater.gds | Bin 688 -> 688 bytes cspdk/sin300/gds/Layer_Designations.gds | Bin 0 -> 20356 bytes .../gds/SOI220nm_1310nm_TE_RIB_2x1_MMI.gds | Bin 0 -> 504 bytes .../gds/SOI220nm_1310nm_TE_RIB_2x2_MMI.gds | Bin 0 -> 872 bytes .../SOI220nm_1310nm_TE_RIB_90_Degree_Bend.gds | Bin 0 -> 2240 bytes ...SOI220nm_1310nm_TE_RIB_Grating_Coupler.gds | Bin 0 -> 5472 bytes .../gds/SOI220nm_1310nm_TE_RIB_Waveguide.gds | Bin 0 -> 266 bytes ...220nm_1310nm_TE_RIB_Waveguide_Crossing.gds | Bin 0 -> 1108 bytes .../gds/SOI220nm_1310nm_TE_STRIP_2x1_MMI.gds | Bin 0 -> 586 bytes .../gds/SOI220nm_1310nm_TE_STRIP_2x2_MMI.gds | Bin 0 -> 714 bytes ...OI220nm_1310nm_TE_STRIP_90_Degree_Bend.gds | Bin 0 -> 650 bytes ...I220nm_1310nm_TE_STRIP_Grating_Coupler.gds | Bin 0 -> 5394 bytes .../SOI220nm_1310nm_TE_STRIP_Waveguide.gds | Bin 0 -> 204 bytes ...0nm_1310nm_TE_STRIP_Waveguide_Crossing.gds | Bin 694 -> 726 bytes .../gds/SOI220nm_1550nm_TE_RIB_2x1_MMI.gds | Bin 0 -> 744 bytes .../gds/SOI220nm_1550nm_TE_RIB_2x2_MMI.gds | Bin 0 -> 872 bytes .../SOI220nm_1550nm_TE_RIB_90_Degree_Bend.gds | Bin 0 -> 2272 bytes ...SOI220nm_1550nm_TE_RIB_Grating_Coupler.gds | Bin 0 -> 4192 bytes .../gds/SOI220nm_1550nm_TE_RIB_Waveguide.gds | Bin 0 -> 266 bytes ...220nm_1550nm_TE_RIB_Waveguide_Crossing.gds | Bin 1078 -> 1108 bytes .../gds/SOI220nm_1550nm_TE_STRIP_2x1_MMI.gds | Bin 0 -> 586 bytes .../gds/SOI220nm_1550nm_TE_STRIP_2x2_MMI.gds | Bin 0 -> 714 bytes ...OI220nm_1550nm_TE_STRIP_90_Degree_Bend.gds | Bin 0 -> 650 bytes .../SOI220nm_1550nm_TE_STRIP_Waveguide.gds | Bin 0 -> 204 bytes ...0nm_1550nm_TE_STRIP_Waveguide_Crossing.gds | Bin 822 -> 854 bytes .../gds/SiN300nm_1310nm_TE_STRIP_2x1_MMI.gds | Bin .../gds/SiN300nm_1310nm_TE_STRIP_2x2_MMI.gds | Bin .../gds/SiN300nm_1310nm_TE_STRIP_90_Degr.gds | Bin .../gds/SiN300nm_1310nm_TE_STRIP_Grating.gds | Bin .../gds/SiN300nm_1310nm_TE_STRIP_Wavegui.gds | Bin .../gds/SiN300nm_1550nm_TE_STRIP_2x1_MMI.gds | Bin .../gds/SiN300nm_1550nm_TE_STRIP_2x2_MMI.gds | Bin .../gds/SiN300nm_1550nm_TE_STRIP_90_Degr.gds | Bin .../gds/SiN300nm_1550nm_TE_STRIP_Grating.gds | Bin .../gds/SiN300nm_1550nm_TE_STRIP_Wavegui.gds | Bin cspdk/sin300/import_pdk.py | 6 + cspdk/sin300/klayout/d25/Cornerstone.lyd25 | 38 + .../klayout/d25/Cornerstone_sin300.lyd25 | 34 + cspdk/sin300/klayout/layers.lyp | 122 + cspdk/sin300/klayout/tech.lyt | 162 + cspdk/sin300/layers.yaml | 38 + cspdk/sin300/models.py | 146 + .../sin300/samples/circuit_simulations_nc.py | 23 + .../circuit_simulations_nc_with_routing.py | 31 + .../sin300/samples/component_from_yaml_nc.py | 54 + .../samples/get_route_nc.py} | 2 +- .../samples/mode_solver_n.py | 0 cspdk/sin300/tech.py | 198 ++ install_tech.py | 12 +- tests/gds_ref/_bend.gds | Bin 2080 -> 0 bytes tests/gds_ref/_gc_rectangular.gds | Bin 1828 -> 0 bytes tests/gds_ref/_mm1x2_nitride_cband.gds | Bin 378 -> 0 bytes tests/gds_ref/_mm2x2_nitride_cband.gds | Bin 442 -> 0 bytes tests/gds_ref/_mmi1x2.gds | Bin 378 -> 0 bytes tests/gds_ref/_mmi1x2_nitride_oband.gds | Bin 378 -> 0 bytes tests/gds_ref/_mmi2x2.gds | Bin 442 -> 0 bytes tests/gds_ref/_mmi2x2_nitride_oband.gds | Bin 442 -> 0 bytes tests/gds_ref/_straight.gds | Bin 180 -> 0 bytes tests/gds_ref/_taper.gds | Bin 176 -> 0 bytes tests/gds_ref/array.gds | Bin 272 -> 0 bytes tests/gds_ref/bend_euler.gds | Bin 2084 -> 0 bytes tests/gds_ref/bend_nc.gds | Bin 5102 -> 0 bytes tests/gds_ref/bend_no.gds | Bin 5102 -> 0 bytes tests/gds_ref/bend_rc.gds | Bin 5406 -> 0 bytes tests/gds_ref/bend_ro.gds | Bin 5406 -> 0 bytes tests/gds_ref/bend_s.gds | Bin 1820 -> 0 bytes tests/gds_ref/bend_sc.gds | Bin 2094 -> 0 bytes tests/gds_ref/bend_so.gds | Bin 2094 -> 0 bytes tests/gds_ref/coupler_nc.gds | Bin 6708 -> 0 bytes tests/gds_ref/coupler_no.gds | Bin 6708 -> 0 bytes tests/gds_ref/coupler_rc.gds | Bin 7412 -> 0 bytes tests/gds_ref/coupler_ro.gds | Bin 7412 -> 0 bytes tests/gds_ref/coupler_sc.gds | Bin 6708 -> 0 bytes tests/gds_ref/coupler_so.gds | Bin 6708 -> 0 bytes tests/gds_ref/die_nc.gds | Bin 21822 -> 0 bytes tests/gds_ref/die_no.gds | Bin 21832 -> 0 bytes tests/gds_ref/die_rc.gds | Bin 24404 -> 0 bytes tests/gds_ref/die_ro.gds | Bin 25244 -> 0 bytes tests/gds_ref/die_sc.gds | Bin 14942 -> 0 bytes tests/gds_ref/die_so.gds | Bin 14940 -> 0 bytes tests/gds_ref/gc_elliptical_sc.gds | Bin 21530 -> 0 bytes tests/gds_ref/gc_elliptical_so.gds | Bin 21530 -> 0 bytes tests/gds_ref/gc_rectangular.gds | Bin 2168 -> 0 bytes tests/gds_ref/gc_rectangular_nc.gds | Bin 1828 -> 0 bytes tests/gds_ref/gc_rectangular_no.gds | Bin 1828 -> 0 bytes tests/gds_ref/gc_rectangular_rc.gds | Bin 3216 -> 0 bytes tests/gds_ref/gc_rectangular_ro.gds | Bin 4056 -> 0 bytes tests/gds_ref/gc_rectangular_sc.gds | Bin 4098 -> 0 bytes tests/gds_ref/gc_rectangular_so.gds | Bin 3928 -> 0 bytes tests/gds_ref/grating_coupler_array.gds | Bin 2532 -> 0 bytes tests/gds_ref/mmi1x2.gds | Bin 368 -> 0 bytes tests/gds_ref/mmi1x2_nc.gds | Bin 372 -> 0 bytes tests/gds_ref/mmi1x2_no.gds | Bin 372 -> 0 bytes tests/gds_ref/mmi1x2_rc.gds | Bin 634 -> 0 bytes tests/gds_ref/mmi1x2_ro.gds | Bin 634 -> 0 bytes tests/gds_ref/mmi1x2_sc.gds | Bin 378 -> 0 bytes tests/gds_ref/mmi1x2_so.gds | Bin 378 -> 0 bytes tests/gds_ref/mmi2x2.gds | Bin 432 -> 0 bytes tests/gds_ref/mmi2x2_nc.gds | Bin 436 -> 0 bytes tests/gds_ref/mmi2x2_no.gds | Bin 436 -> 0 bytes tests/gds_ref/mmi2x2_rc.gds | Bin 762 -> 0 bytes tests/gds_ref/mmi2x2_ro.gds | Bin 762 -> 0 bytes tests/gds_ref/mmi2x2_sc.gds | Bin 442 -> 0 bytes tests/gds_ref/mmi2x2_so.gds | Bin 442 -> 0 bytes tests/gds_ref/mzi.gds | Bin 6120 -> 0 bytes tests/gds_ref/mzi_nc.gds | Bin 6930 -> 0 bytes tests/gds_ref/mzi_no.gds | Bin 12172 -> 0 bytes tests/gds_ref/mzi_rc.gds | Bin 7772 -> 0 bytes tests/gds_ref/mzi_ro.gds | Bin 7772 -> 0 bytes tests/gds_ref/mzi_sc.gds | Bin 3948 -> 0 bytes tests/gds_ref/mzi_so.gds | Bin 6258 -> 0 bytes tests/gds_ref/pad.gds | Bin 184 -> 0 bytes tests/gds_ref/rectangle.gds | Bin 286 -> 0 bytes tests/gds_ref/straight.gds | Bin 188 -> 0 bytes tests/gds_ref/straight_nc.gds | Bin 188 -> 0 bytes tests/gds_ref/straight_no.gds | Bin 188 -> 0 bytes tests/gds_ref/straight_rc.gds | Bin 252 -> 0 bytes tests/gds_ref/straight_ro.gds | Bin 252 -> 0 bytes tests/gds_ref/straight_sc.gds | Bin 188 -> 0 bytes tests/gds_ref/straight_so.gds | Bin 188 -> 0 bytes tests/gds_ref/taper.gds | Bin 176 -> 0 bytes tests/gds_ref/taper_cross_section.gds | Bin 254 -> 0 bytes tests/gds_ref/taper_nc.gds | Bin 178 -> 0 bytes tests/gds_ref/taper_no.gds | Bin 178 -> 0 bytes tests/gds_ref/taper_rc.gds | Bin 242 -> 0 bytes tests/gds_ref/taper_ro.gds | Bin 242 -> 0 bytes tests/gds_ref/taper_sc.gds | Bin 178 -> 0 bytes tests/gds_ref/taper_so.gds | Bin 178 -> 0 bytes tests/gds_ref/trans_sc_rc10.gds | Bin 262 -> 0 bytes tests/gds_ref/trans_sc_rc20.gds | Bin 262 -> 0 bytes tests/gds_ref/trans_sc_rc50.gds | Bin 262 -> 0 bytes tests/gds_ref/wire_corner.gds | Bin 182 -> 0 bytes tests/test_netlists/test_netlists__bend_.yml | 5 - .../test_netlists__straight_.yml | 5 - tests/test_netlists/test_netlists__taper_.yml | 5 - tests/test_netlists/test_netlists_array_.yml | 197 -- .../test_netlists_bend_euler_.yml | 5 - .../test_netlists/test_netlists_bend_nc_.yml | 5 - .../test_netlists/test_netlists_bend_no_.yml | 5 - .../test_netlists/test_netlists_bend_rc_.yml | 5 - .../test_netlists/test_netlists_bend_ro_.yml | 5 - tests/test_netlists/test_netlists_bend_s_.yml | 35 - .../test_netlists/test_netlists_bend_sc_.yml | 5 - .../test_netlists/test_netlists_bend_so_.yml | 5 - .../test_netlists_coupler_nc_.yml | 5 - .../test_netlists_coupler_no_.yml | 5 - .../test_netlists_coupler_rc_.yml | 5 - .../test_netlists_coupler_ro_.yml | 5 - .../test_netlists_coupler_sc_.yml | 5 - .../test_netlists_coupler_so_.yml | 5 - .../test_netlists_crossing_rc_.yml | 5 - .../test_netlists_crossing_sc_.yml | 5 - .../test_netlists_crossing_so_.yml | 5 - tests/test_netlists/test_netlists_die_nc_.yml | 2597 ----------------- tests/test_netlists/test_netlists_die_no_.yml | 2597 ----------------- tests/test_netlists/test_netlists_die_rc_.yml | 2597 ----------------- tests/test_netlists/test_netlists_die_ro_.yml | 2597 ----------------- tests/test_netlists/test_netlists_die_sc_.yml | 2597 ----------------- tests/test_netlists/test_netlists_die_so_.yml | 2597 ----------------- .../test_netlists_gc_elliptical_sc_.yml | 5 - .../test_netlists_gc_elliptical_so_.yml | 5 - .../test_netlists_gc_rectangular_.yml | 5 - .../test_netlists_gc_rectangular_nc_.yml | 5 - .../test_netlists_gc_rectangular_no_.yml | 5 - .../test_netlists_gc_rectangular_rc_.yml | 5 - .../test_netlists_gc_rectangular_ro_.yml | 5 - .../test_netlists_gc_rectangular_sc_.yml | 5 - .../test_netlists_gc_rectangular_so_.yml | 5 - .../test_netlists_grating_coupler_array_.yml | 107 - tests/test_netlists/test_netlists_heater_.yml | 5 - tests/test_netlists/test_netlists_mmi1x2_.yml | 5 - .../test_netlists_mmi1x2_nc_.yml | 5 - .../test_netlists_mmi1x2_no_.yml | 5 - .../test_netlists_mmi1x2_rc_.yml | 5 - .../test_netlists_mmi1x2_ro_.yml | 5 - .../test_netlists_mmi1x2_sc_.yml | 5 - .../test_netlists_mmi1x2_so_.yml | 5 - tests/test_netlists/test_netlists_mmi2x2_.yml | 5 - .../test_netlists_mmi2x2_nc_.yml | 5 - .../test_netlists_mmi2x2_no_.yml | 5 - .../test_netlists_mmi2x2_rc_.yml | 5 - .../test_netlists_mmi2x2_ro_.yml | 5 - .../test_netlists_mmi2x2_sc_.yml | 5 - .../test_netlists_mmi2x2_so_.yml | 5 - tests/test_netlists/test_netlists_mzi_.yml | 681 ----- tests/test_netlists/test_netlists_mzi_nc_.yml | 621 ---- tests/test_netlists/test_netlists_mzi_no_.yml | 621 ---- tests/test_netlists/test_netlists_mzi_rc_.yml | 771 ----- tests/test_netlists/test_netlists_mzi_ro_.yml | 771 ----- tests/test_netlists/test_netlists_mzi_sc_.yml | 621 ---- tests/test_netlists/test_netlists_mzi_so_.yml | 621 ---- tests/test_netlists/test_netlists_pad_.yml | 5 - .../test_netlists_rectangle_.yml | 31 - .../test_netlists/test_netlists_straight_.yml | 5 - .../test_netlists_straight_nc_.yml | 5 - .../test_netlists_straight_no_.yml | 5 - .../test_netlists_straight_rc_.yml | 5 - .../test_netlists_straight_ro_.yml | 5 - .../test_netlists_straight_sc_.yml | 5 - .../test_netlists_straight_so_.yml | 5 - tests/test_netlists/test_netlists_taper_.yml | 5 - .../test_netlists_taper_cross_section_.yml | 5 - .../test_netlists/test_netlists_taper_nc_.yml | 5 - .../test_netlists/test_netlists_taper_no_.yml | 5 - .../test_netlists/test_netlists_taper_rc_.yml | 5 - .../test_netlists/test_netlists_taper_ro_.yml | 5 - .../test_netlists/test_netlists_taper_sc_.yml | 5 - .../test_netlists/test_netlists_taper_so_.yml | 5 - .../test_netlists_trans_sc_rc10_.yml | 5 - .../test_netlists_trans_sc_rc20_.yml | 5 - .../test_netlists_trans_sc_rc50_.yml | 5 - .../test_netlists_wire_corner_.yml | 6 - ...est_netlists.py => test_netlists_si220.py} | 3 +- tests/test_netlists_sin300.py | 40 + tests/test_pdk/test_settings__bend_.yml | 22 - .../test_settings__gc_rectangular_.yml | 27 - .../test_settings__mm1x2_nitride_cband_.yml | 53 - .../test_settings__mm2x2_nitride_cband_.yml | 53 - tests/test_pdk/test_settings__mmi1x2_.yml | 18 - .../test_settings__mmi1x2_nitride_oband_.yml | 53 - tests/test_pdk/test_settings__mmi2x2_.yml | 18 - .../test_settings__mmi2x2_nitride_oband_.yml | 53 - tests/test_pdk/test_settings__straight_.yml | 13 - tests/test_pdk/test_settings__taper_.yml | 13 - tests/test_pdk/test_settings_array_.yml | 22 - tests/test_pdk/test_settings_bend_euler_.yml | 24 - tests/test_pdk/test_settings_bend_nc_.yml | 17 - tests/test_pdk/test_settings_bend_no_.yml | 17 - tests/test_pdk/test_settings_bend_rc_.yml | 17 - tests/test_pdk/test_settings_bend_ro_.yml | 17 - tests/test_pdk/test_settings_bend_s_.yml | 13 - tests/test_pdk/test_settings_bend_sc_.yml | 17 - tests/test_pdk/test_settings_bend_so_.yml | 17 - tests/test_pdk/test_settings_coupler_nc_.yml | 11 - tests/test_pdk/test_settings_coupler_no_.yml | 11 - tests/test_pdk/test_settings_coupler_rc_.yml | 11 - tests/test_pdk/test_settings_coupler_ro_.yml | 11 - tests/test_pdk/test_settings_coupler_sc_.yml | 11 - tests/test_pdk/test_settings_coupler_so_.yml | 11 - tests/test_pdk/test_settings_crossing_rc_.yml | 5 - tests/test_pdk/test_settings_crossing_sc_.yml | 5 - tests/test_pdk/test_settings_crossing_so_.yml | 5 - tests/test_pdk/test_settings_die_nc_.yml | 5 - tests/test_pdk/test_settings_die_no_.yml | 5 - tests/test_pdk/test_settings_die_rc_.yml | 5 - tests/test_pdk/test_settings_die_ro_.yml | 5 - tests/test_pdk/test_settings_die_sc_.yml | 5 - tests/test_pdk/test_settings_die_so_.yml | 5 - .../test_settings_gc_elliptical_sc_.yml | 11 - .../test_settings_gc_elliptical_so_.yml | 11 - .../test_settings_gc_rectangular_.yml | 19 - .../test_settings_gc_rectangular_nc_.yml | 8 - .../test_settings_gc_rectangular_no_.yml | 8 - .../test_settings_gc_rectangular_rc_.yml | 8 - .../test_settings_gc_rectangular_ro_.yml | 8 - .../test_settings_gc_rectangular_sc_.yml | 8 - .../test_settings_gc_rectangular_so_.yml | 8 - .../test_settings_grating_coupler_array_.yml | 16 - tests/test_pdk/test_settings_heater_.yml | 5 - tests/test_pdk/test_settings_mmi1x2_.yml | 14 - tests/test_pdk/test_settings_mmi1x2_nc_.yml | 5 - tests/test_pdk/test_settings_mmi1x2_no_.yml | 5 - tests/test_pdk/test_settings_mmi1x2_rc_.yml | 5 - tests/test_pdk/test_settings_mmi1x2_ro_.yml | 5 - tests/test_pdk/test_settings_mmi1x2_sc_.yml | 5 - tests/test_pdk/test_settings_mmi1x2_so_.yml | 5 - tests/test_pdk/test_settings_mmi2x2_.yml | 14 - tests/test_pdk/test_settings_mmi2x2_nc_.yml | 5 - tests/test_pdk/test_settings_mmi2x2_no_.yml | 5 - tests/test_pdk/test_settings_mmi2x2_rc_.yml | 5 - tests/test_pdk/test_settings_mmi2x2_ro_.yml | 5 - tests/test_pdk/test_settings_mmi2x2_sc_.yml | 5 - tests/test_pdk/test_settings_mmi2x2_so_.yml | 5 - tests/test_pdk/test_settings_mzi_.yml | 31 - tests/test_pdk/test_settings_mzi_nc_.yml | 9 - tests/test_pdk/test_settings_mzi_no_.yml | 9 - tests/test_pdk/test_settings_mzi_rc_.yml | 9 - tests/test_pdk/test_settings_mzi_ro_.yml | 9 - tests/test_pdk/test_settings_mzi_sc_.yml | 9 - tests/test_pdk/test_settings_mzi_so_.yml | 9 - tests/test_pdk/test_settings_pad_.yml | 23 - tests/test_pdk/test_settings_rectangle_.yml | 21 - tests/test_pdk/test_settings_straight_.yml | 16 - tests/test_pdk/test_settings_straight_nc_.yml | 12 - tests/test_pdk/test_settings_straight_no_.yml | 12 - tests/test_pdk/test_settings_straight_rc_.yml | 12 - tests/test_pdk/test_settings_straight_ro_.yml | 12 - tests/test_pdk/test_settings_straight_sc_.yml | 12 - tests/test_pdk/test_settings_straight_so_.yml | 12 - tests/test_pdk/test_settings_taper_.yml | 20 - .../test_settings_taper_cross_section_.yml | 16 - tests/test_pdk/test_settings_taper_nc_.yml | 12 - tests/test_pdk/test_settings_taper_no_.yml | 12 - tests/test_pdk/test_settings_taper_rc_.yml | 12 - tests/test_pdk/test_settings_taper_ro_.yml | 12 - tests/test_pdk/test_settings_taper_sc_.yml | 12 - tests/test_pdk/test_settings_taper_so_.yml | 12 - .../test_pdk/test_settings_trans_sc_rc10_.yml | 11 - .../test_pdk/test_settings_trans_sc_rc20_.yml | 11 - .../test_pdk/test_settings_trans_sc_rc50_.yml | 11 - tests/test_pdk/test_settings_wire_corner_.yml | 8 - tests/{test_pdk.py => test_pdk_si220.py} | 9 +- tests/test_pdk_sin300.py | 40 + 324 files changed, 2087 insertions(+), 22669 deletions(-) create mode 100644 cspdk/si220/klayout/d25/Cornerstone_si220.lyd25 rename cspdk/si220/samples/{circuit_simulations.py => circuit_simulations_sc.py} (100%) rename cspdk/si220/samples/{circuit_simulations_with_routing.py => circuit_simulations_sc_with_routing.py} (100%) rename cspdk/si220/samples/{component_from_yaml.py => component_from_yaml_sc.py} (100%) create mode 100644 cspdk/si220/samples/get_route_sc.py create mode 100644 cspdk/sin300/__init__.py create mode 100644 cspdk/sin300/cells.py create mode 100644 cspdk/sin300/config.py create mode 100644 cspdk/sin300/gds/CORNERSTONE MPW SOI 220nm GDSII Template.gds create mode 100644 cspdk/sin300/gds/Cell0_Institution_Name.gds create mode 100644 cspdk/sin300/gds/Cell0_SOI220_Full_1550nm_Packaging_Template.gds create mode 100644 cspdk/sin300/gds/Cell0_SOI_Full_Institution_Name.gds create mode 100644 cspdk/sin300/gds/Cell0_SOI_Half_Institution_Name.gds create mode 100644 cspdk/sin300/gds/Flip_Chip_Bonding_Example.gds rename tests/gds_ref/heater.gds => cspdk/sin300/gds/Heater.gds (90%) create mode 100644 cspdk/sin300/gds/Layer_Designations.gds create mode 100644 cspdk/sin300/gds/SOI220nm_1310nm_TE_RIB_2x1_MMI.gds create mode 100644 cspdk/sin300/gds/SOI220nm_1310nm_TE_RIB_2x2_MMI.gds create mode 100644 cspdk/sin300/gds/SOI220nm_1310nm_TE_RIB_90_Degree_Bend.gds create mode 100644 cspdk/sin300/gds/SOI220nm_1310nm_TE_RIB_Grating_Coupler.gds create mode 100644 cspdk/sin300/gds/SOI220nm_1310nm_TE_RIB_Waveguide.gds create mode 100644 cspdk/sin300/gds/SOI220nm_1310nm_TE_RIB_Waveguide_Crossing.gds create mode 100644 cspdk/sin300/gds/SOI220nm_1310nm_TE_STRIP_2x1_MMI.gds create mode 100644 cspdk/sin300/gds/SOI220nm_1310nm_TE_STRIP_2x2_MMI.gds create mode 100644 cspdk/sin300/gds/SOI220nm_1310nm_TE_STRIP_90_Degree_Bend.gds create mode 100644 cspdk/sin300/gds/SOI220nm_1310nm_TE_STRIP_Grating_Coupler.gds create mode 100644 cspdk/sin300/gds/SOI220nm_1310nm_TE_STRIP_Waveguide.gds rename tests/gds_ref/crossing_so.gds => cspdk/sin300/gds/SOI220nm_1310nm_TE_STRIP_Waveguide_Crossing.gds (56%) create mode 100644 cspdk/sin300/gds/SOI220nm_1550nm_TE_RIB_2x1_MMI.gds create mode 100644 cspdk/sin300/gds/SOI220nm_1550nm_TE_RIB_2x2_MMI.gds create mode 100644 cspdk/sin300/gds/SOI220nm_1550nm_TE_RIB_90_Degree_Bend.gds create mode 100644 cspdk/sin300/gds/SOI220nm_1550nm_TE_RIB_Grating_Coupler.gds create mode 100644 cspdk/sin300/gds/SOI220nm_1550nm_TE_RIB_Waveguide.gds rename tests/gds_ref/crossing_rc.gds => cspdk/sin300/gds/SOI220nm_1550nm_TE_RIB_Waveguide_Crossing.gds (66%) create mode 100644 cspdk/sin300/gds/SOI220nm_1550nm_TE_STRIP_2x1_MMI.gds create mode 100644 cspdk/sin300/gds/SOI220nm_1550nm_TE_STRIP_2x2_MMI.gds create mode 100644 cspdk/sin300/gds/SOI220nm_1550nm_TE_STRIP_90_Degree_Bend.gds create mode 100644 cspdk/sin300/gds/SOI220nm_1550nm_TE_STRIP_Waveguide.gds rename tests/gds_ref/crossing_sc.gds => cspdk/sin300/gds/SOI220nm_1550nm_TE_STRIP_Waveguide_Crossing.gds (53%) rename cspdk/{si220 => sin300}/gds/SiN300nm_1310nm_TE_STRIP_2x1_MMI.gds (100%) rename cspdk/{si220 => sin300}/gds/SiN300nm_1310nm_TE_STRIP_2x2_MMI.gds (100%) rename cspdk/{si220 => sin300}/gds/SiN300nm_1310nm_TE_STRIP_90_Degr.gds (100%) rename cspdk/{si220 => sin300}/gds/SiN300nm_1310nm_TE_STRIP_Grating.gds (100%) rename cspdk/{si220 => sin300}/gds/SiN300nm_1310nm_TE_STRIP_Wavegui.gds (100%) rename cspdk/{si220 => sin300}/gds/SiN300nm_1550nm_TE_STRIP_2x1_MMI.gds (100%) rename cspdk/{si220 => sin300}/gds/SiN300nm_1550nm_TE_STRIP_2x2_MMI.gds (100%) rename cspdk/{si220 => sin300}/gds/SiN300nm_1550nm_TE_STRIP_90_Degr.gds (100%) rename cspdk/{si220 => sin300}/gds/SiN300nm_1550nm_TE_STRIP_Grating.gds (100%) rename cspdk/{si220 => sin300}/gds/SiN300nm_1550nm_TE_STRIP_Wavegui.gds (100%) create mode 100644 cspdk/sin300/import_pdk.py create mode 100644 cspdk/sin300/klayout/d25/Cornerstone.lyd25 create mode 100644 cspdk/sin300/klayout/d25/Cornerstone_sin300.lyd25 create mode 100644 cspdk/sin300/klayout/layers.lyp create mode 100644 cspdk/sin300/klayout/tech.lyt create mode 100644 cspdk/sin300/layers.yaml create mode 100644 cspdk/sin300/models.py create mode 100644 cspdk/sin300/samples/circuit_simulations_nc.py create mode 100644 cspdk/sin300/samples/circuit_simulations_nc_with_routing.py create mode 100644 cspdk/sin300/samples/component_from_yaml_nc.py rename cspdk/{si220/samples/get_route.py => sin300/samples/get_route_nc.py} (91%) rename cspdk/{si220 => sin300}/samples/mode_solver_n.py (100%) create mode 100644 cspdk/sin300/tech.py delete mode 100644 tests/gds_ref/_bend.gds delete mode 100644 tests/gds_ref/_gc_rectangular.gds delete mode 100644 tests/gds_ref/_mm1x2_nitride_cband.gds delete mode 100644 tests/gds_ref/_mm2x2_nitride_cband.gds delete mode 100644 tests/gds_ref/_mmi1x2.gds delete mode 100644 tests/gds_ref/_mmi1x2_nitride_oband.gds delete mode 100644 tests/gds_ref/_mmi2x2.gds delete mode 100644 tests/gds_ref/_mmi2x2_nitride_oband.gds delete mode 100644 tests/gds_ref/_straight.gds delete mode 100644 tests/gds_ref/_taper.gds delete mode 100644 tests/gds_ref/array.gds delete mode 100644 tests/gds_ref/bend_euler.gds delete mode 100644 tests/gds_ref/bend_nc.gds delete mode 100644 tests/gds_ref/bend_no.gds delete mode 100644 tests/gds_ref/bend_rc.gds delete mode 100644 tests/gds_ref/bend_ro.gds delete mode 100644 tests/gds_ref/bend_s.gds delete mode 100644 tests/gds_ref/bend_sc.gds delete mode 100644 tests/gds_ref/bend_so.gds delete mode 100644 tests/gds_ref/coupler_nc.gds delete mode 100644 tests/gds_ref/coupler_no.gds delete mode 100644 tests/gds_ref/coupler_rc.gds delete mode 100644 tests/gds_ref/coupler_ro.gds delete mode 100644 tests/gds_ref/coupler_sc.gds delete mode 100644 tests/gds_ref/coupler_so.gds delete mode 100644 tests/gds_ref/die_nc.gds delete mode 100644 tests/gds_ref/die_no.gds delete mode 100644 tests/gds_ref/die_rc.gds delete mode 100644 tests/gds_ref/die_ro.gds delete mode 100644 tests/gds_ref/die_sc.gds delete mode 100644 tests/gds_ref/die_so.gds delete mode 100644 tests/gds_ref/gc_elliptical_sc.gds delete mode 100644 tests/gds_ref/gc_elliptical_so.gds delete mode 100644 tests/gds_ref/gc_rectangular.gds delete mode 100644 tests/gds_ref/gc_rectangular_nc.gds delete mode 100644 tests/gds_ref/gc_rectangular_no.gds delete mode 100644 tests/gds_ref/gc_rectangular_rc.gds delete mode 100644 tests/gds_ref/gc_rectangular_ro.gds delete mode 100644 tests/gds_ref/gc_rectangular_sc.gds delete mode 100644 tests/gds_ref/gc_rectangular_so.gds delete mode 100644 tests/gds_ref/grating_coupler_array.gds delete mode 100644 tests/gds_ref/mmi1x2.gds delete mode 100644 tests/gds_ref/mmi1x2_nc.gds delete mode 100644 tests/gds_ref/mmi1x2_no.gds delete mode 100644 tests/gds_ref/mmi1x2_rc.gds delete mode 100644 tests/gds_ref/mmi1x2_ro.gds delete mode 100644 tests/gds_ref/mmi1x2_sc.gds delete mode 100644 tests/gds_ref/mmi1x2_so.gds delete mode 100644 tests/gds_ref/mmi2x2.gds delete mode 100644 tests/gds_ref/mmi2x2_nc.gds delete mode 100644 tests/gds_ref/mmi2x2_no.gds delete mode 100644 tests/gds_ref/mmi2x2_rc.gds delete mode 100644 tests/gds_ref/mmi2x2_ro.gds delete mode 100644 tests/gds_ref/mmi2x2_sc.gds delete mode 100644 tests/gds_ref/mmi2x2_so.gds delete mode 100644 tests/gds_ref/mzi.gds delete mode 100644 tests/gds_ref/mzi_nc.gds delete mode 100644 tests/gds_ref/mzi_no.gds delete mode 100644 tests/gds_ref/mzi_rc.gds delete mode 100644 tests/gds_ref/mzi_ro.gds delete mode 100644 tests/gds_ref/mzi_sc.gds delete mode 100644 tests/gds_ref/mzi_so.gds delete mode 100644 tests/gds_ref/pad.gds delete mode 100644 tests/gds_ref/rectangle.gds delete mode 100644 tests/gds_ref/straight.gds delete mode 100644 tests/gds_ref/straight_nc.gds delete mode 100644 tests/gds_ref/straight_no.gds delete mode 100644 tests/gds_ref/straight_rc.gds delete mode 100644 tests/gds_ref/straight_ro.gds delete mode 100644 tests/gds_ref/straight_sc.gds delete mode 100644 tests/gds_ref/straight_so.gds delete mode 100644 tests/gds_ref/taper.gds delete mode 100644 tests/gds_ref/taper_cross_section.gds delete mode 100644 tests/gds_ref/taper_nc.gds delete mode 100644 tests/gds_ref/taper_no.gds delete mode 100644 tests/gds_ref/taper_rc.gds delete mode 100644 tests/gds_ref/taper_ro.gds delete mode 100644 tests/gds_ref/taper_sc.gds delete mode 100644 tests/gds_ref/taper_so.gds delete mode 100644 tests/gds_ref/trans_sc_rc10.gds delete mode 100644 tests/gds_ref/trans_sc_rc20.gds delete mode 100644 tests/gds_ref/trans_sc_rc50.gds delete mode 100644 tests/gds_ref/wire_corner.gds delete mode 100644 tests/test_netlists/test_netlists__bend_.yml delete mode 100644 tests/test_netlists/test_netlists__straight_.yml delete mode 100644 tests/test_netlists/test_netlists__taper_.yml delete mode 100644 tests/test_netlists/test_netlists_array_.yml delete mode 100644 tests/test_netlists/test_netlists_bend_euler_.yml delete mode 100644 tests/test_netlists/test_netlists_bend_nc_.yml delete mode 100644 tests/test_netlists/test_netlists_bend_no_.yml delete mode 100644 tests/test_netlists/test_netlists_bend_rc_.yml delete mode 100644 tests/test_netlists/test_netlists_bend_ro_.yml delete mode 100644 tests/test_netlists/test_netlists_bend_s_.yml delete mode 100644 tests/test_netlists/test_netlists_bend_sc_.yml delete mode 100644 tests/test_netlists/test_netlists_bend_so_.yml delete mode 100644 tests/test_netlists/test_netlists_coupler_nc_.yml delete mode 100644 tests/test_netlists/test_netlists_coupler_no_.yml delete mode 100644 tests/test_netlists/test_netlists_coupler_rc_.yml delete mode 100644 tests/test_netlists/test_netlists_coupler_ro_.yml delete mode 100644 tests/test_netlists/test_netlists_coupler_sc_.yml delete mode 100644 tests/test_netlists/test_netlists_coupler_so_.yml delete mode 100644 tests/test_netlists/test_netlists_crossing_rc_.yml delete mode 100644 tests/test_netlists/test_netlists_crossing_sc_.yml delete mode 100644 tests/test_netlists/test_netlists_crossing_so_.yml delete mode 100644 tests/test_netlists/test_netlists_die_nc_.yml delete mode 100644 tests/test_netlists/test_netlists_die_no_.yml delete mode 100644 tests/test_netlists/test_netlists_die_rc_.yml delete mode 100644 tests/test_netlists/test_netlists_die_ro_.yml delete mode 100644 tests/test_netlists/test_netlists_die_sc_.yml delete mode 100644 tests/test_netlists/test_netlists_die_so_.yml delete mode 100644 tests/test_netlists/test_netlists_gc_elliptical_sc_.yml delete mode 100644 tests/test_netlists/test_netlists_gc_elliptical_so_.yml delete mode 100644 tests/test_netlists/test_netlists_gc_rectangular_.yml delete mode 100644 tests/test_netlists/test_netlists_gc_rectangular_nc_.yml delete mode 100644 tests/test_netlists/test_netlists_gc_rectangular_no_.yml delete mode 100644 tests/test_netlists/test_netlists_gc_rectangular_rc_.yml delete mode 100644 tests/test_netlists/test_netlists_gc_rectangular_ro_.yml delete mode 100644 tests/test_netlists/test_netlists_gc_rectangular_sc_.yml delete mode 100644 tests/test_netlists/test_netlists_gc_rectangular_so_.yml delete mode 100644 tests/test_netlists/test_netlists_grating_coupler_array_.yml delete mode 100644 tests/test_netlists/test_netlists_heater_.yml delete mode 100644 tests/test_netlists/test_netlists_mmi1x2_.yml delete mode 100644 tests/test_netlists/test_netlists_mmi1x2_nc_.yml delete mode 100644 tests/test_netlists/test_netlists_mmi1x2_no_.yml delete mode 100644 tests/test_netlists/test_netlists_mmi1x2_rc_.yml delete mode 100644 tests/test_netlists/test_netlists_mmi1x2_ro_.yml delete mode 100644 tests/test_netlists/test_netlists_mmi1x2_sc_.yml delete mode 100644 tests/test_netlists/test_netlists_mmi1x2_so_.yml delete mode 100644 tests/test_netlists/test_netlists_mmi2x2_.yml delete mode 100644 tests/test_netlists/test_netlists_mmi2x2_nc_.yml delete mode 100644 tests/test_netlists/test_netlists_mmi2x2_no_.yml delete mode 100644 tests/test_netlists/test_netlists_mmi2x2_rc_.yml delete mode 100644 tests/test_netlists/test_netlists_mmi2x2_ro_.yml delete mode 100644 tests/test_netlists/test_netlists_mmi2x2_sc_.yml delete mode 100644 tests/test_netlists/test_netlists_mmi2x2_so_.yml delete mode 100644 tests/test_netlists/test_netlists_mzi_.yml delete mode 100644 tests/test_netlists/test_netlists_mzi_nc_.yml delete mode 100644 tests/test_netlists/test_netlists_mzi_no_.yml delete mode 100644 tests/test_netlists/test_netlists_mzi_rc_.yml delete mode 100644 tests/test_netlists/test_netlists_mzi_ro_.yml delete mode 100644 tests/test_netlists/test_netlists_mzi_sc_.yml delete mode 100644 tests/test_netlists/test_netlists_mzi_so_.yml delete mode 100644 tests/test_netlists/test_netlists_pad_.yml delete mode 100644 tests/test_netlists/test_netlists_rectangle_.yml delete mode 100644 tests/test_netlists/test_netlists_straight_.yml delete mode 100644 tests/test_netlists/test_netlists_straight_nc_.yml delete mode 100644 tests/test_netlists/test_netlists_straight_no_.yml delete mode 100644 tests/test_netlists/test_netlists_straight_rc_.yml delete mode 100644 tests/test_netlists/test_netlists_straight_ro_.yml delete mode 100644 tests/test_netlists/test_netlists_straight_sc_.yml delete mode 100644 tests/test_netlists/test_netlists_straight_so_.yml delete mode 100644 tests/test_netlists/test_netlists_taper_.yml delete mode 100644 tests/test_netlists/test_netlists_taper_cross_section_.yml delete mode 100644 tests/test_netlists/test_netlists_taper_nc_.yml delete mode 100644 tests/test_netlists/test_netlists_taper_no_.yml delete mode 100644 tests/test_netlists/test_netlists_taper_rc_.yml delete mode 100644 tests/test_netlists/test_netlists_taper_ro_.yml delete mode 100644 tests/test_netlists/test_netlists_taper_sc_.yml delete mode 100644 tests/test_netlists/test_netlists_taper_so_.yml delete mode 100644 tests/test_netlists/test_netlists_trans_sc_rc10_.yml delete mode 100644 tests/test_netlists/test_netlists_trans_sc_rc20_.yml delete mode 100644 tests/test_netlists/test_netlists_trans_sc_rc50_.yml delete mode 100644 tests/test_netlists/test_netlists_wire_corner_.yml rename tests/{test_netlists.py => test_netlists_si220.py} (90%) create mode 100644 tests/test_netlists_sin300.py delete mode 100644 tests/test_pdk/test_settings__bend_.yml delete mode 100644 tests/test_pdk/test_settings__gc_rectangular_.yml delete mode 100644 tests/test_pdk/test_settings__mm1x2_nitride_cband_.yml delete mode 100644 tests/test_pdk/test_settings__mm2x2_nitride_cband_.yml delete mode 100644 tests/test_pdk/test_settings__mmi1x2_.yml delete mode 100644 tests/test_pdk/test_settings__mmi1x2_nitride_oband_.yml delete mode 100644 tests/test_pdk/test_settings__mmi2x2_.yml delete mode 100644 tests/test_pdk/test_settings__mmi2x2_nitride_oband_.yml delete mode 100644 tests/test_pdk/test_settings__straight_.yml delete mode 100644 tests/test_pdk/test_settings__taper_.yml delete mode 100644 tests/test_pdk/test_settings_array_.yml delete mode 100644 tests/test_pdk/test_settings_bend_euler_.yml delete mode 100644 tests/test_pdk/test_settings_bend_nc_.yml delete mode 100644 tests/test_pdk/test_settings_bend_no_.yml delete mode 100644 tests/test_pdk/test_settings_bend_rc_.yml delete mode 100644 tests/test_pdk/test_settings_bend_ro_.yml delete mode 100644 tests/test_pdk/test_settings_bend_s_.yml delete mode 100644 tests/test_pdk/test_settings_bend_sc_.yml delete mode 100644 tests/test_pdk/test_settings_bend_so_.yml delete mode 100644 tests/test_pdk/test_settings_coupler_nc_.yml delete mode 100644 tests/test_pdk/test_settings_coupler_no_.yml delete mode 100644 tests/test_pdk/test_settings_coupler_rc_.yml delete mode 100644 tests/test_pdk/test_settings_coupler_ro_.yml delete mode 100644 tests/test_pdk/test_settings_coupler_sc_.yml delete mode 100644 tests/test_pdk/test_settings_coupler_so_.yml delete mode 100644 tests/test_pdk/test_settings_crossing_rc_.yml delete mode 100644 tests/test_pdk/test_settings_crossing_sc_.yml delete mode 100644 tests/test_pdk/test_settings_crossing_so_.yml delete mode 100644 tests/test_pdk/test_settings_die_nc_.yml delete mode 100644 tests/test_pdk/test_settings_die_no_.yml delete mode 100644 tests/test_pdk/test_settings_die_rc_.yml delete mode 100644 tests/test_pdk/test_settings_die_ro_.yml delete mode 100644 tests/test_pdk/test_settings_die_sc_.yml delete mode 100644 tests/test_pdk/test_settings_die_so_.yml delete mode 100644 tests/test_pdk/test_settings_gc_elliptical_sc_.yml delete mode 100644 tests/test_pdk/test_settings_gc_elliptical_so_.yml delete mode 100644 tests/test_pdk/test_settings_gc_rectangular_.yml delete mode 100644 tests/test_pdk/test_settings_gc_rectangular_nc_.yml delete mode 100644 tests/test_pdk/test_settings_gc_rectangular_no_.yml delete mode 100644 tests/test_pdk/test_settings_gc_rectangular_rc_.yml delete mode 100644 tests/test_pdk/test_settings_gc_rectangular_ro_.yml delete mode 100644 tests/test_pdk/test_settings_gc_rectangular_sc_.yml delete mode 100644 tests/test_pdk/test_settings_gc_rectangular_so_.yml delete mode 100644 tests/test_pdk/test_settings_grating_coupler_array_.yml delete mode 100644 tests/test_pdk/test_settings_heater_.yml delete mode 100644 tests/test_pdk/test_settings_mmi1x2_.yml delete mode 100644 tests/test_pdk/test_settings_mmi1x2_nc_.yml delete mode 100644 tests/test_pdk/test_settings_mmi1x2_no_.yml delete mode 100644 tests/test_pdk/test_settings_mmi1x2_rc_.yml delete mode 100644 tests/test_pdk/test_settings_mmi1x2_ro_.yml delete mode 100644 tests/test_pdk/test_settings_mmi1x2_sc_.yml delete mode 100644 tests/test_pdk/test_settings_mmi1x2_so_.yml delete mode 100644 tests/test_pdk/test_settings_mmi2x2_.yml delete mode 100644 tests/test_pdk/test_settings_mmi2x2_nc_.yml delete mode 100644 tests/test_pdk/test_settings_mmi2x2_no_.yml delete mode 100644 tests/test_pdk/test_settings_mmi2x2_rc_.yml delete mode 100644 tests/test_pdk/test_settings_mmi2x2_ro_.yml delete mode 100644 tests/test_pdk/test_settings_mmi2x2_sc_.yml delete mode 100644 tests/test_pdk/test_settings_mmi2x2_so_.yml delete mode 100644 tests/test_pdk/test_settings_mzi_.yml delete mode 100644 tests/test_pdk/test_settings_mzi_nc_.yml delete mode 100644 tests/test_pdk/test_settings_mzi_no_.yml delete mode 100644 tests/test_pdk/test_settings_mzi_rc_.yml delete mode 100644 tests/test_pdk/test_settings_mzi_ro_.yml delete mode 100644 tests/test_pdk/test_settings_mzi_sc_.yml delete mode 100644 tests/test_pdk/test_settings_mzi_so_.yml delete mode 100644 tests/test_pdk/test_settings_pad_.yml delete mode 100644 tests/test_pdk/test_settings_rectangle_.yml delete mode 100644 tests/test_pdk/test_settings_straight_.yml delete mode 100644 tests/test_pdk/test_settings_straight_nc_.yml delete mode 100644 tests/test_pdk/test_settings_straight_no_.yml delete mode 100644 tests/test_pdk/test_settings_straight_rc_.yml delete mode 100644 tests/test_pdk/test_settings_straight_ro_.yml delete mode 100644 tests/test_pdk/test_settings_straight_sc_.yml delete mode 100644 tests/test_pdk/test_settings_straight_so_.yml delete mode 100644 tests/test_pdk/test_settings_taper_.yml delete mode 100644 tests/test_pdk/test_settings_taper_cross_section_.yml delete mode 100644 tests/test_pdk/test_settings_taper_nc_.yml delete mode 100644 tests/test_pdk/test_settings_taper_no_.yml delete mode 100644 tests/test_pdk/test_settings_taper_rc_.yml delete mode 100644 tests/test_pdk/test_settings_taper_ro_.yml delete mode 100644 tests/test_pdk/test_settings_taper_sc_.yml delete mode 100644 tests/test_pdk/test_settings_taper_so_.yml delete mode 100644 tests/test_pdk/test_settings_trans_sc_rc10_.yml delete mode 100644 tests/test_pdk/test_settings_trans_sc_rc20_.yml delete mode 100644 tests/test_pdk/test_settings_trans_sc_rc50_.yml delete mode 100644 tests/test_pdk/test_settings_wire_corner_.yml rename tests/{test_pdk.py => test_pdk_si220.py} (80%) create mode 100644 tests/test_pdk_sin300.py diff --git a/cspdk/si220/__init__.py b/cspdk/si220/__init__.py index f6a468a..ec51e8b 100644 --- a/cspdk/si220/__init__.py +++ b/cspdk/si220/__init__.py @@ -19,7 +19,7 @@ ) _cross_sections = get_cross_sections(tech) PDK = Pdk( - name="cornerstone", + name="cornerstone_si220", cells=_cells, cross_sections=_cross_sections, layers=dict(LAYER), diff --git a/cspdk/si220/cells.py b/cspdk/si220/cells.py index 0ec2d81..c05d854 100644 --- a/cspdk/si220/cells.py +++ b/cspdk/si220/cells.py @@ -5,7 +5,7 @@ from gdsfactory.typings import ComponentSpec, CrossSectionSpec, LayerSpec from cspdk.si220.config import PATH -from cspdk.si220.tech import LAYER, xs_nc, xs_no, xs_rc, xs_ro, xs_sc, xs_so +from cspdk.si220.tech import LAYER, xs_rc, xs_ro, xs_sc, xs_so ################ # Straights @@ -95,42 +95,6 @@ def straight_ro(length: float = 10.0, **kwargs) -> gf.Component: ) -@gf.cell -def straight_nc(length: float = 10.0, **kwargs) -> gf.Component: - """Straight waveguide in nitride, c-band. - - Args: - length (float, optional): The length of the waveguide. Defaults to 10.0. - - Returns: - gf.Component: the component - """ - if "cross_section" not in kwargs: - kwargs["cross_section"] = "xs_nc" - return _straight( - length=length, - **kwargs, - ) - - -@gf.cell -def straight_no(length: float = 10.0, **kwargs) -> gf.Component: - """Straight waveguide in nitride, o-band. - - Args: - length (float, optional): The length of the waveguide. Defaults to 10.0. - - Returns: - gf.Component: the component - """ - if "cross_section" not in kwargs: - kwargs["cross_section"] = "xs_no" - return _straight( - length=length, - **kwargs, - ) - - ################ # Bends ################ @@ -286,50 +250,6 @@ def bend_ro( ) -@gf.cell -def bend_nc( - radius: float = _float(xs_nc.radius), angle: float = 90.0, **kwargs -) -> gf.Component: - """An euler bend in nitride, c-band. - - Args: - radius (float, optional): the radius of the bend. Defaults to the PDK's default value for that cross-section. - angle (float, optional): the angle of the bend. Defaults to 90.0. - - Returns: - gf.Component: the component - """ - if "cross_section" not in kwargs: - kwargs["cross_section"] = "xs_nc" - return _bend( - radius=radius, - angle=angle, - **kwargs, - ) - - -@gf.cell -def bend_no( - radius: float = _float(xs_no.radius), angle: float = 90.0, **kwargs -) -> gf.Component: - """An euler bend in nitride, o-band. - - Args: - radius (float, optional): the radius of the bend. Defaults to the PDK's default value for that cross-section. - angle (float, optional): the angle of the bend. Defaults to 90.0. - - Returns: - gf.Component: the component - """ - if "cross_section" not in kwargs: - kwargs["cross_section"] = "xs_no" - return _bend( - radius=radius, - angle=angle, - **kwargs, - ) - - ################ # Transitions ################ @@ -450,54 +370,6 @@ def taper_ro( return _taper(length=length, width1=width1, width2=width2, port=port, **kwargs) -@gf.cell -def taper_nc( - length: float = 10.0, - width1: float = 0.5, - width2: float | None = None, - port: gf.Port | None = None, - **kwargs, -) -> gf.Component: - """A width taper in nitride, c-band. - - Args: - length (float, optional): the length of the taper, in um. Defaults to 10.0. - width1 (float, optional): the width of the taper input, in um. Defaults to 0.5. - width2 (float | None, optional): the width of the taper output, in um. Defaults to None. - port (gf.Port | None, optional): if given, starts from the port's width and transitions to width1. Defaults to None. - - Returns: - gf.Component: the component - """ - if "cross_section" not in kwargs: - kwargs["cross_section"] = "xs_nc" - return _taper(length=length, width1=width1, width2=width2, port=port, **kwargs) - - -@gf.cell -def taper_no( - length: float = 10.0, - width1: float = 0.5, - width2: float | None = None, - port: gf.Port | None = None, - **kwargs, -) -> gf.Component: - """A width taper in nitride, o-band. - - Args: - length (float, optional): the length of the taper, in um. Defaults to 10.0. - width1 (float, optional): the width of the taper input, in um. Defaults to 0.5. - width2 (float | None, optional): the width of the taper output, in um. Defaults to None. - port (gf.Port | None, optional): if given, starts from the port's width and transitions to width1. Defaults to None. - - Returns: - gf.Component: the component - """ - if "cross_section" not in kwargs: - kwargs["cross_section"] = "xs_no" - return _taper(length=length, width1=width1, width2=width2, port=port, **kwargs) - - @gf.cell def _taper_cross_section( length: float = 10, @@ -746,92 +618,6 @@ def mmi2x2_so(**kwargs) -> gf.Component: ) -################ -# Nitride MMIs oband -################ - - -@gf.cell -def mmi1x2_no(**kwargs) -> gf.Component: - """A 1x2 MMI in nitride, o-band. - - Returns: - gf.Component: the component - """ - if "cross_section" not in kwargs: - kwargs["cross_section"] = "xs_no" - return _mmi1x2( - width_mmi=12.0, - length_taper=50.0, - width_taper=5.5, - gap_mmi=0.4, - length_mmi=42.0, - **kwargs, - ) - - -@gf.cell -def mmi2x2_no(**kwargs) -> gf.Component: - """A 2x2 MMI in nitride, o-band. - - Returns: - gf.Component: the component - """ - if "cross_section" not in kwargs: - kwargs["cross_section"] = "xs_no" - return _mmi2x2( - width_mmi=12.0, - length_taper=50.0, - width_taper=5.5, - gap_mmi=0.4, - length_mmi=126.0, - **kwargs, - ) - - -################ -# Nitride MMIs cband -################ - - -@gf.cell -def mmi1x2_nc(**kwargs) -> gf.Component: - """A 1x2 MMI in nitride, c-band. - - Returns: - gf.Component: the component - """ - if "cross_section" not in kwargs: - kwargs["cross_section"] = "xs_nc" - return _mmi1x2( - width_mmi=12.0, - length_taper=50.0, - width_taper=5.5, - gap_mmi=0.4, - length_mmi=64.7, - **kwargs, - ) - - -@gf.cell -def mmi2x2_nc(**kwargs) -> gf.Component: - """A 2x2 MMI in nitride, c-band. - - Returns: - gf.Component: the component - """ - if "cross_section" not in kwargs: - kwargs["cross_section"] = "xs_nc" - return _mmi2x2( - width_mmi=12.0, - length_taper=50.0, - width_taper=5.5, - gap_mmi=0.4, - length_mmi=232.0, - **kwargs, - ) - - ############################## # Evanescent couplers ############################## @@ -1010,66 +796,6 @@ def coupler_ro( ) -@gf.cell -def coupler_nc( - gap: float = 0.4, - length: float = 20.0, - dx: float = 10.0, - dy: float = 4.0, - **kwargs, -) -> gf.Component: - """A symmetric coupler in nitride, c-band. - - Args: - gap (float, optional): the coupling gap, in um. Defaults to 0.4. - length (float, optional): the length of the coupling section, in um. Defaults to 20.0. - dx (float, optional): the port-to-port horizontal spacing. Defaults to 10.0. - dy (float, optional): the port-to-port vertical spacing. Defaults to 4.0. - - Returns: - gf.Component: the component - """ - if "cross_section" not in kwargs: - kwargs["cross_section"] = "xs_nc" - return _coupler( - gap=gap, - length=length, - dx=dx, - dy=dy, - **kwargs, - ) - - -@gf.cell -def coupler_no( - gap: float = 0.4, - length: float = 20.0, - dx: float = 10.0, - dy: float = 4.0, - **kwargs, -) -> gf.Component: - """A symmetric coupler in nitride, o-band. - - Args: - gap (float, optional): the coupling gap, in um. Defaults to 0.4. - length (float, optional): the length of the coupling section, in um. Defaults to 20.0. - dx (float, optional): the port-to-port horizontal spacing. Defaults to 10.0. - dy (float, optional): the port-to-port vertical spacing. Defaults to 4.0. - - Returns: - gf.Component: the component - """ - if "cross_section" not in kwargs: - kwargs["cross_section"] = "xs_no" - return _coupler( - gap=gap, - length=length, - dx=dx, - dy=dy, - **kwargs, - ) - - ############################## # grating couplers Rectangular ############################## @@ -1168,42 +894,6 @@ def gc_rectangular_rc() -> gf.Component: ) -@gf.cell -def gc_rectangular_nc() -> gf.Component: - """A rectangular grating coupler in nitride, c-band. - - Returns: - gf.Component: the component - """ - return _gc_rectangular( - period=0.66, - cross_section="xs_nc", - length_taper=200, - fiber_angle=20, - layer_grating=LAYER.NITRIDE_ETCH, - layer_slab=LAYER.NITRIDE, - slab_offset=0, - ) - - -@gf.cell -def gc_rectangular_no() -> gf.Component: - """A rectangular grating coupler in nitride, o-band. - - Returns: - gf.Component: the component - """ - return _gc_rectangular( - period=0.964, - cross_section="xs_no", - length_taper=200, - fiber_angle=20, - layer_grating=LAYER.NITRIDE_ETCH, - layer_slab=LAYER.NITRIDE, - slab_offset=0, - ) - - ############################## # grating couplers elliptical ############################## @@ -1479,74 +1169,6 @@ def mzi_ro( ) -@gf.cell -def mzi_nc( - delta_length: float = 10.0, - length_y: float = 2.0, - length_x: float = 0.1, - add_electrical_ports_bot: bool = True, - **kwargs, -) -> gf.Component: - """A Mach-Zehnder Interferometer (MZI) in nitride, c-band. - - Args: - delta_length (float, optional): the length differential between the two arms. Defaults to 10.0. - length_y (float, optional): the common vertical length, in um. Defaults to 2.0. - length_x (float, optional): the common horizontal length, in um. Defaults to 0.1. - add_electrical_ports_bot (bool, optional): if true, adds electrical ports to the bottom. Defaults to True. - - Returns: - gf.Component: the component - """ - if "cross_section" not in kwargs: - kwargs["cross_section"] = "xs_nc" - return _mzi( - delta_length=delta_length, - length_y=length_y, - length_x=length_x, - add_electrical_ports_bot=add_electrical_ports_bot, - straight=straight_nc, - bend=bend_nc, - combiner=mmi1x2_nc, - splitter=mmi1x2_nc, - **kwargs, - ) - - -@gf.cell -def mzi_no( - delta_length: float = 10.0, - length_y: float = 2.0, - length_x: float = 0.1, - add_electrical_ports_bot: bool = True, - **kwargs, -) -> gf.Component: - """A Mach-Zehnder Interferometer (MZI) in nitride, o-band. - - Args: - delta_length (float, optional): the length differential between the two arms. Defaults to 10.0. - length_y (float, optional): the common vertical length, in um. Defaults to 2.0. - length_x (float, optional): the common horizontal length, in um. Defaults to 0.1. - add_electrical_ports_bot (bool, optional): if true, adds electrical ports to the bottom. Defaults to True. - - Returns: - gf.Component: the component - """ - if "cross_section" not in kwargs: - kwargs["cross_section"] = "xs_no" - return _mzi( - delta_length=delta_length, - length_y=length_y, - length_x=length_x, - add_electrical_ports_bot=add_electrical_ports_bot, - bend=bend_no, - straight=straight_no, - combiner=mmi1x2_no, - splitter=mmi1x2_no, - **kwargs, - ) - - ################ # Packaging ################ @@ -1628,8 +1250,8 @@ def grating_coupler_array( with_loopback: bool = False, bend: ComponentSpec = _bend, grating_coupler_spacing: float = 0.0, - grating_coupler: ComponentSpec = gc_rectangular_nc, - cross_section: CrossSectionSpec = "xs_nc", + grating_coupler: ComponentSpec = gc_rectangular_sc, + cross_section: CrossSectionSpec = "xs_sc", ) -> gf.Component: """An array of grating couplers. @@ -1641,8 +1263,8 @@ def grating_coupler_array( with_loopback (bool, optional): if True, adds a loopback. Defaults to False. bend (ComponentSpec, optional): the bend to be used for the loopback. Defaults to _bend. grating_coupler_spacing (float, optional): the spacing to be used in the loopback. Defaults to 0.0. - grating_coupler (ComponentSpec, optional): the grating coupler component to use. Defaults to gc_rectangular_nc. - cross_section (CrossSectionSpec, optional): the cross section to be used for routing in the loopback. Defaults to "xs_nc". + grating_coupler (ComponentSpec, optional): the grating coupler component to use. + cross_section (CrossSectionSpec, optional): the cross section to be used for routing in the loopback. Returns: gf.Component: the component @@ -1667,8 +1289,8 @@ def _die( npads: int = 31, grating_pitch: float = 250.0, pad_pitch: float = 300.0, - grating_coupler: ComponentSpec = gc_rectangular_nc, - cross_section: CrossSectionSpec = "xs_nc", + grating_coupler: ComponentSpec = gc_rectangular_sc, + cross_section: CrossSectionSpec = "xs_sc", pad: ComponentSpec = pad, ) -> gf.Component: c = gf.Component() @@ -1726,32 +1348,6 @@ def _die( return c -@gf.cell -def die_nc() -> gf.Component: - """The standard die template for nitride, c-band. This has 24 grating couplers, split evenly between the left and right sides of the chip and 62 electrical pads split between the top and bottom. - - Returns: - gf.Component: the component - """ - return _die( - grating_coupler=gc_rectangular_nc, - cross_section="xs_nc", - ) - - -@gf.cell -def die_no() -> gf.Component: - """The standard die template for nitride, o-band. This has 24 grating couplers, split evenly between the left and right sides of the chip and 62 electrical pads split between the top and bottom. - - Returns: - gf.Component: the component - """ - return _die( - grating_coupler=gc_rectangular_no, - cross_section="xs_no", - ) - - @gf.cell def die_sc() -> gf.Component: """The standard die template for strip, c-band. This has 24 grating couplers, split evenly between the left and right sides of the chip and 62 electrical pads split between the top and bottom. diff --git a/cspdk/si220/import_pdk.py b/cspdk/si220/import_pdk.py index d582cc2..2e3ad07 100644 --- a/cspdk/si220/import_pdk.py +++ b/cspdk/si220/import_pdk.py @@ -3,4 +3,4 @@ import gdsfactory as gf if __name__ == "__main__": - print(gf.write_cells.get_import_gds_script("gds", module="cspdk.cells")) + print(gf.write_cells.get_import_gds_script("gds", module="cspdk.si220.cells")) diff --git a/cspdk/si220/klayout/d25/Cornerstone_si220.lyd25 b/cspdk/si220/klayout/d25/Cornerstone_si220.lyd25 new file mode 100644 index 0000000..2796a20 --- /dev/null +++ b/cspdk/si220/klayout/d25/Cornerstone_si220.lyd25 @@ -0,0 +1,34 @@ + + + + + d25 + + + + false + false + 0 + + true + d25_scripts + tools_menu.d25.end + dsl + d25-dsl-xml + + +core = input(3, 0) +slab = input(5, 0) +heater = input(39, 0) +metal = input(41, 0) + + + +z(core, zstart: 0.0, zstop: 0.2, name: 'core: si 3/0', ) +z(slab, zstart: 0.0, zstop: 0.1, name: 'slab: si 5/0', ) +z(heater, zstart: 1.1, zstop: 1.8, name: 'heater: TiN 39/0', ) +z(metal, zstart: 1.8, zstop: 2.5, name: 'metal: Aluminum 41/0', ) + + + + diff --git a/cspdk/si220/klayout/layers.lyp b/cspdk/si220/klayout/layers.lyp index 811824a..8f5bfae 100644 --- a/cspdk/si220/klayout/layers.lyp +++ b/cspdk/si220/klayout/layers.lyp @@ -68,40 +68,6 @@ GRA 6/0 6/0@1 - - #ffa500 - #ffa500 - 0 - 0 - I3 - - true - true - false - - false - false - 0 - NITRIDE 203/0 - 203/0@1 - - - #0000ff - #0000ff - 0 - 0 - I3 - - true - true - true - 1 - false - false - 0 - NITRIDE_ETCH 204/0 - 204/0@1 - #ebc634 #ebc634 diff --git a/cspdk/si220/klayout/tech.lyt b/cspdk/si220/klayout/tech.lyt index 35c2b1b..79e6616 100644 --- a/cspdk/si220/klayout/tech.lyt +++ b/cspdk/si220/klayout/tech.lyt @@ -1,6 +1,6 @@ - Cornerstone + Cornerstone_si220 0.001 @@ -156,7 +156,7 @@ HEATER,HEATER,PAD - PAD='41/0' HEATER='39/0' + PAD='41/0' diff --git a/cspdk/si220/layers.yaml b/cspdk/si220/layers.yaml index 848c959..ef535ea 100644 --- a/cspdk/si220/layers.yaml +++ b/cspdk/si220/layers.yaml @@ -25,18 +25,6 @@ LayerViews: transparent: true width: 1 color: "blue" - NITRIDE: - layer: [203, 0] - layer_in_name: true - color: "orange" - hatch_pattern: coarsely dotted - NITRIDE_ETCH: - layer: [204, 0] - layer_in_name: true - hatch_pattern: coarsely dotted - transparent: true - width: 1 - color: "blue" HEATER: layer: [39, 0] layer_in_name: true diff --git a/cspdk/si220/samples/circuit_simulations.py b/cspdk/si220/samples/circuit_simulations_sc.py similarity index 100% rename from cspdk/si220/samples/circuit_simulations.py rename to cspdk/si220/samples/circuit_simulations_sc.py diff --git a/cspdk/si220/samples/circuit_simulations_with_routing.py b/cspdk/si220/samples/circuit_simulations_sc_with_routing.py similarity index 100% rename from cspdk/si220/samples/circuit_simulations_with_routing.py rename to cspdk/si220/samples/circuit_simulations_sc_with_routing.py diff --git a/cspdk/si220/samples/component_from_yaml.py b/cspdk/si220/samples/component_from_yaml_sc.py similarity index 100% rename from cspdk/si220/samples/component_from_yaml.py rename to cspdk/si220/samples/component_from_yaml_sc.py diff --git a/cspdk/si220/samples/get_route_sc.py b/cspdk/si220/samples/get_route_sc.py new file mode 100644 index 0000000..6343354 --- /dev/null +++ b/cspdk/si220/samples/get_route_sc.py @@ -0,0 +1,18 @@ +"""`get_route` returns a Manhattan route between two ports. """ + +import gdsfactory as gf + +from cspdk.si220 import cells, tech + +if __name__ == "__main__": + c = gf.Component("sample_connect") + mmi1 = c << cells.mmi1x2_sc() + mmi2 = c << cells.mmi1x2_sc() + mmi2.move((500, 50)) + + route = tech.get_route_sc( + mmi1.ports["o3"], + mmi2.ports["o1"], + ) + c.add(route.references) + c.show() diff --git a/cspdk/si220/tech.py b/cspdk/si220/tech.py index a146a18..a46271c 100644 --- a/cspdk/si220/tech.py +++ b/cspdk/si220/tech.py @@ -22,8 +22,6 @@ class LayerMapCornerstone(LayerMap): GRA: Layer = (6, 0) LBL: Layer = (100, 0) PAD: Layer = (41, 0) - NITRIDE: Layer = (203, 0) - NITRIDE_ETCH: Layer = (204, 0) # labels for gdsfactory LABEL_SETTINGS: Layer = (100, 0) @@ -36,7 +34,6 @@ class LayerMapCornerstone(LayerMap): def get_layer_stack( thickness_wg: float = 220 * nm, thickness_slab: float = 100 * nm, - thickness_nitride: float = 300 * nm, zmin_heater: float = 1.1, thickness_heater: float = 700 * nm, zmin_metal: float = 1.1, @@ -48,7 +45,7 @@ def get_layer_stack( Args: thickness_wg: waveguide thickness in um. - thickness_nitride: nitride thickness in um. + thickness_slab: slab thickness in um. zmin_heater: TiN heater. thickness_heater: TiN thickness. zmin_metal: metal thickness in um. @@ -75,24 +72,6 @@ def get_layer_stack( sidewall_angle=10, width_to_z=0.5, ), - nitride=LayerLevel( - layer=LAYER.NITRIDE, - thickness=thickness_nitride, - zmin=0.0, - material="sin", - info={"mesh_order": 2}, - sidewall_angle=10, - width_to_z=0.5, - ), - nitride_etch=LayerLevel( - layer=LAYER.NITRIDE_ETCH, - thickness=thickness_nitride, - zmin=0.0, - material="sin", - info={"mesh_order": 1}, - sidewall_angle=10, - width_to_z=0.5, - ), heater=LayerLevel( layer=LAYER.HEATER, thickness=thickness_heater, @@ -133,10 +112,6 @@ def get_layer_stack( radius_min=25, ) xf_ro = partial(xf_rc, width=0.40) - -xf_nc = partial(gf.cross_section.strip, layer=LAYER.NITRIDE, width=1.20, radius=25) -xf_no = partial(gf.cross_section.strip, layer=LAYER.NITRIDE, width=0.95, radius=25) - xf_rc_tip = partial( gf.cross_section.strip, sections=(gf.Section(width=0.2, layer="SLAB", name="slab"),), @@ -168,8 +143,6 @@ def get_layer_stack( xs_rc = xf_rc() xs_so = xf_so() xs_ro = xf_ro() -xs_nc = xf_nc() -xs_no = xf_no() xs_rc_tip = xf_rc_tip() xs_sc_heater_metal = xf_sc_heater_metal() @@ -194,20 +167,11 @@ def get_layer_stack( _settings_ro = dict( straight="straight_ro", cross_section=xs_ro, bend="bend_ro", taper="taper_ro" ) -_settings_nc = dict( - straight="straight_nc", cross_section=xs_nc, bend="bend_nc", taper="taper_nc" -) -_settings_no = dict( - straight="straight_no", cross_section=xs_no, bend="bend_no", taper="taper_no" -) - get_route_sc = partial(gf.routing.get_route, **_settings_sc) get_route_so = partial(gf.routing.get_route, **_settings_so) get_route_rc = partial(gf.routing.get_route, **_settings_rc) get_route_ro = partial(gf.routing.get_route, **_settings_ro) -get_route_nc = partial(gf.routing.get_route, **_settings_nc) -get_route_no = partial(gf.routing.get_route, **_settings_no) get_route_from_steps_sc = partial( gf.routing.get_route_from_steps, @@ -225,22 +189,11 @@ def get_layer_stack( gf.routing.get_route_from_steps, **_settings_ro, ) -get_route_from_steps_nc = partial( - gf.routing.get_route_from_steps, - **_settings_nc, -) -get_route_from_steps_no = partial( - gf.routing.get_route_from_steps, - **_settings_no, -) - get_bundle_sc = partial(gf.routing.get_bundle, **_settings_sc) get_bundle_so = partial(gf.routing.get_bundle, **_settings_so) get_bundle_rc = partial(gf.routing.get_bundle, **_settings_rc) get_bundle_ro = partial(gf.routing.get_bundle, **_settings_ro) -get_bundle_nc = partial(gf.routing.get_bundle, **_settings_nc) -get_bundle_no = partial(gf.routing.get_bundle, **_settings_no) get_bundle_from_steps_sc = partial( gf.routing.get_bundle_from_steps, @@ -258,14 +211,6 @@ def get_layer_stack( gf.routing.get_bundle_from_steps, **_settings_ro, ) -get_bundle_from_steps_nc = partial( - gf.routing.get_bundle_from_steps, - **_settings_nc, -) -get_bundle_from_steps_no = partial( - gf.routing.get_bundle_from_steps, - **_settings_no, -) routing_strategies = dict( @@ -273,26 +218,18 @@ def get_layer_stack( get_route_so=get_route_so, get_route_rc=get_route_rc, get_route_ro=get_route_ro, - get_route_nc=get_route_nc, - get_route_no=get_route_no, get_route_from_steps_sc=get_route_from_steps_sc, get_route_from_steps_so=get_route_from_steps_so, get_route_from_steps_rc=get_route_from_steps_rc, get_route_from_steps_ro=get_route_from_steps_ro, - get_route_from_steps_nc=get_route_from_steps_nc, - get_route_from_steps_no=get_route_from_steps_no, get_bundle_sc=get_bundle_sc, get_bundle_so=get_bundle_so, get_bundle_rc=get_bundle_rc, get_bundle_ro=get_bundle_ro, - get_bundle_nc=get_bundle_nc, - get_bundle_no=get_bundle_no, get_bundle_from_steps_sc=get_bundle_from_steps_sc, get_bundle_from_steps_so=get_bundle_from_steps_so, get_bundle_from_steps_rc=get_bundle_from_steps_rc, get_bundle_from_steps_ro=get_bundle_from_steps_ro, - get_bundle_from_steps_nc=get_bundle_from_steps_nc, - get_bundle_from_steps_no=get_bundle_from_steps_no, ) @@ -305,7 +242,7 @@ def get_layer_stack( connectivity = cast(list[ConnectivitySpec], [("HEATER", "HEATER", "PAD")]) t = KLayoutTechnology( - name="Cornerstone", + name="Cornerstone_si220", layer_map=dict(LAYER), layer_views=LAYER_VIEWS, layer_stack=LAYER_STACK, @@ -315,4 +252,3 @@ def get_layer_stack( if __name__ == "__main__": print(xs_rc.sections) - print(type(LAYER.NITRIDE), LAYER.NITRIDE) diff --git a/cspdk/sin300/__init__.py b/cspdk/sin300/__init__.py new file mode 100644 index 0000000..8a39aac --- /dev/null +++ b/cspdk/sin300/__init__.py @@ -0,0 +1,42 @@ +from gdsfactory.cross_section import get_cross_sections +from gdsfactory.get_factories import get_cells +from gdsfactory.pdk import Pdk + +from cspdk.sin300 import cells, config, tech +from cspdk.sin300.cells import _bend, _straight, _taper +from cspdk.sin300.config import PATH +from cspdk.sin300.models import get_models +from cspdk.sin300.tech import LAYER, LAYER_STACK, LAYER_VIEWS, routing_strategies + +_models = get_models() +_cells = get_cells(cells) +_cells.update( + { + "_straight": _straight, + "_bend": _bend, + "_taper": _taper, + } +) +_cross_sections = get_cross_sections(tech) +PDK = Pdk( + name="cornerstone_sin300", + cells=_cells, + cross_sections=_cross_sections, + layers=dict(LAYER), + layer_stack=LAYER_STACK, + layer_views=LAYER_VIEWS, + models=_models, + routing_strategies=routing_strategies, +) +PDK.activate() + +__all__ = [ + "LAYER", + "LAYER_STACK", + "LAYER_VIEWS", + "PATH", + "cells", + "config", + "tech", +] +__version__ = "0.7.0" diff --git a/cspdk/sin300/cells.py b/cspdk/sin300/cells.py new file mode 100644 index 0000000..5da39e7 --- /dev/null +++ b/cspdk/sin300/cells.py @@ -0,0 +1,1005 @@ +from functools import partial +from typing import Any + +import gdsfactory as gf +from gdsfactory.typings import ComponentSpec, CrossSectionSpec, LayerSpec + +from cspdk.sin300.config import PATH +from cspdk.sin300.tech import LAYER, xs_nc, xs_no + +################ +# Straights +################ + + +@gf.cell +def _straight( + length: float = 10.0, + cross_section: CrossSectionSpec = "xs_nc", +) -> gf.Component: + return gf.components.straight( + length=length, + cross_section=cross_section, + ) + + +@gf.cell +def straight_nc(length: float = 10.0, **kwargs) -> gf.Component: + """Straight waveguide in nitride, c-band. + + Args: + length (float, optional): The length of the waveguide. Defaults to 10.0. + + Returns: + gf.Component: the component + """ + if "cross_section" not in kwargs: + kwargs["cross_section"] = "xs_nc" + return _straight( + length=length, + **kwargs, + ) + + +@gf.cell +def straight_no(length: float = 10.0, **kwargs) -> gf.Component: + """Straight waveguide in nitride, o-band. + + Args: + length (float, optional): The length of the waveguide. Defaults to 10.0. + + Returns: + gf.Component: the component + """ + if "cross_section" not in kwargs: + kwargs["cross_section"] = "xs_no" + return _straight( + length=length, + **kwargs, + ) + + +################ +# Bends +################ + + +@gf.cell +def bend_s( + size: tuple[float, float] = (11.0, 1.8), + cross_section: CrossSectionSpec = "xs_nc", + **kwargs, +) -> gf.Component: + """An S-bend. + + Args: + size (tuple[float, float], optional): The size of the s-bend, in x and y. Defaults to (11.0, 1.8). + cross_section (CrossSectionSpec, optional): the bend cross-section. Defaults to "xs_nc" (nitride, c-band). + + Returns: + gf.Component: the component + """ + return gf.components.bend_s( + size=size, + cross_section=cross_section, + **kwargs, + ) + + +@gf.cell +def _bend( + radius: float | None = None, + angle: float = 90.0, + p: float = 0.5, + with_arc_floorplan: bool = True, + npoints: int | None = None, + direction: str = "ccw", + cross_section: CrossSectionSpec = "xs_nc", +) -> gf.Component: + return gf.components.bend_euler( + radius=radius, + angle=angle, + p=p, + with_arc_floorplan=with_arc_floorplan, + npoints=npoints, + direction=direction, + cross_section=cross_section, + ) + + +@gf.cell +def wire_corner( + cross_section: CrossSectionSpec = "xs_metal_routing", +) -> gf.Component: + """The bend equivalent for electrical wires, which is a simple corner. + + Args: + cross_section (CrossSectionSpec, optional): the bend cross-section. Defaults to "xs_metal_routing". + + Returns: + gf.Component: the component + """ + return gf.components.wire_corner(cross_section=cross_section) + + +def _float(x: Any) -> float: + return float(x) + + +@gf.cell +def bend_nc( + radius: float = _float(xs_nc.radius), angle: float = 90.0, **kwargs +) -> gf.Component: + """An euler bend in nitride, c-band. + + Args: + radius (float, optional): the radius of the bend. Defaults to the PDK's default value for that cross-section. + angle (float, optional): the angle of the bend. Defaults to 90.0. + + Returns: + gf.Component: the component + """ + if "cross_section" not in kwargs: + kwargs["cross_section"] = "xs_nc" + return _bend( + radius=radius, + angle=angle, + **kwargs, + ) + + +@gf.cell +def bend_no( + radius: float = _float(xs_no.radius), angle: float = 90.0, **kwargs +) -> gf.Component: + """An euler bend in nitride, o-band. + + Args: + radius (float, optional): the radius of the bend. Defaults to the PDK's default value for that cross-section. + angle (float, optional): the angle of the bend. Defaults to 90.0. + + Returns: + gf.Component: the component + """ + if "cross_section" not in kwargs: + kwargs["cross_section"] = "xs_no" + return _bend( + radius=radius, + angle=angle, + **kwargs, + ) + + +################ +# Transitions +################ + + +@gf.cell +def _taper( + length: float = 10.0, + width1: float = 0.5, + width2: float | None = None, + port: gf.Port | None = None, + cross_section: CrossSectionSpec = "xs_nc", + **kwargs, +) -> gf.Component: + return gf.components.taper( + length=length, + width1=width1, + width2=width2, + port=port, + cross_section=cross_section, + **kwargs, + ) + + +@gf.cell +def taper_nc( + length: float = 10.0, + width1: float = 0.5, + width2: float | None = None, + port: gf.Port | None = None, + **kwargs, +) -> gf.Component: + """A width taper in nitride, c-band. + + Args: + length (float, optional): the length of the taper, in um. Defaults to 10.0. + width1 (float, optional): the width of the taper input, in um. Defaults to 0.5. + width2 (float | None, optional): the width of the taper output, in um. Defaults to None. + port (gf.Port | None, optional): if given, starts from the port's width and transitions to width1. Defaults to None. + + Returns: + gf.Component: the component + """ + if "cross_section" not in kwargs: + kwargs["cross_section"] = "xs_nc" + return _taper(length=length, width1=width1, width2=width2, port=port, **kwargs) + + +@gf.cell +def taper_no( + length: float = 10.0, + width1: float = 0.5, + width2: float | None = None, + port: gf.Port | None = None, + **kwargs, +) -> gf.Component: + """A width taper in nitride, o-band. + + Args: + length (float, optional): the length of the taper, in um. Defaults to 10.0. + width1 (float, optional): the width of the taper input, in um. Defaults to 0.5. + width2 (float | None, optional): the width of the taper output, in um. Defaults to None. + port (gf.Port | None, optional): if given, starts from the port's width and transitions to width1. Defaults to None. + + Returns: + gf.Component: the component + """ + if "cross_section" not in kwargs: + kwargs["cross_section"] = "xs_no" + return _taper(length=length, width1=width1, width2=width2, port=port, **kwargs) + + +################ +# MMIs +################ + + +@gf.cell +def _mmi1x2( + width_mmi: float = 6.0, + width_taper: float = 1.5, + length_taper: float = 20.0, + cross_section: CrossSectionSpec = "xs_nc", + **kwargs, +) -> gf.Component: + return gf.components.mmi1x2( + width_mmi=width_mmi, + length_taper=length_taper, + width_taper=width_taper, + cross_section=cross_section, + **kwargs, + ) + + +@gf.cell +def _mmi2x2( + width_mmi: float = 6.0, + width_taper: float = 1.5, + length_taper: float = 20.0, + cross_section: CrossSectionSpec = "xs_nc", + **kwargs, +) -> gf.Component: + return gf.components.mmi2x2( + width_mmi=width_mmi, + length_taper=length_taper, + width_taper=width_taper, + cross_section=cross_section, + **kwargs, + ) + + +################ +# Nitride MMIs oband +################ + + +@gf.cell +def mmi1x2_no(**kwargs) -> gf.Component: + """A 1x2 MMI in nitride, o-band. + + Returns: + gf.Component: the component + """ + if "cross_section" not in kwargs: + kwargs["cross_section"] = "xs_no" + return _mmi1x2( + width_mmi=12.0, + length_taper=50.0, + width_taper=5.5, + gap_mmi=0.4, + length_mmi=42.0, + **kwargs, + ) + + +@gf.cell +def mmi2x2_no(**kwargs) -> gf.Component: + """A 2x2 MMI in nitride, o-band. + + Returns: + gf.Component: the component + """ + if "cross_section" not in kwargs: + kwargs["cross_section"] = "xs_no" + return _mmi2x2( + width_mmi=12.0, + length_taper=50.0, + width_taper=5.5, + gap_mmi=0.4, + length_mmi=126.0, + **kwargs, + ) + + +################ +# Nitride MMIs cband +################ + + +@gf.cell +def mmi1x2_nc(**kwargs) -> gf.Component: + """A 1x2 MMI in nitride, c-band. + + Returns: + gf.Component: the component + """ + if "cross_section" not in kwargs: + kwargs["cross_section"] = "xs_nc" + return _mmi1x2( + width_mmi=12.0, + length_taper=50.0, + width_taper=5.5, + gap_mmi=0.4, + length_mmi=64.7, + **kwargs, + ) + + +@gf.cell +def mmi2x2_nc(**kwargs) -> gf.Component: + """A 2x2 MMI in nitride, c-band. + + Returns: + gf.Component: the component + """ + if "cross_section" not in kwargs: + kwargs["cross_section"] = "xs_nc" + return _mmi2x2( + width_mmi=12.0, + length_taper=50.0, + width_taper=5.5, + gap_mmi=0.4, + length_mmi=232.0, + **kwargs, + ) + + +############################## +# Evanescent couplers +############################## + + +@gf.cell +def _coupler_symmetric( + bend: ComponentSpec = bend_s, + gap: float = 0.234, + dx: float = 10.0, + dy: float = 4.0, + cross_section: CrossSectionSpec = "xs_nc", +) -> gf.Component: + return gf.components.coupler_symmetric( + bend=bend, + gap=gap, + dx=dx, + dy=dy, + cross_section=cross_section, + ) + + +@gf.cell +def _coupler_straight( + length: float = 10.0, + gap: float = 0.4, + straight: ComponentSpec = _straight, + cross_section: CrossSectionSpec = "xs_nc", +) -> gf.Component: + return gf.components.coupler_straight( + length=length, + gap=gap, + straight=straight, + cross_section=cross_section, + ) + + +@gf.cell +def _coupler( + gap: float = 0.236, + length: float = 20.0, + coupler_symmetric: ComponentSpec = _coupler_symmetric, + coupler_straight: ComponentSpec = _coupler_straight, + dx: float = 10.0, + dy: float = 4.0, + cross_section: CrossSectionSpec = "xs_nc", +) -> gf.Component: + return gf.components.coupler( + gap=gap, + length=length, + coupler_symmetric=coupler_symmetric, + coupler_straight=coupler_straight, + dx=dx, + dy=dy, + cross_section=cross_section, + ) + + +@gf.cell +def coupler_nc( + gap: float = 0.4, + length: float = 20.0, + dx: float = 10.0, + dy: float = 4.0, + **kwargs, +) -> gf.Component: + """A symmetric coupler in nitride, c-band. + + Args: + gap (float, optional): the coupling gap, in um. Defaults to 0.4. + length (float, optional): the length of the coupling section, in um. Defaults to 20.0. + dx (float, optional): the port-to-port horizontal spacing. Defaults to 10.0. + dy (float, optional): the port-to-port vertical spacing. Defaults to 4.0. + + Returns: + gf.Component: the component + """ + if "cross_section" not in kwargs: + kwargs["cross_section"] = "xs_nc" + return _coupler( + gap=gap, + length=length, + dx=dx, + dy=dy, + **kwargs, + ) + + +@gf.cell +def coupler_no( + gap: float = 0.4, + length: float = 20.0, + dx: float = 10.0, + dy: float = 4.0, + **kwargs, +) -> gf.Component: + """A symmetric coupler in nitride, o-band. + + Args: + gap (float, optional): the coupling gap, in um. Defaults to 0.4. + length (float, optional): the length of the coupling section, in um. Defaults to 20.0. + dx (float, optional): the port-to-port horizontal spacing. Defaults to 10.0. + dy (float, optional): the port-to-port vertical spacing. Defaults to 4.0. + + Returns: + gf.Component: the component + """ + if "cross_section" not in kwargs: + kwargs["cross_section"] = "xs_no" + return _coupler( + gap=gap, + length=length, + dx=dx, + dy=dy, + **kwargs, + ) + + +############################## +# grating couplers Rectangular +############################## + + +@gf.cell +def _gc_rectangular( + n_periods: int = 30, + fill_factor: float = 0.5, + length_taper: float = 350.0, + fiber_angle: float = 10.0, + layer_grating: LayerSpec = LAYER.GRA, + layer_slab: LayerSpec = LAYER.WG, + slab_offset: float = 0.0, + period: float = 0.75, + width_grating: float = 11.0, + polarization: str = "te", + wavelength: float = 1.55, + taper: ComponentSpec = _taper, + slab_xmin: float = -1.0, + cross_section: CrossSectionSpec = "xs_nc", +) -> gf.Component: + c = gf.components.grating_coupler_rectangular( + n_periods=n_periods, + fill_factor=fill_factor, + length_taper=length_taper, + fiber_angle=fiber_angle, + layer_grating=layer_grating, + layer_slab=layer_slab, + slab_offset=slab_offset, + period=period, + width_grating=width_grating, + polarization=polarization, + wavelength=wavelength, + taper=taper, + slab_xmin=slab_xmin, + cross_section=cross_section, + ).flatten() + return c + + +@gf.cell +def gc_rectangular_nc() -> gf.Component: + """A rectangular grating coupler in nitride, c-band. + + Returns: + gf.Component: the component + """ + return _gc_rectangular( + period=0.66, + cross_section="xs_nc", + length_taper=200, + fiber_angle=20, + layer_grating=LAYER.NITRIDE_ETCH, + layer_slab=LAYER.NITRIDE, + slab_offset=0, + ) + + +@gf.cell +def gc_rectangular_no() -> gf.Component: + """A rectangular grating coupler in nitride, o-band. + + Returns: + gf.Component: the component + """ + return _gc_rectangular( + period=0.964, + cross_section="xs_no", + length_taper=200, + fiber_angle=20, + layer_grating=LAYER.NITRIDE_ETCH, + layer_slab=LAYER.NITRIDE, + slab_offset=0, + ) + + +############################## +# grating couplers elliptical +############################## + + +@gf.cell +def _gc_elliptical( + polarization: str = "te", + taper_length: float = 16.6, + taper_angle: float = 30.0, + trenches_extra_angle: float = 9.0, + wavelength: float = 1.53, + fiber_angle: float = 20.0, + grating_line_width: float = 0.343, + neff: float = 1.6, + ncladding: float = 1.443, + layer_trench: LayerSpec = LAYER.GRA, + p_start: int = 26, + n_periods: int = 30, + end_straight_length: float = 0.2, + cross_section: CrossSectionSpec = "xs_nc", +) -> gf.Component: + return gf.components.grating_coupler_elliptical_trenches( + polarization=polarization, + taper_length=taper_length, + taper_angle=taper_angle, + trenches_extra_angle=trenches_extra_angle, + wavelength=wavelength, + fiber_angle=fiber_angle, + grating_line_width=grating_line_width, + neff=neff, + ncladding=ncladding, + layer_trench=layer_trench, + p_start=p_start, + n_periods=n_periods, + end_straight_length=end_straight_length, + cross_section=cross_section, + ) + + +@gf.cell +def gc_elliptical_nc( + grating_line_width: float = 0.343, + fiber_angle: float = 20, + wavelength: float = 1.53, + neff: float = 1.6, + cross_section: CrossSectionSpec = "xs_nc", + **kwargs, +) -> gf.Component: + """An elliptical grating coupler in strip, c-band. + + Args: + grating_line_width: the grating line width, in um. Defaults to 0.343. + fiber_angle: the fiber angle, in degrees. Defaults to 15. + wavelength: the center wavelength, in um. Defaults to 1.53. + neff: the effective index of the waveguide. Defaults to 1.6. + cross_section: the cross-section. Defaults to "xs_nc". + + Returns: + gf.Component: the component + """ + return _gc_elliptical( + grating_line_width=grating_line_width, + fiber_angle=fiber_angle, + wavelength=wavelength, + cross_section=cross_section, + neff=neff, + **kwargs, + ) + + +@gf.cell +def gc_elliptical_no( + grating_line_width: float = 0.343, + fiber_angle: float = 20, + wavelength: float = 1.31, + neff: float = 1.63, + cross_section: CrossSectionSpec = "xs_no", + **kwargs, +) -> gf.Component: + """An elliptical grating coupler in strip, o-band. + + Args: + grating_line_width: the grating line width, in um. Defaults to 0.343. + fiber_angle: the fiber angle, in degrees. Defaults to 15. + wavelength: the center wavelength, in um. Defaults to 1.31. + neff: the effective index of the waveguide. Defaults to 1.63. + cross_section: the cross-section. Defaults to "xs_no". + + + Returns: + gf.Component: the component + """ + if "cross_section" not in kwargs: + kwargs["cross_section"] = "xs_so" + return _gc_elliptical( + grating_line_width=grating_line_width, + fiber_angle=fiber_angle, + wavelength=wavelength, + neff=neff, + cross_section=cross_section, + **kwargs, + ) + + +################ +# MZI +################ + + +@gf.cell +def _mzi( + delta_length: float = 10.0, + length_y: float = 2.0, + length_x: float = 0.1, + cross_section: CrossSectionSpec = "xs_nc", + add_electrical_ports_bot: bool = True, + bend: ComponentSpec = _bend, + straight: ComponentSpec = _straight, + splitter: ComponentSpec = _mmi1x2, + combiner: ComponentSpec = _mmi2x2, +) -> gf.Component: + return gf.components.mzi( + delta_length=delta_length, + length_y=length_y, + length_x=length_x, + bend=bend, + straight=straight, + straight_y=straight, + straight_x_top=straight, + straight_x_bot=straight, + splitter=splitter, + combiner=combiner, + with_splitter=True, + port_e1_splitter="o2", + port_e0_splitter="o3", + port_e1_combiner="o2", + port_e0_combiner="o3", + nbends=2, + cross_section=cross_section, + cross_section_x_top=cross_section, + cross_section_x_bot=cross_section, + mirror_bot=False, + add_optical_ports_arms=False, + add_electrical_ports_bot=add_electrical_ports_bot, + min_length=0.01, + extend_ports_straight_x=None, + ) + + +@gf.cell +def mzi_nc( + delta_length: float = 10.0, + length_y: float = 2.0, + length_x: float = 0.1, + add_electrical_ports_bot: bool = True, + **kwargs, +) -> gf.Component: + """A Mach-Zehnder Interferometer (MZI) in nitride, c-band. + + Args: + delta_length (float, optional): the length differential between the two arms. Defaults to 10.0. + length_y (float, optional): the common vertical length, in um. Defaults to 2.0. + length_x (float, optional): the common horizontal length, in um. Defaults to 0.1. + add_electrical_ports_bot (bool, optional): if true, adds electrical ports to the bottom. Defaults to True. + + Returns: + gf.Component: the component + """ + if "cross_section" not in kwargs: + kwargs["cross_section"] = "xs_nc" + return _mzi( + delta_length=delta_length, + length_y=length_y, + length_x=length_x, + add_electrical_ports_bot=add_electrical_ports_bot, + straight=straight_nc, + bend=bend_nc, + combiner=mmi1x2_nc, + splitter=mmi1x2_nc, + **kwargs, + ) + + +@gf.cell +def mzi_no( + delta_length: float = 10.0, + length_y: float = 2.0, + length_x: float = 0.1, + add_electrical_ports_bot: bool = True, + **kwargs, +) -> gf.Component: + """A Mach-Zehnder Interferometer (MZI) in nitride, o-band. + + Args: + delta_length (float, optional): the length differential between the two arms. Defaults to 10.0. + length_y (float, optional): the common vertical length, in um. Defaults to 2.0. + length_x (float, optional): the common horizontal length, in um. Defaults to 0.1. + add_electrical_ports_bot (bool, optional): if true, adds electrical ports to the bottom. Defaults to True. + + Returns: + gf.Component: the component + """ + if "cross_section" not in kwargs: + kwargs["cross_section"] = "xs_no" + return _mzi( + delta_length=delta_length, + length_y=length_y, + length_x=length_x, + add_electrical_ports_bot=add_electrical_ports_bot, + bend=bend_no, + straight=straight_no, + combiner=mmi1x2_no, + splitter=mmi1x2_no, + **kwargs, + ) + + +################ +# Packaging +################ + + +@gf.cell +def pad( + size: tuple[float, float] = (100.0, 100.0), + layer: LayerSpec = LAYER.PAD, + bbox_layers: None = None, + bbox_offsets: None = None, + port_inclusion: float = 0.0, + port_orientation: None = None, +) -> gf.Component: + """An electrical pad. + + Args: + size (tuple[float, float], optional): Size of the pad in (x, y). Defaults to (100.0, 100.0). + layer (LayerSpec, optional): the layer to draw the pad on. Defaults to LAYER.PAD. + bbox_layers (None, optional): if set, draws a box around the pad with the given layers. Defaults to None. + bbox_offsets (None, optional): if set, applies an offset to grow the bbox's specified with `bbox_layers`. Defaults to None. + port_inclusion (float, optional): if set, insets the port from the edge by the specified amount. Defaults to 0.0. + port_orientation (None, optional): if set, gives the port a fixed orientation. Defaults to None. + + Returns: + gf.Component: the component + """ + return gf.components.pad( + size=size, + layer=layer, + bbox_layers=bbox_layers, + bbox_offsets=bbox_offsets, + port_inclusion=port_inclusion, + port_orientation=port_orientation, + ) + + +@gf.cell +def rectangle( + size: tuple[float, float] = (4.0, 2.0), + layer: LayerSpec = LAYER.FLOORPLAN, + centered: bool = False, + port_type: str = "electrical", + port_orientations: tuple[float, float, float, float] = (180.0, 90.0, 0.0, -90.0), + round_corners_east_west: bool = False, + round_corners_north_south: bool = False, +) -> gf.Component: + """A simple rectangle on the given layer. + + Args: + size (tuple[float, float], optional): the size of the rectangle in (x, y). Defaults to (4.0, 2.0). + layer (LayerSpec, optional): the layer to draw the rectangle on. Defaults to LAYER.FLOORPLAN. + centered (bool, optional): if true, the rectangle's origin will be placed at the center (otherwise it will be bottom-left). Defaults to False. + port_type (str, optional): the port type for ports automatically added to edges of the rectangle. Defaults to "electrical". + port_orientations (tuple[float, float, float, float], optional): orientations of the ports to be automatically added. Defaults to (180.0, 90.0, 0.0, -90.0). + round_corners_east_west (bool, optional): if True, circles are added to the east and west edges, forming a horizontal pill shape. Defaults to False. + round_corners_north_south (bool, optional): if True, circles are added to the north and south edges, forming a vertical pill shape. Defaults to False. + + Returns: + gf.Component: the component + """ + return gf.components.rectangle( + size=size, + layer=layer, + centered=centered, + port_type=port_type, + port_orientations=port_orientations, + round_corners_east_west=round_corners_east_west, + round_corners_north_south=round_corners_north_south, + ) + + +@gf.cell +def grating_coupler_array( + pitch: float = 127.0, + n: int = 6, + port_name: str = "o1", + rotation: float = 0.0, + with_loopback: bool = False, + bend: ComponentSpec = _bend, + grating_coupler_spacing: float = 0.0, + grating_coupler: ComponentSpec = gc_rectangular_nc, + cross_section: CrossSectionSpec = "xs_nc", +) -> gf.Component: + """An array of grating couplers. + + Args: + pitch (float, optional): the center-center pitch between grating couplers. Defaults to 127.0. + n (int, optional): the number of grating couplers to place. Defaults to 6. + port_name (str, optional): the routing port of the grating coupler to be placed. Defaults to "o1". + rotation (float, optional): rotation of the grating couplers, in degrees. Defaults to 0.0. + with_loopback (bool, optional): if True, adds a loopback. Defaults to False. + bend (ComponentSpec, optional): the bend to be used for the loopback. Defaults to _bend. + grating_coupler_spacing (float, optional): the spacing to be used in the loopback. Defaults to 0.0. + grating_coupler (ComponentSpec, optional): the grating coupler component to use. Defaults to gc_rectangular_nc. + cross_section (CrossSectionSpec, optional): the cross section to be used for routing in the loopback. Defaults to "xs_nc". + + Returns: + gf.Component: the component + """ + return gf.components.grating_coupler_array( + pitch=pitch, + n=n, + port_name=port_name, + rotation=rotation, + with_loopback=with_loopback, + bend=bend, + grating_coupler_spacing=grating_coupler_spacing, + grating_coupler=grating_coupler, + cross_section=cross_section, + ) + + +@gf.cell +def _die( + size: tuple[float, float] = (11470.0, 4900.0), + ngratings: int = 14, + npads: int = 31, + grating_pitch: float = 250.0, + pad_pitch: float = 300.0, + grating_coupler: ComponentSpec = gc_rectangular_nc, + cross_section: CrossSectionSpec = "xs_nc", + pad: ComponentSpec = pad, +) -> gf.Component: + c = gf.Component() + + fp = c << rectangle(size=size, layer=LAYER.FLOORPLAN, centered=True) + + # Add optical ports + x0 = -4925 + 2.827 + y0 = 1650 + + gca = grating_coupler_array( + n=ngratings, + pitch=grating_pitch, + with_loopback=True, + rotation=90, + grating_coupler=grating_coupler, + cross_section=cross_section, + ) + left = c << gca + left.rotate(90) + left.xmax = x0 + left.y = fp.y + c.add_ports(left.ports, prefix="W") + + right = c << gca + right.rotate(-90) + right.xmax = -x0 + right.y = fp.y + c.add_ports(right.ports, prefix="E") + + # Add electrical ports + x0 = -4615 + y0 = 2200 + pad = pad() + + for i in range(npads): + pad_ref = c << pad + pad_ref.xmin = x0 + i * pad_pitch + pad_ref.ymin = y0 + c.add_port( + name=f"N{i}", + port=pad_ref.ports["e4"], + ) + + for i in range(npads): + pad_ref = c << pad + pad_ref.xmin = x0 + i * pad_pitch + pad_ref.ymax = -y0 + c.add_port( + name=f"S{i}", + port=pad_ref.ports["e2"], + ) + + c.auto_rename_ports() + return c + + +@gf.cell +def die_nc() -> gf.Component: + """The standard die template for nitride, c-band. This has 24 grating couplers, split evenly between the left and right sides of the chip and 62 electrical pads split between the top and bottom. + + Returns: + gf.Component: the component + """ + return _die( + grating_coupler=gc_rectangular_nc, + cross_section="xs_nc", + ) + + +@gf.cell +def die_no() -> gf.Component: + """The standard die template for nitride, o-band. This has 24 grating couplers, split evenly between the left and right sides of the chip and 62 electrical pads split between the top and bottom. + + Returns: + gf.Component: the component + """ + return _die( + grating_coupler=gc_rectangular_no, + cross_section="xs_no", + ) + + +################ +# Imported from Cornerstone MPW SOI 220nm GDSII Template +################ +_import_gds = partial(gf.import_gds, gdsdir=PATH.gds) + + +array = gf.components.array + + +if __name__ == "__main__": + c = taper_nc() + c.show() + # for name, func in list(globals().items()): + # if not callable(func): + # continue + # if name in ["partial", "_import_gds"]: + # continue + # print(name, func()) diff --git a/cspdk/sin300/config.py b/cspdk/sin300/config.py new file mode 100644 index 0000000..f3f88c7 --- /dev/null +++ b/cspdk/sin300/config.py @@ -0,0 +1,25 @@ +"""Store path.""" + +__all__ = ["PATH"] + +import pathlib + +cwd = pathlib.Path.cwd() +cwd_config = cwd / "config.yml" +module = pathlib.Path(__file__).parent.absolute() +repo = module.parent.parent + + +class Path: + module = module + repo = repo + gds = module / "gds" + klayout = module / "klayout" + + lyp = klayout / "tech" / "layers.lyp" + lyt = klayout / "tech" / "tech.lyt" + lyp_yaml = module / "layers.yaml" + tech = module / "klayout" / "tech" + + +PATH = Path() diff --git a/cspdk/sin300/gds/CORNERSTONE MPW SOI 220nm GDSII Template.gds b/cspdk/sin300/gds/CORNERSTONE MPW SOI 220nm GDSII Template.gds new file mode 100644 index 0000000000000000000000000000000000000000..1e9bc59263973b86f4dbb8d65e0a6a0469f4132a GIT binary patch literal 90112 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 literal 0 HcmV?d00001 diff --git a/cspdk/sin300/gds/Cell0_Institution_Name.gds b/cspdk/sin300/gds/Cell0_Institution_Name.gds new file mode 100644 index 0000000000000000000000000000000000000000..93d8220fcb351c4f189dc3922cd676fbceaf6e46 GIT binary patch literal 192 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRK!i}y>+O=V!=U|?Y5WnxHXVB=$A sU|`S@VE(_NcE$fL1q%?(P3zW@LL literal 0 HcmV?d00001 diff --git a/cspdk/sin300/gds/Cell0_SOI220_Full_1550nm_Packaging_Template.gds b/cspdk/sin300/gds/Cell0_SOI220_Full_1550nm_Packaging_Template.gds new file mode 100644 index 0000000000000000000000000000000000000000..a45450f53b72c2ce4f660900a8b956865bb85dd5 GIT binary patch literal 27216 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 literal 0 HcmV?d00001 diff --git a/cspdk/sin300/gds/Cell0_SOI_Full_Institution_Name.gds b/cspdk/sin300/gds/Cell0_SOI_Full_Institution_Name.gds new file mode 100644 index 0000000000000000000000000000000000000000..024985b04615bd2c044741abade202ad9d871af7 GIT binary patch literal 202 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRN;V`5-n&=Fw%zoK@<|66l6FoZWnz-R{5qyUgOj0TId2mrQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLR)NsIT)D=x__DJ{v&&x`j<%uQurVBuh3 zVB=+CNM>N;V`5-n&=Fw%e~t6P|66l6Flc@=fYA)9NdX{n7!4L@5d`XI2Vxcm0M>;w A6aWAK literal 0 HcmV?d00001 diff --git a/cspdk/sin300/gds/Flip_Chip_Bonding_Example.gds b/cspdk/sin300/gds/Flip_Chip_Bonding_Example.gds new file mode 100644 index 0000000000000000000000000000000000000000..6713de88c9d36fcf9debb15d24c13fd4ed72b46d GIT binary patch literal 1156 zcmaKrKTE?<6vasQHbNyN6uk#=F#2 z=?8epq0f9($4OnagqNJk>!0MSnwKxBtFm5}PoMd!j+1=V5}rLP^vd*ttFiR literal 0 HcmV?d00001 diff --git a/tests/gds_ref/heater.gds b/cspdk/sin300/gds/Heater.gds similarity index 90% rename from tests/gds_ref/heater.gds rename to cspdk/sin300/gds/Heater.gds index 6646920a47c3fe45221d4a08ed1a60caa076f482..9d8ce749c9ce7af3c21ebd8187dedf52143efe99 100644 GIT binary patch delta 12 TcmdnMx`A~<5~Ih)WM3u#9JK@q delta 12 TcmdnMx`A~<5@W{3WM3u#9aRJ= diff --git a/cspdk/sin300/gds/Layer_Designations.gds b/cspdk/sin300/gds/Layer_Designations.gds new file mode 100644 index 0000000000000000000000000000000000000000..393bec33273cd51c8477abeacc2de38fa5d82a4a GIT binary patch literal 20356 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 literal 0 HcmV?d00001 diff --git a/cspdk/sin300/gds/SOI220nm_1310nm_TE_RIB_2x1_MMI.gds b/cspdk/sin300/gds/SOI220nm_1310nm_TE_RIB_2x1_MMI.gds new file mode 100644 index 0000000000000000000000000000000000000000..48ecf301090f960362d9d1f68f6a21e7c45d20ed GIT binary patch literal 504 zcmZ|My-Nc@5C!n(UT!a#Q&eK1Mij9XO%&8d{0ihSLD3XqbJ0#P7QsRx|A1g=l{9uX z3YGyCQi;8-MIhQJ1d9WSDB}%dJR7Uu@|b1cu+UIy6R|dB)zOYVSQy3d-!p8b_jY#* z+l3<_YM65i$I~l!=WnyimGQIkRu(by|GOhvZ>&0r#KeByjZemzY|>qK7Tv^Q+|6Vh zgu;OCP%xl76@Z&AgXr><$V-XugGBBDQFDnX@)-E>AUVtPpG_7pEY1OQjOPROt>i4v zh3jIZ0;D~lrD_1>sNdusXk4@;q8ZM`v`6&S!}o%oUJ9XZ{O)7^>~q5Vlx(6}Rea)o zrih-eWgijfPjW7nY+%6e#}3T{xnf{1_sjZUu_paQqSq_V#axl-#qYQ&o?O_%XpSyR~F!py-@%X~UxfxrGF|wQHUTV#Z=i_EN zoq~4=Fh(`#Fvc_h^C6w+=AGzwifFw=)J_UJRXOjrEFIo)xcLE3fPH`-6?)6;Q(+CE zC*bA>P98a5*lht%Z$zD{u$}DdF8Qo;zR+l}PyJ|Fs7L#{tDo~Y=j*|ym2Xk$1N?k% z_S>}bEh^o`PZX@#y*c~ibM8^}L4JE~&iMsv+#~yY_j1kW`TuN7&q5%mc7f+7?CDOw z?|*-;d4Gx-qIyNxWTpNuNUg9-j*f T38JRj7p9e4uSh?BRhbum*`p#e literal 0 HcmV?d00001 diff --git a/cspdk/sin300/gds/SOI220nm_1310nm_TE_RIB_90_Degree_Bend.gds b/cspdk/sin300/gds/SOI220nm_1310nm_TE_RIB_90_Degree_Bend.gds new file mode 100644 index 0000000000000000000000000000000000000000..e7ca1fbfedc8d4a856f1190f9dad856108c94860 GIT binary patch literal 2240 zcmZ{mdr;JM6vdAVEQ+8a0?I>C5M&WyL4}n!ECekNML-g87Zeplz*Q710$&l?SW{D3 zW}{ΞJGA$oj_ONj(Yb+nB^#Pp8f7+SfobT@M`@Q$vbI<*Pj4~L? z71Yn*enB1@A$Nr-U^}wyvcYydDy3+$jotyClR~dc6OKyZX;RD)Vs=Qe?utnRtfQo ziCs3HHMNzKt29HJ*}!k`s$4J4cut!25%1Vn?JC{3Uz%-Y&mO53o)uf9d0(=3rBojw zRZWu`+Bq{+YCHwPaZ!R~pDQgUmi>mblw6JnrB*mP{*acRAa=Rbo&}p}Xt zv>*I_gx3bp4o?gGskQMmNbUyuRY{(D^r?7_I?qt|*VO$4I$T4C0+3!*4@RE>#5jp= ze{<#~bo_?B=uq+&@5nWsby+5QC-R$_Ui`p1l76gVZK6N^JQL~HMjrZL^P`VwmWQsn z`1PI(^qJanIB)%j2X0yH%X}AKa3&oc({A$w;+qBdhgy=q$4_ufqFxLAw%o*T<@oM- z{8z*}4?m{jM;H7_y%Ue(SJv^H@h^48!Oiq4?^^M<6MwhicR0p8jQ=m=|82~}R_5Ug z=A#tEXTkJ#JoN^kLDXL6364>tnJ;uUp|cOYGlemK)Ejw#dE5?Cr)LT{l6gHwF6PI* z0;D$Aiy(OnOTbM8=W}Q7UA_Oi7u@c?7kuE?^YM9{bNJnd-no(A=Zw@JuET<)f$xLV zG-wxi3O-N65$_Jem%isDe|+Qj0Ci-sj;1aO^Z$)HuTaxrX$(FYu|pcWo;_$Vj+z5s zr&jb2LdR%49ef?lx;c}8rt~}nJtvWWG+YuJ(Gbn1+?K-dWeV@Y=hH_wV)du5%g_Vw zSm7MCl>VbnbPj&NdoiK-1I}jVp=Y+^UGY#Vu}9%4bV~5TWAL}Yy{w)7FT#T@rHUf$=q*+JyECC%YXAzqtn;?D481~%el>YRU**yvSn zBQ}0qu$CFw$;|8_<{W9^r^Je2md-LK=+<??`ozF>BP(K;NAuyh~>WsoRM! z7QZO9uwF7jTJ{V0O5fbJ3}%iG@NTx$N&c3t(kghjpyxwRf%vhz6TH@k1@ykFSt@|z z8a!M;j#b1iK%*5~m@zcypojVUiA%hE_TGO994ocqKO6pNg@>)2dm@-w{1z^0pdFsA zXhhGN(K0Wb8i|`rpBs*$A%AP?Z-7IoliWF_XjUy{*KuzgLhJSD@g1`Z=bEYX0L>g| zn(;Ea{Yn3MUqvs|n$YtgvpkEQh0r^+DaXf2x44tZIR%|dIcKS)*X&PZo{En%%e&|k zxh7@e3A`B392b7fEW@<`jWnNtq#eb%H~f&(FBO4s##u1=n#OoCD$Pb{0&RT;P}-!+d+A$?xj@ P+?o5{d%?Zup9K92L2RGb literal 0 HcmV?d00001 diff --git a/cspdk/sin300/gds/SOI220nm_1310nm_TE_RIB_Grating_Coupler.gds b/cspdk/sin300/gds/SOI220nm_1310nm_TE_RIB_Grating_Coupler.gds new file mode 100644 index 0000000000000000000000000000000000000000..52ee55bdc9306d436592ed7ebcbf14ed86e4cd3e GIT binary patch literal 5472 zcmaKweN2^Q7>6GZhXWxP8j%_q85t4@90}2o6!8NzkDt+i&YwbmMQ%$boHnUNo4W@bcYX81fkzvu4Wty|uIUF?GE{9ewU_dVM& zF%yY2nXCzsq$4K9OfyL)$7G-Xvq_D_y1P1h+j}1}CL#oN4CtbR>ZJYLvyZ(GsaBA{VuTU}K}+w$J_&0Rek+Lqk6WmEUMUK33=CYBa4 z2_`lvVvNa8PjK%3G-LAO#M%lI-MP@1@~y0`QodbTaz?jYf+OO>=&fZR*|1Pudg4c_k_y5>)4aVe_J8M@9>q}hl z%-r&e_HOaJp>q{|Lf-|?RC@b&H|?HXFT^f9Q|Vpj5bdrT6k->isr6Iep>EonLUiy< zt-pCMb!EGS=-`=3Z-0G1boS(Sq3?ocD!rT4M7!7539$>$)cQHO)D_GWqJw8@efk0F zChrrXgJ&we{drgD?D2k~?}BG4y_@kQ?OwfAh+TN5(%V0tquo=$Aeo~iXWouRH|Oo$Gisr2?>a_HGnL*IM`^d%3b6~%RC@d4 z2<;vn7Gf8ksr0VCl6D))h1i8>YW-Tee_T7=KY{4rnOc8aDeX4W`EwvTc&64*I!67a zhlS|inOdJ;Ox=xhgy`UzN^b{SLTA5f6#6cBrqa8@EZQx~6k->isr4D3Q+N3%LUiy< zrMJJm9XdPuy3lvQGqwHz-T(G`y8i>w!84WKO(>)5j+6*}7d%tzs~)4S`e7kDc&5_Z zeRTfqH+233eHT1a>D`_5{BkYy{0hV_JX7lz?xgE3|4fJuo~iY%KZsq}V#e(3CXvxL42o~iV1O$+VTGzzf`&(!)Ud#Jl?K!^^Wsr9#Rq;7SG5FI>I z>sM~3ZdH#E9XwO(b2_QJu2qN*o~iWKt)R|S2z?hkQ|Vo84Rv+ZLhQmbwZ3D7y1R#k z=-`=JpSy~>*~^6J;F(HqchmcCzo7R&(09QzmEPS>=hrpS`3=M_JX7iIFQ10%wkJLk zVi%sN^ll^du8aCW?7}m(e%=Xs-%5`P(ZMs7-tM9EZ@;ATALzT_nM&{ON~Yb`h!DH* zOs&7=W9k-tAVdex)cWj4sJrF?Av$=b*5@sv?uG?Ibnr~APnt?y@)RLDc&658?x609 z_k`%+nM!Z}SsOY#-YoQ8@Jyw5si$Z+?W7R9@Jyw*e?3UMXL^O$g=Z?gTly01E_+^x nU3jL_+nBiyYNhrQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLR7|(|sSGR}3=C|% zObpBnYVz}Z215GzXb!s;Q$y7lsN$shtXhh7C{EMepYn-uYqbo`XMyX U@jy06KZFL0gY~lm&0t{w0K{iV)&Kwi literal 0 HcmV?d00001 diff --git a/cspdk/sin300/gds/SOI220nm_1310nm_TE_RIB_Waveguide_Crossing.gds b/cspdk/sin300/gds/SOI220nm_1310nm_TE_RIB_Waveguide_Crossing.gds new file mode 100644 index 0000000000000000000000000000000000000000..dc8931c4cae1de46f09c6f83915255155d3365ab GIT binary patch literal 1108 zcmZ{jO-R&H6vdC@%u~nlD=pLih@vSYI{CFIA%#9%NQBr(ib;c_s4!V579tW6A%lpU z7D6s0s5DHFFoG8CD#%R>A;VppKqJW#GxK(ySEx;^-=D{O_nv$1`NP2FYJoq-7552V zWFZd6koWI5d@d8|?dWgs9|AIBJ+-H!C(gfqyitAbMcMTI)+YEp|9^Yjm{3D~Wo3Ea z)o?{sg+)_c_+tH;aC7^OuI|C!&aUv;{%ZpRy?xz)J037eF2uqly8zc*D!-1N68Z8S zCUZ*U>mZpbvatnoWI^QHO>$ObbDNwK`7uO>M7DOwQjzUpvP|UXF3jO~BELq+=OVk$ zU@~r#Z(!0P^1B2k?G_n;N!cSCs9=Pgf${B<4`C9A$)_+0J0g2NnD`-b62@$c$Vp28 zZ|yk{(_`>Tb<+utDDB$v2)NIx19@! zyGw?E1VhdN-cfQE@Wqo0KvLBD1f+PaZ$Rpp^$|Ek-C0Y@?1-LcQ@6e6H0wJjtaY3= zt?MjmA7@qjIxDKfU!%JGjjA(eRCVWaiFS^>sLqw|B{^ro7|FQ{eI$J-8Yk&XAX$AX zo>1RPsN4Ej!aZAGizn3QK(hK?G_HFn^yyv-#>g3%d@sqpdY!z9nBUyKi^SkTGOE57VBI}*-Y+h%-GE45`y*&rgr|doceoyQ> zk~ws@k}qvtAoGFk0~Fq)ugl8PX+00l>%AazVc!K`k*rhxNbA;4YMI}}4)LlBQa}+J>TnF>*&mTt*-1q~vcu#!* literal 0 HcmV?d00001 diff --git a/cspdk/sin300/gds/SOI220nm_1310nm_TE_STRIP_2x1_MMI.gds b/cspdk/sin300/gds/SOI220nm_1310nm_TE_STRIP_2x1_MMI.gds new file mode 100644 index 0000000000000000000000000000000000000000..86833f05963d9d8ec54a78d7072c65b74f7127a7 GIT binary patch literal 586 zcmaKpy-LJD6orp7$z+NDVk4|zv8AGkh1v+Bf)wGz}Kl|F)vFQA2;onW_( zt=Rhr+e->jR+Q`BTw>CU)i<0ohq>nt43yeOeL#6#_?Uu+24<>f3@LMZa+DsXm%yZU zSJ$qVwx92_m5t8)-OWLax@*rijA`#iVYqO9mIR9dBi>BfaVy$O!iykjHX}GSzzi#B zm=OhFc1#mJJ`jCQ6CGa@_11-7ucCkV3LnlmY-qd%{|_Ae0w8?2L;wH) literal 0 HcmV?d00001 diff --git a/cspdk/sin300/gds/SOI220nm_1310nm_TE_STRIP_2x2_MMI.gds b/cspdk/sin300/gds/SOI220nm_1310nm_TE_STRIP_2x2_MMI.gds new file mode 100644 index 0000000000000000000000000000000000000000..32c178f921db05b8b54404490acd9f856b37d9da GIT binary patch literal 714 zcmaKoJxjw-6o%h?^v3#y0T;1@Lq{Pt4&ovN6bw=nn?YQHofOoelR7v!6#NAa1#$Bq zNVjh8{SDGp9E2h*J>Jtpnl87~6YiUbbIuC|+df0dvb`_NV+|h4*qHvtqOGp4>Wz!W zJ+SH&_M+#VqtExB-Tij();dp6Dwy4}Qnlka47YA?(#m#)ksPG8!@Dr8R%5tx zfLgNQKrPz?mnWjXb)vXVG>C-5uDp->Sq|5S$p@?=dw>%N-41(tSWjpbO+Ik> z$n%AxKJf8MH0%lo(Ihv_=bYyYRgXQrXh-M-lic9TeZPk?M+hvmWp5#oemDAlGrxQK zetzd3B%kHyy-)Y=H@OG)IXC%vPu~yY|G>=p%Q)NT{h_^_S$`RIKEB`6C%O0sa?8>m literal 0 HcmV?d00001 diff --git a/cspdk/sin300/gds/SOI220nm_1310nm_TE_STRIP_90_Degree_Bend.gds b/cspdk/sin300/gds/SOI220nm_1310nm_TE_STRIP_90_Degree_Bend.gds new file mode 100644 index 0000000000000000000000000000000000000000..11a64f182c8ac2d60b7b4268205b44bffcf5b4b9 GIT binary patch literal 650 zcmZ{hO-NKx7>3_D_h){ZJO7)3k%SZxl$;SVH-a`Th6$1!Gz7gAjiLC*ETX_@Q&790 zMGFN3!9Z{!w1{xwDg@hzLC{K35?m>*5(S@G>81;Z=iGC@_kGXzUAZ#mp>hEe+*d?d z1=Xa+t9wO_J30Qi_Newk%2-ZM@4K$@_s_@O#jiI%%@0?UbN;VwbKQaar9z=&ddkmt z=If~3^#>{sO8tI!hhMBdtyQajUv>J4WQQczGqU8yj1)LXSh{?IoMd@zkW2yIk*pGY zj&KyNOU?{6aZKjmtQ33$ccsurqmN{TeCiT^xK9t9;C_SD z?s4B|@E-SHM6*I)^x&OA4>C))u4N|9GTJq0qy5cXm}&TwdEpsOK|DibnRB#cnFX}; lVVI$lhx{kIjk(jm)dW{LV1+OlQK)>^t<*PJ$QI_JZt>7H6^t<5c;7HiqCsE7!O zsECM&h>DPiiin7akcfx~kr1MWa6hBPnfY-(<-t?yjc-?h1?Z$szeyYJo9yRP5GGo4H1 z#9W$7Oo%z>N^;Y@zbD7J;v~1B+QoM)a4xllTQw?w@8T2P|9aYaR=xf^KI{$E+~VYa zeBzw@bhg>KqLe3ErERM4VV4%A&g=c6cZ2iQZ)qbJcB$d%?_R!pX1x}7u}cl_*ADXC zbpu-5#V)n{l(*SUeO(KOU26Fo_OPqkrG>*TH9YoE;YQL*~)jXZq(u~ zcB$oO6|tK=LkovpYWdv#>?ZEj!eN&ho_^jL939)Pja=BJhWFDS=ew70(c&(4sp095 zXZY^PC$+eXU26F~_3XZ`)52kw8s5*?6r8{EPHp7EE;T&;`6%B#^{^Iqu}cl_FUaP* zSqUxfVwW184vz8NL#MR3i(P7XKR)^*jJ|*T_%mAE#V$2G9UkGk!^gC^i(P7XKW!`D zz4S#b?qZi(emy_Gegi+hp>WuxmQO3?yYXTz9CoSUX|OUl`ZlSJT-c?C_qP`C-L`33 z+{G?6JPqaX-5(}saTmMP@P6I_zB_-P7I(2rEr0!Kb`_&qIP6lx(}B$3=wS4VjNd^t za$%Pm-j~PuZaHaj7rWH(^y4t!Ju;-lUF=fB`=%Pc+nmzkE_SKq*YM}Zck$;Z6b`%8 z@;6uV-4=fSJPL{7$iZ*K-iBd=;B7j~)T_w(nUzUR+>C>(aF;r+NOe%-MO zZREl(wS4U(?CKuW!eN&hp7!$dPv7wK9~!x^OAYUD*rkT2-(L=nMxWP4F6>gn`(;n@-Q|yIaTmMP z^7+rPyXUO?c-=f7`>{825+Rg5w z&$V#arIx>GBfC}IS~%=d%dgnXZe^bq4!hLyg=^Ve)uDyME;T&)k5*e(1(3x{25`GSYoU2&fl4!hLy#S7V8J6{WjU26G^ zDeN*QY2mO-EkAi1yG!2F!eN&hp8i=A9F4VUBNuk5;eGZ=zMFGGi@VsRhNr*o=ewu- zwYZC2YIwio1-`rVSuO5jml~da8sxi22ei10U21s0_%*&;^NJRCu}j5gME{2vcmD!j Cf2_g) literal 0 HcmV?d00001 diff --git a/cspdk/sin300/gds/SOI220nm_1310nm_TE_STRIP_Waveguide.gds b/cspdk/sin300/gds/SOI220nm_1310nm_TE_STRIP_Waveguide.gds new file mode 100644 index 0000000000000000000000000000000000000000..cad9dbe215c120ed58d3e856f1f53ef87afc0f5c GIT binary patch literal 204 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRUk&!`OZoHwfA&3fbjSmh9@(hR%Pb^DKFU?Fzjdw1}FD}l^ KOW&C5$piolMH4~* delta 25 gcmcb{x{Y;0Jf8p?TXIo;adBo|dVF#I#$Hb*0B{iq;s5{u diff --git a/cspdk/sin300/gds/SOI220nm_1550nm_TE_RIB_2x1_MMI.gds b/cspdk/sin300/gds/SOI220nm_1550nm_TE_RIB_2x1_MMI.gds new file mode 100644 index 0000000000000000000000000000000000000000..aa0cbedc7f7a05c07e8f0e76d3b03c1610599a8a GIT binary patch literal 744 zcmaKqze_?<6vw~a=XticFsYmI`2hK825 zCRcIGK$`j^3~4b42N8+n^lnFcZ+T9i%lF(b_j}H{&>+Mvf?Yx{qZeb)F@*{D8GfOq zQ%9M@%mpy4sLRIH!shE!b#W~}`}nYDBB*+MCpB$nD;9~&og7=?XjH;nx3*)eR^&Wv zB@!|Cx&f_UK!G+O0L%mwqL)iRnI}3u091pixAdMsyAIzVy!=Gxn#}KK=_C4i zW7ex)e!y5FY7R*P;tROlx0Ag~5>e>C-tqm~2H#@>eR~~rcITJ6?1Sr_ z{Lb9m^NS||IY&v=@bWu-=F;46F5T|G%|G3pUv2I0M(!`$ASxA@<%&K3X`+ua&dmhI zucgk+Hh|!$ybpv{0JG?Dq-N*2v%g*nkU5w{pZ8K{nnj|DU;3PPO9k#vxBrL_zj{sm Axc~qF literal 0 HcmV?d00001 diff --git a/cspdk/sin300/gds/SOI220nm_1550nm_TE_RIB_2x2_MMI.gds b/cspdk/sin300/gds/SOI220nm_1550nm_TE_RIB_2x2_MMI.gds new file mode 100644 index 0000000000000000000000000000000000000000..c67bfee05929f66f711f177d1b2f30c6cd57b741 GIT binary patch literal 872 zcmaKqKS)AR6vjW_)2IEVASF>KqQM}j6p5CoC`dw*5(*csE&4M!)z%s`y0y4Ojg5{@ zP3<`fp@A+9fr{ek9#7Bb@|=E;@7(Ww=bm$6K+{eUbZG7`jKU8$7BN5gjd9Jmx;W3C zW$%C)-L<*>uzv9V^0Tp9Sjj)7k_fu&y$gnMd>9LdS8uMzps_HrPkhsR`Sme%;0|{r&FCIUz7sVBI8<(rx@! zpC4~LKY(fWZ&K+){5&`ISv31Msp>X^>Int;E~=YhE`;8HzGlm5Dz=O>?&ISTnd WtP3waL{%^QtlV-@?&nr5JMjm5#Td!} literal 0 HcmV?d00001 diff --git a/cspdk/sin300/gds/SOI220nm_1550nm_TE_RIB_90_Degree_Bend.gds b/cspdk/sin300/gds/SOI220nm_1550nm_TE_RIB_90_Degree_Bend.gds new file mode 100644 index 0000000000000000000000000000000000000000..959a11ce2818c4944cca6c650de6396a08edcde9 GIT binary patch literal 2272 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 literal 0 HcmV?d00001 diff --git a/cspdk/sin300/gds/SOI220nm_1550nm_TE_RIB_Waveguide.gds b/cspdk/sin300/gds/SOI220nm_1550nm_TE_RIB_Waveguide.gds new file mode 100644 index 0000000000000000000000000000000000000000..557f03b2fb558afc7689a6085a6e0ebf2fc99a49 GIT binary patch literal 266 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLR7|(|sSGR}3=C|% zObpBnYVz}Z215GzdQrO;Q$y7lz9jehtXhh7C{EMepYn-uct%wLujDm UGa>pR^#A`raj<@NpcyO-0J#lFssI20 literal 0 HcmV?d00001 diff --git a/tests/gds_ref/crossing_rc.gds b/cspdk/sin300/gds/SOI220nm_1550nm_TE_RIB_Waveguide_Crossing.gds similarity index 66% rename from tests/gds_ref/crossing_rc.gds rename to cspdk/sin300/gds/SOI220nm_1550nm_TE_RIB_Waveguide_Crossing.gds index c63f44c50f28fe8186e61541bcc3b38f610ac4bf..2c388d1a78926183855e0b0785f5410caacb7606 100644 GIT binary patch delta 55 zcmdnSafM?-ypA3lTd=>Uk&!`OZoHwXDToSjjSup4iVsgLOHD7$Oi7J*F3K-1&df{S In0t~L0O^+#6aWAK delta 25 gcmcb@v5jLwJf8p?TXIo;adBo|dVEpx#_p5M0C6G-SO5S3 diff --git a/cspdk/sin300/gds/SOI220nm_1550nm_TE_STRIP_2x1_MMI.gds b/cspdk/sin300/gds/SOI220nm_1550nm_TE_STRIP_2x1_MMI.gds new file mode 100644 index 0000000000000000000000000000000000000000..c3c5e51506784f0fe6839aaf3b28cf5a352fa8e4 GIT binary patch literal 586 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRo(wD;3=C|% zObpBnYR= z|Nk!@5O+do1_tgO5Pc9DERVx}gg>{eg7|mKDwzLaG*}#m{{R2|fMEx7H;e|kA0!T= dSsih^-%kh;Zph&W5(kANL>{7_9T*2J3;=q9vF88) literal 0 HcmV?d00001 diff --git a/cspdk/sin300/gds/SOI220nm_1550nm_TE_STRIP_2x2_MMI.gds b/cspdk/sin300/gds/SOI220nm_1550nm_TE_STRIP_2x2_MMI.gds new file mode 100644 index 0000000000000000000000000000000000000000..032dac443357006bb065fcf90ca4955e5206a7db GIT binary patch literal 714 zcmaKoze>YU6vn^Yq&L=oC`dutL8LJ;4hG!>b?Bsz;4`@B$Rm_wTp42lhEP`FT%Y-uNDvS$`R4`}}^SUe2t)jA=gJ-%Wq*;2(rL B(hL9q literal 0 HcmV?d00001 diff --git a/cspdk/sin300/gds/SOI220nm_1550nm_TE_STRIP_90_Degree_Bend.gds b/cspdk/sin300/gds/SOI220nm_1550nm_TE_STRIP_90_Degree_Bend.gds new file mode 100644 index 0000000000000000000000000000000000000000..7a3a5e9fe796986240f1ecae8ad2306e03227680 GIT binary patch literal 650 zcmZ{gy-QnR6vm(2E>~gSAQ=LZE(Ss7kqh1ranuKtzysQAC#( z3N2Ixom~6_oE$n-q?Uq<*baqi3!;M1LZMTCPI2+V;rHId^E~f4uPhnHGsRtoeI~!E zW$U35ch3qM*39&HX{@v$#oXrOuGLiTs8O#r4`8K zMXDgj88_dyT zhuAnZU9QR<`p?m9Q3KQ(zAR+VNH4n(QdWpBl{_GsshV=ZOco(vLS1<-m-t9dZRj>(fE${gmZv*5W gvk|7z*27zEg7^Q<8NKU}3Q`|*_wz)N+muKD0S=N^Gynhq literal 0 HcmV?d00001 diff --git a/cspdk/sin300/gds/SOI220nm_1550nm_TE_STRIP_Waveguide.gds b/cspdk/sin300/gds/SOI220nm_1550nm_TE_STRIP_Waveguide.gds new file mode 100644 index 0000000000000000000000000000000000000000..acdba8b4783ba1be144b29e6a5b8ab616e96d044 GIT binary patch literal 204 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRUk&!`OZoHwXDToSjjSmh9@(hR%Pb^DKFU?Fzjdw1}FD}l^ KOW&A#k_i9~jT6cM delta 25 gcmcb{wvBB@m0C58eSO5S3 diff --git a/cspdk/si220/gds/SiN300nm_1310nm_TE_STRIP_2x1_MMI.gds b/cspdk/sin300/gds/SiN300nm_1310nm_TE_STRIP_2x1_MMI.gds similarity index 100% rename from cspdk/si220/gds/SiN300nm_1310nm_TE_STRIP_2x1_MMI.gds rename to cspdk/sin300/gds/SiN300nm_1310nm_TE_STRIP_2x1_MMI.gds diff --git a/cspdk/si220/gds/SiN300nm_1310nm_TE_STRIP_2x2_MMI.gds b/cspdk/sin300/gds/SiN300nm_1310nm_TE_STRIP_2x2_MMI.gds similarity index 100% rename from cspdk/si220/gds/SiN300nm_1310nm_TE_STRIP_2x2_MMI.gds rename to cspdk/sin300/gds/SiN300nm_1310nm_TE_STRIP_2x2_MMI.gds diff --git a/cspdk/si220/gds/SiN300nm_1310nm_TE_STRIP_90_Degr.gds b/cspdk/sin300/gds/SiN300nm_1310nm_TE_STRIP_90_Degr.gds similarity index 100% rename from cspdk/si220/gds/SiN300nm_1310nm_TE_STRIP_90_Degr.gds rename to cspdk/sin300/gds/SiN300nm_1310nm_TE_STRIP_90_Degr.gds diff --git a/cspdk/si220/gds/SiN300nm_1310nm_TE_STRIP_Grating.gds b/cspdk/sin300/gds/SiN300nm_1310nm_TE_STRIP_Grating.gds similarity index 100% rename from cspdk/si220/gds/SiN300nm_1310nm_TE_STRIP_Grating.gds rename to cspdk/sin300/gds/SiN300nm_1310nm_TE_STRIP_Grating.gds diff --git a/cspdk/si220/gds/SiN300nm_1310nm_TE_STRIP_Wavegui.gds b/cspdk/sin300/gds/SiN300nm_1310nm_TE_STRIP_Wavegui.gds similarity index 100% rename from cspdk/si220/gds/SiN300nm_1310nm_TE_STRIP_Wavegui.gds rename to cspdk/sin300/gds/SiN300nm_1310nm_TE_STRIP_Wavegui.gds diff --git a/cspdk/si220/gds/SiN300nm_1550nm_TE_STRIP_2x1_MMI.gds b/cspdk/sin300/gds/SiN300nm_1550nm_TE_STRIP_2x1_MMI.gds similarity index 100% rename from cspdk/si220/gds/SiN300nm_1550nm_TE_STRIP_2x1_MMI.gds rename to cspdk/sin300/gds/SiN300nm_1550nm_TE_STRIP_2x1_MMI.gds diff --git a/cspdk/si220/gds/SiN300nm_1550nm_TE_STRIP_2x2_MMI.gds b/cspdk/sin300/gds/SiN300nm_1550nm_TE_STRIP_2x2_MMI.gds similarity index 100% rename from cspdk/si220/gds/SiN300nm_1550nm_TE_STRIP_2x2_MMI.gds rename to cspdk/sin300/gds/SiN300nm_1550nm_TE_STRIP_2x2_MMI.gds diff --git a/cspdk/si220/gds/SiN300nm_1550nm_TE_STRIP_90_Degr.gds b/cspdk/sin300/gds/SiN300nm_1550nm_TE_STRIP_90_Degr.gds similarity index 100% rename from cspdk/si220/gds/SiN300nm_1550nm_TE_STRIP_90_Degr.gds rename to cspdk/sin300/gds/SiN300nm_1550nm_TE_STRIP_90_Degr.gds diff --git a/cspdk/si220/gds/SiN300nm_1550nm_TE_STRIP_Grating.gds b/cspdk/sin300/gds/SiN300nm_1550nm_TE_STRIP_Grating.gds similarity index 100% rename from cspdk/si220/gds/SiN300nm_1550nm_TE_STRIP_Grating.gds rename to cspdk/sin300/gds/SiN300nm_1550nm_TE_STRIP_Grating.gds diff --git a/cspdk/si220/gds/SiN300nm_1550nm_TE_STRIP_Wavegui.gds b/cspdk/sin300/gds/SiN300nm_1550nm_TE_STRIP_Wavegui.gds similarity index 100% rename from cspdk/si220/gds/SiN300nm_1550nm_TE_STRIP_Wavegui.gds rename to cspdk/sin300/gds/SiN300nm_1550nm_TE_STRIP_Wavegui.gds diff --git a/cspdk/sin300/import_pdk.py b/cspdk/sin300/import_pdk.py new file mode 100644 index 0000000..d582cc2 --- /dev/null +++ b/cspdk/sin300/import_pdk.py @@ -0,0 +1,6 @@ +""" From a list of GDS files, generate a script to import the cells from a pdk """ + +import gdsfactory as gf + +if __name__ == "__main__": + print(gf.write_cells.get_import_gds_script("gds", module="cspdk.cells")) diff --git a/cspdk/sin300/klayout/d25/Cornerstone.lyd25 b/cspdk/sin300/klayout/d25/Cornerstone.lyd25 new file mode 100644 index 0000000..6128169 --- /dev/null +++ b/cspdk/sin300/klayout/d25/Cornerstone.lyd25 @@ -0,0 +1,38 @@ + + + + + d25 + + + + false + false + 0 + + true + d25_scripts + tools_menu.d25.end + dsl + d25-dsl-xml + + +core = input(3, 0) +slab = input(5, 0) +nitride = input(203, 0) +nitride_etch = input(204, 0) +heater = input(39, 0) +metal = input(41, 0) + + + +z(core, zstart: 0.0, zstop: 0.2, name: 'core: si 3/0', ) +z(slab, zstart: 0.0, zstop: 0.1, name: 'slab: si 5/0', ) +z(nitride, zstart: 0.0, zstop: 0.3, name: 'nitride: sin 203/0', ) +z(nitride_etch, zstart: 0.0, zstop: 0.3, name: 'nitride_etch: sin 204/0', ) +z(heater, zstart: 1.1, zstop: 1.8, name: 'heater: TiN 39/0', ) +z(metal, zstart: 1.8, zstop: 2.5, name: 'metal: Aluminum 41/0', ) + + + + diff --git a/cspdk/sin300/klayout/d25/Cornerstone_sin300.lyd25 b/cspdk/sin300/klayout/d25/Cornerstone_sin300.lyd25 new file mode 100644 index 0000000..bbb059c --- /dev/null +++ b/cspdk/sin300/klayout/d25/Cornerstone_sin300.lyd25 @@ -0,0 +1,34 @@ + + + + + d25 + + + + false + false + 0 + + true + d25_scripts + tools_menu.d25.end + dsl + d25-dsl-xml + + +nitride = input(203, 0) +nitride_etch = input(204, 0) +heater = input(39, 0) +metal = input(41, 0) + + + +z(nitride, zstart: 0.0, zstop: 0.3, name: 'nitride: sin 203/0', ) +z(nitride_etch, zstart: 0.0, zstop: 0.3, name: 'nitride_etch: sin 204/0', ) +z(heater, zstart: 1.1, zstop: 1.8, name: 'heater: TiN 39/0', ) +z(metal, zstart: 1.8, zstop: 2.5, name: 'metal: Aluminum 41/0', ) + + + + diff --git a/cspdk/sin300/klayout/layers.lyp b/cspdk/sin300/klayout/layers.lyp new file mode 100644 index 0000000..8190ff8 --- /dev/null +++ b/cspdk/sin300/klayout/layers.lyp @@ -0,0 +1,122 @@ + + + + #ffa500 + #ffa500 + 0 + 0 + I3 + + true + true + false + + false + false + 0 + NITRIDE 203/0 + 203/0@1 + + + #0000ff + #0000ff + 0 + 0 + I3 + + true + true + true + 1 + false + false + 0 + NITRIDE_ETCH 204/0 + 204/0@1 + + + #ebc634 + #ebc634 + 0 + 0 + I3 + + true + true + false + + false + false + 0 + HEATER 39/0 + 39/0@1 + + + + #008080 + 0 + 0 + I3 + + true + true + false + + false + false + 0 + PAD 41/0 + 41/0@1 + + + #000000 + #000000 + 0 + 0 + I1 + + true + true + false + + false + false + 0 + FLOORPLAN 99/0 + 99/0@1 + + + #00ffff + #00ffff + 0 + 0 + I1 + + true + true + false + + false + false + 0 + LABEL_SETTINGS 100/0 + 100/0@1 + + + #00ffff + #00ffff + 0 + 0 + I1 + + true + true + false + + false + false + 0 + LABEL_INSTANCE 101/0 + 101/0@1 + + diff --git a/cspdk/sin300/klayout/tech.lyt b/cspdk/sin300/klayout/tech.lyt new file mode 100644 index 0000000..cfdc5e1 --- /dev/null +++ b/cspdk/sin300/klayout/tech.lyt @@ -0,0 +1,162 @@ + + + Cornerstone_sin300 + + + 0.001 + + + + layers.lyp + true + + + 1 + true + true + + + true + layer_map() + true + true + + + true + layer_map() + 0.001 + true + #1 + true + #1 + false + #1 + true + OUTLINE + true + PLACEMENT_BLK + true + REGIONS + true + + 0 + true + .PIN + 2 + true + .PIN + 2 + true + .FILL + 5 + true + .OBS + 3 + true + .BLK + 4 + true + .LABEL + 1 + true + .LABEL + 1 + true + + 0 + true + + 0 + VIA_ + true + default + false + false + + + + false + true + true + 64 + 0 + 1 + 0 + DATA + 0 + 0 + BORDER + layer_map() + true + + + 0.001 + 1 + 100 + 100 + 0 + 0 + 0 + false + false + false + true + layer_map() + + + 0 + 0.001 + layer_map() + true + false + + + 1 + 0.001 + layer_map() + true + false + true + + + + + GDS2 + + true + false + false + false + false + false + 8000 + 32000 + LIB + + + 2 + true + true + 1 + * + false + + + 0 + + + false + false + + + 0 + + true + + + + HEATER,HEATER,PAD + HEATER='39/0' + PAD='41/0' + + diff --git a/cspdk/sin300/layers.yaml b/cspdk/sin300/layers.yaml new file mode 100644 index 0000000..9f0fe0b --- /dev/null +++ b/cspdk/sin300/layers.yaml @@ -0,0 +1,38 @@ +LayerViews: + NITRIDE: + layer: [203, 0] + layer_in_name: true + color: "orange" + hatch_pattern: coarsely dotted + NITRIDE_ETCH: + layer: [204, 0] + layer_in_name: true + hatch_pattern: coarsely dotted + transparent: true + width: 1 + color: "blue" + HEATER: + layer: [39, 0] + layer_in_name: true + color: "#ebc634" + hatch_pattern: coarsely dotted + PAD: + layer: [41, 0] + layer_in_name: true + fill_color: "teal" + hatch_pattern: coarsely dotted + FLOORPLAN: + layer: [99, 0] + layer_in_name: true + color: "black" + hatch_pattern: hollow + LABEL_SETTINGS: + layer: [100, 0] + layer_in_name: true + color: "cyan" + hatch_pattern: hollow + LABEL_INSTANCE: + layer: [101, 0] + layer_in_name: true + color: "cyan" + hatch_pattern: hollow diff --git a/cspdk/sin300/models.py b/cspdk/sin300/models.py new file mode 100644 index 0000000..5ded49c --- /dev/null +++ b/cspdk/sin300/models.py @@ -0,0 +1,146 @@ +from __future__ import annotations + +import inspect +from collections.abc import Callable +from functools import partial + +import gplugins.sax.models as sm +import jax.numpy as jnp +import sax +from gdsfactory.pdk import get_cross_section_name +from gdsfactory.typings import CrossSectionSpec +from gplugins.sax.models import bend as __bend +from gplugins.sax.models import straight as __straight +from numpy.typing import NDArray + +nm = 1e-3 + +FloatArray = NDArray[jnp.floating] +Float = float | FloatArray + +################ +# Straights +################ + + +def _straight( + *, + wl: Float = 1.55, + length: Float = 10.0, + loss: Float = 0.0, + cross_section: CrossSectionSpec = "xs_sc", +) -> sax.SDict: + if get_cross_section_name(cross_section).endswith("nc"): + return __straight( + wl=wl, # type: ignore + length=length, # type: ignore + loss=loss, # type: ignore + wl0=1.55, + neff=1.6, + ng=1.94, + ) + elif get_cross_section_name(cross_section).endswith("no"): + return __straight( + wl=wl, # type: ignore + length=length, # type: ignore + loss=loss, # type: ignore + wl0=1.31, + neff=1.63, + ng=2.00, + ) + else: + return __straight( + wl=wl, # type: ignore + length=length, # type: ignore + loss=loss, # type: ignore + wl0=1.55, + neff=2.38, + ng=4.30, + ) + + +straight_nc = partial(_straight, cross_section="xs_nc") +straight_no = partial(_straight, cross_section="xs_no") + +################ +# Bends +################ +bend_s = _straight + + +def _bend(wl: Float = 1.5, length: Float = 20.0, loss: Float = 0.03) -> sax.SDict: + return __bend( + wl=wl, # type: ignore + length=length, # type: ignore + loss=loss, # type: ignore + ) + + +bend_nc = partial(_bend, loss=0.03) +bend_no = partial(_bend, loss=0.03) + + +################ +# MMIs +################ +_mmi1x2 = sm.mmi1x2 +_mmi2x2 = sm.mmi2x2 + +_mmi1x2_o = partial(_mmi1x2, wl0=1.31) +_mmi1x2_c = partial(_mmi1x2, wl0=1.55) +_mmi2x2_o = partial(_mmi2x2, wl0=1.31) +_mmi2x2_c = partial(_mmi2x2, wl0=1.55) + +mmi1x2_nc = _mmi1x2_c +mmi1x2_no = _mmi1x2_o + +mmi2x2_nc = _mmi2x2_c +mmi2x2_no = _mmi2x2_o + +############################## +# Evanescent couplers +############################## + +_coupler = _mmi2x2 +_coupler_o = partial(_coupler, wl0=1.31) +_coupler_c = partial(_coupler, wl0=1.55) +coupler_nc = _coupler_c +coupler_no = _coupler_o + +############################## +# grating couplers Rectangular +############################## +_gc_rectangular = sm.grating_coupler +_gcro = partial(_gc_rectangular, loss=6, bandwidth=35 * nm, wavelength=1.31) +_gcrc = partial(_gc_rectangular, loss=6, bandwidth=35 * nm, wavelength=1.55) +gc_rectangular_nc = _gcrc +gc_rectangular_no = _gcro + +############################## +# grating couplers Elliptical +############################## +_gc_elliptical = _gc_rectangular +_gceo = partial(_gc_elliptical, loss=6, bandwidth=35 * nm, wavelength=1.31) +_gcec = partial(_gc_elliptical, loss=6, bandwidth=35 * nm, wavelength=1.55) +gc_elliptical_nc = _gcec +gc_elliptical_no = _gceo + + +################ +# Models Dict +################ +def get_models() -> dict[str, Callable[..., sax.SDict]]: + models = {} + for name, func in list(globals().items()): + if not callable(func): + continue + _func = func + while isinstance(_func, partial): + _func = _func.func + try: + sig = inspect.signature(_func) + except ValueError: + continue + if str(sig.return_annotation) == "sax.SDict": + models[name] = func + return models diff --git a/cspdk/sin300/samples/circuit_simulations_nc.py b/cspdk/sin300/samples/circuit_simulations_nc.py new file mode 100644 index 0000000..f80ca8d --- /dev/null +++ b/cspdk/sin300/samples/circuit_simulations_nc.py @@ -0,0 +1,23 @@ +import jax.numpy as jnp +import matplotlib.pyplot as plt +import sax + +from cspdk.sin300 import PDK, cells + +if __name__ == "__main__": + c = cells.mzi_nc(delta_length=100) + c.show() + c.plot_netlist() + netlist = c.get_netlist() + models = PDK.models + circuit, _ = sax.circuit(netlist, models=models) # type: ignore + wl = jnp.linspace(1.5, 1.6, 256) + + S = circuit(wl=wl) + plt.figure(figsize=(14, 4)) + plt.title("MZI") + plt.plot(1e3 * wl, jnp.abs(S["o1", "o2"]) ** 2) # type: ignore + plt.xlabel("λ [nm]") + plt.ylabel("T") + plt.grid(True) + plt.show() diff --git a/cspdk/sin300/samples/circuit_simulations_nc_with_routing.py b/cspdk/sin300/samples/circuit_simulations_nc_with_routing.py new file mode 100644 index 0000000..a624476 --- /dev/null +++ b/cspdk/sin300/samples/circuit_simulations_nc_with_routing.py @@ -0,0 +1,31 @@ +import gdsfactory as gf +import jax.numpy as jnp +import matplotlib.pyplot as plt +import sax + +from cspdk.sin300 import PDK, cells, tech + +if __name__ == "__main__": + c = gf.Component() + mzi1 = c << cells.mzi_nc(delta_length=10) + mzi2 = c << cells.mzi_nc(delta_length=100) + mzi2.move((200, 200)) + route = tech.get_route_nc(mzi1.ports["o2"], mzi2.ports["o1"]) + c.add(route.references) + c.add_port(name="o1", port=mzi1.ports["o1"]) + c.add_port(name="o2", port=mzi2.ports["o2"]) + c.show() + c.plot_netlist_flat() + netlist = c.get_netlist_recursive() + models = PDK.models + circuit, _ = sax.circuit(netlist, models=models) # type: ignore + wl = jnp.linspace(1.5, 1.6, 256) + + S = circuit(wl=wl) + plt.figure(figsize=(14, 4)) + plt.title("MZI") + plt.plot(1e3 * wl, jnp.abs(S["o1", "o2"]) ** 2) # type: ignore + plt.xlabel("λ [nm]") + plt.ylabel("T") + plt.grid(True) + plt.show() diff --git a/cspdk/sin300/samples/component_from_yaml_nc.py b/cspdk/sin300/samples/component_from_yaml_nc.py new file mode 100644 index 0000000..855a779 --- /dev/null +++ b/cspdk/sin300/samples/component_from_yaml_nc.py @@ -0,0 +1,54 @@ +sample_pads = """ +name: pads +pdk: cspdk.sin300 + +instances: + bl: + component: pad + tl: + component: pad + br: + component: pad + tr: + component: pad + +placements: + tl: + x: -200 + y: 500 + + br: + x: 400 + y: 400 + + tr: + x: 400 + y: 600 + + +routes: + electrical: + settings: + cross_section: xs_metal_routing + separation: 20 + width: 10 + path_length_match_loops: 2 + end_straight_length: 100 + links: + tl,e3: tr,e1 + bl,e3: br,e1 + optical: + settings: + cross_section: xs_nc + radius: 100 + links: + bl,e4: br,e3 + +""" + + +if __name__ == "__main__": + import gdsfactory as gf + + c = gf.read.from_yaml(sample_pads) + c.show() diff --git a/cspdk/si220/samples/get_route.py b/cspdk/sin300/samples/get_route_nc.py similarity index 91% rename from cspdk/si220/samples/get_route.py rename to cspdk/sin300/samples/get_route_nc.py index 980d432..168a817 100644 --- a/cspdk/si220/samples/get_route.py +++ b/cspdk/sin300/samples/get_route_nc.py @@ -2,7 +2,7 @@ import gdsfactory as gf -from cspdk.si220 import cells, tech +from cspdk.sin300 import cells, tech if __name__ == "__main__": c = gf.Component("sample_connect") diff --git a/cspdk/si220/samples/mode_solver_n.py b/cspdk/sin300/samples/mode_solver_n.py similarity index 100% rename from cspdk/si220/samples/mode_solver_n.py rename to cspdk/sin300/samples/mode_solver_n.py diff --git a/cspdk/sin300/tech.py b/cspdk/sin300/tech.py new file mode 100644 index 0000000..0345aa5 --- /dev/null +++ b/cspdk/sin300/tech.py @@ -0,0 +1,198 @@ +"""Technology definitions.""" + +import sys +from functools import partial +from typing import cast + +import gdsfactory as gf +from gdsfactory.cross_section import get_cross_sections +from gdsfactory.technology import LayerLevel, LayerMap, LayerStack, LayerViews +from gdsfactory.typings import ConnectivitySpec, Layer + +from cspdk.sin300.config import PATH + +nm = 1e-3 + + +class LayerMapCornerstone(LayerMap): + WG: Layer = (3, 0) + SLAB: Layer = (5, 0) + FLOORPLAN: Layer = (99, 0) + HEATER: Layer = (39, 0) + GRA: Layer = (6, 0) + LBL: Layer = (100, 0) + PAD: Layer = (41, 0) + NITRIDE: Layer = (203, 0) + NITRIDE_ETCH: Layer = (204, 0) + + # labels for gdsfactory + LABEL_SETTINGS: Layer = (100, 0) + LABEL_INSTANCE: Layer = (101, 0) + + +LAYER = LayerMapCornerstone() + + +def get_layer_stack( + thickness_nitride: float = 300 * nm, + zmin_heater: float = 1.1, + thickness_heater: float = 700 * nm, + zmin_metal: float = 1.1, + thickness_metal: float = 700 * nm, +) -> LayerStack: + """Returns LayerStack. + + based on paper https://www.degruyter.com/document/doi/10.1515/nanoph-2013-0034/html + + Args: + thickness_nitride: nitride thickness in um. + zmin_heater: TiN heater. + thickness_heater: TiN thickness. + zmin_metal: metal thickness in um. + thickness_metal: metal2 thickness. + """ + + return LayerStack( + layers=dict( + nitride=LayerLevel( + layer=LAYER.NITRIDE, + thickness=thickness_nitride, + zmin=0.0, + material="sin", + info={"mesh_order": 2}, + sidewall_angle=10, + width_to_z=0.5, + ), + nitride_etch=LayerLevel( + layer=LAYER.NITRIDE_ETCH, + thickness=thickness_nitride, + zmin=0.0, + material="sin", + info={"mesh_order": 1}, + sidewall_angle=10, + width_to_z=0.5, + ), + heater=LayerLevel( + layer=LAYER.HEATER, + thickness=thickness_heater, + zmin=zmin_heater, + material="TiN", + info={"mesh_order": 1}, + ), + metal=LayerLevel( + layer=LAYER.PAD, + thickness=thickness_metal, + zmin=zmin_metal + thickness_metal, + material="Aluminum", + info={"mesh_order": 2}, + ), + ) + ) + + +LAYER_STACK = get_layer_stack() +LAYER_VIEWS = gf.technology.LayerViews(PATH.lyp_yaml) + + +############################ +# Cross-sections functions +############################ +xf_nc = partial(gf.cross_section.strip, layer=LAYER.NITRIDE, width=1.20, radius=25) +xf_no = partial(gf.cross_section.strip, layer=LAYER.NITRIDE, width=0.95, radius=25) + +xf_nc_heater_metal = partial( + gf.cross_section.strip_heater_metal, + layer=LAYER.NITRIDE, + heater_width=2.5, + layer_heater=LAYER.HEATER, + width=1.20, +) + +metal_routing = partial( + gf.cross_section.cross_section, + layer=LAYER.PAD, + width=10.0, + port_names=gf.cross_section.port_names_electrical, + port_types=gf.cross_section.port_types_electrical, + radius=None, +) +heater_metal = partial(metal_routing, width=4, layer=LAYER.HEATER) + +############################ +# Cross-sections +############################ +xs_nc = xf_nc() +xs_no = xf_no() + +xs_sc_heater_metal = xf_nc_heater_metal() +xs_metal_routing = metal_routing() +xs_heater_metal = heater_metal() + +cross_sections = get_cross_sections(sys.modules[__name__]) + +############################ +# Routing functions +############################ +_settings_nc = dict( + straight="straight_nc", cross_section=xs_nc, bend="bend_nc", taper="taper_nc" +) +_settings_no = dict( + straight="straight_no", cross_section=xs_no, bend="bend_no", taper="taper_no" +) + +get_route_nc = partial(gf.routing.get_route, **_settings_nc) +get_route_no = partial(gf.routing.get_route, **_settings_no) + +get_route_from_steps_nc = partial( + gf.routing.get_route_from_steps, + **_settings_nc, +) +get_route_from_steps_no = partial( + gf.routing.get_route_from_steps, + **_settings_no, +) + +get_bundle_nc = partial(gf.routing.get_bundle, **_settings_nc) +get_bundle_no = partial(gf.routing.get_bundle, **_settings_no) + +get_bundle_from_steps_nc = partial( + gf.routing.get_bundle_from_steps, + **_settings_nc, +) +get_bundle_from_steps_no = partial( + gf.routing.get_bundle_from_steps, + **_settings_no, +) + + +routing_strategies = dict( + get_route_nc=get_route_nc, + get_route_no=get_route_no, + get_route_from_steps_nc=get_route_from_steps_nc, + get_route_from_steps_no=get_route_from_steps_no, + get_bundle_nc=get_bundle_nc, + get_bundle_no=get_bundle_no, + get_bundle_from_steps_nc=get_bundle_from_steps_nc, + get_bundle_from_steps_no=get_bundle_from_steps_no, +) + + +if __name__ == "__main__": + from gdsfactory.technology.klayout_tech import KLayoutTechnology + + LAYER_VIEWS = LayerViews(PATH.lyp_yaml) + # LAYER_VIEWS.to_lyp(PATH.lyp) + + connectivity = cast(list[ConnectivitySpec], [("HEATER", "HEATER", "PAD")]) + + t = KLayoutTechnology( + name="Cornerstone_sin300", + layer_map=dict(LAYER), + layer_views=LAYER_VIEWS, + layer_stack=LAYER_STACK, + connectivity=connectivity, + ) + t.write_tech(tech_dir=PATH.klayout) + +if __name__ == "__main__": + print(type(LAYER.NITRIDE), LAYER.NITRIDE) diff --git a/install_tech.py b/install_tech.py index 7ae8a33..eb079e1 100644 --- a/install_tech.py +++ b/install_tech.py @@ -14,6 +14,9 @@ def remove_path_or_dir(dest: pathlib.Path): def make_link(src, dest, overwrite: bool = True) -> None: dest = pathlib.Path(dest) + if not src.exists(): + raise FileNotFoundError(f"{src} does not exist") + if dest.exists() and not overwrite: print(f"{dest} already exists") return @@ -33,8 +36,13 @@ def make_link(src, dest, overwrite: bool = True) -> None: klayout_folder = "KLayout" if sys.platform == "win32" else ".klayout" cwd = pathlib.Path(__file__).resolve().parent home = pathlib.Path.home() - src = cwd / "cspdk" / "si220" / "klayout" dest_folder = home / klayout_folder / "tech" dest_folder.mkdir(exist_ok=True, parents=True) - dest = dest_folder / "cspdk" + + src = cwd / "cspdk" / "si220" / "klayout" + dest = dest_folder / "cspdk_si220" + make_link(src=src, dest=dest) + + src = cwd / "cspdk" / "sin300" / "klayout" + dest = dest_folder / "cspdk_sin300" make_link(src=src, dest=dest) diff --git a/tests/gds_ref/_bend.gds b/tests/gds_ref/_bend.gds deleted file mode 100644 index 223bd77606664f7a838deb93461c06111b459d50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2080 zcmZ|QX^7Qj6bImQ*U?!VXPj{sM`ycBWof&GC6$(mQDkNsmN+RSiIv!*B5hchm_=lk zk_(DKrC5PhS`?L88IcL?i%VsTS!6_;J-3+;eaR0#a|izKd(Q8i|DDK2GC46?63McC zQ65cE7P)Bq@6S=0%+8$AHGAspxe;}#%!qRr4IBIVhQnu$+B$UgiYv!QOXmNdEzf4B zbWNW%Eh613B3qS=RAl=kBg$6xO@)6)j~;Es;%*cDdtBXZaxmK>l3Th>oyYcw)Gl^9 zbQ1I2&tgR81|G*hImCtc@D#W8;~8AV5fQyg=U%|Ayf~uwC|<#L*%eVfnX~u}=SNh` z;i8DjQoWCG37?3lYUGPt$K4TqPUJzppr=Gc^=J;@dvt%_$(+Eid2>X~ja<&(xjmxx zF7AuySK;wWK1k2iHFG-Ga9Kosfjg;&#NQG9^_o1Lo9WDklev*k^H4Z(; zX)w2Oz3eg(&1R6kl+I4CQgRg!^A1^#~(BJ>sa2;r}$e$oAZ0ix$Qc>!yU379?{-LJ+$e!HKb(z4I+1TNuavhPoI);qKCsO3z#bzj~?y%Zmk^)Xya=N9EW@EktJxA}^UC-P0|zxbYvWmI&3>tFm-wu`9O z_BwvW)jTM}x-;m|wyq0FwTOTc7dyhBL&h}DM%OLN&c@MBl zW%3$u2``nYTCztumuhL2NmeaQb~`J-CbeYDqtSblS;*0}-wnHc|CnpTRa8@dyOX|+ zvuIE2kI?Mv=lLG9M|JK^=SLwzLo$=K(lyJ}^Ud{D;fPhQUiFOu;B z4wkL_l2yFP_v>NV{=_|$S7Mt?)sxU?)f6t3>4%)pahxI3w>XjJkr*RO&m@NPR1T5h zlk8xQjWS%pYMN`p?91$klA^5ipIWlF@)y}0qIxpZ`MnH2=0UnQ%p_%2ae(%y^mior gEcepxluWGRmo)E^vA9S4`?>q?aoU=sm61-zKNd}Pn*aa+ diff --git a/tests/gds_ref/_gc_rectangular.gds b/tests/gds_ref/_gc_rectangular.gds deleted file mode 100644 index beeacacb7ac67577a57e6a9cee41a1c437e299ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1828 zcma*o%_{_P7zgmL*_q!;OH4~CMNu4-p|;(ob>Udiu=orKax#296s*T?yxXL>X$~MH3o6zr)9| z#E5Dr#suK^2%TMv!QPvr*Kqem+wNAR4|T%t-?lIoGZb?q8I!eCHl5H7+0ZppNyf4X z#gL<#Dycz50bdHRatQe6su5Z71PNV^1_IFzJ*e4I=x?{zCCErURSuO?rTj*f>JwG!cT_oi zO_lL8s!Z-t<=6^UnmMW*k5lF3AXVmisB$_$m9vdhIbTJU3wf$sdZEhYd#YT$rONel zs@yoB%FQ*Z+@7Jz-4s>s4^ib|FI66gsq&=Rm0tXr%znnS)M#4CWZV>VQkc0ZZ2d^x zg*6M+PFvv0sZO7~XAS!)dkfj^7r&q8BfT%(jQ{6GBKw;E&V4>lm5+Jw;7*s~G_m^D R9qWtZ;sN#)uy*8myaW3z$vpr7 diff --git a/tests/gds_ref/_mm1x2_nitride_cband.gds b/tests/gds_ref/_mm1x2_nitride_cband.gds deleted file mode 100644 index bbcab547831735c4984160b9f6d52bef50084081..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 378 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRC)O|Nmc|K;r-Z|6Ku> z$DyBr;l>#T29C!d`+-_(A++dEh&brQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLR|6LZO`v3p`%@Fz(J4F0bE?gdu zeg+2K$sm0|H~fUq47DJA3=ABPAv91Phkgcz8)rc3K<)?Xt%cAab3o!CbD{Eh^#A|= dDHr1ZSL_fPrQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRrQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRyG%;mhVBuh3VB=+CIL*Mu$Hc(Epd-Kx zBpLqye=&i9L9_-&Gcbr3fW%=mSe!)=tN#E0Z8k74Fy4l!=h_FN|NsB$1QP%M|DP&c z9*2Ggh8t%X7&sF^_5-!nLTJ&S5OH2HxI7;H|Nnn_1#$l?b_o5y8Km$3|8EN*G*BL_ KA1KYj!TrQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRsG*BLgeg=l*IUsc)_XG9TLTHdVAaRhnP*mo%ONz#AIWnd{sPfJd9Z$Vpph&L0PN{$&;S4c diff --git a/tests/gds_ref/_mmi2x2_nitride_oband.gds b/tests/gds_ref/_mmi2x2_nitride_oband.gds deleted file mode 100644 index 4dde2da2191b4241fab8e56e2a6bf462cf772b19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 442 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRyG%;mhVBuh3VB=+CIL*Mu$Hc(Epd-Kx zBpLqye=&i9L9_-&Gcbr3fW%=mSe!)=tN#E0Z8rS>|7`(C_5c6>n<4Zoc8K_=S8#be z`WYB_#X$OiZukkI8EQfL7#KJcAT&@Ohkgcz8)rc3K<)?Xt%cAab3o!CbD{Eh^#A|= d=@rEPuh=0p$R9V(K>P)wf%0JeKxq~h1_0;2ZNUHl diff --git a/tests/gds_ref/_straight.gds b/tests/gds_ref/_straight.gds deleted file mode 100644 index 4072cfea189d2bb95cd23a32c2788a5396d68916..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRrQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRwV^ X|Noy2BnYFy;w*v;3@q$G%)$Tw`R5$+ diff --git a/tests/gds_ref/array.gds b/tests/gds_ref/array.gds deleted file mode 100644 index fb52ed841793d69fa31e55ac38242f105ba1a210..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 272 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRSp0)VBin}i2!L~CI&VJMg|!HW(FAG-Ms+D zWMK0Az`!C1)Wgnz*9H!-4M24q3=C|%ObnU~YgwcecA!mf31iN~vuaMP{a9iBkhbgVvyBiL_B-(uQP~ zkqbpZWwd}+rWBP~8KMd8n_1an78PNOJ-3+;eaR0#a|izKd(Q8i|DDK2GC4h363MdN zF*q8dEOOEQ-=Cv0neDxzyKi>ibrH3x%=lB6jGg@Yqx(;swBg9rD=(TFEt&s+c1Skc z-81L1Sv~W6d-@_>9+9m|Mk=yHk`ZMO4o!uB2M-=>!_s~eBL-aEZ*mmdBa-X;O-*1& zL~0wmBGNOM=a(!-WUk_2{F9?yxR}SdZ8%ThDvpmRFP(cjH}IT@L6dkPx3fE9@J!C( zH(VG|F^@|kDogd=&pY^dL{$Sf@nPF9zH1h+5C*3M&vqWe+k`H{R#CpbQVA07ZLdy+3P89PQ$*X zvuoy34K=^&%z6Qj-IO@&tGXy#cJ7Kz#`RF z94Gr;PT}uVL(?t1R@Otgn0hJRE9*nJmd-88x%Cu2&$s!CjHmNW>c6-{#xg3pzwIx6 zEZZg2Yey}=;%e@d;o-mGsCh|v`N70OPGX^Z3E9?AK10LwNaBIIs^%jow^MIw_ zmphINzPJZ2g}5cp3HG@)38@j^ww zZZ@=0J@qST7wgrM+hg9|(cG(4S8k1cuphZatl%{Jay#`~JD5rP`wM^ z812lk9lv%&vH1&$!5Df-^!(QSH~pp!Iv^JqpEp)iWzz*D(|B^ zD$TuZv-j#{>a)U}+v>b`Kg;kXs()lR&17WO`}u|}ALHdTt3mo``PzHDj&`HEiA>o2C7 zM%bP74V*)JTK6l>zV3S8WA>=l9jS+SGkcll$uhPhsUg%ya<`0qPP(f`Cdp+oR)2CX z6FghSi#STQ@=I26zVFxlvi*s>D6hmunW`tD&#GCxOQ!F0A*b*PnZCv8G>^ntvh+;i zBp%DrGJJxa%&|d+D_Ko*O_+U|9Z^!0mHtypb^(8p%|5Cp)5Gs&@FDloy;b5?M}(WDt=D$E*VP)#J`{W{~o8UNm?1{bo>L>LwLLZ diff --git a/tests/gds_ref/bend_nc.gds b/tests/gds_ref/bend_nc.gds deleted file mode 100644 index 054b9a08bf9bdfb7a80aeb6d3c0ab8ae0c8fea52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5102 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 I?%|R6KTgs`+5i9m diff --git a/tests/gds_ref/bend_no.gds b/tests/gds_ref/bend_no.gds deleted file mode 100644 index da65ad3ddbeac52388e740356f250db1371d4ab4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5102 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 diff --git a/tests/gds_ref/bend_rc.gds b/tests/gds_ref/bend_rc.gds deleted file mode 100644 index 6e3da2482089bdee6b8dbec4216c568b56eea9a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5406 zcmZ|Td32TKodDopZgR5#iR^3Gm$1nm776>lgdGyHkedjih?cTgwXKSkGBV<5g=(QH zidt($p_b86N9|~>Ix@CaYaJZ5E>jnDbkNG;n0YQYb58%6oO92UyL{jG{h>bf;s*00%EcV5G|QRj{vQyP(zACX&_i0sHMN<_4&X_*~<8XFtC zV|&J|!X|fROmu1Tj*Qv;n|zQxoV2vb$1^6Uv1df`g^an2*vo}qWABK(RqVs}**7A8 zJ^S%EOCky`=YWtF4rF>=gCm+3aR_&Fctne0j^uuhjwl?+aXiGbh@!Ea%qKZL;;fmR z%_E#2(Q+9V^C(wDv}#~AKV&MR^#-2DuXvGcUBOL?k>usPj#o#tYs($n%O6Fw@5Md* zIq!<-FpLNIFdvTSIFY~RGkh_k(>%V$m-%i)=au{~zRj;Ax~x^30)EO45yhJ+U&W_6 zDx#}3g!sBCZY<+JaCJoYcD#f?<@SgkY7o}d<6c@%&!K#ZhxtlGukrkl))tKsy=O&a zIY;j!92C)K38(Q-l&8M6w3fcsoVC-E&Zl$t`-D$Nlx*ai{EF7v|9cUMjuA>53H2Iq z4VOm@6kEc120BM#cf_Dp{73GhybN|s;uQBrWOs`=+ar4_@1Wca=|jg3xre`s7}}q2 z@IJknj2NbOa`erx16&y~-0wNAJ^Vo)j2JPD|3SYen@5cFJb4bipIj%!KA&{$QI1a@ zi70ixr2LdRf3E%;EudVnkNz2Nix{Iexvz4+9xsX*YZmh4a_p_#8ZoXjALoyGBH|qJ z=8xial(X@9JVc+(|D0kk7#>lk_X<49j`48B1T`)=$)jduLc~P%Y4!s?Pmf6x%}Ptk zN%P8x$@0=%&L&$&^N%B@c&|k%9n-?Kru>!Sn<|#VE_|IAL`<8@NBF2&%GYY*Et1FS zx9}GcGjjPq+-$ZM@onB6F|(Z3KGU%+y*{fq)o9jEenWlHYDL8C6y zKVU|yBbH=SEK9sztgcJssQ6CGQP-9cOBeD=?&GI)Y`0ZLcM@Ns{B)m8b?yGkh~*__ z);_sh?R(t9e>SttBUb2>o>y@Zzo7Set>attsBlbgd8oKBGs6`Rnq9F~9H;)PRQtXj zmEWPYS3YcZU8_=E`stIEa$6$rE7i5+W*#)d^0QL^^_TN1pB-QwRrTD?J!Uw`Kk({^ z>Sks*i((lh-s&w>_v)XUzl(+H(|J5v~pZk5N_iOu@ zWuLE=$6=1I_4{z=tKCoMuYJ)h%S)}Cj8vmlU3d+rm|;0vbsl%nqtvxmiM{j&>Wk5B z`QH?8oxU04*t$`?olDKIYu9b$y>!gD!8|~HQTKuwmb1F|`B+3M%&yo|&N2Qsbe^(# zEa&gI#_Xz3>id})PTgd7LB*chMTk^;5$Ts#SyDTQHF0d5BZZ+E~t}*c;?& z(M&Gk5muNnF*VfiC{t#tf#O^8AJ# zYVstn)niv>tkaL_=XEG$icEA`vI(d+5wDW5x|h$-=y=VpRW=_ z>RGdJs>#h6Yd)d+)~wA~{WhPm{wj*G>J|PA)gbk2aXVM)DNdo3oV|PCi@ee?5>&nu~Ab`UEfKF>`aAZ}DR4i5VYK9%op0-LK4@_v-Fu z73E@@xvJa7#Z;52M|du0(`!?n;Y3d2AagH{x(*yeIh!P>tJHAPQ2xn&aX-~*Vt>l( z1lL;iBle`cl-nXj4hndYA?6>k(b0O33&&ce@HQkuhb80?9Evx^HdA!R$ zu0N`+dw4V2i-zrFZ=R(meSWCes-9yzs@V{as&y>pxXis_RX+Rb*;jqf$jM4QIat0{ zUgUd7{#MH6ps@_!S5N5W=Q*9$JKzOYP%SE*v%i=s{!Fn~SYOEpT+0pAOZ`sj^^Yjd z6|U8!oYl2RP5t&eR`EflEVizP%+7Jnv~{*wyv=>4*JqTn+AO|EJu+R+S~}0P zueh3ey=7av_F2!E$%nXwa&}gUnY6~Df2Xw+U2i7kr)U}-S9pS5=sJ`1LE(ASkA>aL z=5O6!zeaJkxWR0`L%Ez_oh{_E%z2uNv+Reor4h@1SK^ETBu_m^f>ALMSM_;Xj9)!R6PJ!pMH)hQ`&LwnKZ zhwSGL_Tjl^^)61x%xuzn2jA`Qvg7oAj+h2{Kj#2@Q?3WzNxd+zC&fPCb`GRo&uMN} zf9mhRPuQ6+W$t0K)v~0W=jO7X{>uI?Te9Aa?&K^sqjmS$PO=Hk~gujL1N^UqYLylVcZ-g|}en7e@Q>9ObdE~jM7QNs{hj+&&+exS(`I#=S3Cgn5z zJZo2zg&EWTTS>ou=I4z5Z__<;S~+FD%ldy?GV}kotm6Osf7{15%Uf<^eLljL_R^GU5h3yU?|Lwv+h!jn;GD l*5@DTvCs9}O?pe63kPspCSB?MJpKPi`8boWJUPpW{{@W%MhpM| diff --git a/tests/gds_ref/bend_ro.gds b/tests/gds_ref/bend_ro.gds deleted file mode 100644 index a2c6b06e38b43e60ddf8932ed5f8865cb1d3bc3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5406 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 diff --git a/tests/gds_ref/bend_s.gds b/tests/gds_ref/bend_s.gds deleted file mode 100644 index 481b023ab6201f0ebeae68f1fe1efc6772797a0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1820 zcmaLYduWw)9LMp`bNfBJo$Z`$=WJ&??wq;JT_O{2%O&Pa8DvHmF|%^DwsKxpY^K>i zTFr2hik5+CH3i8CgUXymh>I){^3uhEL@hIy))JITMc4ar2ocnQ!|Qp@p6B=b-kxVN zvhA5lShjys8H&qSxl;c;R+eq%w>Gsu(!NB>cf1MpUA0p`d-L45$-8dq-Z*Qz65fB` zn_)~-OIveehujSA&gJZx)|U3ham`~|TE>oiOv(y7y8dw^lI!b#SIiGq{MQ<8nq)$@ z9GPsJ!|{V_4h#$=S$Z3$Bx@R$;_p~4*{iTha;oq~+=HVCUEDqr^&)ve-){*n=ab z&`@l^7x5uHj~!C>{n&-Ov0KU^H|@gb@erQGJ}G<~Ia^39RuNvs(Ncu_tvhiC&XIDn z@i}}PU&B4fdU*x-6}DkNeoF1qX(nsg)G_}_oQQkz0Vx_s>JjC7`z8DY-;rW5+>g}E zK83{X5LZDSCXjudTKpLAkqQ|GX8|%K&I$~E-y+3xk>hwP9>HEbClwKoOI$_N#-(OO zU*IiLF+FzaTk&$7k3S+cO4Q><>_+-C#KwKtjK`2;_dKl_&J3jCD@dFr12{rTl7~la zli%VDDK!PjA+-~iNTt=-g|FiVX=n_$;Tr6b$}*9fm950XQh9LBzU9H+e~~Jp$o>_< z{a2)6HO!ueA7V(VoQnB)0?EDVX)KYdsiz_TYH~6aQq8?M4FAH)L4DS*xr^EDv+@vrk2m8t?7IaIU>H9qu4i#K@m|0kNIm?w$cMS}iMebxt|i~2*ohC~ zBIoZr$RTx2PZmv>yX2_gD`eu&MAHJp+>8T-yA=JjK zr=M@&Qmn%{^qc+|axH!e$)%XOniTW#0s2S`UO#hm3BN|}_ddeO*v;Irr}qMqi$`q= zS;J$!f*)`Uu0-lzFq(NG_Si9`j+ynYAnM# zB(A(u%=NFxJwn|Ln}XXZux4#~sXi>3G; zueA4ZGfqNcOFxK9k=(5(cwdsg^)R;L-Sqr7Hs=;E5TeQ=k0i5Fn9G6<1)_Aa1Heo`CARh8rsU2y{~=frNnzUsq6oPTvvYsFKRv} diff --git a/tests/gds_ref/bend_sc.gds b/tests/gds_ref/bend_sc.gds deleted file mode 100644 index 819ad2b7aa602f79287fccb5f645381b2c6441cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2094 zcmZ|QYiQMV7zgm@T&HexIyZN5b7$MRRF>Ve5=%<$hEZr{8rH}h6p5N>sUh94FzJS5 zmXQ`kL8VxNR$3I5Ss76Y-EV4TnQ2snUF>t(Ui2nk_}Ll!f4}GXKF|LwvXM+qjg~~R zVpsHwrl^Q~su9`9L@_CCQ>Qb38XDmB;!t0M87&U(Lv1?afGC5i@|Nm@b zHanwx_ROyC1+%*6b&VP|YUaojM|4M|`$S}`laY#S|71kPg9B3G-{HfD+pxUH#Nb}n z_Lv;TTtsqHkEyY2k4Wucr$eW)z}+lGWajcH{>kAkyp1QiZ4gi48jgwRQ$F`BZsz$B zeaG`+zRMXA{ibs^zvJ~0mGikQqN-f){k(%uMpQTQMLx>+Bl;i5y?jAWiHMrBIfU=g z{R5_R3cuyG5d*K`Djwq2h}v7YD`HTk$E&!4o~vu75bGZ1%82?Rw^I#?zas|gHF**@ z(3uSM){JwI|UCnp6P1d6$+H=%X z`$Czwa0l;-=YB68p!HCXE**l|iGWYO7*&!s}!`fVWXErF&(41RtSuOLA^KozL-Yz9QqP ze3SYwy(eQCmE7O<7eABjGU~Oxj^A)C_sZ~S{=iNAQD)=#6V0P!#`$Tzmd}-SVQ#O7 zdMqyOv83MOv3~Bg{QL6f!XLe=r#Res?*7;5lw+q_i^F&hW!Lc{<|maaGF;6Xnrp)BE9{7pqN4ntTCxlIi){8&J(+Iq zlfft4OZSGEq|7Sz&>ofljwCnoYucT%i8cI+=3O?H_lkc%_xwFhTa&ah(&_jI%5Zx% diff --git a/tests/gds_ref/bend_so.gds b/tests/gds_ref/bend_so.gds deleted file mode 100644 index 88beed9335cc99194a2b3392336f4772ba2d599b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2094 zcmZ|QXKa;a6bJCrdv6!Eg<=ckQYanwzOE<=%22_9pi$#O1)`!rQ49gCaUkdiR0yDc zaH2TS7;#6DfE$f_p|~)L8&J`>P&5we@1-XC#U{<~Lf-p4=lsv}yp6KRWX45fNv8aZ z=oWpVJlbNwe?Lc6rfmAONgbzk%!;VXmX0`Z!H~mWSoXuPQIG7gbjgIV(OCNb-)$%> zo76sI%Eb0_r?+=Z95i|AoX8jUot>RSv8cCd&aUQV6)T2AExuHZHqmPYjLpql$`9&&V&8}+GptZ+(~UB&P;TbcyjGnEtR#Db<&O=d8=?sdeQs%|EvfqR9 z?WN}8)3P7M^;|=BHjIx*YPf*~**kBET>7XXQD0tP$tkkdXQGF``c9mO#$BlH#+AHQ z*3MM2l-5n|mhl8W#7(q!lU$S4RDbfEY<)L*S(a)~UZ*)EZ^~{rzD4s(-jSJmlf1`t zU9)RT*G=8X_hpdQo0`_kqFhpw9zGxXuj&7%|4yIV?%5n;9rbP342z@fWACDjT0L9T zQ_E94fbL6ie|6qV`7}3kZ+$GLj0ecDxU>G!eOmPWC-Xdq&T+rZbPoGX>Z+mf1AZsJ zWB93DosGg;+OuFz`N!!_gfg9I@US7oX%FQ^;?8| z8=OPWcWa>E%9XOzSLF$u;2!@bOTQIM=q^+o$lcxduVnfnui_~*!~Db&><#CzyVPUAA!{>U>pi_UF*r}x(unp0N)^%b;7 z-6C3}u9|H!zS4W}SJv=V8Jkt+c2;q=j2BX0wdEWvW3$TaC|m27sJ;7zd|$S|@JXt% zx&!c6!h9fze17*3IE!>CovV4G*EQUXUGQ62vS;y~Wr;pHo zd4`|K>H>Z!oA0@f?KH#OdcMhHY0vCSe2pXcie6UmWy&{Pm$Q924@xNul$9{yh|@@+OY2oK`XIwh)fU&0Ny!z6<((K5s|QE8g$++>=8G zgpQdXe{Z|IysF8!Oqn=(TKS}^kj{pXSCR@}guHesf4!)EZrJ}PH6%%rF(E|TzTzPE z`b+yhc6W^otEtl86HhyPs z=ZK?@jn==)&IupDW}F^ z>J`t_7{0)%>e`O8IFr`6ek~tU|Eu^i|H!xXsXf(VqxUp^!+%hWO=q*7df6zCO|{Oh z&)j?kkLNS&#=X4EzPXNNe36xuSCbrTuBF=5JWKIw8mOMNKj%U|%rCi~`d8P3`dW9F zyCco7d9-tI98c#>REMqavDCTon&t|sMYDL@o~C%)?1^Ua>d&Ki_3`t>tN)7PZSO#N zZXZi)+HSwMq@3#<9?pI|iSlgm89Vf?Mco_3ZW+V}sNM~$s8>7HtL0wK;iFtib>4Lr zefF+j@vmG?b>6LCE#A9(F1NCddcWst`zw$3TB~*JEnp{3;2HGZ*7Mzmep-7`U0eIw zYw>jhX)UcIxsh^f9K*lDozG%#&!GC%N`koF}Dy_Zq<^hH=1KYynkVTO^>Gas&^$@2O`Ip`ul4;C z>T8@QX?etXl5Vq4%#%zznkSh~_LF&%v1j5u$>?L8Cz<~Cp}aCxG*2?O&^*bAALmKt zahfNY*Jz$(KB9S&u_xj@$*iM!lG#o3Bro4NF;DW2p?Q+04so93UE*AAWf`BNcy%{W zyt;gfSG$nn)%v_V@oGU z@6CsCjC)1B@^9tMv>!M9gzCI;5ntj&+KU^Hq&jcVuY6~CLj_kb!y5P7Jnm(m5VF>> zZZi+zJ?y~FJjH$aA6I$=ek9kL& zC%oIe{wdXM#U=c$d;fjT<=K2F&J)UO*->=9zK`qreVivhSkfoXlMtfI)VoBzmc2*o zTQ0AX%lREI6-OOQtbfHeo*(B4<+alODLFIF6S}`vIS3{0&egZ_NQzfdBF}M5b9D&C z&edA|FW$k=xKX{%b|-FZ&)J+x_s+(D(7D>A z4#oEOrUxmHO||T9A2?6NC-4~_%DoKs&2=FZZRd-0p0>!V=u7+US}x?X6u+i{>RJ19 z-ouA!4%Duv{?+xMzSiAEcX!>_Jl#1sjz{w*s>4=wF5Kzdq`8{cQ@m~Ni$d|X)lj_p z^C(`u&npzK{ws>Ny#wXBeJuOYelK*+cI5CZ_G3rNv#^NzR-o<;&QF2+ui*izcf%?! zc5kRx!H1l~KX574dDmIIpTFWSxt!{}TfYh_IhO-i$E)05SMz6_PwUuQz%HD?qxcOA z<2Vf$9?H_**e-c*>&8=@7=3|=)P(EJOAeXy_BC){j%2E+@0^ldBQj1JfXU^ zyv3K@>p$i5bndgy#Cbw_wJoFjCb6#U@5BB-2hH8`VuRrare$I8S z8eBh<^&yny(_SgFKXUhk&|m*^n`nRKCL!E#ntR$^a>J`E4q?FQJe;ra*boMalRlBw zmhKwDphKu;gY+kT8F#a92!pGsMuYA9bVUe5+z08Kss8EPL%8u!{+hqwBV0ji80s_9 z3-~-g31L`@Uvm`giD4g89>Y7ZjWgWy?P&jHI)yOe6xuT*X0aESP%TEvD^tZgcnf`I zM*Q+Fe4Nwy8W-`S5Jt&4V^56op3FL0Q$}v1)F@94E3V@)e1hswv6*tLJeOs>lipkT zCB>`q+C1^9MpL{hpO+_Il^pWKtG27wW}LdYxax z+qjoY?MLgF(35&T;YsR&@a74{%v$S2Ib<&k;pX_dEBOjbLzr|V2h&=z);6h;<3gA` znSLg#U)Fl3R8o(otmfSzOf9FnP1S?!Z$p^oJ=wY3!G}Va?zLHY%_yYW&4}x=H*c{A z4qDR3zd!1p=XCWh>CN%9zG?C*xtv$?QgPI=#QLZ9;Q7|^I^{LxG@fal^LP?Zr5;TB z1LZbJypj_6zRxu6z2YYI(EnmcjVx%lH|5 zfbBV3-`?aDs%deB{`&0V{#1)%d5pE@;_mi?9u}X#yLl+jpk9q$;-25mSzJYV6>1QT*y|RL`oFyoc6MG@Tby|0=i98Y-XVMJ(g#v`31Lb{^zXqz)D1-Sa!yk*l4b zZz$fVITUZy1r)Emj^dU3yh8EH6C@&opx4Oe&xJMk>%`&;_#5%Mf7qP`WV z`|u5{<-=6(;c8Q`*!`hi1t0Qh>fNwDROg|)ct4+_-VC)j3e@>V{VJ&B?>Kt?p+?m>sjbNw1#X#bF3 ziSIA_=Seiqlhhz?=D-8%cro$uZ88)VcCIo$3|m zN$TVS^Caaxah{}(P@h8>>t=tX?AJI?a?~x(lN_~-^CZVUit{9A3Fq^3eL0l&NSr4* zuW<$Sc<5!EOSQ?lQ@?#^jv5XdMSYF)Bu5@`p5$E48SKul*u{Q2h3z@ZV)QZ2lb{!I zo`jXWgJ1A#iXZ1mn8)dSgo`MbI8TE86z548$pyTYJ~Q-mKCa`be1hr_=SeI;<++{( zw)0MkSLsON+oXOJfPj?<>zW7{2gCK>A)vTd>d{Wk5#aUPP|)Op+pIy2)u>$E-Sp7KoB zb|6Fq&%A9N=sQuHy)e-;cU#7N>UFKn ze1$vRx1Ql!Yj`i$u#rpSJmI%-p3r)ycouB^jH{{FQ_HDtQ$5SIzU$r}N4=QlnZNao zI8P|A8J-1O?b#XD6~Bw$a`q4I+ZX4FXF*O^?|n^ip3wTH$!lL5ul8)16Xyx7e`*gF zTF2{@*Ob$EWSl4L80QI3l!s^B#xp5iV-NYh&x_cLz12hi8{I7vhjW;^ZRHqx25!{v z35Ri(`p)NXcqt##hwu3^XYg&d=coGiCfz&Zd^c!xuEwfEqy0VhAjTFHfcfM4=r>R;tH>TBh*o|)4u zh_~pFS{h?kh_ws2z%05)* zp}Y7FpWO*?(YVwTiGN&8RrR~jq`*r z#Cbw__3KUdO=(=0b5Yv)psuU``uncX_27R$+5i2dv+o&OewahSpE#G|pZ`9O4!-|j aoP+L!E#FszbogK6$QIL?_d)~LnV)_1fzL&M|BjMh2_OI;yJ2!?*=+L2G z*eBH?yF8SHJwrAe6gvOUzlX98nNe3%)m7GA7s9X7g{Pl&`$-pl_-tdhb6!7c+GG8D zhkXiv`Mo=4GSy?Rt{pYJZpfIip`a*)%nlvGCn2+A2Y)@SV>)d6N-ao|q$Y%DelF+n zRDPQzx#|3xd-GpO(smC&WriOmN$X9VlO$W)_!e*AD@oE4zki++`4kKJXp(HXi<8-j zwF)Z0xuWe3}@27D+)xK?ck}Q6W`gQSdsXrI} zji2!xTGK-DwYm1fGbv9C-sI~%hWc~<)3nCxL4DX~Gw>(0<*Yd3V%SVgctay@tSEoW+<4XP1 zvXUQile!*cue!#nNwmII3wfwM&>LG%eU>oZ%*fUKEPY4@3y+{+SB*~@8N7N z<=6W2Sb9zU&6KbDFP#+~^|L&-y7xNkZWZ@B@wHxJACyuK*Z1Q!e428#rbm)72VAeYnH+T^eKpZZg7f9TBJ=~}t2^!nV1&Lz3boy$M5HUKYkDmA57zQ4eot#|=|MGW`G8{EdJ4Btu5zy3 zdZc}=&aKZ=U$%)azYAwjp5j{bd-FZ+?~n5+uSWTK{&Y!_WF!xE=7sG#Zx@7uox?BB zleG85c@mBDBt4quNm`BKJW1ElJV{?|9p*{;dYUKciPm`&Z;3s_J87Pz?-O7AKK8zO zl75QjNm@*Co}^!+d6J&fK2Or0w$GFFxAJM8q*u^9NjJ&2d6Lf4JSmWmI8O@pQXliA zK+WPjDL7dj&69!)Xr2`4$v966E?0N+q~JQ5Ck56Q=Se~A8}pJ;Zm z!77?31uZmB3f(u(lR~`{=Sksl+==Jw-*-8HV<=w@`|*$ZT^HZmgxlTPYdSjh<8qk{&Y>@OJFnv- zjIW>W-1>;Ga}@3K6&?9+=bJdP>bSfoo1KGAAr$G!W$ItF1AomuotJZXFe`YB^R$7d zQC}6EM~z!#&wM|P{dqX;y~VFlzb^hQ_2;6$QJoi^Lw&hWd`0?l;hB`D1#j|h9z*>( z|7kiK=kLJ><2>QRai08anY_=_Ptp0}ExVYn@^`LtKGlE0H#{fK6P^+03Ds>;Esu}$ zgh$4C!b9Rb;r`+n$K9!K%j9E;`jn;lT?nOHiyqWS<|0Pe<&+=H}Y+h&GCE{KuzTy`9 zpp+}wk6%!Iip_@g&HStVQ$32+cY}C~)xV(&FQe-fpUt=FEZ%6}7VpD8EaFq@ z>hRte>nop)XK*fKKe|ujB0lFFkmuM3O%o`drn$Vzxp5%%UGp`Rzvh4PEayyT9?fgn znep`tyM$D9`D3H9es5AinVWe46! zeU%;0?|FrDwFigr1NM#cg!*->^D(PGTaTnVw?0pO*(ScMzHFO8dCHy0-^6)B{h4;Uo);*<^Gwje3PeyP%Yj}clM%tRl8p1 z8m_0kHB9W8C#VJ)F%A<$#@dHlYeqhYTT`Z<@6df}cF-3)aZr1I)W|_rJT(c=4Piu2 z_T@8_zY$yc`w%XVeS15f)7S23!!!}uj4{a z3}Kx3isWS663SCu4e#bg-shv}4SXPktBUy`ALGLzTz&MrCM5XnhV@?-ABx8zsNOJCrHoT?7;Q979uIEj06oO->Aw14ElcSdCDu{XjjQyJHI(SB;eY0Ao=o>0rp6_Y@LpQmFgYkukLm`hN%a)U zSG63L$W2v3y{&D|ey)#rjiYHRM#cDAm z$IIw?#b(Yf>!Q+&L=|10D=yWBbE-dT0*cQf^TzXSM& z^G^M<&$Az=IS-qtKl|R!+qfUa&}Rn6)4j7-IA6cu5Dug@^-`;>T=yDH{n@jb?%h)i zS$$b9zU=X=r9Abh=Wkd^{duXiW$njHy*Jy%TzHk%*j;Sf{r~2P&oA5NNi@!r)V%h2 zl5!r!d6N3NeV(NL)jm&BpSI7Flzj9QduopLAH=u#G+$|-Cn@=f^Cb0D`#ecK+CEQG zljTQ^Q@8LByq+64wtb$Ys@msCs*il@!PEtuO8JQMBy~9DE444bbKCq z&0MVBz4;ku()!{&39)ZRF!s%CT1T8GL7n0}2}Ah-FVTPcGPrM?C!s6f|{=-XYu@B=ovDvSBHC6%FE~QvD9nB-=X`|cqYuB#6i?IH7`;; zHEx$rIahjmR%zrjl)n*M`MGnb2lf2r&+-L&eeMb8RR!!^>oTbw5>iSvX~J!U7*QffKoCa&j?Tps5M_3K#A zd~N!(*0XS%I@d0wz8ojMHhnp63FWCyfNihGc|!d;{szv9^Mo_vJmHIRp8V_~cZu_ao#H&<{&Al05OKW3qj>`5 zW3>9ToE_&0yT^ILia1Z`j2!s`$I&x$%LMMlJLPvKAK`_3RvqM{@);GdutgVOYgS9-BlW83_-8fYLETjD~{Lj?K!}Z-(_Z{Xl=vMtO z>|W018B~wz2Cm^0%2#!F&&VD1wLG>uE2^x!wHw9PdI@)9rTy?Ruc7+1-oYa|#r|>s z)|aUst?D~eyshd#B*%?(y|y%m(Ow?XiHF&*pYU|vNN3yNSYP=Zw3OFUKeoBgptJe7 z^FW?s9}Ikw;u%;@XUu>+_1yrUVcO(xfX@QCLI&>cyqV6f^!oVBU-1*q<>S=<6=$;A zIVO&rI`+Gn_DjD5cvqY!bWU8>kIy&{o2Wng-p+TqAO8{O3BQW-gp1-l;p#X~*cj&t z^=q%u)So?@?Q3=Jc@_0#x%l$>vb>h^)T5qz$9Y2id8zX#Z$DmoKD)$u!h_>H*{<{U zfBk(|IDGs6KiT&Aq_fWfBY&Pl!Po!&`DXk3x8G;G+wK?N9`EaG+t0WCzAfvKzaacK DipUMv diff --git a/tests/gds_ref/coupler_rc.gds b/tests/gds_ref/coupler_rc.gds deleted file mode 100644 index c08c0e66247ad5bbec5b881634f7f5d2564129e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7412 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 diff --git a/tests/gds_ref/coupler_so.gds b/tests/gds_ref/coupler_so.gds deleted file mode 100644 index 839cdc0c237591bfae12519c5f50d080af501aec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6708 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 OUjOFb+pt7Yl-g#N0H~ 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 w{_6cNTatUP&o3hK$xHIP1o42-WrL;;1 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 Z_uIVQy~lsaF6ZP?BGT#;=OVjZ{U27sxKIE9 diff --git a/tests/gds_ref/gc_elliptical_sc.gds b/tests/gds_ref/gc_elliptical_sc.gds deleted file mode 100644 index c80a16805e7839a35ce67b508d0870da9eee9e87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21530 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 Juawe~{|9E9r=I`- diff --git a/tests/gds_ref/gc_elliptical_so.gds b/tests/gds_ref/gc_elliptical_so.gds deleted file mode 100644 index 6ccf6f360870d52d5c5cb2a7ee421a01ce13a242..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21530 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 diff --git a/tests/gds_ref/gc_rectangular.gds b/tests/gds_ref/gc_rectangular.gds deleted file mode 100644 index 6b8d9ab264882a3251ffae0830e8668fc6ad2e8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2168 zcmaKtPe_wt9LImX+xsqL#fpN0VIkomqB;l}L==PvgANfimbNw>v#Bq+W|qxZIBX@2 zG*Mb93x|JVL3of(9YVrmhw$L7f)Mf0p+k6Z&3*mSi2UvH8K39-d7tAWmKcUlygLln zcd3$t;*ukBxbnZa4Xfj3C>D&}6WQl5&z^sL>f)#ApQkUpKaqRszan09`*yEoMOp%} za7#RBN4h(LF>&q`v342a5No#~BF8)qF|VE!*`E;e?F3mYuBJ9US@zC7^54GnnbPm; z-|uX7C0Q&M50y_h&ntVY^8P|C?kUvrev-b-ZTs1J>}KoHy?IB{>-|(Cc2kY$razMO zdOz8O-DDHG{1=j5?{hYGIUC*UA0)lrk0-GkPokUnP15Uqb{MGghO9=nlwbfd>fdc7Z7#BOL2-ScxKz20Y*vCAx@dv=+m*ZaXW>;~7+J#8iF z^*+6UU3vrElRG56-Vb=N8}OielqTu*zP|>${u*?tEJ?5T$vW(kb?6=zNP4~RYrw9r z0o{WSB)#7E`mpQup}YT?q}ThND0V$jba%gz^m-ppU>8rI>;6U3>wQ-SyRHnn+ZIW$ z_jV3DJBRMp0g_(t+vl)rpF`Jql%&`Dwgv3k7SKh{ko0;VUcxTCgf4Q4q}Th<3U;9t zbgef?dc6;H_O RH-moby!?K;N^iJR{s5MoFNFXA diff --git a/tests/gds_ref/gc_rectangular_nc.gds b/tests/gds_ref/gc_rectangular_nc.gds deleted file mode 100644 index 9d8bcdc73a58cd1b29cc28b3aea4f40d1631f172..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1828 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRwFG?)Q%uA0?&Mz&@or74FnsbO%sbfH_O1&e* zsx*usR;BS9VpWfHX{;Xdel&p_l(K8xpf6ci7y$PLzK{R_ diff --git a/tests/gds_ref/gc_rectangular_no.gds b/tests/gds_ref/gc_rectangular_no.gds deleted file mode 100644 index a34f5bfa5ab49dc6ead246cd3575aacf302a2257..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1828 zcma*oJxjw-6b9h8NxT)Q9}Q6yItVHX3dPV?>mUks5D^rLhzM;`(@?B!h*eM=99#qk zcOBeZ92^~-MX*0W(9K1}K{qF38ojiBpDZ_=JURE?gRj} zo~wELPj`iV@4+*^T+MjLahfY9uB={fzK6T=I{8L2`&;}b-H{^6SwX- RuRZVM!u{@LyL(GX!W%y>ud@IE diff --git a/tests/gds_ref/gc_rectangular_rc.gds b/tests/gds_ref/gc_rectangular_rc.gds deleted file mode 100644 index d1204c7b921524b73ac30947094f0556c3664c1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3216 zcma*pO-K}B7zgmD*_n4mwyHLie_|vE ztrT4*gg;Uxt)Vd0Qq979iU`cg#BIYqOr(UQ&0G7lZ4*PYn_7zN2M6}-q^R`w-8#n7 zw&7&5Y2EDT%2`QUx09x0WYb-iVe3t*mP$67Dv1?DY`H)Zu@wRlHB^O2+NBcJetMR>)Y{T{F#U6JCH>wHE#6<1C+TI1h)>u3THyP9`seJ{%L@eG+ z5idn>1*%$R^KW1!^^_KC)Kt~aM^LE~Di8cXW&8^&6Yo%& zdV|Wgaa0~GqSCsL%IqL2a~Dx*_oC9tqw-J=mE8$c9%)5oemg3UZ9!$vMpPcJLuDa~ z%9B;7>=jYj_Y;+;zN7NY2UMPYi^}tpsJt+O%1e(>*?$X_S1zM+;4~_)^`P>)gUTCi zsJyukmA7}Ga;OEBcbidpuK|@0YEb!5LFMBLR6dzQ?Iere669rUGcBArzRhD7;XN#5D;$|51)rEbNH^mv=TT6Yj)Kk4a=v}Vs zuA48CGrS)z(RY2IWcYr)$oHq_`2M$kzVH3+x5ob@Rv0ro+H*!{XSt&WnOV6bd$~@O lGM1*_g^7*^GdPF8QZ-wu8H--CR^&g^@NUijEqEhQq+jCkAfNyM diff --git a/tests/gds_ref/gc_rectangular_ro.gds b/tests/gds_ref/gc_rectangular_ro.gds deleted file mode 100644 index ef1748e83a3d98e9cde0dbd7b1babcfdcbfc95a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4056 zcma*qZ%7ky7zgmD+wC`z6*iU_E%3!&C0eM78WfkEHe6o#0UwAAtNM4$dFiAEXlIS!WX>=uG^j0#H_ye<~e@*Jh$)NyDu@~ zxJGiU;4FD6rL|-sCsi)KCo9LKkY5($BSdzSdF%FG&(5*Ixy|*-4T*t$4dgKYeYc9S zpe#f~;h;}!>xf7J*(V3Ys1OczNP_Hhdjeve;PMk+Lc~^bWG1$XBchrz6Pfq8h^nWF zu_+K;=OzDt&~?rg>EQXHeOk zLuE?_m8~gM9!jE88bW0_fyzi9D&-zjMq{Y#jG(fs8I?yHQ5oBX%H!Km*=u`d953j*Q2Ps z(Td8O2T*x?H!26~QF+&k%6m1aykCjR2X<6GDnaGrpQs$3L*dIcR5t%GpL+Sq4Gl#l^=&tIh#P`mp)W}?Lp8!foe#z1?q7a`ILEgL~dg?HUVNKI17%xIcTMw6DxWK>2e zW@SZ(H8Zm#9muRE=|Huai5Z=!#I@9-0}*z(pJv|Q?;%nq>34`EBIi%@~&zS{4ZV!{x@LCV4VvRZpAKaeR1sR`idizjLyU*P~mn zWfcT-!}-Aye{n%+$REzlpEmWcjH$stjd7p@X@94ysN&g4e#36{o*kE#bMdoQ}wOv+{*43 zD&Q|v!1J#9bL@PM-Osz>&%5DySN$1wKEv*3>)_AU!Sk;AQ|x?--A_+|KRp4Sch#R@ z=M(IHvKjtlGd%CAKl&N(j(&zao-R}N_Eh~5c0R)HEtlY1F2VDz`orvenBALa!Z*)^ z=Uw%U?A*xihq~Yob;0wl`UZAxVE2RB@CUQuc~|{@cHYnK2m0X;^uzP6`n~CRx0l`b z6~gZ;l)XJwznh(Rv-_Se@O!?%^RD`OcCKglT@mG z^EP&`+W}v<1DH^Hz4RZh^0Ef#+TIo4?}S=C5#DrpT1N zJypMnoj0+2RTRD|3eUUhH?Z>tcHcM~e&cL--c?`8&Xw%Gz8ijhH$3mEkFaxu-Pg^B zUpF6~ch#4(b2+(k0JyoC2&iU+KkO5zi0nfYYgX|n+_q=xaymolrRqtnKKf4FA-~(Ck zysLf*J1=4P+#dMc9(dkWzlfa|vHM~l{9+$G@2X#T4DS}Qd(I$y&Y8{~g+Gz5^}~PX_=1 diff --git a/tests/gds_ref/gc_rectangular_so.gds b/tests/gds_ref/gc_rectangular_so.gds deleted file mode 100644 index a4f33e4640a0ccceead88113e15ee57f58851657..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3928 zcma*qNoW&M9LMp$lgUddQR)y&g&cawp@)JaR#QPlp$9<^9tzftbTXNwl`$Qr(^4f$ z(I6=*Dppjg7*VNW#f2h4iWCVYNRc2#ibPbZSU0TFg9l;E_DFI4`B8{l)?R=856CwJoU?$)O#s3ci}&-Y9&^_fvyF@{xz%ovRsmU zUqEj66>k8@opq?(?M7vQP}x3@%HS+2LpfB2v#9JyqjFCQmHG%Oqe)a6gQzqUsI+3J z>@`r?7eeL!HdMy8pz`1bRQ5Na@=yaR<6cxAsX=8zMCHJDR380=%Hyw4d14Bcr!uHK zJ%-9NcTjouDk{&PL*>vhR9@^y^I?ZQF+ndluGWp%ES6E1$z>O6=FF z<0md`#Zu*ED$Q7K#QZ#ei{^3!W~f+f|9NFC`%@tn3ezL~{{B*9mfpvA7e)FB)^F>! diff --git a/tests/gds_ref/grating_coupler_array.gds b/tests/gds_ref/grating_coupler_array.gds deleted file mode 100644 index 61ece741f374b535ac7b0762ddcc0c891e8e77d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2532 zcmb7`JxmjE9EN}19S0#$zN#oTP^5|w!~(ViA&7iv4Ie=SQygr{hXq3rFJ-_uFc=dE z195PXL0x2WFbwFxL>$xs6XIYPNK70IgK=U&>a{Pg5+i?867rJgo~K9t6b>;((}LnU zq@{k5bU7xe;t}`$uO&k>$3_RNur(#()KeNS&eXQQeeu1nb@}YmCpUVF^*YyG|f zpGZcw9^1XvFYyl}$Nv1kFVb>1DPOCZNy;}$o+ag*d9Rc5)AWyj{8amV6esMmPxzp- zGtxxNOikX4>Co&~tjN|y&ukJod|&kbE^aLL?LnM#6FhO&|L7CnnEj6V{W^P{&112j zi;2r(U*F$<*nj_^f%^mv-k(dJ*aQ2%33z=I=&rxvlB@fk4R}2p=z33a$<=*#0A6BXtNXwlyuci~E1$UJ>b`9oUfVXh%gtPJ zb>A`suVn~b>q{=Vx^G&8*R+PNxqwTq?i(B6H8!BT@Q_Qc?&}xf)!Xm&`0r7}4=%a7 zuXDnybD}$clS{7d{nPOL)97m7amm$v%@(|xEp$FVmt5Uf1>sc%(N#a^lB@g5Rd|)F z=)4Xtxw^0L!mIG2J9CdquI|eg;FT?)EC0$RSNEl9@Jj7Jj`5%W=^ie*y7xrkd7|h} zu5iiKeeou|;!SiV-gU(^Awr~{q*F_&E3yO!a(meCd3PnP&O6l&z^zQ6;oz=Q7i zIG0@A=g-5-pGSA}GnZW5J9pqYchDWV#3fhvxg+p$N6_WH;*zWTtaW%<>*#U{x#a5p YujjPxm__fHMZb4F@%*&^cQ6e31u}bITL1t6 diff --git a/tests/gds_ref/mmi1x2.gds b/tests/gds_ref/mmi1x2.gds deleted file mode 100644 index 22b27c72fced2ed0111c4e508a1f100210c402b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 368 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRMERR6qFd8h*A_(MS>i_@$#s{FnhhXIlj9)N?ieL!~rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLR)FY9{vCSe^P?D|0U22kU#!gfb{+U|Lqcl2Fio=vjhFW G!T&e5 diff --git a/tests/gds_ref/mmi1x2_no.gds b/tests/gds_ref/mmi1x2_no.gds deleted file mode 100644 index 2085d5a9330629b641eb04d9a4614ec8f507df33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 372 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRQ@x zVr9jDU@@93P>hl!)7QQ4>&;x`*8QH_Iej|adm$mjEc_8HEs-qL7!NY^OEPUsG){`=y50V>0^QpyjawIpr1lY}h>=3XZV*8yvj}9=m)NE04JmG4_GPImN@&adY|vy z3$^eOh_GM^gN1@c3L8PN6tqxm zQd8Sp#4Zg-{g&cqVt+6x>i>m z@uVlwSBLhAXe`c6{zt#&U0-uR=YgI?cN@$<95SzRlQ;T-$1>my==}jJ!I})%mzQyF z@0xsMxGm7DyZ{@XL=f*tNpA8~(b NlX;bgyjst;@eTc4r)B^E diff --git a/tests/gds_ref/mmi1x2_sc.gds b/tests/gds_ref/mmi1x2_sc.gds deleted file mode 100644 index a3446def57fb9c59d469914d6e2e4f87a9e1ac3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 378 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRrQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRrQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRMERR6qFd8h*A_(MS>i_@$#)tp^{}q5#|NsBL8AAV_4H5sd4la*JKLZ1E5J(@; zf>a32Pz%z>z`!^GLIdS-=x1QC=>e$&xgV&v7D9u}0f~dmh05d6|NsA=bx{A$hR`5? U*z`dB1)_oSVEybsC$caA08sB|82|tP diff --git a/tests/gds_ref/mmi2x2_nc.gds b/tests/gds_ref/mmi2x2_nc.gds deleted file mode 100644 index 9e6c7a38c97adae053c55a355dd7cdac71abd834..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 436 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRs5~D1|Nnndg82XC Y9taKe2T&i_Utk(257y5P3rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRxX4Ip(O_XG8wfY3m5z~VrCFnK)s|Ns9qAL9R) YdmuE>A3%Lze}QSBJXk+FFbr5204=3$HUIzs diff --git a/tests/gds_ref/mmi2x2_rc.gds b/tests/gds_ref/mmi2x2_rc.gds deleted file mode 100644 index 27a35aab80d1f81e5267be6ab635d5c9af85645d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 762 zcmZ{hy-Nc@5XIl!B^TotQ9@7?Foi`5LAXM(5d{muPAtSm6I2Lz%~e`SN}Dt(ZLYIZ z(xtQz{|3u|9DzWHg&-m7xO0<_HNj@z@*Y3l><(<0<`FW68GFMd77@b=vicp^mShAC#u$ozM9-d z^z$j&NsHgj4RW3T(_gIv36D8o{)SJYpdwtuXAN_mAL&;Qdu2|2P9SQ;g|kwkD%bh3 z{)JQFmRwe%R!REXW#Lt>^IAXfodv8E|36^FMR^YPd9Gfr^IAXWMD4QduT>JB=U|TK v>g75=(ofXQ3ExSJ@*bGuy|AiW=g0aRzHmWB`gsrB&wF8BxXI{rJkF-;U{W!h`t__jp+MB za+s3&DERG7{*S-a0TQ9&faM!?5_N0B^%^R5Z}Jm<{;@m7@#AzQt+;SbPLg|*pYpGq z2)A~nlBi!6|DY~B_a<-nVP!u7C#T*Yu;P+@4?SmZ)SJBFS3S|7F8k}3h39){j=fQD s@)LfdQ6T&Px# diff --git a/tests/gds_ref/mmi2x2_sc.gds b/tests/gds_ref/mmi2x2_sc.gds deleted file mode 100644 index ddda3a75289ea6d8ead2ba737785b19665e07b05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 442 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRCfW%=mSe!)=tN#E0H$M3P|Ibg5>i_@$vq9*eS`hKy=5TpD z`hf<-z)a*08WJ0049CYM=lB diff --git a/tests/gds_ref/mmi2x2_so.gds b/tests/gds_ref/mmi2x2_so.gds deleted file mode 100644 index 0195c3eb87ef00cb37de9d6c046dee85b3f8a89c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 442 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLR)&Kwh`wpRhN<+kdJHqAh z=m#3SAEXcHxTg@BkrSkkfq_{cLIdS-=x1P*mjS5*xu1c7krP4#%>j!8^}*!v=>Px! dwuj3V1I#WpgdSVJJ6{t3;?aTY~26= diff --git a/tests/gds_ref/mzi.gds b/tests/gds_ref/mzi.gds deleted file mode 100644 index f1cb13a7b7456ed60eedb09d2e538e089881c73d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6120 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 diff --git a/tests/gds_ref/mzi_no.gds b/tests/gds_ref/mzi_no.gds deleted file mode 100644 index 783122267f79b2c14f8bc3dec9fee366ece137f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12172 zcmeI&d3aUjnE>$b-Xu2x0)(�m34C1i~7Yux~0Dc7ZHhasz@bAS$hO$7RH|TF0ra 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 diff --git a/tests/gds_ref/mzi_sc.gds b/tests/gds_ref/mzi_sc.gds deleted file mode 100644 index c1913f6afde2cd5c86576b21b8db2d43984394f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3948 zcmbW)du&r>7{~FaXYDE5I<}Qvx~;5R*Ne(^W8EbP%0Q7|G$7(2=)%?w7Ou{L10EPh};py$qW!g@c2DF?bgCJ3H-rl?aq6i=l#9! zdE1F9ic%>~lVUwB36dpN@kn0u&tg;5$@SF@;~Qp)q{UeV4q8+?{Hslu%7^Uevv$?k zQR1|8JT^sDr_8ReDlRQ73e*;sh&h3K*wrah>I<8Ss%mOVYHNa}UC(`~HaO*kQ7+VH%S25(e6V$FC)GL{y?tiu z=;+EN!9ZQGuDZ;~!{lhvv}JXzS9Vk<)YJY-+I6>H8-3Th;(o!pK+*W9`BaQGreoyZ zLVCT5TE})&hxCm3#AHvGBIE3>qoXU|HlLU)JE=1-lEAq;9nntGrU$OZ%qym|>OgHt zVOifuontX|qOWWxy_nq)suEDzpMPwX32Mw5bu@o{Jxz{tceM6x&qMTz(o@V1jh;_Q zY)_73F?FJ^Z09+M**Bpo9qr`UDihSUr_Cyzo)~GI7`L7d<}L)6q)42oT@_Zkr*T?n z+T}+?UMPzwlDLE4^3O2ze&`9meY~b^J;8-1^{YjcX8nInyJ^?o*EG%5`uh&X>nDha zWsqK9B#y&EH$KI9-x@k$Lci~1yrx~dY4m^flHrYSjg#s69z%W~8vj3;In?&gyIXRz zu8!oUxtQ)^eV!twjIe7Bl^&Q!Cfg0;Dlnfp9>4;Q<}v8SGw5fI)A2sMfxTI%h1gHT z+6~FXx&{Y|bkXnoFz&#|$Z7~ag@>?OBw-v*#b0p_YuJd3ctBYf?JZn_?};Qia5rwi zBO+b<;syMaIdMWI55*ijjMPsVhokX4&J;;~7FXhR+$Cb4kEcbtB{JNG%aL(u*~o`R z+B#ezlJ3KONDroeMKYMHQi5BNduA5lX8aJFMI41>#sTBlf{h|sJ#Z&(Bs+^pHrbm; zAon(}q2(lGALP75mV@y!(x;OiEWGbLO18s9x>q3g=uRztpXEBR2It|I$UM8;E8-fC z%kTrdCX&bfVY@!H9rIeA&9)ZdVM+ovHt*stREtifCn zpPB3}*bA576J(!(^qI~*eQ%RJ^Ynd!+mLaY1Mv#7PX1)Fe-iyjZ~g&fKN&~jHKd2^ z`S?6pr{F?lF8(*j`W{@5+}BUe-5}I@IT=^teq{ds!(>cGe(Jk;p8Y?Q?IL8Z z`Dw^!SpHhPK!!c>cifJDklA4T6Il;GYwQ^lR=+PBV!F_2wD%e1Y`kS;u~0e|Y9%B93Oiyo$^>Eddqw6R!)tLmO^j zpS^|+n2PL~)D>vO9I`mTK3$KmBmKD9cgY`NHyl7VhuG))a4}LVe+bXP88Tvxk{WRf zT99YL_9jxp#=5)q@LYX{%rlX7cBS*&{Y8emkp6S4ku}Lxc|N};%Xe`ivR3iT!+D

#}m*<`J&S5WE$t&k^96_e^qG~t`=_Q*?RC>u`Z>!{&MK2cC!@+Z7S%5>4 z{hfJ)^M`fKd>ZK~gS}&Z5vL;iH2n&)_UW@Z$Jj?{)QEcrU&hI3#{0>bJrdUynTK+k zjCrk4%T6ZBax$iWWg43BQ8J#3J;;{)lq8(N`Fe?LTkt57muV-N(vOLGCRO25GW`MP z;7F_|({Hd6Sr5}NvSf^@KNe$eGJGH1=s^b=uEJzwT}`aLl|4dBV%7hn7qtm5lT9XOVrRe~u{I@D#FlbWLmUB(mP2?;DH5Lg=;r`R2N#&-o0s z?XQ%!@1?hV%C~(x(m&m;`loBiNVSM}RkiKgW2aRm!Klh#l;Jr>ysN5h-$XmDnp0_1 f&0!Z9$ws`Zs%?M0bXrw{;kgDQ)gs1JHJjx>KUm~5 diff --git a/tests/gds_ref/mzi_so.gds b/tests/gds_ref/mzi_so.gds deleted file mode 100644 index 80bece1165eb2f739a9504939bdb6c3585a3a20e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6258 zcmeI0c~I147{{MI*jyN* z{2IxOYJG2_%{FmbZAGtQe@V5^TP@ZYY$V$zPOL4M>aFk<6?jVudY6jCCR!x;WlfS+ z*V&w=yIGwXHE>zea<$W3*FW%6aHlKTR^^{mQ{lgLg1@e!x^8lPeMP;$dP?o&NmKbW zS)|F1@_JycuK(3Rf_u}FZS_;?Dr?7$pHfj!Sy}9_^b#NI@qph!iH!kQfrw2>+jM>F ziRQg$<+n9ED_&@}6COjAx3H?%TU2FeWb*CR^#>nrUU_DZ0c8)Y6^Z)2c~`i7Urmj# zw73xa%{dM%H&P7dDAFUUdGDD$hU|pbh{#2*-`8v>JcfVe7_l-vqMAijK7WbN>kF@; zsdU8I?l_(LV@N(M!|=!|dlgg{7FOa->1Zk)65%I&rQhotTUb+A5~gEhuP86Qx1Tou z7G4_aBC6F|{zgP2BKo1VwN3rbxrwOln5u~W4bP`VOr=92{DiOcmlpX83krINW&Uq3 zt#o$_FAa5}vuKw#Zx)yBOlREcAfh<4Si}}@7O^id?igLyDW}XeXi9D3LWAaRkOOaC zZqPCi_7Smcgcor!mBGG{bEx;HPLtsvcmiIA!v;7MZ^>{td)UHl5@6iFBeDMi8t zI7}oF-!cjAhVw*{Zh~*XBXGM&@(g%Fq@z{Dln>{^tJEb8?}Sgl*F;jYU?Y4Ecc~(2 ztTkT=UxdWnNrS}KX)#)1E8PtTLvpap5$W6oZh_dd5~ovL@?+s_$UWgag@#cg8LIb* zIb$Dul@=I@rrgq*AHf?%vb=C5d=h`U;WUIJgSdpmjI+HpI581Dd0O>jp@Et|d^1$IyPNNM1kq8=Qsq=$p45 z9u&!sMf+Mf6#fLsFA>f2*T6#%t&@n=-OH$fyP6tc&;2k&1NVp2;6BLO6l{6WI)#4l zkdvx`XADGh&rG!M3DGx=m^~k${UvZ0+ysd;eUyk65BEYh+S6|ux^yN6jrg48rHw{w z^3=#7gS<8RA+swa?#$)zQM9I~w1p76+RJEM4wu6H5Z~G8s;!2^udPK}_G;_UlGwG4 zkUD6a(XKn(3aOvA4b3<=+Lut-rFQwsuHrtp6Ae_niYi{{K^H|WkuI3C)fM1Kjgf4E+)=bAo}Fy!Xol`0-|va8hXwrKjp_o z-hV?UtcUb*)&WQ#W>pz6WPSw?qu+4Yh_3X8dke&;n>sn)ft)F4A$*d0@Y#JY^uP(! z3$5K(!wl%7o{zyyh_C#U)cXOr3r53L^usJjol>oE68&-yycC*YXZmR-IUj-+_%3}$ z9(mL#nF})S8v5{lNN*)!-?f)MeH^|7vtccLycm*yLIK*KX*@P^i820iIEr&X4RaIV zShQNhIXMPzh4{#ELt@YVf^+pIybH1~`#jFw_h|SzoB>%MlMeZgUXGUJ6+IG`bB_N+ zOTHcRA!orc0A9d({}D|;fe*pakQzFVazAhmRd3r^?{vZ|(RK+m!9Lt8E6|pGQS?_j z`A5<3oxbB9`T^F$#c2C091rh+^lhrn{dELVCky$fIv_q$=0a?w#KC+tp2t1-2aJcG zp)s{GKM!N!bTpm=$t%eYd!sS6GIvBKUK;n!&M zGu#3FkQ!Qd!Od_4#HZy`xB>Qs>&ayqTnEuq(ex~2jfz20lpjU)6(G+spD`67Nn8I* zq}fh4nYVb#OZV`ne1>{j`{<6cptm5;+G~2moDrHnTlj6CF50IHZaey{eY)VuJk+>> z+oubjoZRy5(?$Dq(LP=LZ>EdT`=}OA`N-))YK-YZYJyWmkY_zzgwHggH%M)IwQn}O z+L^-6!6X%Wd()=Zb1+GT=NfwJ*rwNWoNMT9Q=48Trm3zm|5@P_-g~!v$K9&WqeDa% zEYfv@%x3OQ>j}J29|0B!b-^bNH-sJKBf+Bwp?8m&-D*pg4 C@ursm diff --git a/tests/gds_ref/pad.gds b/tests/gds_ref/pad.gds deleted file mode 100644 index e0528180ff3c3e832b817b3e916e8b85c45ec20b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLR(NvupQGBJ#gH(+4lU|?Y5Wn$1|VB=$AU|`S@VE+H# bW&;c}FdPm*#xQXZ&A=kaz`()|#4HQ|7G^9D diff --git a/tests/gds_ref/rectangle.gds b/tests/gds_ref/rectangle.gds deleted file mode 100644 index 1a18a7558af2b1c739dffdbbbc4de9558eb84143..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLR1fklvkfrXs`uMJ{s*i2#JU|?Y5WnxHXVB=$AU|`S@VE+IAhr$2< XerQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRrQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRrQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRrQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRrQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLR)efYCsq6CiOQ0MlS`7D0r5R&@QZr$h8ZXrOa5A=)AI|NlU7uzq%+ H87vF{m<=xk diff --git a/tests/gds_ref/straight_sc.gds b/tests/gds_ref/straight_sc.gds deleted file mode 100644 index ca8c3c83cc7dab2c8a9c043563216a08bccd069a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRrQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLR)efYCsq6CiOQ0MlS`7D1qXb|7Y9003|;BIW=9 diff --git a/tests/gds_ref/taper.gds b/tests/gds_ref/taper.gds deleted file mode 100644 index 2c4bb628795f571313977d6ee24aade0572b5c0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 176 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRwV^ W|Noy2BnYFy;w*wd{p>)@!TrQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRrQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLWX&Wn(KzEJ!Vi&r4=t;b353<7Hwv&A`UT#K6FyBftzKLEskygSr5W Y{{R0!8%PjFgT+|{85mgDftZB>0FC+{jQ{`u diff --git a/tests/gds_ref/taper_no.gds b/tests/gds_ref/taper_no.gds deleted file mode 100644 index c61a13c729ae1118d0e62ccd8aa4259649ea3f74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLWX&Wn(KzEJ!Vi&&y|E;b353<7Hwv&A`UT#K6FyBftzKLEskygSr5W Y{{R0!8%PjFgT+|{85mgDftZB>0Fh=MnE(I) diff --git a/tests/gds_ref/taper_rc.gds b/tests/gds_ref/taper_rc.gds deleted file mode 100644 index aa41142b2a7216eb517bb51fbfe78e38e3a3af1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLWX&Wn(KzEJ!ViFG^-$;b353<7HxCW?Fd==w!6A^IWo|NpP2L-a#vprbPx!1~#NX0R{-0OIQ>J^%m! diff --git a/tests/gds_ref/taper_ro.gds b/tests/gds_ref/taper_ro.gds deleted file mode 100644 index f9dea2356dbf10430d2f0dad804e8f3223c0fb3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLWX&Wn(KzEJ!ViFUn_N;b353<7HxCW?Fd==w!6A^IWo|NpP2L-a#vprbPx!1~#NX0R{-0O?mJN&o-= diff --git a/tests/gds_ref/taper_sc.gds b/tests/gds_ref/taper_sc.gds deleted file mode 100644 index 7096a4375dc5b345743c972a7539c58566c3260c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLWX&Wn(KzEJ!ViFHUA);b353<7HxCW?rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLWX&Wn(KzEJ!ViFV1IR;b353<7HxCW?rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLR8fbAQNE`@KKm=HxMUVlmpBY0x8$|zq bd5C_7hai1G@C!r$^|LX6^|J%bU||3Ns$Vp3 diff --git a/tests/gds_ref/trans_sc_rc20.gds b/tests/gds_ref/trans_sc_rc20.gds deleted file mode 100644 index 9828c9b1a55a789404c688bfd3df64218adbd7eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLR8fbAQNE`@KKm=HxMUVlmpBY0x8$|zq bd5C_7hai1G@C!r$^|LX6^|J%bU||3NdiOMk diff --git a/tests/gds_ref/trans_sc_rc50.gds b/tests/gds_ref/trans_sc_rc50.gds deleted file mode 100644 index 96fe0ad71402c1e5933243ea05c14b6cab8ccd9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRStpB>t_d=!NLFlWsEm~ diff --git a/tests/gds_ref/wire_corner.gds b/tests/gds_ref/wire_corner.gds deleted file mode 100644 index ba22294b598b5fdfa59dff0cfdd3187f46a443db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLR None: + """Write netlists for hierarchical circuits. + + Checks that both netlists are the same jsondiff does a hierarchical diff. + + Component -> netlist -> Component -> netlist + + """ + c = component_factory[component_type]() + n = c.get_netlist() + if check: + data_regression.check(n) + + yaml_str = OmegaConf.to_yaml(n, sort_keys=True) + c2 = gf.read.from_yaml(yaml_str, name=c.name) + n2 = c2.get_netlist() + d = jsondiff.diff(n, n2) + assert len(d) == 0, d diff --git a/tests/test_pdk/test_settings__bend_.yml b/tests/test_pdk/test_settings__bend_.yml deleted file mode 100644 index 22e6d92..0000000 --- a/tests/test_pdk/test_settings__bend_.yml +++ /dev/null @@ -1,22 +0,0 @@ -function: _bend -info: - dy: 10.0 - length: 16.637 - radius: 10.0 - radius_min: 7.061 - route_info_length: 16.637 - route_info_n_bend_90: 1.0 - route_info_type: xs_sc - route_info_weight: 16.637 - route_info_xs_sc_length: 16.637 - width: 0.45 -module: cspdk.cells -name: _bend -settings: - angle: 90.0 - cross_section: xs_sc - direction: ccw - npoints: null - p: 0.5 - radius: null - with_arc_floorplan: true diff --git a/tests/test_pdk/test_settings__gc_rectangular_.yml b/tests/test_pdk/test_settings__gc_rectangular_.yml deleted file mode 100644 index 77608b6..0000000 --- a/tests/test_pdk/test_settings__gc_rectangular_.yml +++ /dev/null @@ -1,27 +0,0 @@ -function: grating_coupler_rectangular -info: - fiber_angle: 10 - polarization: te - wavelength: 1.55 -module: gdsfactory.components.grating_coupler_rectangular -name: grating_coupler_rectangular_fcb0b7aa -settings: - cross_section: xs_sc - fiber_angle: 10 - fill_factor: 0.5 - layer_grating: - - 6 - - 0 - layer_slab: - - 3 - - 0 - length_taper: 350 - n_periods: 30 - period: 0.75 - polarization: te - slab_offset: 0 - slab_xmin: -1.0 - taper: - function: taper - wavelength: 1.55 - width_grating: 11.0 diff --git a/tests/test_pdk/test_settings__mm1x2_nitride_cband_.yml b/tests/test_pdk/test_settings__mm1x2_nitride_cband_.yml deleted file mode 100644 index 7ccbdca..0000000 --- a/tests/test_pdk/test_settings__mm1x2_nitride_cband_.yml +++ /dev/null @@ -1,53 +0,0 @@ -function: mmi1x2 -info: {} -module: gdsfactory.components.mmi1x2 -name: mmi1x2_c06ba645 -settings: - cross_section: - add_pins_function_module: gdsfactory.add_pins - add_pins_function_name: null - auto_widen: false - auto_widen_minimum_length: 200.0 - bbox_layers: null - bbox_offsets: null - components_along_path: [] - end_straight_length: 0.01 - gap: 3.0 - info: {} - min_length: 0.01 - radius: 25.0 - radius_min: 5.0 - sections: - - hidden: false - insets: null - layer: - - 203 - - 0 - name: _default - offset: 0.0 - offset_function: null - port_names: - - o1 - - o2 - port_types: - - optical - - optical - simplify: null - width: 1.2 - width_function: null - start_straight_length: 0.01 - taper_length: 10.0 - width_wide: null - gap: 0.4 - gap_mmi: 0.25 - length_mmi: 5.5 - length_taper: 50 - post_process: null - straight: - function: straight - taper: - function: taper - width: null - width_mmi: 12 - width_taper: 5.5 - with_bbox: true diff --git a/tests/test_pdk/test_settings__mm2x2_nitride_cband_.yml b/tests/test_pdk/test_settings__mm2x2_nitride_cband_.yml deleted file mode 100644 index ef401cc..0000000 --- a/tests/test_pdk/test_settings__mm2x2_nitride_cband_.yml +++ /dev/null @@ -1,53 +0,0 @@ -function: mmi2x2 -info: {} -module: gdsfactory.components.mmi2x2 -name: mmi2x2_c06ba645 -settings: - cross_section: - add_pins_function_module: gdsfactory.add_pins - add_pins_function_name: null - auto_widen: false - auto_widen_minimum_length: 200.0 - bbox_layers: null - bbox_offsets: null - components_along_path: [] - end_straight_length: 0.01 - gap: 3.0 - info: {} - min_length: 0.01 - radius: 25.0 - radius_min: 5.0 - sections: - - hidden: false - insets: null - layer: - - 203 - - 0 - name: _default - offset: 0.0 - offset_function: null - port_names: - - o1 - - o2 - port_types: - - optical - - optical - simplify: null - width: 1.2 - width_function: null - start_straight_length: 0.01 - taper_length: 10.0 - width_wide: null - gap: 0.4 - gap_mmi: 0.25 - length_mmi: 5.5 - length_taper: 50 - post_process: null - straight: - function: straight - taper: - function: taper - width: null - width_mmi: 12 - width_taper: 5.5 - with_bbox: true diff --git a/tests/test_pdk/test_settings__mmi1x2_.yml b/tests/test_pdk/test_settings__mmi1x2_.yml deleted file mode 100644 index a00f5fb..0000000 --- a/tests/test_pdk/test_settings__mmi1x2_.yml +++ /dev/null @@ -1,18 +0,0 @@ -function: mmi1x2 -info: {} -module: gdsfactory.components.mmi1x2 -name: mmi1x2_18da61b4 -settings: - cross_section: xs_sc - gap_mmi: 0.25 - length_mmi: 5.5 - length_taper: 20 - post_process: null - straight: - function: straight - taper: - function: taper - width: null - width_mmi: 6 - width_taper: 1.5 - with_bbox: true diff --git a/tests/test_pdk/test_settings__mmi1x2_nitride_oband_.yml b/tests/test_pdk/test_settings__mmi1x2_nitride_oband_.yml deleted file mode 100644 index b0d942d..0000000 --- a/tests/test_pdk/test_settings__mmi1x2_nitride_oband_.yml +++ /dev/null @@ -1,53 +0,0 @@ -function: mmi1x2 -info: {} -module: gdsfactory.components.mmi1x2 -name: mmi1x2_c514a145 -settings: - cross_section: - add_pins_function_module: gdsfactory.add_pins - add_pins_function_name: null - auto_widen: false - auto_widen_minimum_length: 200.0 - bbox_layers: null - bbox_offsets: null - components_along_path: [] - end_straight_length: 0.01 - gap: 3.0 - info: {} - min_length: 0.01 - radius: 25.0 - radius_min: 5.0 - sections: - - hidden: false - insets: null - layer: - - 203 - - 0 - name: _default - offset: 0.0 - offset_function: null - port_names: - - o1 - - o2 - port_types: - - optical - - optical - simplify: null - width: 0.95 - width_function: null - start_straight_length: 0.01 - taper_length: 10.0 - width_wide: null - gap: 0.4 - gap_mmi: 0.25 - length_mmi: 5.5 - length_taper: 50 - post_process: null - straight: - function: straight - taper: - function: taper - width: null - width_mmi: 12 - width_taper: 5.5 - with_bbox: true diff --git a/tests/test_pdk/test_settings__mmi2x2_.yml b/tests/test_pdk/test_settings__mmi2x2_.yml deleted file mode 100644 index c91d788..0000000 --- a/tests/test_pdk/test_settings__mmi2x2_.yml +++ /dev/null @@ -1,18 +0,0 @@ -function: mmi2x2 -info: {} -module: gdsfactory.components.mmi2x2 -name: mmi2x2_18da61b4 -settings: - cross_section: xs_sc - gap_mmi: 0.25 - length_mmi: 5.5 - length_taper: 20 - post_process: null - straight: - function: straight - taper: - function: taper - width: null - width_mmi: 6 - width_taper: 1.5 - with_bbox: true diff --git a/tests/test_pdk/test_settings__mmi2x2_nitride_oband_.yml b/tests/test_pdk/test_settings__mmi2x2_nitride_oband_.yml deleted file mode 100644 index 3cfab10..0000000 --- a/tests/test_pdk/test_settings__mmi2x2_nitride_oband_.yml +++ /dev/null @@ -1,53 +0,0 @@ -function: mmi2x2 -info: {} -module: gdsfactory.components.mmi2x2 -name: mmi2x2_c514a145 -settings: - cross_section: - add_pins_function_module: gdsfactory.add_pins - add_pins_function_name: null - auto_widen: false - auto_widen_minimum_length: 200.0 - bbox_layers: null - bbox_offsets: null - components_along_path: [] - end_straight_length: 0.01 - gap: 3.0 - info: {} - min_length: 0.01 - radius: 25.0 - radius_min: 5.0 - sections: - - hidden: false - insets: null - layer: - - 203 - - 0 - name: _default - offset: 0.0 - offset_function: null - port_names: - - o1 - - o2 - port_types: - - optical - - optical - simplify: null - width: 0.95 - width_function: null - start_straight_length: 0.01 - taper_length: 10.0 - width_wide: null - gap: 0.4 - gap_mmi: 0.25 - length_mmi: 5.5 - length_taper: 50 - post_process: null - straight: - function: straight - taper: - function: taper - width: null - width_mmi: 12 - width_taper: 5.5 - with_bbox: true diff --git a/tests/test_pdk/test_settings__straight_.yml b/tests/test_pdk/test_settings__straight_.yml deleted file mode 100644 index 5b8e41c..0000000 --- a/tests/test_pdk/test_settings__straight_.yml +++ /dev/null @@ -1,13 +0,0 @@ -function: _straight -info: - length: 10.0 - route_info_length: 10.0 - route_info_type: xs_sc - route_info_weight: 10.0 - route_info_xs_sc_length: 10.0 - width: 0.45 -module: cspdk.cells -name: _straight -settings: - cross_section: xs_sc - length: 10.0 diff --git a/tests/test_pdk/test_settings__taper_.yml b/tests/test_pdk/test_settings__taper_.yml deleted file mode 100644 index 5f64ac8..0000000 --- a/tests/test_pdk/test_settings__taper_.yml +++ /dev/null @@ -1,13 +0,0 @@ -function: _taper -info: - length: 10.0 - width1: 0.5 - width2: 0.5 -module: cspdk.cells -name: _taper -settings: - cross_section: xs_sc - length: 10.0 - port: null - width1: 0.5 - width2: null diff --git a/tests/test_pdk/test_settings_array_.yml b/tests/test_pdk/test_settings_array_.yml deleted file mode 100644 index a3682d4..0000000 --- a/tests/test_pdk/test_settings_array_.yml +++ /dev/null @@ -1,22 +0,0 @@ -function: array -info: - layer: - - 41 - - 0 - size: - - 100.0 - - 100.0 - xsize: 100.0 - ysize: 100.0 -module: gdsfactory.components.array_component -name: pad_array -settings: - add_ports: true - centered: false - columns: 6 - component: pad - rows: 1 - size: null - spacing: - - 150.0 - - 150.0 diff --git a/tests/test_pdk/test_settings_bend_euler_.yml b/tests/test_pdk/test_settings_bend_euler_.yml deleted file mode 100644 index 8b3a9c3..0000000 --- a/tests/test_pdk/test_settings_bend_euler_.yml +++ /dev/null @@ -1,24 +0,0 @@ -function: bend_euler -info: - dy: 10.0 - length: 16.637 - radius: 10.0 - radius_min: 7.061 - route_info_length: 16.637 - route_info_n_bend_90: 1.0 - route_info_type: xs_sc - route_info_weight: 16.637 - route_info_xs_sc_length: 16.637 - width: 0.45 -module: gdsfactory.components.bend_euler -name: bend_euler -settings: - angle: 90.0 - cross_section: xs_sc - direction: ccw - info: null - npoints: null - p: 0.5 - post_process: null - radius: null - with_arc_floorplan: true diff --git a/tests/test_pdk/test_settings_bend_nc_.yml b/tests/test_pdk/test_settings_bend_nc_.yml deleted file mode 100644 index 5525477..0000000 --- a/tests/test_pdk/test_settings_bend_nc_.yml +++ /dev/null @@ -1,17 +0,0 @@ -function: bend_nc -info: - dy: 25.0 - length: 41.592 - radius: 25.0 - radius_min: 17.652 - route_info_length: 41.592 - route_info_n_bend_90: 1.0 - route_info_type: xs_nc - route_info_weight: 41.592 - route_info_xs_nc_length: 41.592 - width: 1.2 -module: cspdk.cells -name: bend_nc -settings: - angle: 90.0 - radius: 25.0 diff --git a/tests/test_pdk/test_settings_bend_no_.yml b/tests/test_pdk/test_settings_bend_no_.yml deleted file mode 100644 index 68ea6bb..0000000 --- a/tests/test_pdk/test_settings_bend_no_.yml +++ /dev/null @@ -1,17 +0,0 @@ -function: bend_no -info: - dy: 25.0 - length: 41.592 - radius: 25.0 - radius_min: 17.652 - route_info_length: 41.592 - route_info_n_bend_90: 1.0 - route_info_type: xs_no - route_info_weight: 41.592 - route_info_xs_no_length: 41.592 - width: 0.95 -module: cspdk.cells -name: bend_no -settings: - angle: 90.0 - radius: 25.0 diff --git a/tests/test_pdk/test_settings_bend_rc_.yml b/tests/test_pdk/test_settings_bend_rc_.yml deleted file mode 100644 index 160b3db..0000000 --- a/tests/test_pdk/test_settings_bend_rc_.yml +++ /dev/null @@ -1,17 +0,0 @@ -function: bend_rc -info: - dy: 25.0 - length: 41.592 - radius: 25.0 - radius_min: 17.652 - route_info_length: 41.592 - route_info_n_bend_90: 1.0 - route_info_type: xs_rc - route_info_weight: 41.592 - route_info_xs_rc_length: 41.592 - width: 0.45 -module: cspdk.cells -name: bend_rc -settings: - angle: 90.0 - radius: 25.0 diff --git a/tests/test_pdk/test_settings_bend_ro_.yml b/tests/test_pdk/test_settings_bend_ro_.yml deleted file mode 100644 index 1f51621..0000000 --- a/tests/test_pdk/test_settings_bend_ro_.yml +++ /dev/null @@ -1,17 +0,0 @@ -function: bend_ro -info: - dy: 25.0 - length: 41.592 - radius: 25.0 - radius_min: 17.652 - route_info_length: 41.592 - route_info_n_bend_90: 1.0 - route_info_type: xs_ro - route_info_weight: 41.592 - route_info_xs_ro_length: 41.592 - width: 0.4 -module: cspdk.cells -name: bend_ro -settings: - angle: 90.0 - radius: 25.0 diff --git a/tests/test_pdk/test_settings_bend_s_.yml b/tests/test_pdk/test_settings_bend_s_.yml deleted file mode 100644 index 84490b5..0000000 --- a/tests/test_pdk/test_settings_bend_s_.yml +++ /dev/null @@ -1,13 +0,0 @@ -function: bend_s -info: - end_angle: 0 - length: 11.206 - min_bend_radius: 13.012 - start_angle: 0 -module: cspdk.cells -name: bend_s$1 -settings: - cross_section: xs_sc - size: - - 11.0 - - 1.8 diff --git a/tests/test_pdk/test_settings_bend_sc_.yml b/tests/test_pdk/test_settings_bend_sc_.yml deleted file mode 100644 index 6e484c9..0000000 --- a/tests/test_pdk/test_settings_bend_sc_.yml +++ /dev/null @@ -1,17 +0,0 @@ -function: bend_sc -info: - dy: 10.0 - length: 16.637 - radius: 10.0 - radius_min: 7.061 - route_info_length: 16.637 - route_info_n_bend_90: 1.0 - route_info_type: xs_sc - route_info_weight: 16.637 - route_info_xs_sc_length: 16.637 - width: 0.45 -module: cspdk.cells -name: bend_sc -settings: - angle: 90.0 - radius: 10.0 diff --git a/tests/test_pdk/test_settings_bend_so_.yml b/tests/test_pdk/test_settings_bend_so_.yml deleted file mode 100644 index 394d4d4..0000000 --- a/tests/test_pdk/test_settings_bend_so_.yml +++ /dev/null @@ -1,17 +0,0 @@ -function: bend_so -info: - dy: 10.0 - length: 16.637 - radius: 10.0 - radius_min: 7.061 - route_info_length: 16.637 - route_info_n_bend_90: 1.0 - route_info_type: xs_so - route_info_weight: 16.637 - route_info_xs_so_length: 16.637 - width: 0.4 -module: cspdk.cells -name: bend_so -settings: - angle: 90.0 - radius: 10.0 diff --git a/tests/test_pdk/test_settings_coupler_nc_.yml b/tests/test_pdk/test_settings_coupler_nc_.yml deleted file mode 100644 index bf4bb92..0000000 --- a/tests/test_pdk/test_settings_coupler_nc_.yml +++ /dev/null @@ -1,11 +0,0 @@ -function: coupler_nc -info: - length: 10.102 - min_bend_radius: 15.665 -module: cspdk.cells -name: coupler_nc -settings: - dx: 10.0 - dy: 4.0 - gap: 0.4 - length: 20.0 diff --git a/tests/test_pdk/test_settings_coupler_no_.yml b/tests/test_pdk/test_settings_coupler_no_.yml deleted file mode 100644 index c3081a5..0000000 --- a/tests/test_pdk/test_settings_coupler_no_.yml +++ /dev/null @@ -1,11 +0,0 @@ -function: coupler_no -info: - length: 10.124 - min_bend_radius: 14.295 -module: cspdk.cells -name: coupler_no -settings: - dx: 10.0 - dy: 4.0 - gap: 0.4 - length: 20.0 diff --git a/tests/test_pdk/test_settings_coupler_rc_.yml b/tests/test_pdk/test_settings_coupler_rc_.yml deleted file mode 100644 index e571155..0000000 --- a/tests/test_pdk/test_settings_coupler_rc_.yml +++ /dev/null @@ -1,11 +0,0 @@ -function: coupler_rc -info: - length: 10.192 - min_bend_radius: 11.701 -module: cspdk.cells -name: coupler_rc -settings: - dx: 10.0 - dy: 4.0 - gap: 0.236 - length: 20.0 diff --git a/tests/test_pdk/test_settings_coupler_ro_.yml b/tests/test_pdk/test_settings_coupler_ro_.yml deleted file mode 100644 index d11cf23..0000000 --- a/tests/test_pdk/test_settings_coupler_ro_.yml +++ /dev/null @@ -1,11 +0,0 @@ -function: coupler_ro -info: - length: 10.198 - min_bend_radius: 11.548 -module: cspdk.cells -name: coupler_ro -settings: - dx: 10.0 - dy: 4.0 - gap: 0.236 - length: 20.0 diff --git a/tests/test_pdk/test_settings_coupler_sc_.yml b/tests/test_pdk/test_settings_coupler_sc_.yml deleted file mode 100644 index 0a95e62..0000000 --- a/tests/test_pdk/test_settings_coupler_sc_.yml +++ /dev/null @@ -1,11 +0,0 @@ -function: coupler_sc -info: - length: 10.192 - min_bend_radius: 11.701 -module: cspdk.cells -name: coupler_sc -settings: - dx: 10.0 - dy: 4.0 - gap: 0.236 - length: 20.0 diff --git a/tests/test_pdk/test_settings_coupler_so_.yml b/tests/test_pdk/test_settings_coupler_so_.yml deleted file mode 100644 index b0162cb..0000000 --- a/tests/test_pdk/test_settings_coupler_so_.yml +++ /dev/null @@ -1,11 +0,0 @@ -function: coupler_so -info: - length: 10.198 - min_bend_radius: 11.548 -module: cspdk.cells -name: coupler_so -settings: - dx: 10.0 - dy: 4.0 - gap: 0.236 - length: 20.0 diff --git a/tests/test_pdk/test_settings_crossing_rc_.yml b/tests/test_pdk/test_settings_crossing_rc_.yml deleted file mode 100644 index e6615ba..0000000 --- a/tests/test_pdk/test_settings_crossing_rc_.yml +++ /dev/null @@ -1,5 +0,0 @@ -function: crossing_rc -info: {} -module: cspdk.cells -name: crossing_rc -settings: {} diff --git a/tests/test_pdk/test_settings_crossing_sc_.yml b/tests/test_pdk/test_settings_crossing_sc_.yml deleted file mode 100644 index 30edf92..0000000 --- a/tests/test_pdk/test_settings_crossing_sc_.yml +++ /dev/null @@ -1,5 +0,0 @@ -function: crossing_sc -info: {} -module: cspdk.cells -name: crossing_sc -settings: {} diff --git a/tests/test_pdk/test_settings_crossing_so_.yml b/tests/test_pdk/test_settings_crossing_so_.yml deleted file mode 100644 index a1f4578..0000000 --- a/tests/test_pdk/test_settings_crossing_so_.yml +++ /dev/null @@ -1,5 +0,0 @@ -function: crossing_so -info: {} -module: cspdk.cells -name: crossing_so -settings: {} diff --git a/tests/test_pdk/test_settings_die_nc_.yml b/tests/test_pdk/test_settings_die_nc_.yml deleted file mode 100644 index 3bc7ce2..0000000 --- a/tests/test_pdk/test_settings_die_nc_.yml +++ /dev/null @@ -1,5 +0,0 @@ -function: die_nc -info: {} -module: cspdk.cells -name: die_nc -settings: {} diff --git a/tests/test_pdk/test_settings_die_no_.yml b/tests/test_pdk/test_settings_die_no_.yml deleted file mode 100644 index b416c12..0000000 --- a/tests/test_pdk/test_settings_die_no_.yml +++ /dev/null @@ -1,5 +0,0 @@ -function: die_no -info: {} -module: cspdk.cells -name: die_no -settings: {} diff --git a/tests/test_pdk/test_settings_die_rc_.yml b/tests/test_pdk/test_settings_die_rc_.yml deleted file mode 100644 index d04838b..0000000 --- a/tests/test_pdk/test_settings_die_rc_.yml +++ /dev/null @@ -1,5 +0,0 @@ -function: die_rc -info: {} -module: cspdk.cells -name: die_rc -settings: {} diff --git a/tests/test_pdk/test_settings_die_ro_.yml b/tests/test_pdk/test_settings_die_ro_.yml deleted file mode 100644 index f770ef3..0000000 --- a/tests/test_pdk/test_settings_die_ro_.yml +++ /dev/null @@ -1,5 +0,0 @@ -function: die_ro -info: {} -module: cspdk.cells -name: die_ro -settings: {} diff --git a/tests/test_pdk/test_settings_die_sc_.yml b/tests/test_pdk/test_settings_die_sc_.yml deleted file mode 100644 index e502ddf..0000000 --- a/tests/test_pdk/test_settings_die_sc_.yml +++ /dev/null @@ -1,5 +0,0 @@ -function: die_sc -info: {} -module: cspdk.cells -name: die_sc -settings: {} diff --git a/tests/test_pdk/test_settings_die_so_.yml b/tests/test_pdk/test_settings_die_so_.yml deleted file mode 100644 index bce5550..0000000 --- a/tests/test_pdk/test_settings_die_so_.yml +++ /dev/null @@ -1,5 +0,0 @@ -function: die_so -info: {} -module: cspdk.cells -name: die_so -settings: {} diff --git a/tests/test_pdk/test_settings_gc_elliptical_sc_.yml b/tests/test_pdk/test_settings_gc_elliptical_sc_.yml deleted file mode 100644 index 8af7c6a..0000000 --- a/tests/test_pdk/test_settings_gc_elliptical_sc_.yml +++ /dev/null @@ -1,11 +0,0 @@ -function: gc_elliptical_sc -info: - period: 0.6759999999999999 - polarization: te - wavelength: 1.53 -module: cspdk.cells -name: gc_elliptical_sc -settings: - fiber_angle: 15 - grating_line_width: 0.343 - wavelength: 1.53 diff --git a/tests/test_pdk/test_settings_gc_elliptical_so_.yml b/tests/test_pdk/test_settings_gc_elliptical_so_.yml deleted file mode 100644 index 10ffbfc..0000000 --- a/tests/test_pdk/test_settings_gc_elliptical_so_.yml +++ /dev/null @@ -1,11 +0,0 @@ -function: gc_elliptical_so -info: - period: 0.579 - polarization: te - wavelength: 1.31 -module: cspdk.cells -name: gc_elliptical_so -settings: - fiber_angle: 15 - grating_line_width: 0.343 - wavelength: 1.31 diff --git a/tests/test_pdk/test_settings_gc_rectangular_.yml b/tests/test_pdk/test_settings_gc_rectangular_.yml deleted file mode 100644 index 5db460c..0000000 --- a/tests/test_pdk/test_settings_gc_rectangular_.yml +++ /dev/null @@ -1,19 +0,0 @@ -function: gc_rectangular -info: - fiber_angle: 10 - polarization: te - wavelength: 1.55 -module: cspdk.cells -name: gc_rectangular -settings: - fiber_angle: 10 - fill_factor: 0.5 - layer_grating: - - 6 - - 0 - layer_slab: - - 3 - - 0 - length_taper: 350 - n_periods: 30 - slab_offset: 0 diff --git a/tests/test_pdk/test_settings_gc_rectangular_nc_.yml b/tests/test_pdk/test_settings_gc_rectangular_nc_.yml deleted file mode 100644 index b8565c6..0000000 --- a/tests/test_pdk/test_settings_gc_rectangular_nc_.yml +++ /dev/null @@ -1,8 +0,0 @@ -function: gc_rectangular_nc -info: - fiber_angle: 20 - polarization: te - wavelength: 1.55 -module: cspdk.cells -name: gc_rectangular_nc -settings: {} diff --git a/tests/test_pdk/test_settings_gc_rectangular_no_.yml b/tests/test_pdk/test_settings_gc_rectangular_no_.yml deleted file mode 100644 index 3ae7bd3..0000000 --- a/tests/test_pdk/test_settings_gc_rectangular_no_.yml +++ /dev/null @@ -1,8 +0,0 @@ -function: gc_rectangular_no -info: - fiber_angle: 20 - polarization: te - wavelength: 1.55 -module: cspdk.cells -name: gc_rectangular_no -settings: {} diff --git a/tests/test_pdk/test_settings_gc_rectangular_rc_.yml b/tests/test_pdk/test_settings_gc_rectangular_rc_.yml deleted file mode 100644 index d533742..0000000 --- a/tests/test_pdk/test_settings_gc_rectangular_rc_.yml +++ /dev/null @@ -1,8 +0,0 @@ -function: gc_rectangular_rc -info: - fiber_angle: 10.0 - polarization: te - wavelength: 1.55 -module: cspdk.cells -name: gc_rectangular_rc -settings: {} diff --git a/tests/test_pdk/test_settings_gc_rectangular_ro_.yml b/tests/test_pdk/test_settings_gc_rectangular_ro_.yml deleted file mode 100644 index 9061ecf..0000000 --- a/tests/test_pdk/test_settings_gc_rectangular_ro_.yml +++ /dev/null @@ -1,8 +0,0 @@ -function: gc_rectangular_ro -info: - fiber_angle: 10.0 - polarization: te - wavelength: 1.55 -module: cspdk.cells -name: gc_rectangular_ro -settings: {} diff --git a/tests/test_pdk/test_settings_gc_rectangular_sc_.yml b/tests/test_pdk/test_settings_gc_rectangular_sc_.yml deleted file mode 100644 index 4b7e359..0000000 --- a/tests/test_pdk/test_settings_gc_rectangular_sc_.yml +++ /dev/null @@ -1,8 +0,0 @@ -function: gc_rectangular_sc -info: - fiber_angle: 10 - polarization: te - wavelength: 1.55 -module: cspdk.cells -name: gc_rectangular_sc -settings: {} diff --git a/tests/test_pdk/test_settings_gc_rectangular_so_.yml b/tests/test_pdk/test_settings_gc_rectangular_so_.yml deleted file mode 100644 index dbaff68..0000000 --- a/tests/test_pdk/test_settings_gc_rectangular_so_.yml +++ /dev/null @@ -1,8 +0,0 @@ -function: gc_rectangular_so -info: - fiber_angle: 10.0 - polarization: te - wavelength: 1.55 -module: cspdk.cells -name: gc_rectangular_so -settings: {} diff --git a/tests/test_pdk/test_settings_grating_coupler_array_.yml b/tests/test_pdk/test_settings_grating_coupler_array_.yml deleted file mode 100644 index f995f7a..0000000 --- a/tests/test_pdk/test_settings_grating_coupler_array_.yml +++ /dev/null @@ -1,16 +0,0 @@ -function: grating_coupler_array -info: {} -module: cspdk.cells -name: grating_coupler_array -settings: - bend: - function: _bend - cross_section: xs_nc - grating_coupler: - function: gc_rectangular_nc - grating_coupler_spacing: 0.0 - n: 6 - pitch: 127.0 - port_name: o1 - rotation: 0.0 - with_loopback: false diff --git a/tests/test_pdk/test_settings_heater_.yml b/tests/test_pdk/test_settings_heater_.yml deleted file mode 100644 index 1ab76c1..0000000 --- a/tests/test_pdk/test_settings_heater_.yml +++ /dev/null @@ -1,5 +0,0 @@ -function: heater -info: {} -module: cspdk.cells -name: heater$1 -settings: {} diff --git a/tests/test_pdk/test_settings_mmi1x2_.yml b/tests/test_pdk/test_settings_mmi1x2_.yml deleted file mode 100644 index 57995a7..0000000 --- a/tests/test_pdk/test_settings_mmi1x2_.yml +++ /dev/null @@ -1,14 +0,0 @@ -function: mmi1x2 -info: {} -module: gdsfactory.components.mmi1x2 -name: mmi1x2 -settings: - cross_section: xs_sc - gap_mmi: 0.25 - length_mmi: 5.5 - length_taper: 10.0 - taper: - function: taper - width: null - width_mmi: 2.5 - width_taper: 1.0 diff --git a/tests/test_pdk/test_settings_mmi1x2_nc_.yml b/tests/test_pdk/test_settings_mmi1x2_nc_.yml deleted file mode 100644 index 56cbdc2..0000000 --- a/tests/test_pdk/test_settings_mmi1x2_nc_.yml +++ /dev/null @@ -1,5 +0,0 @@ -function: mmi1x2_nc -info: {} -module: cspdk.cells -name: mmi1x2_nc -settings: {} diff --git a/tests/test_pdk/test_settings_mmi1x2_no_.yml b/tests/test_pdk/test_settings_mmi1x2_no_.yml deleted file mode 100644 index f43f842..0000000 --- a/tests/test_pdk/test_settings_mmi1x2_no_.yml +++ /dev/null @@ -1,5 +0,0 @@ -function: mmi1x2_no -info: {} -module: cspdk.cells -name: mmi1x2_no -settings: {} diff --git a/tests/test_pdk/test_settings_mmi1x2_rc_.yml b/tests/test_pdk/test_settings_mmi1x2_rc_.yml deleted file mode 100644 index 603b4fc..0000000 --- a/tests/test_pdk/test_settings_mmi1x2_rc_.yml +++ /dev/null @@ -1,5 +0,0 @@ -function: mmi1x2_rc -info: {} -module: cspdk.cells -name: mmi1x2_rc -settings: {} diff --git a/tests/test_pdk/test_settings_mmi1x2_ro_.yml b/tests/test_pdk/test_settings_mmi1x2_ro_.yml deleted file mode 100644 index 5fdd6f0..0000000 --- a/tests/test_pdk/test_settings_mmi1x2_ro_.yml +++ /dev/null @@ -1,5 +0,0 @@ -function: mmi1x2_ro -info: {} -module: cspdk.cells -name: mmi1x2_ro -settings: {} diff --git a/tests/test_pdk/test_settings_mmi1x2_sc_.yml b/tests/test_pdk/test_settings_mmi1x2_sc_.yml deleted file mode 100644 index 000abd4..0000000 --- a/tests/test_pdk/test_settings_mmi1x2_sc_.yml +++ /dev/null @@ -1,5 +0,0 @@ -function: mmi1x2_sc -info: {} -module: cspdk.cells -name: mmi1x2_sc -settings: {} diff --git a/tests/test_pdk/test_settings_mmi1x2_so_.yml b/tests/test_pdk/test_settings_mmi1x2_so_.yml deleted file mode 100644 index bf3637b..0000000 --- a/tests/test_pdk/test_settings_mmi1x2_so_.yml +++ /dev/null @@ -1,5 +0,0 @@ -function: mmi1x2_so -info: {} -module: cspdk.cells -name: mmi1x2_so -settings: {} diff --git a/tests/test_pdk/test_settings_mmi2x2_.yml b/tests/test_pdk/test_settings_mmi2x2_.yml deleted file mode 100644 index 7bfa3d6..0000000 --- a/tests/test_pdk/test_settings_mmi2x2_.yml +++ /dev/null @@ -1,14 +0,0 @@ -function: mmi2x2 -info: {} -module: gdsfactory.components.mmi2x2 -name: mmi2x2 -settings: - cross_section: xs_sc - gap_mmi: 0.25 - length_mmi: 5.5 - length_taper: 10.0 - taper: - function: taper - width: null - width_mmi: 2.5 - width_taper: 1.0 diff --git a/tests/test_pdk/test_settings_mmi2x2_nc_.yml b/tests/test_pdk/test_settings_mmi2x2_nc_.yml deleted file mode 100644 index 87ef9ca..0000000 --- a/tests/test_pdk/test_settings_mmi2x2_nc_.yml +++ /dev/null @@ -1,5 +0,0 @@ -function: mmi2x2_nc -info: {} -module: cspdk.cells -name: mmi2x2_nc -settings: {} diff --git a/tests/test_pdk/test_settings_mmi2x2_no_.yml b/tests/test_pdk/test_settings_mmi2x2_no_.yml deleted file mode 100644 index e106824..0000000 --- a/tests/test_pdk/test_settings_mmi2x2_no_.yml +++ /dev/null @@ -1,5 +0,0 @@ -function: mmi2x2_no -info: {} -module: cspdk.cells -name: mmi2x2_no -settings: {} diff --git a/tests/test_pdk/test_settings_mmi2x2_rc_.yml b/tests/test_pdk/test_settings_mmi2x2_rc_.yml deleted file mode 100644 index 974a9d7..0000000 --- a/tests/test_pdk/test_settings_mmi2x2_rc_.yml +++ /dev/null @@ -1,5 +0,0 @@ -function: mmi2x2_rc -info: {} -module: cspdk.cells -name: mmi2x2_rc -settings: {} diff --git a/tests/test_pdk/test_settings_mmi2x2_ro_.yml b/tests/test_pdk/test_settings_mmi2x2_ro_.yml deleted file mode 100644 index 9c4813d..0000000 --- a/tests/test_pdk/test_settings_mmi2x2_ro_.yml +++ /dev/null @@ -1,5 +0,0 @@ -function: mmi2x2_ro -info: {} -module: cspdk.cells -name: mmi2x2_ro -settings: {} diff --git a/tests/test_pdk/test_settings_mmi2x2_sc_.yml b/tests/test_pdk/test_settings_mmi2x2_sc_.yml deleted file mode 100644 index 295aec9..0000000 --- a/tests/test_pdk/test_settings_mmi2x2_sc_.yml +++ /dev/null @@ -1,5 +0,0 @@ -function: mmi2x2_sc -info: {} -module: cspdk.cells -name: mmi2x2_sc -settings: {} diff --git a/tests/test_pdk/test_settings_mmi2x2_so_.yml b/tests/test_pdk/test_settings_mmi2x2_so_.yml deleted file mode 100644 index cd07874..0000000 --- a/tests/test_pdk/test_settings_mmi2x2_so_.yml +++ /dev/null @@ -1,5 +0,0 @@ -function: mmi2x2_so -info: {} -module: cspdk.cells -name: mmi2x2_so -settings: {} diff --git a/tests/test_pdk/test_settings_mzi_.yml b/tests/test_pdk/test_settings_mzi_.yml deleted file mode 100644 index 33b23d0..0000000 --- a/tests/test_pdk/test_settings_mzi_.yml +++ /dev/null @@ -1,31 +0,0 @@ -function: mzi -info: {} -module: gdsfactory.components.mzi -name: mzi -settings: - add_electrical_ports_bot: true - add_optical_ports_arms: false - bend: - function: bend_euler - combiner: null - cross_section: xs_sc - cross_section_x_bot: null - cross_section_x_top: null - delta_length: 10.0 - extend_ports_straight_x: null - length_x: 0.1 - length_y: 2.0 - min_length: 0.01 - mirror_bot: false - nbends: 2 - port_e0_combiner: o3 - port_e0_splitter: o3 - port_e1_combiner: o2 - port_e1_splitter: o2 - splitter: mmi1x2 - straight: - function: straight - straight_x_bot: null - straight_x_top: null - straight_y: null - with_splitter: true diff --git a/tests/test_pdk/test_settings_mzi_nc_.yml b/tests/test_pdk/test_settings_mzi_nc_.yml deleted file mode 100644 index a7a15bc..0000000 --- a/tests/test_pdk/test_settings_mzi_nc_.yml +++ /dev/null @@ -1,9 +0,0 @@ -function: mzi_nc -info: {} -module: cspdk.cells -name: mzi_nc -settings: - add_electrical_ports_bot: true - delta_length: 10.0 - length_x: 0.1 - length_y: 2.0 diff --git a/tests/test_pdk/test_settings_mzi_no_.yml b/tests/test_pdk/test_settings_mzi_no_.yml deleted file mode 100644 index 7bbbdf3..0000000 --- a/tests/test_pdk/test_settings_mzi_no_.yml +++ /dev/null @@ -1,9 +0,0 @@ -function: mzi_no -info: {} -module: cspdk.cells -name: mzi_no -settings: - add_electrical_ports_bot: true - delta_length: 10.0 - length_x: 0.1 - length_y: 2.0 diff --git a/tests/test_pdk/test_settings_mzi_rc_.yml b/tests/test_pdk/test_settings_mzi_rc_.yml deleted file mode 100644 index a6ab51c..0000000 --- a/tests/test_pdk/test_settings_mzi_rc_.yml +++ /dev/null @@ -1,9 +0,0 @@ -function: mzi_rc -info: {} -module: cspdk.cells -name: mzi_rc -settings: - add_electrical_ports_bot: true - delta_length: 10.0 - length_x: 0.1 - length_y: 2.0 diff --git a/tests/test_pdk/test_settings_mzi_ro_.yml b/tests/test_pdk/test_settings_mzi_ro_.yml deleted file mode 100644 index ea56e4c..0000000 --- a/tests/test_pdk/test_settings_mzi_ro_.yml +++ /dev/null @@ -1,9 +0,0 @@ -function: mzi_ro -info: {} -module: cspdk.cells -name: mzi_ro -settings: - add_electrical_ports_bot: true - delta_length: 10.0 - length_x: 0.1 - length_y: 2.0 diff --git a/tests/test_pdk/test_settings_mzi_sc_.yml b/tests/test_pdk/test_settings_mzi_sc_.yml deleted file mode 100644 index 8361c09..0000000 --- a/tests/test_pdk/test_settings_mzi_sc_.yml +++ /dev/null @@ -1,9 +0,0 @@ -function: mzi_sc -info: {} -module: cspdk.cells -name: mzi_sc -settings: - add_electrical_ports_bot: true - delta_length: 10.0 - length_x: 0.1 - length_y: 2.0 diff --git a/tests/test_pdk/test_settings_mzi_so_.yml b/tests/test_pdk/test_settings_mzi_so_.yml deleted file mode 100644 index a1e3918..0000000 --- a/tests/test_pdk/test_settings_mzi_so_.yml +++ /dev/null @@ -1,9 +0,0 @@ -function: mzi_so -info: {} -module: cspdk.cells -name: mzi_so -settings: - add_electrical_ports_bot: true - delta_length: 10.0 - length_x: 0.1 - length_y: 2.0 diff --git a/tests/test_pdk/test_settings_pad_.yml b/tests/test_pdk/test_settings_pad_.yml deleted file mode 100644 index 5389ff7..0000000 --- a/tests/test_pdk/test_settings_pad_.yml +++ /dev/null @@ -1,23 +0,0 @@ -function: pad -info: - layer: - - 41 - - 0 - size: - - 100.0 - - 100.0 - xsize: 100.0 - ysize: 100.0 -module: cspdk.cells -name: pad -settings: - bbox_layers: null - bbox_offsets: null - layer: - - 41 - - 0 - port_inclusion: 0.0 - port_orientation: null - size: - - 100.0 - - 100.0 diff --git a/tests/test_pdk/test_settings_rectangle_.yml b/tests/test_pdk/test_settings_rectangle_.yml deleted file mode 100644 index adcfc82..0000000 --- a/tests/test_pdk/test_settings_rectangle_.yml +++ /dev/null @@ -1,21 +0,0 @@ -function: rectangle -info: - area: 8.0 -module: cspdk.cells -name: rectangle -settings: - centered: false - layer: - - 99 - - 0 - port_orientations: - - 180.0 - - 90.0 - - 0.0 - - -90.0 - port_type: electrical - round_corners_east_west: false - round_corners_north_south: false - size: - - 4.0 - - 2.0 diff --git a/tests/test_pdk/test_settings_straight_.yml b/tests/test_pdk/test_settings_straight_.yml deleted file mode 100644 index 9da98e8..0000000 --- a/tests/test_pdk/test_settings_straight_.yml +++ /dev/null @@ -1,16 +0,0 @@ -function: straight -info: - length: 10.0 - route_info_length: 10.0 - route_info_type: xs_sc - route_info_weight: 10.0 - route_info_xs_sc_length: 10.0 - width: 0.45 -module: gdsfactory.components.straight -name: straight -settings: - cross_section: xs_sc - info: null - length: 10.0 - npoints: 2 - post_process: null diff --git a/tests/test_pdk/test_settings_straight_nc_.yml b/tests/test_pdk/test_settings_straight_nc_.yml deleted file mode 100644 index bcd0ed6..0000000 --- a/tests/test_pdk/test_settings_straight_nc_.yml +++ /dev/null @@ -1,12 +0,0 @@ -function: straight_nc -info: - length: 10.0 - route_info_length: 10.0 - route_info_type: xs_nc - route_info_weight: 10.0 - route_info_xs_nc_length: 10.0 - width: 1.2 -module: cspdk.cells -name: straight_nc -settings: - length: 10.0 diff --git a/tests/test_pdk/test_settings_straight_no_.yml b/tests/test_pdk/test_settings_straight_no_.yml deleted file mode 100644 index 2583541..0000000 --- a/tests/test_pdk/test_settings_straight_no_.yml +++ /dev/null @@ -1,12 +0,0 @@ -function: straight_no -info: - length: 10.0 - route_info_length: 10.0 - route_info_type: xs_no - route_info_weight: 10.0 - route_info_xs_no_length: 10.0 - width: 0.95 -module: cspdk.cells -name: straight_no -settings: - length: 10.0 diff --git a/tests/test_pdk/test_settings_straight_rc_.yml b/tests/test_pdk/test_settings_straight_rc_.yml deleted file mode 100644 index 3144127..0000000 --- a/tests/test_pdk/test_settings_straight_rc_.yml +++ /dev/null @@ -1,12 +0,0 @@ -function: straight_rc -info: - length: 10.0 - route_info_length: 10.0 - route_info_type: xs_rc - route_info_weight: 10.0 - route_info_xs_rc_length: 10.0 - width: 0.45 -module: cspdk.cells -name: straight_rc -settings: - length: 10.0 diff --git a/tests/test_pdk/test_settings_straight_ro_.yml b/tests/test_pdk/test_settings_straight_ro_.yml deleted file mode 100644 index a11ed70..0000000 --- a/tests/test_pdk/test_settings_straight_ro_.yml +++ /dev/null @@ -1,12 +0,0 @@ -function: straight_ro -info: - length: 10.0 - route_info_length: 10.0 - route_info_type: xs_ro - route_info_weight: 10.0 - route_info_xs_ro_length: 10.0 - width: 0.4 -module: cspdk.cells -name: straight_ro -settings: - length: 10.0 diff --git a/tests/test_pdk/test_settings_straight_sc_.yml b/tests/test_pdk/test_settings_straight_sc_.yml deleted file mode 100644 index c91c649..0000000 --- a/tests/test_pdk/test_settings_straight_sc_.yml +++ /dev/null @@ -1,12 +0,0 @@ -function: straight_sc -info: - length: 10.0 - route_info_length: 10.0 - route_info_type: xs_sc - route_info_weight: 10.0 - route_info_xs_sc_length: 10.0 - width: 0.45 -module: cspdk.cells -name: straight_sc -settings: - length: 10.0 diff --git a/tests/test_pdk/test_settings_straight_so_.yml b/tests/test_pdk/test_settings_straight_so_.yml deleted file mode 100644 index 0ded88a..0000000 --- a/tests/test_pdk/test_settings_straight_so_.yml +++ /dev/null @@ -1,12 +0,0 @@ -function: straight_so -info: - length: 10.0 - route_info_length: 10.0 - route_info_type: xs_so - route_info_weight: 10.0 - route_info_xs_so_length: 10.0 - width: 0.4 -module: cspdk.cells -name: straight_so -settings: - length: 10.0 diff --git a/tests/test_pdk/test_settings_taper_.yml b/tests/test_pdk/test_settings_taper_.yml deleted file mode 100644 index d945786..0000000 --- a/tests/test_pdk/test_settings_taper_.yml +++ /dev/null @@ -1,20 +0,0 @@ -function: taper -info: - length: 10.0 - width1: 0.5 - width2: 0.5 -module: gdsfactory.components.taper -name: taper -settings: - cross_section: xs_sc - length: 10.0 - port: null - port_order_name: - - o1 - - o2 - port_order_types: - - optical - - optical - width1: 0.5 - width2: null - with_two_ports: true diff --git a/tests/test_pdk/test_settings_taper_cross_section_.yml b/tests/test_pdk/test_settings_taper_cross_section_.yml deleted file mode 100644 index eae24bf..0000000 --- a/tests/test_pdk/test_settings_taper_cross_section_.yml +++ /dev/null @@ -1,16 +0,0 @@ -function: taper_cross_section -info: - length: 10 - route_info_length: 10.0 - route_info_type: xs_rc_tip - route_info_weight: 10.0 - route_info_xs_rc_tip_length: 10.0 - route_info_xs_rc_tip_taper_length: 10 -module: cspdk.cells -name: taper_cross_section -settings: - cross_section1: xs_rc_tip - cross_section2: xs_rc - length: 10 - linear: true - npoints: 2 diff --git a/tests/test_pdk/test_settings_taper_nc_.yml b/tests/test_pdk/test_settings_taper_nc_.yml deleted file mode 100644 index a332928..0000000 --- a/tests/test_pdk/test_settings_taper_nc_.yml +++ /dev/null @@ -1,12 +0,0 @@ -function: taper_nc -info: - length: 10.0 - width1: 0.5 - width2: 0.5 -module: cspdk.cells -name: taper_nc -settings: - length: 10.0 - port: null - width1: 0.5 - width2: null diff --git a/tests/test_pdk/test_settings_taper_no_.yml b/tests/test_pdk/test_settings_taper_no_.yml deleted file mode 100644 index 2535a5e..0000000 --- a/tests/test_pdk/test_settings_taper_no_.yml +++ /dev/null @@ -1,12 +0,0 @@ -function: taper_no -info: - length: 10.0 - width1: 0.5 - width2: 0.5 -module: cspdk.cells -name: taper_no -settings: - length: 10.0 - port: null - width1: 0.5 - width2: null diff --git a/tests/test_pdk/test_settings_taper_rc_.yml b/tests/test_pdk/test_settings_taper_rc_.yml deleted file mode 100644 index a1f062b..0000000 --- a/tests/test_pdk/test_settings_taper_rc_.yml +++ /dev/null @@ -1,12 +0,0 @@ -function: taper_rc -info: - length: 10.0 - width1: 0.5 - width2: 0.5 -module: cspdk.cells -name: taper_rc -settings: - length: 10.0 - port: null - width1: 0.5 - width2: null diff --git a/tests/test_pdk/test_settings_taper_ro_.yml b/tests/test_pdk/test_settings_taper_ro_.yml deleted file mode 100644 index e96be0a..0000000 --- a/tests/test_pdk/test_settings_taper_ro_.yml +++ /dev/null @@ -1,12 +0,0 @@ -function: taper_ro -info: - length: 10.0 - width1: 0.5 - width2: 0.5 -module: cspdk.cells -name: taper_ro -settings: - length: 10.0 - port: null - width1: 0.5 - width2: null diff --git a/tests/test_pdk/test_settings_taper_sc_.yml b/tests/test_pdk/test_settings_taper_sc_.yml deleted file mode 100644 index fa050eb..0000000 --- a/tests/test_pdk/test_settings_taper_sc_.yml +++ /dev/null @@ -1,12 +0,0 @@ -function: taper_sc -info: - length: 10.0 - width1: 0.5 - width2: 0.5 -module: cspdk.cells -name: taper_sc -settings: - length: 10.0 - port: null - width1: 0.5 - width2: null diff --git a/tests/test_pdk/test_settings_taper_so_.yml b/tests/test_pdk/test_settings_taper_so_.yml deleted file mode 100644 index 1e164ae..0000000 --- a/tests/test_pdk/test_settings_taper_so_.yml +++ /dev/null @@ -1,12 +0,0 @@ -function: taper_so -info: - length: 10.0 - width1: 0.5 - width2: 0.5 -module: cspdk.cells -name: taper_so -settings: - length: 10.0 - port: null - width1: 0.5 - width2: null diff --git a/tests/test_pdk/test_settings_trans_sc_rc10_.yml b/tests/test_pdk/test_settings_trans_sc_rc10_.yml deleted file mode 100644 index 2a0de03..0000000 --- a/tests/test_pdk/test_settings_trans_sc_rc10_.yml +++ /dev/null @@ -1,11 +0,0 @@ -function: trans_sc_rc10 -info: - length: 10 - route_info_length: 10.0 - route_info_type: xs_rc_tip - route_info_weight: 10.0 - route_info_xs_rc_tip_length: 10.0 - route_info_xs_rc_tip_taper_length: 10 -module: cspdk.cells -name: trans_sc_rc10 -settings: {} diff --git a/tests/test_pdk/test_settings_trans_sc_rc20_.yml b/tests/test_pdk/test_settings_trans_sc_rc20_.yml deleted file mode 100644 index 4872e2a..0000000 --- a/tests/test_pdk/test_settings_trans_sc_rc20_.yml +++ /dev/null @@ -1,11 +0,0 @@ -function: trans_sc_rc20 -info: - length: 20 - route_info_length: 20.0 - route_info_type: xs_rc_tip - route_info_weight: 20.0 - route_info_xs_rc_tip_length: 20.0 - route_info_xs_rc_tip_taper_length: 20 -module: cspdk.cells -name: trans_sc_rc20 -settings: {} diff --git a/tests/test_pdk/test_settings_trans_sc_rc50_.yml b/tests/test_pdk/test_settings_trans_sc_rc50_.yml deleted file mode 100644 index eec65e3..0000000 --- a/tests/test_pdk/test_settings_trans_sc_rc50_.yml +++ /dev/null @@ -1,11 +0,0 @@ -function: trans_sc_rc50 -info: - length: 50 - route_info_length: 50.0 - route_info_type: xs_rc_tip - route_info_weight: 50.0 - route_info_xs_rc_tip_length: 50.0 - route_info_xs_rc_tip_taper_length: 50 -module: cspdk.cells -name: trans_sc_rc50 -settings: {} diff --git a/tests/test_pdk/test_settings_wire_corner_.yml b/tests/test_pdk/test_settings_wire_corner_.yml deleted file mode 100644 index 3a5ab9a..0000000 --- a/tests/test_pdk/test_settings_wire_corner_.yml +++ /dev/null @@ -1,8 +0,0 @@ -function: wire_corner -info: - dy: 10.0 - length: 10.0 -module: cspdk.cells -name: wire_corner$1 -settings: - cross_section: xs_metal_routing diff --git a/tests/test_pdk.py b/tests/test_pdk_si220.py similarity index 80% rename from tests/test_pdk.py rename to tests/test_pdk_si220.py index be87a90..d97bc75 100644 --- a/tests/test_pdk.py +++ b/tests/test_pdk_si220.py @@ -4,18 +4,19 @@ from gdsfactory.difftest import difftest from pytest_regressions.data_regression import DataRegressionFixture -from cspdk.extra import PDK +from cspdk.si220 import PDK cells = PDK.cells skip_test = {"import_gds"} -component_names = set(cells.keys()) - set(skip_test) -dirpath = pathlib.Path(__file__).absolute().with_suffix(".gds").parent / "gds_ref" +cell_names = set(cells.keys()) - set(skip_test) +cell_names = [name for name in cell_names if not name.startswith("_")] +dirpath = pathlib.Path(__file__).absolute().with_suffix(".gds").parent / "gds_ref_si220" dirpath.mkdir(exist_ok=True, parents=True) -@pytest.fixture(params=component_names, scope="function") +@pytest.fixture(params=cell_names, scope="function") def component_name(request) -> str: return request.param diff --git a/tests/test_pdk_sin300.py b/tests/test_pdk_sin300.py new file mode 100644 index 0000000..f9b34a6 --- /dev/null +++ b/tests/test_pdk_sin300.py @@ -0,0 +1,40 @@ +import pathlib + +import pytest +from gdsfactory.difftest import difftest +from pytest_regressions.data_regression import DataRegressionFixture + +from cspdk.sin300 import PDK + +cells = PDK.cells + +skip_test = {"import_gds"} + +cell_names = set(cells.keys()) - set(skip_test) +cell_names = [name for name in cell_names if not name.startswith("_")] +dirpath = ( + pathlib.Path(__file__).absolute().with_suffix(".gds").parent / "gds_ref_sin300" +) +dirpath.mkdir(exist_ok=True, parents=True) + + +@pytest.fixture(params=cell_names, scope="function") +def component_name(request) -> str: + return request.param + + +def test_gds(component_name: str) -> None: + """Avoid regressions in GDS geometry shapes and layers.""" + component = cells[component_name]() + difftest(component, test_name=component_name, dirpath=dirpath) + + +def test_settings(component_name: str, data_regression: DataRegressionFixture) -> None: + """Avoid regressions when exporting settings.""" + component = cells[component_name]() + data_regression.check(component.to_dict()) + + +def test_assert_ports_on_grid(component_name: str) -> None: + component = cells[component_name]() + component.assert_ports_on_grid() From 71d35ad276a38a36b6dffa0f79325c9ce94a2c9a Mon Sep 17 00:00:00 2001 From: Joaquin Matres <4514346+joamatab@users.noreply.github.com> Date: Fri, 3 May 2024 20:21:46 -0700 Subject: [PATCH 6/6] fix tests --- cspdk/__init__.py | 1 + cspdk/si220/__init__.py | 1 - cspdk/si220/samples/circuit_simulations_sc.py | 5 +- cspdk/sin300/__init__.py | 1 - cspdk/sin300/cells.py | 2 - tests/gds_ref_si220/array.gds | Bin 0 -> 272 bytes tests/gds_ref_si220/bend_rc.gds | Bin 0 -> 5394 bytes tests/gds_ref_si220/bend_ro.gds | Bin 0 -> 5394 bytes tests/gds_ref_si220/bend_s.gds | Bin 0 -> 1822 bytes tests/gds_ref_si220/bend_s.oas | Bin 0 -> 2100 bytes tests/gds_ref_si220/bend_sc.gds | Bin 0 -> 2082 bytes tests/gds_ref_si220/bend_so.gds | Bin 0 -> 2082 bytes tests/gds_ref_si220/coupler_rc.gds | Bin 0 -> 7412 bytes tests/gds_ref_si220/coupler_ro.gds | Bin 0 -> 7412 bytes tests/gds_ref_si220/coupler_sc.gds | Bin 0 -> 6708 bytes tests/gds_ref_si220/coupler_so.gds | Bin 0 -> 6708 bytes tests/gds_ref_si220/crossing_rc.gds | Bin 0 -> 1078 bytes tests/gds_ref_si220/crossing_sc.gds | Bin 0 -> 822 bytes tests/gds_ref_si220/crossing_so.gds | Bin 0 -> 694 bytes tests/gds_ref_si220/die_rc.gds | Bin 0 -> 24498 bytes tests/gds_ref_si220/die_ro.gds | Bin 0 -> 25778 bytes tests/gds_ref_si220/die_sc.gds | Bin 0 -> 14194 bytes tests/gds_ref_si220/die_sc.oas | Bin 0 -> 21544 bytes tests/gds_ref_si220/die_so.gds | Bin 0 -> 15474 bytes tests/gds_ref_si220/gc_elliptical_sc.gds | Bin 0 -> 21530 bytes tests/gds_ref_si220/gc_elliptical_so.gds | Bin 0 -> 21530 bytes tests/gds_ref_si220/gc_rectangular_rc.gds | Bin 0 -> 4220 bytes tests/gds_ref_si220/gc_rectangular_ro.gds | Bin 0 -> 5500 bytes tests/gds_ref_si220/gc_rectangular_sc.gds | Bin 0 -> 4092 bytes tests/gds_ref_si220/gc_rectangular_so.gds | Bin 0 -> 5372 bytes tests/gds_ref_si220/grating_coupler_array.gds | Bin 0 -> 4402 bytes tests/gds_ref_si220/grating_coupler_array.oas | Bin 0 -> 2760 bytes tests/gds_ref_si220/heater.gds | Bin 0 -> 690 bytes tests/gds_ref_si220/mmi1x2_rc.gds | Bin 0 -> 628 bytes tests/gds_ref_si220/mmi1x2_ro.gds | Bin 0 -> 628 bytes tests/gds_ref_si220/mmi1x2_sc.gds | Bin 0 -> 372 bytes tests/gds_ref_si220/mmi1x2_so.gds | Bin 0 -> 372 bytes tests/gds_ref_si220/mmi2x2_rc.gds | Bin 0 -> 756 bytes tests/gds_ref_si220/mmi2x2_ro.gds | Bin 0 -> 756 bytes tests/gds_ref_si220/mmi2x2_sc.gds | Bin 0 -> 436 bytes tests/gds_ref_si220/mmi2x2_so.gds | Bin 0 -> 436 bytes tests/gds_ref_si220/mzi_rc.gds | Bin 0 -> 13490 bytes tests/gds_ref_si220/mzi_ro.gds | Bin 0 -> 13490 bytes tests/gds_ref_si220/mzi_sc.gds | Bin 0 -> 6226 bytes tests/gds_ref_si220/mzi_so.gds | Bin 0 -> 6226 bytes tests/gds_ref_si220/pad.gds | Bin 0 -> 174 bytes tests/gds_ref_si220/rectangle.gds | Bin 0 -> 272 bytes tests/gds_ref_si220/straight_rc.gds | Bin 0 -> 246 bytes tests/gds_ref_si220/straight_ro.gds | Bin 0 -> 246 bytes tests/gds_ref_si220/straight_sc.gds | Bin 0 -> 182 bytes tests/gds_ref_si220/straight_sc.oas | Bin 0 -> 460 bytes tests/gds_ref_si220/straight_so.gds | Bin 0 -> 182 bytes tests/gds_ref_si220/taper_rc.gds | Bin 0 -> 242 bytes tests/gds_ref_si220/taper_ro.gds | Bin 0 -> 242 bytes tests/gds_ref_si220/taper_sc.gds | Bin 0 -> 178 bytes tests/gds_ref_si220/taper_sc.oas | Bin 0 -> 456 bytes tests/gds_ref_si220/taper_so.gds | Bin 0 -> 178 bytes tests/gds_ref_si220/trans_sc_rc10.gds | Bin 0 -> 248 bytes tests/gds_ref_si220/trans_sc_rc10.oas | Bin 0 -> 526 bytes tests/gds_ref_si220/trans_sc_rc20.gds | Bin 0 -> 248 bytes tests/gds_ref_si220/trans_sc_rc20.oas | Bin 0 -> 526 bytes tests/gds_ref_si220/trans_sc_rc50.gds | Bin 0 -> 248 bytes tests/gds_ref_si220/trans_sc_rc50.oas | Bin 0 -> 526 bytes tests/gds_ref_si220/wire_corner.gds | Bin 0 -> 184 bytes tests/gds_ref_sin300/array.gds | Bin 0 -> 272 bytes tests/gds_ref_sin300/bend_nc.gds | Bin 0 -> 5090 bytes tests/gds_ref_sin300/bend_no.gds | Bin 0 -> 5090 bytes tests/gds_ref_sin300/bend_s.gds | Bin 0 -> 1820 bytes tests/gds_ref_sin300/coupler_nc.gds | Bin 0 -> 6708 bytes tests/gds_ref_sin300/coupler_no.gds | Bin 0 -> 6708 bytes tests/gds_ref_sin300/die_nc.gds | Bin 0 -> 21266 bytes tests/gds_ref_sin300/die_no.gds | Bin 0 -> 21266 bytes tests/gds_ref_sin300/gc_elliptical_nc.gds | Bin 0 -> 21530 bytes tests/gds_ref_sin300/gc_elliptical_no.gds | Bin 0 -> 21530 bytes tests/gds_ref_sin300/gc_rectangular_nc.gds | Bin 0 -> 2172 bytes tests/gds_ref_sin300/gc_rectangular_no.gds | Bin 0 -> 2172 bytes .../gds_ref_sin300/grating_coupler_array.gds | Bin 0 -> 2482 bytes tests/gds_ref_sin300/mmi1x2_nc.gds | Bin 0 -> 372 bytes tests/gds_ref_sin300/mmi1x2_no.gds | Bin 0 -> 372 bytes tests/gds_ref_sin300/mmi2x2_nc.gds | Bin 0 -> 436 bytes tests/gds_ref_sin300/mmi2x2_no.gds | Bin 0 -> 436 bytes tests/gds_ref_sin300/mzi_nc.gds | Bin 0 -> 12242 bytes tests/gds_ref_sin300/mzi_no.gds | Bin 0 -> 12242 bytes tests/gds_ref_sin300/pad.gds | Bin 0 -> 174 bytes tests/gds_ref_sin300/rectangle.gds | Bin 0 -> 272 bytes tests/gds_ref_sin300/straight_nc.gds | Bin 0 -> 182 bytes tests/gds_ref_sin300/straight_no.gds | Bin 0 -> 182 bytes tests/gds_ref_sin300/taper_nc.gds | Bin 0 -> 178 bytes tests/gds_ref_sin300/taper_no.gds | Bin 0 -> 178 bytes tests/gds_ref_sin300/wire_corner.gds | Bin 0 -> 184 bytes tests/test_netlists_si220.py | 6 + .../test_netlists_array_.yml | 197 ++ .../test_netlists_bend_rc_.yml | 5 + .../test_netlists_bend_ro_.yml | 5 + .../test_netlists_bend_s_.yml | 35 + .../test_netlists_bend_sc_.yml | 5 + .../test_netlists_bend_so_.yml | 5 + .../test_netlists_coupler_rc_.yml | 5 + .../test_netlists_coupler_ro_.yml | 5 + .../test_netlists_coupler_sc_.yml | 5 + .../test_netlists_coupler_so_.yml | 5 + .../test_netlists_crossing_rc_.yml | 5 + .../test_netlists_crossing_sc_.yml | 5 + .../test_netlists_crossing_so_.yml | 5 + .../test_netlists_die_rc_.yml | 2597 +++++++++++++++++ .../test_netlists_die_ro_.yml | 2597 +++++++++++++++++ .../test_netlists_die_sc_.yml | 2597 +++++++++++++++++ .../test_netlists_die_so_.yml | 2597 +++++++++++++++++ .../test_netlists_gc_elliptical_sc_.yml | 5 + .../test_netlists_gc_elliptical_so_.yml | 5 + .../test_netlists_gc_rectangular_rc_.yml | 5 + .../test_netlists_gc_rectangular_ro_.yml | 5 + .../test_netlists_gc_rectangular_sc_.yml | 5 + .../test_netlists_gc_rectangular_so_.yml | 5 + .../test_netlists_grating_coupler_array_.yml | 107 + .../test_netlists_heater_.yml | 5 + .../test_netlists_mmi1x2_rc_.yml | 5 + .../test_netlists_mmi1x2_ro_.yml | 5 + .../test_netlists_mmi1x2_sc_.yml | 5 + .../test_netlists_mmi1x2_so_.yml | 5 + .../test_netlists_mmi2x2_rc_.yml | 5 + .../test_netlists_mmi2x2_ro_.yml | 5 + .../test_netlists_mmi2x2_sc_.yml | 5 + .../test_netlists_mmi2x2_so_.yml | 5 + .../test_netlists_mzi_rc_.yml | 771 +++++ .../test_netlists_mzi_ro_.yml | 771 +++++ .../test_netlists_mzi_sc_.yml | 621 ++++ .../test_netlists_mzi_so_.yml | 621 ++++ .../test_netlists_pad_.yml | 5 + .../test_netlists_rectangle_.yml | 31 + .../test_netlists_straight_rc_.yml | 5 + .../test_netlists_straight_ro_.yml | 5 + .../test_netlists_straight_sc_.yml | 5 + .../test_netlists_straight_so_.yml | 5 + .../test_netlists_taper_rc_.yml | 5 + .../test_netlists_taper_ro_.yml | 5 + .../test_netlists_taper_sc_.yml | 5 + .../test_netlists_taper_so_.yml | 5 + .../test_netlists_trans_sc_rc10_.yml | 5 + .../test_netlists_trans_sc_rc20_.yml | 5 + .../test_netlists_trans_sc_rc50_.yml | 5 + .../test_netlists_wire_corner_.yml | 6 + tests/test_netlists_sin300.py | 6 + .../test_netlists_array_.yml | 197 ++ .../test_netlists_bend_nc_.yml | 5 + .../test_netlists_bend_no_.yml | 5 + .../test_netlists_bend_s_.yml | 35 + .../test_netlists_coupler_nc_.yml | 5 + .../test_netlists_coupler_no_.yml | 5 + .../test_netlists_die_nc_.yml | 2597 +++++++++++++++++ .../test_netlists_die_no_.yml | 2597 +++++++++++++++++ .../test_netlists_gc_elliptical_nc_.yml | 5 + .../test_netlists_gc_elliptical_no_.yml | 5 + .../test_netlists_gc_rectangular_nc_.yml | 5 + .../test_netlists_gc_rectangular_no_.yml | 5 + .../test_netlists_grating_coupler_array_.yml | 107 + .../test_netlists_mmi1x2_nc_.yml | 5 + .../test_netlists_mmi1x2_no_.yml | 5 + .../test_netlists_mmi2x2_nc_.yml | 5 + .../test_netlists_mmi2x2_no_.yml | 5 + .../test_netlists_mzi_nc_.yml | 621 ++++ .../test_netlists_mzi_no_.yml | 621 ++++ .../test_netlists_pad_.yml | 5 + .../test_netlists_rectangle_.yml | 31 + .../test_netlists_straight_nc_.yml | 5 + .../test_netlists_straight_no_.yml | 5 + .../test_netlists_taper_nc_.yml | 5 + .../test_netlists_taper_no_.yml | 5 + .../test_netlists_wire_corner_.yml | 6 + tests/test_pdk_si220.py | 6 + tests/test_pdk_si220/test_settings_array_.yml | 22 + .../test_pdk_si220/test_settings_bend_rc_.yml | 17 + .../test_pdk_si220/test_settings_bend_ro_.yml | 17 + .../test_pdk_si220/test_settings_bend_s_.yml | 13 + .../test_pdk_si220/test_settings_bend_sc_.yml | 17 + .../test_pdk_si220/test_settings_bend_so_.yml | 17 + .../test_settings_coupler_rc_.yml | 11 + .../test_settings_coupler_ro_.yml | 11 + .../test_settings_coupler_sc_.yml | 11 + .../test_settings_coupler_so_.yml | 11 + .../test_settings_crossing_rc_.yml | 5 + .../test_settings_crossing_sc_.yml | 5 + .../test_settings_crossing_so_.yml | 5 + .../test_pdk_si220/test_settings_die_rc_.yml | 5 + .../test_pdk_si220/test_settings_die_ro_.yml | 5 + .../test_pdk_si220/test_settings_die_sc_.yml | 5 + .../test_pdk_si220/test_settings_die_so_.yml | 5 + .../test_settings_gc_elliptical_sc_.yml | 11 + .../test_settings_gc_elliptical_so_.yml | 11 + .../test_settings_gc_rectangular_rc_.yml | 8 + .../test_settings_gc_rectangular_ro_.yml | 8 + .../test_settings_gc_rectangular_sc_.yml | 8 + .../test_settings_gc_rectangular_so_.yml | 8 + .../test_settings_grating_coupler_array_.yml | 16 + .../test_pdk_si220/test_settings_heater_.yml | 5 + .../test_settings_mmi1x2_rc_.yml | 5 + .../test_settings_mmi1x2_ro_.yml | 5 + .../test_settings_mmi1x2_sc_.yml | 5 + .../test_settings_mmi1x2_so_.yml | 5 + .../test_settings_mmi2x2_rc_.yml | 5 + .../test_settings_mmi2x2_ro_.yml | 5 + .../test_settings_mmi2x2_sc_.yml | 5 + .../test_settings_mmi2x2_so_.yml | 5 + .../test_pdk_si220/test_settings_mzi_rc_.yml | 9 + .../test_pdk_si220/test_settings_mzi_ro_.yml | 9 + .../test_pdk_si220/test_settings_mzi_sc_.yml | 9 + .../test_pdk_si220/test_settings_mzi_so_.yml | 9 + tests/test_pdk_si220/test_settings_pad_.yml | 23 + .../test_settings_rectangle_.yml | 21 + .../test_settings_straight_rc_.yml | 12 + .../test_settings_straight_ro_.yml | 12 + .../test_settings_straight_sc_.yml | 12 + .../test_settings_straight_so_.yml | 12 + .../test_settings_taper_rc_.yml | 12 + .../test_settings_taper_ro_.yml | 12 + .../test_settings_taper_sc_.yml | 12 + .../test_settings_taper_so_.yml | 12 + .../test_settings_trans_sc_rc10_.yml | 11 + .../test_settings_trans_sc_rc20_.yml | 11 + .../test_settings_trans_sc_rc50_.yml | 11 + .../test_settings_wire_corner_.yml | 8 + tests/test_pdk_sin300.py | 8 +- .../test_pdk_sin300/test_settings_array_.yml | 22 + .../test_settings_bend_nc_.yml | 17 + .../test_settings_bend_no_.yml | 17 + .../test_pdk_sin300/test_settings_bend_s_.yml | 13 + .../test_settings_coupler_nc_.yml | 11 + .../test_settings_coupler_no_.yml | 11 + .../test_pdk_sin300/test_settings_die_nc_.yml | 5 + .../test_pdk_sin300/test_settings_die_no_.yml | 5 + .../test_settings_gc_elliptical_nc_.yml | 13 + .../test_settings_gc_elliptical_no_.yml | 13 + .../test_settings_gc_rectangular_nc_.yml | 8 + .../test_settings_gc_rectangular_no_.yml | 8 + .../test_settings_grating_coupler_array_.yml | 16 + .../test_settings_mmi1x2_nc_.yml | 5 + .../test_settings_mmi1x2_no_.yml | 5 + .../test_settings_mmi2x2_nc_.yml | 5 + .../test_settings_mmi2x2_no_.yml | 5 + .../test_pdk_sin300/test_settings_mzi_nc_.yml | 9 + .../test_pdk_sin300/test_settings_mzi_no_.yml | 9 + tests/test_pdk_sin300/test_settings_pad_.yml | 23 + .../test_settings_rectangle_.yml | 21 + .../test_settings_straight_nc_.yml | 12 + .../test_settings_straight_no_.yml | 12 + .../test_settings_taper_nc_.yml | 12 + .../test_settings_taper_no_.yml | 12 + .../test_settings_wire_corner_.yml | 8 + 248 files changed, 21473 insertions(+), 9 deletions(-) create mode 100644 tests/gds_ref_si220/array.gds create mode 100644 tests/gds_ref_si220/bend_rc.gds create mode 100644 tests/gds_ref_si220/bend_ro.gds create mode 100644 tests/gds_ref_si220/bend_s.gds create mode 100644 tests/gds_ref_si220/bend_s.oas create mode 100644 tests/gds_ref_si220/bend_sc.gds create mode 100644 tests/gds_ref_si220/bend_so.gds create mode 100644 tests/gds_ref_si220/coupler_rc.gds create mode 100644 tests/gds_ref_si220/coupler_ro.gds create mode 100644 tests/gds_ref_si220/coupler_sc.gds create mode 100644 tests/gds_ref_si220/coupler_so.gds create mode 100644 tests/gds_ref_si220/crossing_rc.gds create mode 100644 tests/gds_ref_si220/crossing_sc.gds create mode 100644 tests/gds_ref_si220/crossing_so.gds create mode 100644 tests/gds_ref_si220/die_rc.gds create mode 100644 tests/gds_ref_si220/die_ro.gds create mode 100644 tests/gds_ref_si220/die_sc.gds create mode 100644 tests/gds_ref_si220/die_sc.oas create mode 100644 tests/gds_ref_si220/die_so.gds create mode 100644 tests/gds_ref_si220/gc_elliptical_sc.gds create mode 100644 tests/gds_ref_si220/gc_elliptical_so.gds create mode 100644 tests/gds_ref_si220/gc_rectangular_rc.gds create mode 100644 tests/gds_ref_si220/gc_rectangular_ro.gds create mode 100644 tests/gds_ref_si220/gc_rectangular_sc.gds create mode 100644 tests/gds_ref_si220/gc_rectangular_so.gds create mode 100644 tests/gds_ref_si220/grating_coupler_array.gds create mode 100644 tests/gds_ref_si220/grating_coupler_array.oas create mode 100644 tests/gds_ref_si220/heater.gds create mode 100644 tests/gds_ref_si220/mmi1x2_rc.gds create mode 100644 tests/gds_ref_si220/mmi1x2_ro.gds create mode 100644 tests/gds_ref_si220/mmi1x2_sc.gds create mode 100644 tests/gds_ref_si220/mmi1x2_so.gds create mode 100644 tests/gds_ref_si220/mmi2x2_rc.gds create mode 100644 tests/gds_ref_si220/mmi2x2_ro.gds create mode 100644 tests/gds_ref_si220/mmi2x2_sc.gds create mode 100644 tests/gds_ref_si220/mmi2x2_so.gds create mode 100644 tests/gds_ref_si220/mzi_rc.gds create mode 100644 tests/gds_ref_si220/mzi_ro.gds create mode 100644 tests/gds_ref_si220/mzi_sc.gds create mode 100644 tests/gds_ref_si220/mzi_so.gds create mode 100644 tests/gds_ref_si220/pad.gds create mode 100644 tests/gds_ref_si220/rectangle.gds create mode 100644 tests/gds_ref_si220/straight_rc.gds create mode 100644 tests/gds_ref_si220/straight_ro.gds create mode 100644 tests/gds_ref_si220/straight_sc.gds create mode 100644 tests/gds_ref_si220/straight_sc.oas create mode 100644 tests/gds_ref_si220/straight_so.gds create mode 100644 tests/gds_ref_si220/taper_rc.gds create mode 100644 tests/gds_ref_si220/taper_ro.gds create mode 100644 tests/gds_ref_si220/taper_sc.gds create mode 100644 tests/gds_ref_si220/taper_sc.oas create mode 100644 tests/gds_ref_si220/taper_so.gds create mode 100644 tests/gds_ref_si220/trans_sc_rc10.gds create mode 100644 tests/gds_ref_si220/trans_sc_rc10.oas create mode 100644 tests/gds_ref_si220/trans_sc_rc20.gds create mode 100644 tests/gds_ref_si220/trans_sc_rc20.oas create mode 100644 tests/gds_ref_si220/trans_sc_rc50.gds create mode 100644 tests/gds_ref_si220/trans_sc_rc50.oas create mode 100644 tests/gds_ref_si220/wire_corner.gds create mode 100644 tests/gds_ref_sin300/array.gds create mode 100644 tests/gds_ref_sin300/bend_nc.gds create mode 100644 tests/gds_ref_sin300/bend_no.gds create mode 100644 tests/gds_ref_sin300/bend_s.gds create mode 100644 tests/gds_ref_sin300/coupler_nc.gds create mode 100644 tests/gds_ref_sin300/coupler_no.gds create mode 100644 tests/gds_ref_sin300/die_nc.gds create mode 100644 tests/gds_ref_sin300/die_no.gds create mode 100644 tests/gds_ref_sin300/gc_elliptical_nc.gds create mode 100644 tests/gds_ref_sin300/gc_elliptical_no.gds create mode 100644 tests/gds_ref_sin300/gc_rectangular_nc.gds create mode 100644 tests/gds_ref_sin300/gc_rectangular_no.gds create mode 100644 tests/gds_ref_sin300/grating_coupler_array.gds create mode 100644 tests/gds_ref_sin300/mmi1x2_nc.gds create mode 100644 tests/gds_ref_sin300/mmi1x2_no.gds create mode 100644 tests/gds_ref_sin300/mmi2x2_nc.gds create mode 100644 tests/gds_ref_sin300/mmi2x2_no.gds create mode 100644 tests/gds_ref_sin300/mzi_nc.gds create mode 100644 tests/gds_ref_sin300/mzi_no.gds create mode 100644 tests/gds_ref_sin300/pad.gds create mode 100644 tests/gds_ref_sin300/rectangle.gds create mode 100644 tests/gds_ref_sin300/straight_nc.gds create mode 100644 tests/gds_ref_sin300/straight_no.gds create mode 100644 tests/gds_ref_sin300/taper_nc.gds create mode 100644 tests/gds_ref_sin300/taper_no.gds create mode 100644 tests/gds_ref_sin300/wire_corner.gds create mode 100644 tests/test_netlists_si220/test_netlists_array_.yml create mode 100644 tests/test_netlists_si220/test_netlists_bend_rc_.yml create mode 100644 tests/test_netlists_si220/test_netlists_bend_ro_.yml create mode 100644 tests/test_netlists_si220/test_netlists_bend_s_.yml create mode 100644 tests/test_netlists_si220/test_netlists_bend_sc_.yml create mode 100644 tests/test_netlists_si220/test_netlists_bend_so_.yml create mode 100644 tests/test_netlists_si220/test_netlists_coupler_rc_.yml create mode 100644 tests/test_netlists_si220/test_netlists_coupler_ro_.yml create mode 100644 tests/test_netlists_si220/test_netlists_coupler_sc_.yml create mode 100644 tests/test_netlists_si220/test_netlists_coupler_so_.yml create mode 100644 tests/test_netlists_si220/test_netlists_crossing_rc_.yml create mode 100644 tests/test_netlists_si220/test_netlists_crossing_sc_.yml create mode 100644 tests/test_netlists_si220/test_netlists_crossing_so_.yml create mode 100644 tests/test_netlists_si220/test_netlists_die_rc_.yml create mode 100644 tests/test_netlists_si220/test_netlists_die_ro_.yml create mode 100644 tests/test_netlists_si220/test_netlists_die_sc_.yml create mode 100644 tests/test_netlists_si220/test_netlists_die_so_.yml create mode 100644 tests/test_netlists_si220/test_netlists_gc_elliptical_sc_.yml create mode 100644 tests/test_netlists_si220/test_netlists_gc_elliptical_so_.yml create mode 100644 tests/test_netlists_si220/test_netlists_gc_rectangular_rc_.yml create mode 100644 tests/test_netlists_si220/test_netlists_gc_rectangular_ro_.yml create mode 100644 tests/test_netlists_si220/test_netlists_gc_rectangular_sc_.yml create mode 100644 tests/test_netlists_si220/test_netlists_gc_rectangular_so_.yml create mode 100644 tests/test_netlists_si220/test_netlists_grating_coupler_array_.yml create mode 100644 tests/test_netlists_si220/test_netlists_heater_.yml create mode 100644 tests/test_netlists_si220/test_netlists_mmi1x2_rc_.yml create mode 100644 tests/test_netlists_si220/test_netlists_mmi1x2_ro_.yml create mode 100644 tests/test_netlists_si220/test_netlists_mmi1x2_sc_.yml create mode 100644 tests/test_netlists_si220/test_netlists_mmi1x2_so_.yml create mode 100644 tests/test_netlists_si220/test_netlists_mmi2x2_rc_.yml create mode 100644 tests/test_netlists_si220/test_netlists_mmi2x2_ro_.yml create mode 100644 tests/test_netlists_si220/test_netlists_mmi2x2_sc_.yml create mode 100644 tests/test_netlists_si220/test_netlists_mmi2x2_so_.yml create mode 100644 tests/test_netlists_si220/test_netlists_mzi_rc_.yml create mode 100644 tests/test_netlists_si220/test_netlists_mzi_ro_.yml create mode 100644 tests/test_netlists_si220/test_netlists_mzi_sc_.yml create mode 100644 tests/test_netlists_si220/test_netlists_mzi_so_.yml create mode 100644 tests/test_netlists_si220/test_netlists_pad_.yml create mode 100644 tests/test_netlists_si220/test_netlists_rectangle_.yml create mode 100644 tests/test_netlists_si220/test_netlists_straight_rc_.yml create mode 100644 tests/test_netlists_si220/test_netlists_straight_ro_.yml create mode 100644 tests/test_netlists_si220/test_netlists_straight_sc_.yml create mode 100644 tests/test_netlists_si220/test_netlists_straight_so_.yml create mode 100644 tests/test_netlists_si220/test_netlists_taper_rc_.yml create mode 100644 tests/test_netlists_si220/test_netlists_taper_ro_.yml create mode 100644 tests/test_netlists_si220/test_netlists_taper_sc_.yml create mode 100644 tests/test_netlists_si220/test_netlists_taper_so_.yml create mode 100644 tests/test_netlists_si220/test_netlists_trans_sc_rc10_.yml create mode 100644 tests/test_netlists_si220/test_netlists_trans_sc_rc20_.yml create mode 100644 tests/test_netlists_si220/test_netlists_trans_sc_rc50_.yml create mode 100644 tests/test_netlists_si220/test_netlists_wire_corner_.yml create mode 100644 tests/test_netlists_sin300/test_netlists_array_.yml create mode 100644 tests/test_netlists_sin300/test_netlists_bend_nc_.yml create mode 100644 tests/test_netlists_sin300/test_netlists_bend_no_.yml create mode 100644 tests/test_netlists_sin300/test_netlists_bend_s_.yml create mode 100644 tests/test_netlists_sin300/test_netlists_coupler_nc_.yml create mode 100644 tests/test_netlists_sin300/test_netlists_coupler_no_.yml create mode 100644 tests/test_netlists_sin300/test_netlists_die_nc_.yml create mode 100644 tests/test_netlists_sin300/test_netlists_die_no_.yml create mode 100644 tests/test_netlists_sin300/test_netlists_gc_elliptical_nc_.yml create mode 100644 tests/test_netlists_sin300/test_netlists_gc_elliptical_no_.yml create mode 100644 tests/test_netlists_sin300/test_netlists_gc_rectangular_nc_.yml create mode 100644 tests/test_netlists_sin300/test_netlists_gc_rectangular_no_.yml create mode 100644 tests/test_netlists_sin300/test_netlists_grating_coupler_array_.yml create mode 100644 tests/test_netlists_sin300/test_netlists_mmi1x2_nc_.yml create mode 100644 tests/test_netlists_sin300/test_netlists_mmi1x2_no_.yml create mode 100644 tests/test_netlists_sin300/test_netlists_mmi2x2_nc_.yml create mode 100644 tests/test_netlists_sin300/test_netlists_mmi2x2_no_.yml create mode 100644 tests/test_netlists_sin300/test_netlists_mzi_nc_.yml create mode 100644 tests/test_netlists_sin300/test_netlists_mzi_no_.yml create mode 100644 tests/test_netlists_sin300/test_netlists_pad_.yml create mode 100644 tests/test_netlists_sin300/test_netlists_rectangle_.yml create mode 100644 tests/test_netlists_sin300/test_netlists_straight_nc_.yml create mode 100644 tests/test_netlists_sin300/test_netlists_straight_no_.yml create mode 100644 tests/test_netlists_sin300/test_netlists_taper_nc_.yml create mode 100644 tests/test_netlists_sin300/test_netlists_taper_no_.yml create mode 100644 tests/test_netlists_sin300/test_netlists_wire_corner_.yml create mode 100644 tests/test_pdk_si220/test_settings_array_.yml create mode 100644 tests/test_pdk_si220/test_settings_bend_rc_.yml create mode 100644 tests/test_pdk_si220/test_settings_bend_ro_.yml create mode 100644 tests/test_pdk_si220/test_settings_bend_s_.yml create mode 100644 tests/test_pdk_si220/test_settings_bend_sc_.yml create mode 100644 tests/test_pdk_si220/test_settings_bend_so_.yml create mode 100644 tests/test_pdk_si220/test_settings_coupler_rc_.yml create mode 100644 tests/test_pdk_si220/test_settings_coupler_ro_.yml create mode 100644 tests/test_pdk_si220/test_settings_coupler_sc_.yml create mode 100644 tests/test_pdk_si220/test_settings_coupler_so_.yml create mode 100644 tests/test_pdk_si220/test_settings_crossing_rc_.yml create mode 100644 tests/test_pdk_si220/test_settings_crossing_sc_.yml create mode 100644 tests/test_pdk_si220/test_settings_crossing_so_.yml create mode 100644 tests/test_pdk_si220/test_settings_die_rc_.yml create mode 100644 tests/test_pdk_si220/test_settings_die_ro_.yml create mode 100644 tests/test_pdk_si220/test_settings_die_sc_.yml create mode 100644 tests/test_pdk_si220/test_settings_die_so_.yml create mode 100644 tests/test_pdk_si220/test_settings_gc_elliptical_sc_.yml create mode 100644 tests/test_pdk_si220/test_settings_gc_elliptical_so_.yml create mode 100644 tests/test_pdk_si220/test_settings_gc_rectangular_rc_.yml create mode 100644 tests/test_pdk_si220/test_settings_gc_rectangular_ro_.yml create mode 100644 tests/test_pdk_si220/test_settings_gc_rectangular_sc_.yml create mode 100644 tests/test_pdk_si220/test_settings_gc_rectangular_so_.yml create mode 100644 tests/test_pdk_si220/test_settings_grating_coupler_array_.yml create mode 100644 tests/test_pdk_si220/test_settings_heater_.yml create mode 100644 tests/test_pdk_si220/test_settings_mmi1x2_rc_.yml create mode 100644 tests/test_pdk_si220/test_settings_mmi1x2_ro_.yml create mode 100644 tests/test_pdk_si220/test_settings_mmi1x2_sc_.yml create mode 100644 tests/test_pdk_si220/test_settings_mmi1x2_so_.yml create mode 100644 tests/test_pdk_si220/test_settings_mmi2x2_rc_.yml create mode 100644 tests/test_pdk_si220/test_settings_mmi2x2_ro_.yml create mode 100644 tests/test_pdk_si220/test_settings_mmi2x2_sc_.yml create mode 100644 tests/test_pdk_si220/test_settings_mmi2x2_so_.yml create mode 100644 tests/test_pdk_si220/test_settings_mzi_rc_.yml create mode 100644 tests/test_pdk_si220/test_settings_mzi_ro_.yml create mode 100644 tests/test_pdk_si220/test_settings_mzi_sc_.yml create mode 100644 tests/test_pdk_si220/test_settings_mzi_so_.yml create mode 100644 tests/test_pdk_si220/test_settings_pad_.yml create mode 100644 tests/test_pdk_si220/test_settings_rectangle_.yml create mode 100644 tests/test_pdk_si220/test_settings_straight_rc_.yml create mode 100644 tests/test_pdk_si220/test_settings_straight_ro_.yml create mode 100644 tests/test_pdk_si220/test_settings_straight_sc_.yml create mode 100644 tests/test_pdk_si220/test_settings_straight_so_.yml create mode 100644 tests/test_pdk_si220/test_settings_taper_rc_.yml create mode 100644 tests/test_pdk_si220/test_settings_taper_ro_.yml create mode 100644 tests/test_pdk_si220/test_settings_taper_sc_.yml create mode 100644 tests/test_pdk_si220/test_settings_taper_so_.yml create mode 100644 tests/test_pdk_si220/test_settings_trans_sc_rc10_.yml create mode 100644 tests/test_pdk_si220/test_settings_trans_sc_rc20_.yml create mode 100644 tests/test_pdk_si220/test_settings_trans_sc_rc50_.yml create mode 100644 tests/test_pdk_si220/test_settings_wire_corner_.yml create mode 100644 tests/test_pdk_sin300/test_settings_array_.yml create mode 100644 tests/test_pdk_sin300/test_settings_bend_nc_.yml create mode 100644 tests/test_pdk_sin300/test_settings_bend_no_.yml create mode 100644 tests/test_pdk_sin300/test_settings_bend_s_.yml create mode 100644 tests/test_pdk_sin300/test_settings_coupler_nc_.yml create mode 100644 tests/test_pdk_sin300/test_settings_coupler_no_.yml create mode 100644 tests/test_pdk_sin300/test_settings_die_nc_.yml create mode 100644 tests/test_pdk_sin300/test_settings_die_no_.yml create mode 100644 tests/test_pdk_sin300/test_settings_gc_elliptical_nc_.yml create mode 100644 tests/test_pdk_sin300/test_settings_gc_elliptical_no_.yml create mode 100644 tests/test_pdk_sin300/test_settings_gc_rectangular_nc_.yml create mode 100644 tests/test_pdk_sin300/test_settings_gc_rectangular_no_.yml create mode 100644 tests/test_pdk_sin300/test_settings_grating_coupler_array_.yml create mode 100644 tests/test_pdk_sin300/test_settings_mmi1x2_nc_.yml create mode 100644 tests/test_pdk_sin300/test_settings_mmi1x2_no_.yml create mode 100644 tests/test_pdk_sin300/test_settings_mmi2x2_nc_.yml create mode 100644 tests/test_pdk_sin300/test_settings_mmi2x2_no_.yml create mode 100644 tests/test_pdk_sin300/test_settings_mzi_nc_.yml create mode 100644 tests/test_pdk_sin300/test_settings_mzi_no_.yml create mode 100644 tests/test_pdk_sin300/test_settings_pad_.yml create mode 100644 tests/test_pdk_sin300/test_settings_rectangle_.yml create mode 100644 tests/test_pdk_sin300/test_settings_straight_nc_.yml create mode 100644 tests/test_pdk_sin300/test_settings_straight_no_.yml create mode 100644 tests/test_pdk_sin300/test_settings_taper_nc_.yml create mode 100644 tests/test_pdk_sin300/test_settings_taper_no_.yml create mode 100644 tests/test_pdk_sin300/test_settings_wire_corner_.yml diff --git a/cspdk/__init__.py b/cspdk/__init__.py index e69de29..49e0fc1 100644 --- a/cspdk/__init__.py +++ b/cspdk/__init__.py @@ -0,0 +1 @@ +__version__ = "0.7.0" diff --git a/cspdk/si220/__init__.py b/cspdk/si220/__init__.py index ec51e8b..4e17f47 100644 --- a/cspdk/si220/__init__.py +++ b/cspdk/si220/__init__.py @@ -39,4 +39,3 @@ "config", "tech", ] -__version__ = "0.7.0" diff --git a/cspdk/si220/samples/circuit_simulations_sc.py b/cspdk/si220/samples/circuit_simulations_sc.py index 945e13f..4f32dbc 100644 --- a/cspdk/si220/samples/circuit_simulations_sc.py +++ b/cspdk/si220/samples/circuit_simulations_sc.py @@ -2,11 +2,10 @@ import matplotlib.pyplot as plt import sax -import cspdk -from cspdk.si220 import PDK +from cspdk.si220 import PDK, cells if __name__ == "__main__": - c = cspdk.cells.mzi_sc(delta_length=100) + c = cells.mzi_sc(delta_length=100) c.show() c.plot_netlist() netlist = c.get_netlist() diff --git a/cspdk/sin300/__init__.py b/cspdk/sin300/__init__.py index 8a39aac..17f7cfb 100644 --- a/cspdk/sin300/__init__.py +++ b/cspdk/sin300/__init__.py @@ -39,4 +39,3 @@ "config", "tech", ] -__version__ = "0.7.0" diff --git a/cspdk/sin300/cells.py b/cspdk/sin300/cells.py index 5da39e7..9b24d2a 100644 --- a/cspdk/sin300/cells.py +++ b/cspdk/sin300/cells.py @@ -655,8 +655,6 @@ def gc_elliptical_no( Returns: gf.Component: the component """ - if "cross_section" not in kwargs: - kwargs["cross_section"] = "xs_so" return _gc_elliptical( grating_line_width=grating_line_width, fiber_angle=fiber_angle, diff --git a/tests/gds_ref_si220/array.gds b/tests/gds_ref_si220/array.gds new file mode 100644 index 0000000000000000000000000000000000000000..fb52ed841793d69fa31e55ac38242f105ba1a210 GIT binary patch literal 272 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 VnRKQ1^Ys58<>Pd|^5iTh{uibyLLvYF literal 0 HcmV?d00001 diff --git a/tests/gds_ref_si220/bend_ro.gds b/tests/gds_ref_si220/bend_ro.gds new file mode 100644 index 0000000000000000000000000000000000000000..e4bba42ce5979bb76b2795b05072940632deff1b GIT binary patch literal 5394 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 PNeTaYHvjWnGYtI=kc(+C literal 0 HcmV?d00001 diff --git a/tests/gds_ref_si220/bend_sc.gds b/tests/gds_ref_si220/bend_sc.gds new file mode 100644 index 0000000000000000000000000000000000000000..9531fe819ceafaa134dd99a3b40978777e4fd1f1 GIT binary patch literal 2082 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 literal 0 HcmV?d00001 diff --git a/tests/gds_ref_si220/coupler_so.gds b/tests/gds_ref_si220/coupler_so.gds new file mode 100644 index 0000000000000000000000000000000000000000..839cdc0c237591bfae12519c5f50d080af501aec GIT binary patch literal 6708 zcmajkcaW9kxd8BYcTd^1AV%Yb3>utEOh!?O7{vy`Laa3D3vOX43rjDtOcWH&wZtA{ zO8^tG#geE*F+ntnnlTd8SSV7Z?Xt85wwyiR{k`rmbN`5QcV_e3oIU$|&-=X3_degj zkO_r_!$PNm!tADSSm+qCp-bree}4`~6lQ9wE2mdXzb=Ghi_$%N-+uNL%b(hP&c&~t zzTmMDgF>hDxBqRsOlI_ySyOAqOfQ=;C8UZ&$Q)T1ibAGcp&!q0UliKD-cOQboFCsy zlKe_8XHWh;Nm^gvGM>mck|g&VF6L2uF-cnP;L{X5EJ%{(|KUSCjCUnT(>=VI|Hau! z(zt*V*p(xbX3Zc5k%ydU`$o8PDa?B-yo%Ptw}* zzv3mFnI!f5SxUdlU&tZ+5wn!j&ezq>dv?}v4ZqK~lcerrs$1QybgeqqZQv4ofq-TB-vmM%^z?omoUXYCdv9=Qw`R4;r&Un?oYgp=ktan`RX0| zo3HF;^VlR=`%hlOz8st+Yd)l(*T}Qk_v&SI&DCeIr`A!c=JTiq&1(Op*v)4r$rron zJ<-NRUca4cu}YmA)nV12`J6b`+V}!jP~WW?&eynsZ^}bXjmx=>AIWn(zu*>bw2lhe z>vd|-*l3;o-6Ph%-nyE;qYiRta?K5LXgW>3j^zcsiC0k#o2+-!Ku)1+H_cUlHE(*5 z@qO~%ET5(~>{oBf_3QcEMEl&-WPgWRZ#%~Ns`b{xs4iP8DfU)zo2&JW_cYI8eEnfA z=1cmlm>+NiU2D7A#C_i0V&9L^pI5LeA7vlPyQNG&t98qDoX7jQlJ>ps1TN=9uBYp_ z$aAOK4?%ZXPnUQVCZiXxS#aQa>ivV?r8DK=9KOOjzO7eE8GG(SI!~I!%j-VO38)Yto7q`uiVfP3tBLkLA#KEh7y#WVEB7V3>X zce9-07X4g5ZRFjIuP@@c)C;?|QH^&!#9h237F6Hv=ZSoh=W+-KQQoOZ`u%nOk~Lhw z@6+DZeN1($yOs5H{j@x5>nL9Be4fXvDPC=cliiQvrN!GJUV0(LON+N%y!0oW$6Efx z6NA3qW}O-9-X`zNne4+WofGoT=;y6Z@Ot*=ea@8}_1c!FXx&@XF(c2fo9Qh0dLi}e z*O!KnwU3*3@+96%>)(6^uX4W0CtF7QlbyzPyxBSUEZy%LFXHc=m#g_Qr}Ay4_^&um zXdl;ip)+IMpXlCQcYX-P1f*cut%r>}f7M z!`|%3i{m`uC2@|hPn#v5#d#7!$-li%olDeV)t|XC&J%tV=Lz-Qn&EsW&J+GE&J((i z*6N#*7vwpff1v#+dDJ>8crU-?yf{yIZJZ}`4{wlX$tW&jU-decy?7H(=XP4}rhzp?xmC#r_WEWU6oRFn!>@jdj^t$&(r59;0vK z{^jWP>}D?Jhx)9T_HX+LKE~&0pSQQLT7O=_{(O{YQQq0(^|Lc7Tf}+#$^O=^qc)!f&8@$bZ zZJqIc+AZ(&5I#$Nv0L70{j*0OrQ6eam1?4MB(>4`aT%?9uR5mWx%U7U#(BcK;yj^! zZ1Aj}s$w~Be55L=X-W;66_x*q8LXrEt zv6S|)QGXXXPnvr1!8lKNyK}cIZ=}8{ni=N_YvMfN=r~U}GR_lPcWXBei1UP3#(Bca z;yj`IAelgCUHmG#xXprBzI~qb?d-glOJC1Uki(NgF|1W+70VSy)f)%{({?hPYA=Wq8bg4@00fk`4oP@Xc3jFD5uy2r>nBleh8yfTEb^3IIrjl7=!;(Z~E z({Gulc^$2LoH}Mc4PpFA+)npFCeJUN2llbLJN>TuUbpkXn(TyWTN+G z?cv1Pe1P^S`}+`T^lJ8HzQngfm?YP%TqfN~@0pb2ju0kK;Q?-TzFG5>kvxL>rueuJ zre4hx_%VMN!ZbB2K8^A$w(jZnxcD53RopX#8TPukcL+1pyjai8e3WvT)s21HED?L= zZ=BcvrfZg{!;HyXDb82?hy$qaroG2^=>9JGn>?0qG4)N!3-Wx8f1nzbxYp!1sb-UZ z#(CCh%_Y~;x=JRfhdfJ0@p|^9wU&rIaUoCV*|gpXaws{H1T?<_GchwVZmn zY8LHt)el&$Pvwy9&)aww<()lVU+bl;Tq_^fPu5!5k7`g^NOh}tm3~*@`WbmvbfS3W zE9kxDUdxDA?mPB(nRprT%KS~*&t=||7Ozaa^k3YsuW&xcP%hUTN9!IX@AMGPW>3mH zt$#-9qjY=Daep?kD>phnKBsk;s$*&~)hM;ld7~#%chMfEe2=ikRF(5-8LfYKB`=_S zQtrKB{wCFtt{Kmfp{txL2RVaVd3f7-GsKxu^uF^^4;L+QZoW(VICv2KZqNok$Qs`6 z{B7Wk)Hg*lozJcGyMbOS8twefaU|tfWZnIDQxEqa%PXDxU-B~gF6v`0SYwKo@txY_zkIGb~*7vnq$))nVTaLqVR!cWyv&f&)tJDjNAY98$CFwZ^IA00lm>$l3Y@=S_XIhVcpPl`ACdu&JXa^j5^FSpu#D_%~#D)Dm9&@)|5&8vJy z$?2If)|s>JG4jq`%2n*ewRB@h9;C-bB4Q z{tMd2>h2uEdujdE^*r4c%csRXHNpP0xHl&HEYsY~+1$>x)Vno46EuIom*{?((@ZYO`@soF|?IpNjK@>M&z6pNsQ^FT{C5eK+krz82>R-;~D^E~ma} z{3y;7ei7#hH^zCwx;RhRXr1ccl%jPtIlF7*+4Oy0&(nAWoktTF@+zK9>z(isr*J&y z(ldI~gZ3f5Pu|t?X?nwct>X&LKK3Dy~z8|AceMV~O%G=n7@@^^9*V}m=AE*7T>__`vSx9xO zc$Mqv`YrOT=%i1@D__A==`%}Cyz;ZCzstnSiB~3GPM?;EmlLl{yxhC)*Lc6I`#6)d(t^FbQN#q4E~yj(|I$*XOR3Wah}k9KKNbQ z$HDqL?>rf_f!pFd;l4Oen2+-$@$X%6p0ItKC+ryK2|LGmLhJ6oo2SHi!fuY@FWH@! z(S6W&G2It^JF`dIJo(T6-W9qY`tK*-d_HlFLmv8EbIAWZj}HC)q3awn#D8CF`})Rj OUjOFb+p7ebqMLA7Y%B1&l8!gdi7Wszi=sd@U2N2pD!-{qcr&*M8E96aw7k_BG)JtBxB zjDx8C_l&6L`g+f2&t->z%0Q^&XztMQmk(FlI-h0c9-KajWa$5YW6pJFFAWUzUc7K7 z+YJN@0axN709Wb(-lG^#2kJ$>e23eAS>)>#@`%XlI$ZTJk#ASY9+9;TGAr_9h#VAI z-?aF~FqskgwGCJGT4Za4d@8d27_Rab`3kNABEMVU%5RdLaAiAWmK}_c7vZAY zeF1?s_W6W7p?y=B+d2ou3F=%x_zpP;6ge^rL`KOTAX;eglAP)UltolGAeL7hfqhZ9 z__8rEZTE>qd*?3z`p=)YJpPR3^{1?k#O4^_d#AzH7Kdouf8qbJayi z&RL%)Id?;pqz;Ya7H=vwoth_2x0V=%ppGpu)3tfhbZ#m&-5bYk4-HYF^FHr4i9iU;Fy3&8j)-k(pov?T5l>JL@S)PouydASv qr(<@vuFJUHK3sas`bwv)&(;a+yLHUwXr%vjuD$to=MPhZApQXBphOJ- literal 0 HcmV?d00001 diff --git a/tests/gds_ref_si220/crossing_sc.gds b/tests/gds_ref_si220/crossing_sc.gds new file mode 100644 index 0000000000000000000000000000000000000000..7fe5b2c1e356f7c6af6f8915e32e2cd4abb5981b GIT binary patch literal 822 zcmZ{iKTMNR6vdBU%l8m33W`7zalk(8UP;p^?y7sHC(Q4JsCm zaWsO2O$T++K{pp&UEEwWCb~E{7=p&ZbG!~N4qtv>Uf#R+o^uakM9~mh*F@nH8qk7( z4z&OK4~ycl{BZGfu?%cX)D7fn>7#ERe(M{2(Y3sA@;F-S{{OZqjz@}xiHZF9`BM`k zK(Zc)8zUqTuaAJ}aZ>_e>KSa?ck(5yqePCvI#&=b^~1JLA(Vc=cC3{O3hSOBS71HEWHWgNp?H`4jBs%S`2nGD2bRhrj5m_U5XNqkXAv%} zBOf8;=VANaA&jnt?e9c5cav;$_I~v9-uHg*z;1t+9`ZWr1+SZa;(gMuy>F)7=g4gK zxiX7BXXXLPx%*~aM>grY`mdAJIS`Z7eQ=JX54n2xRWjV(;U@qpR1aJWtI?THj$kB@;#C|uC$QU zb@e_>I%l_#)O~G{qz^Z?lJsS62_~OvZ7}&Zzf96cQNHS2KI@)**E{V&b+i}N)t=NR zmG!>bqvp_FHJA2W?IF2$&8-|rhjJlZ%87I;H`1*f$p__1z9?t%Nx3W2H|0=1{>i21 MGuh1i27XEW2HBgZ`v3p{ literal 0 HcmV?d00001 diff --git a/tests/gds_ref_si220/crossing_so.gds b/tests/gds_ref_si220/crossing_so.gds new file mode 100644 index 0000000000000000000000000000000000000000..5a114100edbe1cd4bb5d62c8205f201d9ddb561f GIT binary patch literal 694 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 literal 0 HcmV?d00001 diff --git a/tests/gds_ref_si220/die_ro.gds b/tests/gds_ref_si220/die_ro.gds new file mode 100644 index 0000000000000000000000000000000000000000..e464d37d74eeb6a110e722f912ea3896f49a8221 GIT binary patch literal 25778 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 QQ2y1zA7k>ss&3~007QQWO8@`> literal 0 HcmV?d00001 diff --git a/tests/gds_ref_si220/die_sc.gds b/tests/gds_ref_si220/die_sc.gds new file mode 100644 index 0000000000000000000000000000000000000000..7eff2d03d2d375bc90363198961abb5f70a2b076 GIT binary patch literal 14194 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 VF^l)eF^l)eu|MyzSM&9|{{uAu0Qvv` literal 0 HcmV?d00001 diff --git a/tests/gds_ref_si220/die_so.gds b/tests/gds_ref_si220/die_so.gds new file mode 100644 index 0000000000000000000000000000000000000000..43344d97df19cfe07081e808a9a2ee3b68aafba1 GIT binary patch literal 15474 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

    |N09SLE|BwLo9^>Vc?m}GPoFdA+jhI0 zcf0;_{_Qwtoe%9FhxpSWQ1Yb%e(C(_7%lnKk+|vnN^K?imby;zuM=_C`PhlqIzKzN zmVE7upE`fL5J#QQU06@&cUOPO_pa2U&i}4wr5@7mg=o{LXI(GdxUR0BZuqI|soNQ; zukJlzmQvl9Nd0v$mwN1hz6tf≧DX?eUw`Z%=G>J@=dkz2Rx8_g=(9*MBe0M)!kW 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 K#BIsbQ~eJn<1w%R literal 0 HcmV?d00001 diff --git a/tests/gds_ref_si220/gc_elliptical_sc.gds b/tests/gds_ref_si220/gc_elliptical_sc.gds new file mode 100644 index 0000000000000000000000000000000000000000..c80a16805e7839a35ce67b508d0870da9eee9e87 GIT binary patch literal 21530 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 Juawe~{|9E9r=I`- literal 0 HcmV?d00001 diff --git a/tests/gds_ref_si220/gc_elliptical_so.gds b/tests/gds_ref_si220/gc_elliptical_so.gds new file mode 100644 index 0000000000000000000000000000000000000000..6ccf6f360870d52d5c5cb2a7ee421a01ce13a242 GIT binary patch literal 21530 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 literal 0 HcmV?d00001 diff --git a/tests/gds_ref_si220/gc_rectangular_rc.gds b/tests/gds_ref_si220/gc_rectangular_rc.gds new file mode 100644 index 0000000000000000000000000000000000000000..7c53a4c31c776832839eac6d15a615ffb4d59bc2 GIT binary patch literal 4220 zcmaKve@K*f9LGPMcV~o!8y2lelOdx*Rzy(kk0_A+(fT9C*siiJf8?)S&aTVM-OS9{ zSyon-mX=nQR#s+aH#28uW)>9@5+hcvHljsHM8t?aJlnTr=X7SIy1gq>eaSf)Ydpzbw>MS9K2pRv+9nQhjUzMCd8`A=~?xJ4Sq z;K!CHL*D+ue|^ON`>}p;Tu&DP4dYn}dNAaN>&;`B*CU+6>aEu`JM%IO;}eVK^+>|| z@biam$7G?OY)3!%*3yRYcU9=NnD@hbXZZOCJUH)whvz5hLmam6&&RGmAKf)CNw4>P zCD`?u@7a3)R|`pcz3;8SuD1f+mCYo*-uKjE*Heq`@*a|2@4K6@>uy4K=@3b;_g!t+ zb+w`U^%P03_nqC?b#|k>*g?|kea8*#I&Pr5&_~kieefQ3!F%X_xkJ+Heftya+Ml31 z|2s*q_iaPiwGE*=_l%_1`_{MEwVK}<>+^T^HA%1cXGUUo#{6-y`d0Io1*F&e(=phc zjzQNlhNRc~lX2Lcj6-*70!gp;Clatbk$|rGGm>8KkIlmF*erC%r<3%0-h{%{g@hm+7Xd`r^n{lQG^4rZb|ltR+$eVq@xIv=|F9Fkt| z_ZMNezX;ud0+L?uYs#^!DMwdZO4957-fHajR-@aulcd-Css`+;8qifAAnEmfcMEpA zThQ$}PSWfBu1@TBb)u_mC+YQmM?ZEu`qAy|A?fvg`(5m|-$hq(lcd-Ctq-x=`Vif= z-$;7B-|`&0Ezi-F|3%X4ec2oA%HE*c{F0>C`+yz0fE``nUy@$$OQW$XjYhX=6iKi5 zC9&9*#G?Co97(VD#gniro`i1WrzE}J7tO$~Xa>3spOf@@UpN=L!nx?ye?ijgy?+6A z{sriM`jVvA`vMns1uk?yeofNreSR8t`Dy6ZEhFjmJ}(!$yj*l^vq^fr_xZ8&`O&S( zBkA?t8^F#RK)1S>q}Ti0O6+ng(XHA>((8RrJ$56@9&46Un9+Dc)Pp<_*GsN literal 0 HcmV?d00001 diff --git a/tests/gds_ref_si220/gc_rectangular_ro.gds b/tests/gds_ref_si220/gc_rectangular_ro.gds new file mode 100644 index 0000000000000000000000000000000000000000..228a363023f268d77d2bac676b6d657e5a469019 GIT binary patch literal 5500 zcmaKwe@xVM9EU$0+`$|g|cl&?;uu*C6q$>s5?UT9aL6={wcO1j=h-ub?c&hfI_?ZHku zURJfRUwD4kWuGMUs~$&h8+B^CeX7KDSvjsR>~#yzf7^)j-Zt|5B)yA^_P0#f-7=w@ z%^~UK{$??DH;d8D6q59EKV`;l%8YKhjHH+Q8@1Tos6{tfMbgXtbqjXaE$AldNqV^- zZ^v%D9o@ASl3wmdd$1erK{wV((#!qTLF}#$q8qW1^m0Emf!)vqy5SL$UhXf?VRv~B z-IW=VUhW4S|L4x{ndA7b@894(l3wlyys#VaLid-Bq?h}CU+nsQ(fzrMq?dbJ0Cu(j zbbqWM>E*r;_X};G<38rRfBYUuqMyIM==ZmGEq1+Y(f#%;NiV;D&j##zHlX|UC6Zq5 zyF;<-4n_CNYb3qgcST{>6@~8SaFSl`JN4Lg>e2laPtwc1H3K_q2D%>&B)!~s@NDCt6NIa%l&zO z?9Th6yYMJUFZbtyusauouJ%ciUhdBXV|OMP-PvbIdbzI-!LB+4UCla@UhYqC!tV4Y zbXBjA^m2bH0=rWY=qleJ>E-@JB6cSd(VdJT>E-@-8g|Fi(3w+6dbvNEjor~~bjLDD zdbuwzz^=RiT}2*AFZV}Eu{%<-nTJA9U;m-~aw z*d1&}SKLU_%l&>UcKfa94z!WX9x!*gC-QHnzg##qL-0zvjZqGEj zf@>tb+~?oLF8?mN-FHZOxi`6EXL3hp`iG>K`#f*#^1RV~x`d>c`&>Wla{bVKvYe!s z`<#{7<*Y>a@e?Gy+-I-BE_)5Sk5-fPa-X#xyR7x-K74_smwV$z?2H@Heeg0#FZY>Y z*ky*Hd;fKkUhXsEu*--;w`&_oFZb!G*rlhUdoP)!m-{p$c4E%9d5WBcRblYttz1+u4U>7riE_Q^Zm;0zW?4st- zMbD7*av!O%i&W?$?~(L!zts!7tzPK1=}3CH-{Oni7GHD`%Sd{;-yDG5<^XizD@b~| fpMPHHdXDM*{TLRAJ}eOZ{B_swe-FnqOn3D!b&1wU literal 0 HcmV?d00001 diff --git a/tests/gds_ref_si220/gc_rectangular_sc.gds b/tests/gds_ref_si220/gc_rectangular_sc.gds new file mode 100644 index 0000000000000000000000000000000000000000..7c407d586e81c0a231b43e56e915474c1b1111a8 GIT binary patch literal 4092 zcmaLaTS$~^6vpwlapqGt6>Tu75ZV{}B0}2UMG#WqT{jU@lTvCo?gl6P1{y?${L(cDSErzUNsa(fYbsvDW)j{A+>6GA@_bq>gbV z4x2yBWRqzAHh+!&yBX`Uf-C(YU#Q%eDlZ>&(xlDqw#=DF$X%iBRXK}hQ6T`;yp+ROe`mrj$muc_a zfBxRbK1}S-;Lndk7h6W7(W&+|ejn|v(VzdlAD`#FUp~J~+1pd~?>^z(yH9ZcPm?Ko zXFt3S?}pdG{nsK>_RfAV_I1X44aUCIc*mjHGG*`V2Ws$cpa$+ur%c&9`~GCS>raMz zy+Eeyo&Bo@ynDs(e_tPbU!Uxq{flXM_k!JD=EA?smA$in)`EA>*!}ru_~)Nx@9dw< z#=9r%{|&ZH@o+w z!1tuU^RE8I9yFX}zf6xfeyXx<;^F4OIKOO%5ba>uXf2SPp?!^9^ig&x)DpU6M zRQ)Y>zQyjhGvIG$!1J#98|-|8-EVfm-|T|tUG*L8+`;bG7s6j(2+zCf+t|5{-P`-& z+xy{pSN%11zQ*p674VT2@Vu+OwH5DL+5O50{FM>e+f(%|?A*fcmn+~eSHSbG`ity* zk=-x3;V-%2c~|{;c0SMU7wX_I)WP$v`m^kOmfg=yfo3Fz2uKHu_e2m?j=D;`2f#+TI4eZ>&?nk@f zk9NcJuKL65e3;#jWWgWFg6CcJ2iW-lyB{2YKR5u-yXyC);oUxV-(LW~zd-i(RQ(=y z-ox&DzryeR3eUUh>)E-U-FJuKcZcD5SN#rl-ofs>Ecjg(JnyRC&d%G}y>2Ib-A;Jk zRbRu-HSAtH1-^C)JnyRC#?IT=y}B8`x*48#)o=ZVcU!-~{X0XZ?Cq)gE$qC7-K!$- zRS|gJRlkXyH?jNXdGMR(!Sk;AN_MVf_l-U98++h+SACeB!|c9c5&VWl@Vu+OoSnLfP9>^(E|F!tSNt;Y+{6^RD_3JBQf4xDvj&5}tR} zuVLpk?7lV$er*yw@2X$T&a2tIs2;wk9-epA7qW99y9ZO@gQ@VmtG-|r-W9BZTX|BZ z?Cq)gJa*1w_xyDD{B(HURUcsI0K4b5!{@fc^R9XyJNww(p9$~Jgy&uL%h`E3yXW-6 z=k&t!uKK0yyp-LSdEu9N;dxj6l9PD1gx#};;IoHhZ%@_#@_Vw!8-(`;;d!@xV(fQl GxA_4%d`;K@ literal 0 HcmV?d00001 diff --git a/tests/gds_ref_si220/gc_rectangular_so.gds b/tests/gds_ref_si220/gc_rectangular_so.gds new file mode 100644 index 0000000000000000000000000000000000000000..94791d981b05f863181ea7f87fccf1b054a26e8e GIT binary patch literal 5372 zcmaKwe@v8h9LK*Ma4>f{a^$En$J(tq#;P?})SR=%nk&~_V}*$FQ$V_q&XbTXA|g5z z5%p9A)Kd{qQIUu)A|kqoi0C3DqEiu2Peeq=nsY8Xc;9=m7N7g)b$dPU*Yn&T_dMI3 z(khK6T7^8M@gGqO)MLtD=~d|5_e!VH8a5>w6O7xG3i9z=@lw(AuXWT+z7T1D+Ex)0 zr9%AXZx?H|sY!9hjY+12jMS}$1Y_Km%}V(OD5ZT^qkNQhp++ec9_XX|-g-uE-^q9lPsx zbnXU{Uhc0tu)FF&cdeDAm-`VXb|X%7qg^Du++T5Fcg2NnxSyn#`^#?ZF1yhU4U_b8 ze{l-Ci&N+>O_20*@A7=lXYLoz$Dh5AT=z+OxgXSFH>gARrd7Y$}`|fz`y5rIP97EE}eU|~dE(5xsQb>Ba@65)oGaKEHMv`9c zI|{JtC_wi^E=e!%N7Jx7nuhLJB1tdzM@-lqF`=_%ko0nYC=a_sdFT%3 zko0n2QH)(hF}lh^l3wl)mSK0W3|;vil3wl)RAG0Z3SHS@l3woj)nm7>9^L*^B)#14 zZNYAD3p#5PNiX-iJF(l{iEd9jNiX-i`mo#8hpx1Tq?h}hL)h&cLRT_K(#!phaqM=C zqbt5f(#w6(J?x6^q1%3!q?db(FLoARbe6wKdbuwQ#I7(9-KPskdbuwM!LA?#-6xAl zdb!VEie3IvbRR!K(#w6`GVJn}q5J45l3wm}S7MjD65WR{lJs(KUX7i3HM$R8A?f8l zCmOq)XmsztLDI{8b~1L^$>_FiAnD~kD-*k{Omy$1lk{?LGGk{lquZKA(#yTkf}PQV zZc9E%FZY>N>@uzB-Yp^N59~yHC=~{dygC>viZhXi0jxUl)wsx?ps%i%5F8U#rJ%tsY&>5|Uo- b|MNegUvwDyXz%ZT@A28+|Nfr;5Pj7@MXSFU literal 0 HcmV?d00001 diff --git a/tests/gds_ref_si220/grating_coupler_array.gds b/tests/gds_ref_si220/grating_coupler_array.gds new file mode 100644 index 0000000000000000000000000000000000000000..355c09db68cfad2732525cf72e2f56a4df73842a GIT binary patch literal 4402 zcma*qTTE0}6vpx0Vdg-rZEQn{B_!>G55^EnpPD9ySi?)x7h{MWi8`4XZ~#ZB2T&j* zM#WSJqM*h*BH{((B_irby+o~u6fxeSQc4ACYFlIQ^47G|Gw1tuByHCbUbb0l{XqVx ziONtemsh2|})AU=P$vr`-l=qEL&}ZfaOZ`QmvasLul?0WV zI4L3a*V~_}_=o$wH(mby=a=KVRO%1^I4@m4TE9W-iAs0_T2tX{>R(DB{lT= z^UzuISS37g$6GEvclI}Cm)QMs zCj8}0cvvWJUpR9yGSqaa*=#R7Wadto9hCktk z=U((j+4(5DAFGEyRu9j;=nu2=VRk<<8UDy*c9TMIn*qTl}rcHh$jzo!SDd(rP= z=Uwc+I~#s?Haz#D-_Fk4*?q?#{Ek6*?nS>f9d}#VeOo^KwtPLeU(s)7=gsWC27kw=|*Rp$E zDtuikJolns$Ik26y`~kurWKxh(XV}pyR|RjzMZaLJ-1)cuVLpk>|Py(ua3fVFZxyN zyo%jd&w^h)3!Zz?SFv*yyRYnpU)c-Kz33zC9AWnrbKzIah38)M73^HW?v;<=D<8pg zFZ$)vakre^%M0Pl3-#Q7MPJI!rR-kz3clwoQTxB3TX=aA?C literal 0 HcmV?d00001 diff --git a/tests/gds_ref_si220/grating_coupler_array.oas b/tests/gds_ref_si220/grating_coupler_array.oas new file mode 100644 index 0000000000000000000000000000000000000000..27e94e28679e901ccef1d2791dc9fe265601fe67 GIT binary patch literal 2760 zcma);Jxmi}7{_0($JrPuUlmMk_=u+kthKbUq<{#NLJ6fH7E>I&TuLbjw0ImO7zYMp z0%0HyE;6W#Ob&(t9h``RI$%N^3(iUx-nP~2FJIgXGiz>UuS5_;QS|kM!v08D>I}8_ zXm1&BWK77@Ey1L}+6xSs7CzPsS2@Nphh6CQhg+&_qeF63O)4|>lQC5tNyI1Xr(??G zNHSrozG-thYF!Sujpuf>emx}5~P-zIQ15E5`Kd=B?U;(_&@0i%r zzJCWe{|fop06@77aH z>}kJY8Mp@R+0nmu;~z}yY2RxG&T9s*{yrx5wC|Y(&NB;M-DgbfY2UpKoO>I*8y-yT zX}>lCTx|qA*K17dY2UF1oMR0)A13y+FRH+aDtMPaVq#DGm0Q47Zh?2H1`~VQFAoA&9t5xAIVSeBZ(Rk> zx(Z&Iw&&_|DC4lFeTxX3MFj6+0uy`MFI@z#bP>D@KQOVUee*7G=3Veg+A*=G{i0#u ziiW`}eus%Y?dNX*m%jmCVHqa&w7=ylE3sSOHwF)pCxHD MeEUyoQ{#E|56_{6dH?_b literal 0 HcmV?d00001 diff --git a/tests/gds_ref_si220/heater.gds b/tests/gds_ref_si220/heater.gds new file mode 100644 index 0000000000000000000000000000000000000000..d1aa94abfb272182a8d809309ddcac3442293ddb GIT binary patch literal 690 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLWX&Wn;@oO)N<*QZZy;;b353<7HydWMJcCVqjp<5n%rRuUz#1-y2>3 z|A{C4|2O;A|9`hOLFl^Y5OIh+1B)O7HvJ5YE#W|QZ48VmOMv>WF)%*=0-<{}A>vSZ zocf{q7}R$C|F1HMfid0+Lc`2~%Hzt@}N>^Nda**TSV} zG1>ysmNSvt8JoF2sf|w-hmMct^9Y>(Sx?GBAspTuS%{VayA_aK0v4nv01Wz;njm_e z2DUE}1v-k_Pc-)JRFij_JW+L)sB{JFuOI*()w{J% zM43iz@;~}DpAIz#^la!!RM}Rl zIp_C#K4m^QWUgOlexmm}^KUiQ&l~1GE?HG>@_+gt)|o4>aKE4Des79-mB+lR H{?Nu3e3q=# literal 0 HcmV?d00001 diff --git a/tests/gds_ref_si220/mmi1x2_ro.gds b/tests/gds_ref_si220/mmi1x2_ro.gds new file mode 100644 index 0000000000000000000000000000000000000000..70d9abde46c641e0ea705a12d5bbdd246354cb76 GIT binary patch literal 628 zcmZ{gJ4*vW6orqoyR*T^l1LDg6;oI$qK&Z;MGL{!LM?n1!h%6uEEFs(YyyI%poLg%QdxmrPINX7R5VP=`gd3q5op8~Mg84?PkZZw8 zxEyW+dCM6cFAq;&RbECWs{^OU^E2?B|5;DUQYjeR8d?n30XqZ8HUSIL69D?MmYN`X zn*vUj5(QeS+D|n0?OcO*8a&Z`fv8piF2)iCdgipBXzZK3(NA<HOC zJ`oku+~j}sYd#-n4(K@0ljv@P`G-U1Rc`V|Kk&ErQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRrQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRFQjyJ7!Jys&wI> z`!~R%;sQO1!fxT#~S7K{D^l(JW>0QD0~8*Yq0{WJM70A`8u!l6V*eauQs<4{d|h{vf}p( z!(8Y8^w&cm?K1}~-114(tP0l(SfgC$$NJU7UYS#$(-bw5!dV$nmFxUO|I(RoD;_IR zr!4*5itsAed95G#&I4A4{~s`tqC5xtJl7!Cd99ywqHaa@*C`9nb1=tq4RW0y>nG|L ngzsfVc@NC-URYJG^Ar88K)7aA`gsrB&wF8BCl0rbsC)q!Ak-U?JFAsEv;*0fVrW<_8EisRf(uQm5N4 zoxP1%1|$T;5DP&=#Os~8tQiw*<}CN{@y*VK2irbC-m?8?%wiQjiYS=hn76(2>REUi zUIEKaYP)>1xp&`u+uDhP=ehwpMJjb~@)Lgkv9{v)ak`RLS~w?=Q}@+Xb8`}$s2xH#ZSNq)cXTgT9WUf=j=^-lQ;aTCmJ+lfBlN^d=JgBH|b4&!cR0R m3qQp=+&J#$yfLh`O z6xSS*v11Vh*X+0X&3>~pP!OVxTu9hwM3IFJ2l?+i;zEsv{Yh^!2QpT;T3fiy{pM1s z?@Fs>r-fYjznfHQJRX*36-`y77TMJ>1a{SM~tQHq`Y$KHxe0j_23z)sXve&V66?0H5gQ Wn*IHPA@AWiW-q3$KYjg;lz0HMP-&q6 literal 0 HcmV?d00001 diff --git a/tests/gds_ref_si220/mmi2x2_so.gds b/tests/gds_ref_si220/mmi2x2_so.gds new file mode 100644 index 0000000000000000000000000000000000000000..bbcb80d58204d6fa03a0a5bfe074e55bbb0b86db GIT binary patch literal 436 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 SUD$Na$KIs|`HPL!Dt`jMZ=6v8 literal 0 HcmV?d00001 diff --git a/tests/gds_ref_si220/mzi_so.gds b/tests/gds_ref_si220/mzi_so.gds new file mode 100644 index 0000000000000000000000000000000000000000..b62bd9538fce5cecbba9f76c23fabf5fa6d7f188 GIT binary patch literal 6226 zcmeH~cW_iy6o=3DO-MI^uxX_1J_|~kB#TN_zyU|GV2lM)HV_AhCa3|_acmht9Y^e< zVi}`YMw9`p=ztv&5rk3HAVmcSJ1Fh>-F?|z-cGV2jN?DaOy=8c?mgvq&b{wEaf;Pi zCD|6MYm3B7UvWv1^gHykBv_qO8f%+tnrDcl+Z=<3&8`^pZu`&v)0Yic@KE*nlI`ez zZ@kkvb!Ov)mL{>sizKBvr%r7wX)RS>NJ5HDLO=FY>0*V`W4VEK*^c3hI~S@w*5;wX zze0O*)10+|Y4zBgP}khl(lVhXP&d7?X<93vnxxZ)^0i~7uJ7$7p?#TY&X(!THI0)d zPgi>@ipy$>O9Lfp2lnwgBBdkfC>W_Fb)BxS-51{dk6yd8vGj?sji?A}%8E-%{KX}P zzsjw;e&@XK+SvYrTJBgW;`k%HBg%TYzbsH!67Waz8(wXs7s^lML`QgcY=2>mOqH=z zZWXzBTi8Za1kw4K)}}|QIIt#AS{JA-JEV3N|G9^=x+~2m)|&E)ipd`+t*EG|Y%nzN zk2ZOUT3hC?ZwQnZH$)UPcZl*-zP`Kc&7RttO||MOdsS2NHg!Q)>msMbRL_aErhbje z#T<=)w8=}<+JXMsK>5J>`bgg9&QYGa?`pHBw&utgbV#yz6zdZmbKO^E#G{m%XlGWdP)?EgEz;dAp}`^|O6y2qltyXGI7wahiLwq$g2 zfkEpD&@W;66ACncLu4R8529;3M!t5%=+M z0#tS>n#po(`V4~YI$jG87b zg&vXQ;jkR8g6D{&;9I7_&F~J9)XU+E@He<#B<)(bPvjW8h@}Y5g=h2FN`u$I`{DB< z89A^6K8Cvtk>0Geo&}$R#N9`O#Mh@Ct+18pg(D$3*yf1z&4r&r?AeLaqaI%ka5m&w zw;H99*-_`$t5TEDI$5) z&`qp)52A4#+zYYYuL^z*Uq2MQV4T&@JA`vYKZiQa7r{6Sm z=}Qb6@p;Hgy9}+#QzM5g^492w?BgMEXD@;Gpfx?EEr8h7oZFLm;~202rn zGWY=X;IsE;=z~+J7g~GIgITbWdfp4OA-;+ZQ19E}CKv}_r5|pE)G5Obr_nDr!84#0 z_NAY0BBHL~y_Jgng01xFeeh|R2OH_*c1ZroC1``DN!Z9I z#-uahMVtd_n4b(A&}s$eWH-DD;-jAz5_{ffoU51M^^kpe$8zqzMZ-_vwUG7knULSO zC1^=rapPe%=lD;wi6uiqebvXOs=8{#8;L zA%B+@ZbqwC_$Au>1UJ9{q=xoQa1A^c;?wp%Tm=Wi56NXQ`~ae&#_8l0z{HnZ$?qmO?bwNdd{1tn=JLbuB1PzLjFQLY`;mokwxCYy7l(^Xp#9( z>bgNHu}q~HV(|OmEagUA^DL(8i#k}?sfv|qP$K;R6U3qp6=nGU-RxKIX;kP$<)2C* zqoR9@@x7BS>imC<{ks0w2qXSIIR^LtrS>seYq!haZilPj literal 0 HcmV?d00001 diff --git a/tests/gds_ref_si220/pad.gds b/tests/gds_ref_si220/pad.gds new file mode 100644 index 0000000000000000000000000000000000000000..bc585bf91ef94d7488319f8294313a948441a00f GIT binary patch literal 174 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRrQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRrQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRrQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRXZP#1vFK%o;LaUcNGU~v{fgnm|Z{jaA(^h0Q%Lo*@TA@u+MKyk2scAyz73;=Z; BE!F@4 literal 0 HcmV?d00001 diff --git a/tests/gds_ref_si220/straight_sc.gds b/tests/gds_ref_si220/straight_sc.gds new file mode 100644 index 0000000000000000000000000000000000000000..54b2b952e7392dad0c2994ebf226bada676dcc9b GIT binary patch literal 182 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLR`R!bxm7!13g0{J!5qSkRC>SdU8`s664eIi*gf7 zK>EszAbJ=W%y8S2os(FZUs@86VxN(vo`E_8iy#973p)eekP%>GD=sNY%uLTHi7!qD ks)vTjY1ArQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRXZP#1vFK%o;LaUcNGU~v{fpni5BW?=vTeXk*3 literal 0 HcmV?d00001 diff --git a/tests/gds_ref_si220/taper_rc.gds b/tests/gds_ref_si220/taper_rc.gds new file mode 100644 index 0000000000000000000000000000000000000000..aa41142b2a7216eb517bb51fbfe78e38e3a3af1a GIT binary patch literal 242 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLWX&Wn(KzEJ!ViFG^-$;b353<7HxCW?Fd==w!6A^IWo|NpP2L-a#vprbPx!1~#NX0R{-0OIQ>J^%m! literal 0 HcmV?d00001 diff --git a/tests/gds_ref_si220/taper_ro.gds b/tests/gds_ref_si220/taper_ro.gds new file mode 100644 index 0000000000000000000000000000000000000000..f9dea2356dbf10430d2f0dad804e8f3223c0fb3b GIT binary patch literal 242 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLWX&Wn(KzEJ!ViFUn_N;b353<7HxCW?Fd==w!6A^IWo|NpP2L-a#vprbPx!1~#NX0R{-0O?mJN&o-= literal 0 HcmV?d00001 diff --git a/tests/gds_ref_si220/taper_sc.gds b/tests/gds_ref_si220/taper_sc.gds new file mode 100644 index 0000000000000000000000000000000000000000..7096a4375dc5b345743c972a7539c58566c3260c GIT binary patch literal 178 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLWX&Wn(KzEJ!ViFHUA);b353<7HxCW?`R!bxm7!13g0{J!5qSkRC>SdU8`s664eIi*gf7 zK>EszAbJ=W%y8S2os(FZUs@86VxN(vo`E_8iy#973p)eekl|rtD@iO!Es8HrhKI*# e)bRNK|34el|GyX*)CGWSFbxw2(=fYOSQr4TK~4Vv literal 0 HcmV?d00001 diff --git a/tests/gds_ref_si220/taper_so.gds b/tests/gds_ref_si220/taper_so.gds new file mode 100644 index 0000000000000000000000000000000000000000..9a2f542b6d44c693e94e195eec020ae8740e9c1d GIT binary patch literal 178 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLWX&Wn(KzEJ!ViFV1IR;b353<7HxCW?rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRKm=HxMG&E%6+{0Vi2m2pA^Jr!LHd9o1w;V#&tU-T KX9t?W!T`R!bxm7!13g0{J!5qSkRC>SdU8`s664eIi*gf7 zK>EszAbJ=W%y8S2os(FZUs@86VxN(vo`E_8iy#973p)eekP%{ID=A9MD~>NtjxS0! zGyv*=h6*!ksQmx`pA8xczZe+Q1%T{_AQ~tx4-yBrQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRKm=HxMG&E%6+{0Vi2m2pA^Jr!LHd9o1w;V#&tU-T KX9t?W!T`R!bxm7!13g0{J!5qSkRC>SdU8`s664eIi*gf7 zK>EszAbJ=W%y8S2os(FZUs@86VxN(vo`E_8iy#973p)eekP%{ID=A9MD~>NtjxS0! zG63p;h6*!ksQmx`pA8xczZe+&6oBl9AQ~tx4-yBrQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLR`R!bxm7!13g0{J!5qSkRC>SdU8`s664eIi*gf7 zK>EszAbJ=W%y8S2os(FZUs@86VxN(vo`E_8iy#973p)eekP%{ID=A9MD~>NtjxS0! zH2~^>h6*!ksQmx`pA8xczZe(}2LRa*K{QZY9wZKy2ipkM&x))cr0(@}sJb~I8VFJ# R=7?lM%mK>7T+G74007XAU)=xz literal 0 HcmV?d00001 diff --git a/tests/gds_ref_si220/wire_corner.gds b/tests/gds_ref_si220/wire_corner.gds new file mode 100644 index 0000000000000000000000000000000000000000..ce978d99e336dfd450283069720e89ac80474b2b GIT binary patch literal 184 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 BX*K`= literal 0 HcmV?d00001 diff --git a/tests/gds_ref_sin300/coupler_nc.gds b/tests/gds_ref_sin300/coupler_nc.gds new file mode 100644 index 0000000000000000000000000000000000000000..9d07e31cd8f03db5400998f14cc7fd7c33fa7e35 GIT binary patch literal 6708 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 DipUMv literal 0 HcmV?d00001 diff --git a/tests/gds_ref_sin300/die_nc.gds b/tests/gds_ref_sin300/die_nc.gds new file mode 100644 index 0000000000000000000000000000000000000000..9ca56da6fd3f22109fce67c5123fd4481a676646 GIT binary patch literal 21266 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 literal 0 HcmV?d00001 diff --git a/tests/gds_ref_sin300/gc_elliptical_no.gds b/tests/gds_ref_sin300/gc_elliptical_no.gds new file mode 100644 index 0000000000000000000000000000000000000000..747967ffcdf739e9caf2acf0aca3eb7f93eb73f1 GIT binary patch literal 21530 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 E0C1U+)c^nh literal 0 HcmV?d00001 diff --git a/tests/gds_ref_sin300/gc_rectangular_nc.gds b/tests/gds_ref_sin300/gc_rectangular_nc.gds new file mode 100644 index 0000000000000000000000000000000000000000..835abc3048683bff04f480e26cb1ac3b2fdcf0d6 GIT binary patch literal 2172 zcmaKtPe_w-9EZQXo9`rYrY)^C=A@Y^%VyGKIo9$|EjGo5#_Eu)8CuAYu?|HC4-q6D zq(hfHM3+2u2oIw}C+ScfJV=M|AOs!4Lv-?>t#|wQi4pldJ>z*l&tCTTC#D!iT092~ z$2U1B$HgIj@l`*TLxwqX_jW#$e<0$r)kH5n?M-}m{WCmRJp1y+%`x%R?B6z-=2Uhf ze((8R{1H04) zy0KFvz21+;u^Ww}yY`Hv*ZbiW?1op+jr=C*^*-UlF5yF$yhqaOeS87C_yW4CUr2hr zAKJ!lXdB&?ev)4A2PUx_m_#@DhNRc~*cx`RHFW)Ml3wql5$vK7bQhnH^m^a7j9s7g zT`&KRBELv_y$`#v3%k%=xJAXtnk0ia`_iSO;vxV+_h@{v1?lgAYX>{ja zk@R}swTfNWD!QPPq}TgE5W7GS-I<3Zz20{$Vb`&QuJb!dulMb>*tJ`KuI11Fbc&?c zdw&5te*swV)ic8$~Mj=Ux5^}c=`yZUu> d4PKI7@BcZcZO(c0&Uy5E*DL3z!#cz5@&~5173%;1 literal 0 HcmV?d00001 diff --git a/tests/gds_ref_sin300/gc_rectangular_no.gds b/tests/gds_ref_sin300/gc_rectangular_no.gds new file mode 100644 index 0000000000000000000000000000000000000000..ea7788ec562f507c451afed424c5969e42457d7e GIT binary patch literal 2172 zcmaKtK}b_^9LImY%{P(E7Hg~+v2>~erZJhPM^o;|NXrG>G8xA!$^p?&T#ycMmZ}E z@r$qaSxy+{%+$D*vYv>zZ1s`oi)($K-~PH0`w%F+9*K*${`l5ynwj*NHJQ$*vYAIS zDQhg76R|glm`#R!74xJaB9~9u#Maa;a%Mqn3&UiowEMi`$*Q+I|KFEiBU1O{?|Y8A zvMrSk+N#Hu^V+^xd;feM_sr*cKS^KZvHjc{c5`d!9={^#_1@aU&e}tl|3=d5eXaw$ zTnD;`jU>I^PfuVsJ%R4Q9g<$}GX?B21$0x-NP4|bZ(*0-LO1z|q}ThT2fL&PUFr`> zulJ*I>_+40?uSWwy-zG-msmzOVv+QEA1`7TFQOZMPtxoCU;}o8<&UfK9S!Z0^m^YP z!>&Ju?%qX`UhjJsvFlw#*Edem>wV8Uc0KFp?!F=E^**|fU34Ga?e8SL-bX^%MMCJh z-6Xxx~nEhulJov z>^hU^uG}K&^}c-tyY>}ym!6XJdf&Q|0~U^2x`Kt`3MNZU5G7S>b3f zHXaENhi*U|>299yb^}f#!ug{O}(gQBJ-uEoQ>sdnAyTc{d z`z|lME-$+78(ea|_s_xe&!M~ckxQ=kom=oax6oZ^ zhPPaDy|3GZSGS4obUl|`?`s3_Y6Iv_J>`J@Y~PA<9LSJl9)szG<+4wqc- zD;D5YETF6W!X?-H@(g(8_CLqO`+vNjORo367(8DL-O<-va=kCzfLFSKuB?(vuJ*qJhu*p2t-&rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLR)FY9{vCSe^P?D|0U22kU#!gfb{+U|Lqcl2Fio=vjhFW G!T&e5 literal 0 HcmV?d00001 diff --git a/tests/gds_ref_sin300/mmi1x2_no.gds b/tests/gds_ref_sin300/mmi1x2_no.gds new file mode 100644 index 0000000000000000000000000000000000000000..2085d5a9330629b641eb04d9a4614ec8f507df33 GIT binary patch literal 372 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRrQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRs5~D1|Nnndg82XC Y9taKe2T&i_Utk(257y5P3rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRxX4Ip(O_XG8wfY3m5z~VrCFnK)s|Ns9qAL9R) YdmuE>A3%Lze}QSBJXk+FFbr5204=3$HUIzs literal 0 HcmV?d00001 diff --git a/tests/gds_ref_sin300/mzi_nc.gds b/tests/gds_ref_sin300/mzi_nc.gds new file mode 100644 index 0000000000000000000000000000000000000000..75883f398e5cc350f6144d80e1b74074b09b82d5 GIT binary patch literal 12242 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 literal 0 HcmV?d00001 diff --git a/tests/gds_ref_sin300/mzi_no.gds b/tests/gds_ref_sin300/mzi_no.gds new file mode 100644 index 0000000000000000000000000000000000000000..59da158f5c42c47078d62e322bcfa3a7287edc26 GIT binary patch literal 12242 zcmeI&cXU*B7Qpd4C6gXPNFbyU0_h~A7ZMwu!yh}MG(|g54s8{f)qh;L5i-B+3(AwI9WiB$NzRbXV1rZGw=QGy}#dm@8!3O zPSom3@l&bokBXCY7klX~fxrECaZ&5WjWtd&Ou19UQ)4$Eb3t$h0aGco8S4_Wxd(* zL**Rp@P9RbYCR{wLuYK9(7-kIrYRGrPSsCsG))^jal#!_m0?=0!Fj6D^=9*h8Pa;5 zw})=(v?+$MqsL5B&P^HBXlhJ|O;FC@`iz?Ge%LasGOB8igW3GZr)_8d?x@$h#`Nn( zV2m-ury3iRn=7M^c+G6~y4mrXBOF~X;ykY{!VdX0nBwAN8b+nG=a*GwNw0Z4@)H>! z-FEg(=4UlC#4Pgp>b7fih@fMBR=@RZpT(pYqcNr-CjK{br;ZG`nO|R{=ITYetn%s@ zlgX5v924JC^GHvtQ9As#q0y9(WNb`oub|ZmX&z}>({;1A8tLo=tGT*X_R5@+x78}R z*6-T88w}P z0n6{5wkn#<7qgV(W^+?;+xOQwU%8`*IIdO3=hWR6yXIJqyBgZQzrp!t^Z92i@qho0 zMRSVfPIYOxMZRx7|97h8t+TqDwRQV->(&%3V*gJiPsR2+SnAPy{11%VwpMO9u5YDf zT;Iw+YuvVb%MHhs2Ftk8@Mn$N_SCrHxPL;vp1QWDT-*Jz!Ah*uCU!8Q1VNY^-A ziErZ??kkzd`$)Gv$UVcm1nGTmr5>M&bT{DFcoI*E_)Nmf__Nt;=APv{8+qOFbHE<> z5K<@qZb;t#&tQQ_KnRjYz$-XTq(>s&jm(SrA(24l#r!Pp!?#3wmf;>efQLkajCdZu zXDv90^qPbLNGy^l(wl3^Fp*$8Y{W&#u@Da=?~o_)b&*hFl#g&Vl1~_OtI{Fgsd|fq zry%naz7?r=L^e{-2x3tYUnFy++KJRgb(|YFJ+F2|VpNlNlo3mi@6^*pqHn>c@hrY4 z(sv4;!Al~Vt|BqKhH5hK3f?Lbdk;P?5~sp<@m@SH5>H;*K%9@oA_>$$I~x}uu_qFP z_B(ulwe2mE2cN%=fiB-t4^;X*tolEU}82;_X7NhFo)>4-CR9)2a#PeTuMLvptt zj#u%oB5A~HPwr_KnFii3(wPSbzE3}m)VV*kciG3L3qe^Phi}hT&0QcaB z^fJdrl1p#qawM?_r{JT=xFe~52>0JAFI#+K6 zd>S{>%l`NyE*Gf@p_i#e4Y@}0eGT#VQ9i$m%vsGPdYSWU!;tIMvYw-v-`e}}IV7LH zups^u!rI0Aq0nR?yRfa3=0WVo0Pu zdcI2}cl|MXx=N&8hu@RpPYm;*n_4X|;wpj1k;xdbdo-Mw} zZ zwSG4i;rryxG5s#g#`mbp7GzE;lW_-iW6kKdA$8MlrLN4UelzyKP1JoUZa^hYYFe(u z$yzISz;(=*Qj3?E$E(P>rObtX1@n9!pThCTIxRkd^m(xn7qL#Lx1P0C#Cp_I)51@2 z1`b1dVHi2+Z$%|;=A?kw^yFBOie;?NH*qNT#Z1=kS|q2TAsEH_UWq~IkKHWKEWHaV zc?kWngc|>Z&Ul>unU7zh2B~K*YozWS`tDbJ8K>iN`tkxU#!1Nf$~uF@nZ=r|8%aNN zt-3rkVLbhQ7z42u8EfEI%;{yU#BaG@FkiKMk(_GDssATP-TD{eecW$8M6REnkEPs? zn9tf29E{}F?|oF^AlAe&?q|$#4Yf+SrQ2AVd%I8S#lgei&%w-Lo z;6AzwIhIHc)hoEqGG6seq}EEW#P36D9?$x!W(~vRnEt*NF5@V zqaXHW?UHxII(!8a@HU=jTQCi&O9k}_`y(8d@s?7bo-g2I zn2L-WxDSadki}T?7VinH#gZ{djwL=wZpHj2;B{o31q{YMyl;F%&m6$p@c|_EBI@hM z^$Wkl45U`Rtg}M$_nk%$Q6FD-Brl(J$nSl)UIEwY&UXcj*`0b9L?Jzs{~7O1+mT-O zHXyNhtLd$6yk9+sCd@@U-osAPW2W@0e*q}O)xe#d&stH;Uo z+7;}MPw*bdcY~O_F5~IFkI);bhX-phmpXay`<$g1fN{KM(ihoWt24F9=6ao}P1Yse zM-L*gxIc)D>7GF^Qr}M0H**M5C*>L3sRk#a2XcM4-Sp%mI2(Im3O)G-@5$#d8`sj4 zpW-MqAazRrk@suXa{4UG`*u2O)uoEwd>qLujq5mnNpHT2#NMwTGOp62&ONY*_xdCB zCckkat`sAZfAVRJN9NA)KlJ7mq&`XaA-N^dM~)-tQQ~zZ$3$x7aE2abtvbAo)Z5{H zdX$(QDlis9>Cuh+eeyG=BWpQ!JJLt7xk!CuIA+hk#|%SXdh`?i-XZ_K&e*djP)N39|nkUE4bpNS=0`Rq?`@>$!2 zeAXVe^r)7+L#d0F`h`zb97uw!fg)a0Y@oFyMa6CjWvaU7n zV==C$7g=YT<(QAuE07#Dw;?sqkVB6h$Q<<;h+IElGqTPCSQ{GZPMwI=7){T7j$v4WLG;RA^us~el^$V^)SWR6 zsavNF=z#RHT0<|a!6>P@P9N{E@Z20M8)js))^L7M^6S zUdH1{PO4+9$&8%$JH|I&xG|PrF@s2s12dS?j8U%yoiA z4fR((YeMk=v9D}ViIdMNB~C?Gi!#4OX_ft(;6Jhl+qTEvVV|yj@49)P&Z+tO6r^>$ zR&RRTfcCw?Yy3Z89Y(k9654hNxx3kR32nQC>v8y7N LZ}Pv?)N19wld}*R literal 0 HcmV?d00001 diff --git a/tests/gds_ref_sin300/pad.gds b/tests/gds_ref_sin300/pad.gds new file mode 100644 index 0000000000000000000000000000000000000000..bc585bf91ef94d7488319f8294313a948441a00f GIT binary patch literal 174 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRrQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRrQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRLL0tewGcW+%1O^ZqEY2bb)XxsYEDQj>Od^B; literal 0 HcmV?d00001 diff --git a/tests/gds_ref_sin300/straight_no.gds b/tests/gds_ref_sin300/straight_no.gds new file mode 100644 index 0000000000000000000000000000000000000000..fdc0155ce52512096c21f8546f373748da7a5a99 GIT binary patch literal 182 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLRmm*S literal 0 HcmV?d00001 diff --git a/tests/gds_ref_sin300/taper_nc.gds b/tests/gds_ref_sin300/taper_nc.gds new file mode 100644 index 0000000000000000000000000000000000000000..49d45d4dcd8df548a280db1a036ffe8591d80ba1 GIT binary patch literal 178 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLWX&Wn(KzEJ!Vi&r4=t;b353<7Hwv&A`UT#K6FyBftzKLEskygSr5W Y{{R0!8%PjFgT+|{85mgDftZB>0FC+{jQ{`u literal 0 HcmV?d00001 diff --git a/tests/gds_ref_sin300/taper_no.gds b/tests/gds_ref_sin300/taper_no.gds new file mode 100644 index 0000000000000000000000000000000000000000..c61a13c729ae1118d0e62ccd8aa4259649ea3f74 GIT binary patch literal 178 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLWX&Wn(KzEJ!Vi&&y|E;b353<7Hwv&A`UT#K6FyBftzKLEskygSr5W Y{{R0!8%PjFgT+|{85mgDftZB>0Fh=MnE(I) literal 0 HcmV?d00001 diff --git a/tests/gds_ref_sin300/wire_corner.gds b/tests/gds_ref_sin300/wire_corner.gds new file mode 100644 index 0000000000000000000000000000000000000000..ce978d99e336dfd450283069720e89ac80474b2b GIT binary patch literal 184 zcmZQzV_;&6V31*CVt>rQ#URPR&Y;4efXrs#VPeb4Oe#t&s$^ggVP>^+>@@d2w)}&o z%MSeov!g;7WLR