releaseing file deleted

This commit is contained in:
2026-05-28 20:36:25 +08:00
parent 52be015967
commit 518eb06591
83 changed files with 203 additions and 744 deletions
+4 -1
View File
@@ -28,6 +28,9 @@ jobs:
# This generates the linux_x86_64.whl inside the dist/ folder # This generates the linux_x86_64.whl inside the dist/ folder
run: python build_wheel.py run: python build_wheel.py
- name: Export Technology Manifests
run: python scripts/export_technology_manifests.py --dest exported_PDKs
- name: Inject Prebuilt Windows Wheel - name: Inject Prebuilt Windows Wheel
# This copies your locally-built Windows wheel into the dist/ folder # This copies your locally-built Windows wheel into the dist/ folder
# so they sit side-by-side right before the release is published. # so they sit side-by-side right before the release is published.
@@ -44,4 +47,4 @@ jobs:
with: with:
# This command scopes up everything currently sitting in the dist/ folder # This command scopes up everything currently sitting in the dist/ folder
files: "dist/*.whl" files: "dist/*.whl"
api_key: ${{ secrets.GITEA_TOKEN }} api_key: ${{ secrets.GITEA_TOKEN }}
-65
View File
@@ -1,65 +0,0 @@
import nazca as nd
from .Foundry import Foundry
class AMF_Si220_Active(Foundry) :
## Generall parameters
STD_SMWG_WIDTH = 0.45
SLAB_GROWTH = 2
W_METAL_MIN = 5
SPACING_HEATER_MIN = 2
SPACING_METAL_MIN = 4
W_HEATER_MIN = 3
lib_path = 'GDS_lib\\'
# show_pins = False
def __init__(self, layermap={
'STRIP_COR' : ((10,0), 'RIB'),
'SRIB_COR' : ((11,0), 'GRAT'),
'RIB_COR' : ((12,0), 'SLAB'),
'SINWIN1' : ((53,0), 'SINWIN1'),
'SINWG1' : ((54,0), 'SINWG1'),
'HEATER' : ((115,0), 'HTR'),
'VIA_S2M' : ((100,0), 'VIA1'),
'VIA_H2M' : ((120,0), 'VIA2'),
'VIA_M2M' : ((120,0), 'VIA2'),
'METAL' : ((105,0), 'METAL'),
'METAL_2' : ((125,0), 'METAL_2'),
'PAD' : ((150,0), 'BONDPAD'),
'OPEN' : ((151,0), 'OX_OPEN'),
'ISL' : ((160,0), 'DT'),
### Active part
'PP' : ((21,0), 'PCONT'),
'PCONT' : ((21,0), 'PCONT'),
'NP' : ((22,0), 'NCONT'),
'NCONT' : ((22,0), 'NCONT'),
'PLD' : ((23,0), 'PIM'),
'NLD' : ((24,0), 'NIM'),
'PLD2' : ((25,0), 'IPD'),
'NLD2' : ((26,0), 'NPD'),
'GE' : ((40,0), 'GeEP'),
'PPPGE' : ((20,0), 'PPPGE'),
'NPPGE' : ((41,0), 'NPPGE'),
}):
super().__init__(layermap=layermap)
self._add_xsection_(xsection='strip',layers=['STRIP_COR'],growth=[0])
self._add_xsection_(xsection='rib',layers=['STRIP_COR','RIB_COR'],growth=[0,3]) ## Slab waveguide
self._add_xsection_(xsection='rib_s',layers=['STRIP_COR','SRIB_COR'],growth=[0,4]) ## Slab waveguide
self._add_xsection_(xsection='isl',layers=['ISL'],growth=[0])
self._add_xsection_(xsection='sn',layers=['SINWG1','SINWIN1'],growth=[0,21])
self._add_xsection_(xsection='pad',layers=['METAL_2','PAD'],growth=[0,-2.5]) ## DRC 4.2 - [AMF-QP-RND-006]
+21 -1
View File
@@ -1,7 +1,7 @@
import nazca as nd import nazca as nd
from .Foundry import Foundry from .Foundry import Foundry
class EOM1_2ML_CU(Foundry) : class EOM1_2ML_CU_RDL(Foundry) :
## Generall parameters ## Generall parameters
STD_SMWG_WIDTH = 0.45 STD_SMWG_WIDTH = 0.45
@@ -68,4 +68,24 @@ class EOM1_2ML_CU(Foundry) :
'PD_SIPP' : ((100,140)), 'PD_SIPP' : ((100,140)),
'PD_SINP' : ((100,150)), 'PD_SINP' : ((100,150)),
}): }):
super().__init__(layermap=layermap) super().__init__(layermap=layermap)
## add cross sections
nd.add_xsection("strip")
nd.add_layer2xsection("strip",layer="WG_HM",growx=0,growy=0)
nd.add_layer2xsection("strip",layer="WG_STRIP",growx=4,growy=4)
nd.add_xsection("rib_low")
nd.add_layer2xsection("rib_low",layer="WG_HM",growx=0,growy=0)
nd.add_layer2xsection("rib_low",layer="WG_SRIB",growx=3,growy=3)
nd.add_layer2xsection("rib_low",layer="WG_STRIP",leftedge=(-0.5,-3),rightedge=(-0.5,-3.5))
nd.add_layer2xsection("rib_low",layer="WG_STRIP",leftedge=(0.5,3.5),rightedge=(0.5,3))
nd.add_xsection("metal_1")
nd.add_layer2xsection("metal_1",layer="UTM",growx=0,growy=0)
nd.add_layer2xsection("metal_1",layer="SSIN0",growx=2.5,growy=2.5)
nd.add_xsection("metal_2")
nd.add_layer2xsection("metal_2",layer="UTM2",growx=0,growy=0)
nd.add_layer2xsection("metal_2",layer="SSIN1",growx=2.5,growy=2.5)
+1 -2
View File
@@ -1,6 +1,5 @@
from .AMF import AMF_Si220_Active from .Silterra import EOM1_2ML_CU_RDL
from .Silterra import EOM1_2ML_CU
-3
View File
@@ -1,3 +0,0 @@
from .foundries import *
from .components import DC as DC, DC_bend as DC_bend, DC_pX_3sg as DC_pX_3sg, EC_dual_layer_px3 as EC_dual_layer_px3
from .routing import Route as Route
-4
View File
@@ -1,4 +0,0 @@
def __cell_arg__(arg, arg_name, func_name): ...
def __list_convert__(var, name, func_name): ...
def __array_convert__(var, name, func_name, num: int = 1): ...
def __xs_exist__(xs, para_name, func_name): ...
@@ -1 +0,0 @@
from .primitives import *
@@ -1,30 +0,0 @@
from _typeshed import Incomplete
class EC_dual_layer_px3:
name: Incomplete
instantiate: bool
w_in: Incomplete
L_in: Incomplete
Ltp1: Incomplete
Ltp2: Incomplete
Ltp3: Incomplete
L_end: Incomplete
w_tip_core: Incomplete
w1_slab: Incomplete
w_tip_slab: Incomplete
w_mid_slab: Incomplete
w_box: Incomplete
w_box_end: Incomplete
L_box_end: Incomplete
w_DT: Incomplete
xs_SiN: Incomplete
layer_SiN_slab: Incomplete
layer_top_cover: Incomplete
layer_dum_exl_be: Incomplete
layer_DT: Incomplete
xs_Trench: Incomplete
angle_tile: Incomplete
R_bend: Incomplete
cell: Incomplete
def __init__(self, name: str = None, w_in: float = 1.0, L_in: float = 15, Ltp1: float = 100, Ltp2: float = 200, Ltp3: float = 400, L_end: float = 0, w_tip_core: float = 0.2, w1_slab: float = 0.6, w_tip_slab: float = 0.2, w_mid_slab: float = 0.45, w_box: float = 8, w_box_end: float = 12, L_box_end: float = 2, w_DT: float = 12, xs_SiN: str = 'sin', layer_SiN_slab: str = 'SiN_Rib_WG', layer_DT: str = 'OXIDE_FACET', xs_Trench: str = 'air_trench', layer_top_cover: str = 'PAD_OPTICAL', layer_dum_exl_be: str = None, angle_tile: float = 8, R_bend: float = 50) -> None: ...
def generate_gds(self): ...
@@ -1,5 +0,0 @@
from .directional_couplers import *
from .EC_dual_layer_px3 import *
from .beam_splitters import *
from .multimode_interferometers import *
from .spiral import *
@@ -1,39 +0,0 @@
from ...structures import *
from ...foundries import *
import numpy as np
from ...basic import __cell_arg__ as __cell_arg__
from ...routing import Route as Route
from _typeshed import Incomplete
class YBranch:
name: Incomplete
instantiate: bool
w: Incomplete
L: Incomplete
res: Incomplete
R_att: Incomplete
A_att: Incomplete
w_port: Incomplete
xs: Incomplete
cell: Incomplete
def __init__(self, name: str = None, xs: str = 'strip', w: list | np.ndarray = [1.2, 1.0, 1.8, 1.2, 1.0, 1.2, 1.2], L: float = 6, R_att: float = 10, A_att: float = 10, w_port: float = 0.45, show_pins: bool = False, sharp_patch: bool = True, res: float = 0.1) -> None: ...
def generate_gds(self, show_pins: bool = False, sharp_patch: bool = True): ...
class Ybranch_3wg:
name: Incomplete
instantiate: bool
w0: Incomplete
w1: Incomplete
gap: Incomplete
Lcp: Incomplete
xs: Incomplete
w_wg: Incomplete
R0: Incomplete
angle: Incomplete
L_attach: Incomplete
L_in_tp: Incomplete
cell: Incomplete
L: Incomplete
def __init__(self, name=None, w0: float = 0.4, w1: float = 0.2, gap: float = 0.18, Lcp: float = 20, xs: str = 'strip', w_wg: float = 0.45, R0: float = 10, angle: float = 20, L_attach: float = 3, L_in_tp: float = 3, sharp_patch: bool = True) -> None: ...
def generate_gds(self, sharp_patch, err_asy: int = 0): ...
def generate_test_gds(self, gc, dX_gc2gc: int = 400, dY_gc2gc: int = 80, sharp_patch: bool = True, Rbend: int = 15): ...
@@ -1,141 +0,0 @@
from ...basic import __cell_arg__ as __cell_arg__
from ...routing import Route as Route
from ...structures import Clothoid as Clothoid, circle as circle
from _typeshed import Incomplete
class ring_bus_wg:
xs: Incomplete
R_cp: Incomplete
w_bus: Incomplete
dLc: Incomplete
dAc: Incomplete
w_wg: Incomplete
bend_DC: Incomplete
euler_transistion: Incomplete
dL_trans: Incomplete
dA_trans: Incomplete
R_max_trans: Incomplete
w_trans: Incomplete
R_max_anti: Incomplete
R_min_anti: Incomplete
A_anti: Incomplete
wg_Ltp: Incomplete
dL_p2p: Incomplete
res: Incomplete
end_patch: Incomplete
L: int
clothoid_order: Incomplete
cell: Incomplete
def __init__(self, xs: str = 'strip', R_cp: int = 20, w_bus: float = 0.5, bend_DC: bool = True, w_wg: float = 0.5, dLc: int = 10, dAc: int = 10, euler_transistion: bool = False, dL_trans: int = 10, dA_trans: int = 30, R_max_trans: int = 100, w_trans: float = 0.5, euler_anti_bend: bool = False, R_max_anti: int = 100, R_min_anti: int = 10, A_anti=None, res: float = 0.1, wg_Ltp: int = 5, dL_p2p=None, sharp_patch: bool = True, show_pins: bool = False, end_patch: bool = False, clothoid_order: int = 1) -> None: ...
w: Incomplete
sz: Incomplete
def generate_gds(self, sharp_patch, show_pins: bool = False): ...
class ADC_STD_2x2:
name: Incomplete
instantiate: bool
wu0: Incomplete
xs: Incomplete
wu1: Incomplete
wu_in: Incomplete
wu_out: Incomplete
wd0: Incomplete
wd1: Incomplete
wd_in: Incomplete
wd_out: Incomplete
Lu: Incomplete
Ld: Incomplete
angle: Incomplete
g0: Incomplete
g1: Incomplete
sbend_type: Incomplete
Rmax: Incomplete
Rmin: Incomplete
sharp_patch: Incomplete
euler_points: Incomplete
res: Incomplete
Ru0: Incomplete
Ru1: Incomplete
Rd0: Incomplete
Rd1: Incomplete
tp_angle: Incomplete
cell: Incomplete
L: Incomplete
def __init__(self, name=None, xs: str = 'strip', wu0: float = 0.45, wu1: float = 0.61, wu_in: float = 0.45, wu_out: float = 0.8, wd0: float = 0.33, wd1: float = 0.2, wd_in: float = 0.45, wd_out: float = 0.8, Lu: int = 33, Ld: int = 33, angle: int = 20, g0: float = 0.2, g1: float = 0.2, sbend_type: str = 'euler', Rmax=None, Rmin: int = 5, Ru0: int = 0, Ru1: int = 20, Rd0: int = 20, Rd1: int = 0, tp_angle: int = 2, sharp_patch: bool = True, show_pins: bool = False, euler_points: int = 64, res: float = 0.1) -> None: ...
def generate_gds(self, err: int = 0, show_pins: bool = False): ...
err: Incomplete
def generate_err(self, err: float = 0.02): ...
def generate_test_gds(self, gc, dX_gc2gc: int = 400, dY_gc2gc: int = 80, sharp_patch: bool = True): ...
class DC(ADC_STD_2x2):
def __init__(self, name=None, xs: str = 'strip', w_cp: float = 0.45, w_wg: float = 0.45, L_cp: float = 30, angle: float = 20, gap: float = 0.2, sbend_type: str = 'circular', Rmax: float = None, Rmin: float = 5, R0: float = 10, tp_angle: float = 2, sharp_patch: bool = True, show_pins: bool = False) -> None: ...
def generate_test_gds(self, gc, dX_gc2gc: int = 300, dY_gc2gc: int = 40, sharp_patch: bool = True): ...
class BS_tdc(ADC_STD_2x2):
def __init__(self, name=None, xs: str = 'strip', wa0: float = 0.35, wa1: float = 0.45, wb0: float = 0.55, wb1: float = 0.45, w_wg: float = 0.45, gap: float = 0.2, Lt: float = 20, R0: float = 30, angle: float = 15, sbend_type: str = 'circle') -> None: ...
class MDM(ADC_STD_2x2):
wb0: Incomplete
wb1: Incomplete
w0: Incomplete
w1: Incomplete
w_wg: Incomplete
gap0: Incomplete
gap1: Incomplete
Lt_bus: Incomplete
Lt_cp: Incomplete
xs: Incomplete
R0: Incomplete
angle: Incomplete
symmetric_BUS: Incomplete
Rmin: Incomplete
L: Incomplete
def __init__(self, name=None, xs: str = 'strip', wb0: float = 0.45, wb1: float = 0.61, wb_in: float = 0.45, wb_out: float = 0.88, w_wg: float = 0.45, w0: float = 0.33, w1: float = 0.2, gap0: float = 0.2, Lt_bus: float = 20, R0: float = 40, angle: float = 22.5, Lt_cp: float = None, gap1: float = None, Lb0: float = None, symmetric_BUS: bool = True, single_end: bool = True, Rmin: float = 8) -> None: ...
def generate_test_gds(self, gc, dX_gc2gc: int = 300, dY_gc2gc: int = 40, sharp_patch: bool = True): ...
class DC_bend:
name: Incomplete
instantiate: bool
w_in: Incomplete
w_out: Incomplete
gap: Incomplete
r_in: Incomplete
r_out: Incomplete
theta_arc: Incomplete
theta_ext: Incomplete
w_wg: Incomplete
xs_wg: Incomplete
sharp_patch: Incomplete
show_pins: Incomplete
cell: Incomplete
def __init__(self, name=None, w_in: float = 0.45, w_out: float = 0.45, gap: float = 0.2, r_in: int = 40, theta_arc: int = 30, w_wg: float = 0.45, theta_ext: int = 15, xs_wg: str = 'strip', sharp_patch: bool = True, show_pins: bool = False) -> None: ...
width: Incomplete
length: Incomplete
def generate_gds(self, cellname: str = ''): ...
def generate_test_gds(self, gc, dX_gc2gc: int = 300, dY_gc2gc: int = 40, sharp_patch: bool = True): ...
class DC_pX_3sg:
name: Incomplete
instantiate: bool
xs_wg: Incomplete
Lc1: Incomplete
Lp1: Incomplete
Lc2: Incomplete
Lt: Incomplete
w_cp: Incomplete
dw: Incomplete
gap: Incomplete
R0: Incomplete
A: Incomplete
w_wg: Incomplete
sharp_patch: Incomplete
pX_type: Incomplete
port_symmetric: Incomplete
cell: Incomplete
cellU: Incomplete
cellD: Incomplete
L: Incomplete
length: Incomplete
def __init__(self, name=None, xs_wg: str = 'strip', Lc1: float = 10, Lp1: float = 5, Lc2: float = 10, Lt: float = 1, w_cp: float = 0.5, dw: float = 0.1, gap: float = 0.2, R0: float = 10, A: float = 15, w_wg: float = 0.45, pX_type: str = 'symmetric', port_symmetric: bool = True, sharp_patch: bool = True) -> None: ...
def generate_gds(self, err: int = 0): ...
def generate_test_gds(self, gc, dX_gc2gc: int = 300, dY_gc2gc: int = 40, sharp_patch: bool = True): ...
@@ -1,121 +0,0 @@
from ...basic import __cell_arg__ as __cell_arg__
from ...routing import Route as Route
from ...structures import Clothoid as Clothoid, circle as circle, hole as hole
from _typeshed import Incomplete
class Nano_ant:
w_wg: Incomplete
xs_wg: Incomplete
etch_type: str
vector: Incomplete
teeth_number: Incomplete
pitch: Incomplete
duty_cycle: Incomplete
taper_length: Incomplete
ant_length: Incomplete
width: Incomplete
max_theta: Incomplete
define_type: Incomplete
etch_depth: Incomplete
show_pins: Incomplete
cell: Incomplete
def __init__(self, w_wg: float = 0.41, xs_wg: str = 'strip', define_type: str = 'non-periodic', vector: float | list = [0.5, 0.5, 0.5, 0.5, 0.5, 0.5], taper_length: float = 3, width: float = 6, max_theta: float = 110, pitch: float | list = 0.6, duty_cycle: float | list = 0.3, teeth_number: float = 6, etch_depth: str | list = ['METCH'], show_pins: bool = True) -> None: ...
def generate_gds(self, sample_step: float = 0.1, cell_name: str = 'Nanoantenna'): ...
def generate_gds_positive(self, sample_step: float = 0.1): ...
def generate_gds_error(self) -> None: ...
class Taper:
width1: Incomplete
width2: Incomplete
length: Incomplete
type: Incomplete
order: int
show_pins: Incomplete
cell: Incomplete
def __init__(self, width1: int = 4, width2: float = 0.45, length: int = 30, type: str = 'linear', show_pins: bool = False) -> None: ...
def generate_gds(self): ...
class Grating_2D_Hole:
w_wg: Incomplete
w_gt: Incomplete
l_taper: Incomplete
type_taper: Incomplete
gt_vector: Incomplete
gt_num: Incomplete
gt_diameter: Incomplete
gt_layer: Incomplete
polysi_vector: Incomplete
polysi_num: Incomplete
polysi_diameter: Incomplete
polysi_layer: Incomplete
reflector_vector: Incomplete
l_field_center: Incomplete
cell: Incomplete
def __init__(self, w_wg: float = 0.5, w_gt: int = 5, l_taper: int = 30, type_taper: str = 'parabolic', gt_vector=[0.5, 0.5, 0.5, 0.5, 0.5], gt_diameter: float = 0.4, gt_layer: str = 'STRIP_COR', polysi_vector=[0.5, 0.5, 0.5, 0.5, 0.5], polysi_diameter: float = 0.4, polysi_layer: str = 'FCW_TRE', reflector_vector=[0.3, 0.3, 0.3, 0.3, 0.3, 0.3], l_field_center: int = 1) -> None: ...
reflector_num: Incomplete
def generate_gds(self): ...
class GC_STD_2D:
name: Incomplete
instantiate: bool
num_x: Incomplete
num_y: Incomplete
Lx_taper: Incomplete
Ly_taper: Incomplete
Lx_end: Incomplete
Ly_end: Incomplete
Lx_side: Incomplete
Ly_side: Incomplete
Lx_port: Incomplete
Ly_port: Incomplete
xs_open: Incomplete
w_wg: Incomplete
xs_wg: Incomplete
etch_type: Incomplete
shape: Incomplete
hole_shape: Incomplete
Dx_hole: Incomplete
Dy_hole: Incomplete
Px: Incomplete
Py: Incomplete
P_AR: Incomplete
L_AR: Incomplete
show_pins: Incomplete
positive: bool
layer_etch: Incomplete
cell: Incomplete
def __init__(self, name=None, etch_type: str = 'FETCH', xs_wg: str = 'grating', Dx_hole: float = 0.3, Dy_hole: float = 0.3, hole_shape: str = 'circle', shape: str = 'circle', xs_open: str = None, Px: float = 0.57, Py: float = 0.57, num_x: float = 25, num_y: float = 25, Lx_taper: float = 50.0, Ly_taper: float = 0.0, Lx_end: float = 1.0, Ly_end: float = 1.0, Lx_side: float = 0.5, Ly_side: float = 0.5, Lx_port: float = 5.0, Ly_port: float = 5.0, w_wg: float = 0.5, show_pins: bool = False, P_AR: float = 0.6, L_AR: float = 1) -> None: ...
def generate_negative(self): ...
def generate_positive(self): ...
def generate_test_gds(self, dX_gc2gc: int = 300): ...
class GC_STD_1D:
name: Incomplete
instantiate: bool
xs_open: Incomplete
xs_wg: Incomplete
w_wg: Incomplete
L_taper: Incomplete
L_end: Incomplete
A_taper: Incomplete
show_pins: Incomplete
L_tail: Incomplete
positive: bool
Period: Incomplete
eta_etch: Incomplete
num: Incomplete
sector_gc: Incomplete
L_AR: Incomplete
P_AR: Incomplete
layer_etch: Incomplete
cell: Incomplete
def __init__(self, name=None, xs_wg: str = 'strip', w_wg: float = 0.5, etch_type: str = 'FETCH', xs_open: str = None, L_taper: float = 10.0, L_end: float = 2.0, A_taper: float = 30.0, Period: float = 0.5, eta_etch: float = 0.5, num: int = 20, sector_gc: bool = True, show_pins: bool = False, L_tail: int = 2, P_AR: float = 1.0, L_AR: float = 2.0) -> None: ...
def generate_negative(self): ...
def generate_positive(self): ...
def generate_test_dev(self, dX_gc2gc): ...
class FA:
pitch: Incomplete
number: Incomplete
cell: Incomplete
def __init__(self, fiber_coupler, pitch, number, show_pins: bool = False) -> None: ...
@@ -1,29 +0,0 @@
from ...structures import *
from ...routing import Route as Route
from ...structures import Conchoid as Conchoid
from _typeshed import Incomplete
from turtle import shape as shape
class MMI_ML:
name: Incomplete
instantiate: bool
L_arm: Incomplete
xs: Incomplete
w_arm: Incomplete
arm_sine_width: Incomplete
L_mmi: Incomplete
w_mmi: Incomplete
res: Incomplete
N_out: Incomplete
N_in: Incomplete
Dp_out: Incomplete
Dp_in: Incomplete
mmi_sine_width: Incomplete
cell: Incomplete
L: Incomplete
def __init__(self, name=None, L_arm=[10], w_arm=[0.45, 1.35], xs: str = 'strip', arm_sine_width: bool = False, L_mmi=[10], w_mmi=[5, 5], mmi_sine_width: bool = False, sharp_patch: bool = True, show_pins: bool = False, res: float = 0.01, N_out: int = 3, N_in: int = 1, Dp_out: float = 1.5, Dp_in: float = 1.5) -> None: ...
def generate_gds(self, sharp_patch, show_pins): ...
def generate_test_gds(self, gc, dX_gc2gc, dY_gc2gc, R_bend: int = 10, Xout_offset: int = 50): ...
class MMI_STD(MMI_ML):
def __init__(self, name=None, N_out: int = 3, N_in: int = 1, L_arm: int = 10, w_wg: float = 0.45, w_port: float = 1.2, xs: str = 'strip', L_mmi: int = 10, w_mmi: int = 5, sharp_patch: bool = True, show_pins: bool = False, Dp_out: float = 1.5, Dp_in: float = 1.5) -> None: ...
@@ -1,108 +0,0 @@
from ...structures import *
from ...foundries import *
import nazca as nd
from ...routing import Route as Route
from ...structures import Conchoid as Conchoid
from _typeshed import Incomplete
from scipy import optimize as optimize
class spiral:
Dmin: Incomplete
Lmin: Incomplete
R_bend: Incomplete
shape: Incomplete
cycles: Incomplete
width: Incomplete
w_port: Incomplete
gap: Incomplete
xs: Incomplete
layer: Incomplete
name: Incomplete
instantiate: bool
port_angle: Incomplete
w_bend_center: Incomplete
Rmin_bend_center: Incomplete
Euler_bend: Incomplete
Rmin_euler: Incomplete
sharp_patch: Incomplete
w_bend_port: Incomplete
Ltp_port: Incomplete
cell_transition: Incomplete
res: Incomplete
cell: Incomplete
def __init__(self, name: str = None, shape: str = 'circle', Dmin: float = 50, R_bend: float = 10, Rmin_euler: float = 10, Lmin: float = 50, width: float = 2, w_port: float = 0.45, w_bend_center: float = 1, Rmin_bend_center: float = 10, gap: float = 1, cycles: float = 20, xs: str = 'strip', layer: str = None, w_bend_port=None, Ltp_port: int = 10, res: float = 0.5, cell_transition: nd.Cell = None, port_angle: float = 180, Euler_bend: bool = False, show_pins: bool = False, sharp_patch: bool = True, sample_build: bool = False) -> None: ...
def __strt_with_taper__(self, width1, width2, xs, length, Ltp: int = 15, Lstart: int = 2): ...
Atilt: Incomplete
L: Incomplete
Ru: Incomplete
Rd: Incomplete
bend_cell: Incomplete
def generate_gds(self, show_pins): ...
class spiral_rectangle:
Dmin: Incomplete
Lmin: Incomplete
Rmax_bend: Incomplete
Rmin_bend: Incomplete
wmin_bend: Incomplete
cycles: Incomplete
width: Incomplete
w_port: Incomplete
gap: Incomplete
xs: Incomplete
layer: Incomplete
Ltp: Incomplete
Lpatch: Incomplete
name: Incomplete
instantiate: bool
port_angle: Incomplete
sharp_patch: Incomplete
w_bend_port: Incomplete
Lport: Incomplete
cell_xs_transition: Incomplete
res: Incomplete
in_out_align: Incomplete
cell: Incomplete
def __init__(self, name: str = None, Dmin: float = 50, Rmax_bend: float = 10, Rmin_bend: float = 10, wmin_bend: float = 10, Lmin: float = 50, width: float = 2, w_port: float = 0.45, gap: float = 1, cycles: float = 20, xs: str = 'strip', layer: str = None, w_bend_port=None, Lport: int = 10, Ltp: int = 10, res: float = 0.5, cell_xs_transition=None, port_angle: float = 180, show_pins: bool = False, sharp_patch: bool = True, in_out_align: bool = True, Lpatch: float = 0.05, sample_build: bool = False) -> None: ...
def __strt_with_taper__(self, width1, width2, xs, length, Ltp: int = 15, Lstart: int = 2): ...
bend_cell: Incomplete
L: Incomplete
def generate_gds(self, show_pins): ...
class Spiral_Rect_STD(spiral_rectangle):
def __init__(self, name: str = None, Dmin: float = 50, R_bend: float = 10, Lmin: float = 50, width: float = 2, w_port: float = 0.45, gap: float = 1, cycles: float = 20, xs: str = 'strip', layer: str = None, Lport: int = 10, in_out_align: bool = True, res: float = 0.5, cell_xs_transition=None, port_angle: float = 180, show_pins: bool = False, sharp_patch: bool = True) -> None: ...
class spiral_circle:
Dmin: Incomplete
cycles: Incomplete
width: Incomplete
w_port: Incomplete
gap: Incomplete
xs: Incomplete
layer: Incomplete
name: Incomplete
instantiate: bool
port_angle: Incomplete
w_bend_center: Incomplete
Euler_Sbend: Incomplete
sharp_patch: Incomplete
Lport: Incomplete
rib2strip: Incomplete
res: Incomplete
strict_condition: Incomplete
R_ratio_mamnual: Incomplete
cell: Incomplete
def __init__(self, name: str = None, Dmin: float = 50, width: float = 2, w_port: float = 0.45, w_bend_center: float = 1, gap: float = 1, cycles: float = 20, xs: str = 'strip', layer: str = None, Lport: int = 10, res: float = 0.5, rib2strip: bool = True, port_angle: float = 180, Euler_Sbend: bool = False, show_pins: bool = False, sharp_patch: bool = True, strict_condition: bool = False, R_ratio_mamnual=None) -> None: ...
def opt_euler(self, R, R0): ...
Atilt: Incomplete
Rmax: Incomplete
L: Incomplete
Ru: Incomplete
Rd: Incomplete
def generate_gds(self, show_pins): ...
class Spiral_Cicle_MM(spiral_circle):
def __init__(self, name: str = None, Dmin: float = 50, width: float = 2, w_port: float = 0.45, w_bend_center: float = 1, gap: float = 1, cycles: float = 20, xs: str = 'strip', layer: str = None, Lport: int = 10, res: float = 0.5, rib2strip: bool = True, port_angle: float = 180, show_pins: bool = False, sharp_patch: bool = True, strict_condition: bool = False) -> None: ...
class Spiral_Cicle_STD(spiral_circle):
def __init__(self, name: str = None, Dmin: float = 50, width: float = 2, w_port: float = 0.45, gap: float = 1, cycles: float = 20, xs: str = 'strip', layer: str = None, Lport: int = 10, res: float = 0.5, rib2strip: bool = True, port_angle: float = 180, show_pins: bool = False, sharp_patch: bool = True, strict_condition: bool = False) -> None: ...
@@ -1,3 +0,0 @@
SECRET_KEY: bytes
def generate_license(mac_address: str, days_valid: int, output_file: str = 'mxpic.lic'): ...
@@ -1 +0,0 @@
def verify_license() -> None: ...
-11
View File
@@ -1,11 +0,0 @@
from .Foundry import Foundry as Foundry
class AMF_Si220_Active(Foundry):
STD_SMWG_WIDTH: float
SLAB_GROWTH: int
W_METAL_MIN: int
SPACING_HEATER_MIN: int
SPACING_METAL_MIN: int
W_HEATER_MIN: int
lib_path: str
def __init__(self, layermap=...) -> None: ...
-16
View File
@@ -1,16 +0,0 @@
from _typeshed import Incomplete
class Foundry:
STD_SMWG_WIDTH: float
SLAB_GROWTH: int
W_METAL_MIN: int
SPACING_HEATER_MIN: int
SPACING_METAL_MIN: float
W_HEATER_MIN: int
W_VIA_H2M: float
SPACING_VIA_H2M: float
ISL_W_MIN: int
ISL_SP_MIN: int
show_pins: bool
layermap: Incomplete
def __init__(self, layermap=None) -> None: ...
@@ -1,11 +0,0 @@
from .Foundry import Foundry as Foundry
class EOM1_2ML_CU(Foundry):
STD_SMWG_WIDTH: float
SLAB_GROWTH: int
W_METAL_MIN: int
SPACING_HEATER_MIN: int
SPACING_METAL_MIN: int
W_HEATER_MIN: int
lib_path: str
def __init__(self, layermap=...) -> None: ...
@@ -1,2 +0,0 @@
from .AMF import AMF_Si220_Active as AMF_Si220_Active
from .Silterra import EOM1_2ML_CU as EOM1_2ML_CU
-1
View File
@@ -1 +0,0 @@
from .routing import *
-36
View File
@@ -1,36 +0,0 @@
from ..structures import *
import nazca as nd
from _typeshed import Incomplete
def ic_exception(msg: str = '') -> None: ...
class Route(nd.interconnects.Interconnect):
PCB: Incomplete
sharp_patch: Incomplete
Ltp_mm: Incomplete
width2_mm: Incomplete
MM_route: Incomplete
def __init__(self, radius=None, width=None, angle: int = 90, Ltp_mm: int = 10, width2_mm: float = 1.0, MM_route: bool = False, xs=None, layer=None, adapt_width: bool = False, adapt_xs: bool = False, instantiate: bool = False, pinstyle=None, offset=None, varname=None, doc: str = '', PCB: bool = False, modes=None, sharp_patch: bool = True) -> None: ...
def connPatch(self) -> None: ...
def rt_bend(self, width: int = 3, xs: str = 'strip', angle: int = 90, layer=None, pin=None): ...
def strt_mm(self, pin=None, width2=None, Ltp=None, width1=None, Lstart: float = 0.5, length=None, xs=None, arrow: bool = False): ...
def line_mm(self, length=None, width=None, xs=None, width_mm=None, Ltp=None): ...
def strt_mm_p2p(self, pin1=None, pin2=None, width2=None, Ltp=None, width1=None, Lstart: float = 0.5, length=None, xs=None, arrow: bool = False, name=None): ...
def bend_p2p(self, pin1=None, pin2=None, radius=None, width=None, xs=None, name=None, arrow: bool = False, width_mm=None, Ltp=None, sharp_path: bool = True): ...
def ubend_route(self, pin=None, offset: float = 20.0, radius=None, width=None, xs=None, length: int = 0, name=None, arrow: bool = False, balance: int = 0, end_angle: bool = False, width_mm=None, Ltp=None): ...
def sbend_route(self, radius=None, width=None, pin=None, xs=None, offset: int = 20, Ltot=None, length1: int = 0, length2: int = 0, name=None, arrow: bool = False, Amax: float = 90.0, original_function: bool = False): ...
def bend_strt_bend_p2p_mine(self, pin1=None, pin2=None, radius=None, radius1=None, radius2=None, width=None, xs=None, length1: int = 0, length2: int = 0, ictype: str = 'shortest', name=None, arrow: bool = False): ...
def bend_route(self, radius=None, angle=None, width=None, pin=None, xs=None, length1: float = 0.1, length2: float = 0.1, name=None, arrow: bool = False, offset=None, sharp_patch: bool = True, original_function: bool = False): ...
def bend_route_p2p(self, pin1=None, pin2=None, radius=None, width=None, xs=None, name=None, arrow: bool = False, original_function: bool = False): ...
def bend_mine(self, radius=None, angle=None, width=None, pin=None, xs=None, length1: int = 0, length2: int = 0, name=None, arrow: bool = False, offset=None, sharp_patch: bool = True): ...
def tube_mine(self, geo, showpins: bool = False, name=None, xs=None, arrow: bool = False, Ltp=None, width_mm=None, sharp_patch=None): ...
def strt_bend_strt_p2p_mine(self, pin1=None, pin2=None, radius=None, radius1=None, radius2=None, width=None, xs=None, length1: int = 0, length2: int = 0, ictype: str = 'shortest', name=None, arrow: bool = False, width_mm=None, Ltp=None): ...
def sbend_p2p_mine(self, pin1=None, pin2=None, width=None, radius=None, Lstart: int = 0, doFirst: int = 1, arrow: bool = False, width_mm=None, Ltp=None, sharp_patch: bool = False): ...
def sbend_p2p(self, pin1=None, pin2=None, width=None, radius=None, Amax: int = 90, xs=None, doStrFirst: int = 1, Lstart: int = 0, BendEndFlag: int = 1, ref=None, name=None, arrow: bool = False, bsb: bool = True, sharp_patch=None, width_mm=None, Ltp=None): ...
def bend_strt_bend_p2p(self, pin1=None, pin2=None, radius=None, radius1=None, radius2=None, width=None, xs=None, length1: int = 0, length2: int = 0, ictype: str = 'shortest', name=None, arrow: bool = True, width_mm=None, Ltp=None): ...
def ubend_p2p(self, pin1=None, pin2=None, radius=None, width=None, xs=None, length: float = 0.1, name=None, arrow: bool = False, balance: int = 0, end_angle: bool = False, original_function: bool = False, Ltp=None, width_mm=None): ...
def strt(self, length=None, width=None, pin=None, xs=None, edge1=None, edge2=None, edgepoints: int = 50, name=None, arrow: bool = False, gridpatch=None): ...
def taper(self, length=None, width1=None, width2=None, shift: int = 0, xs=None, pin=None, name=None, patch: bool = False, arrow: bool = False): ...
adapt_width: bool
def taper_p2p(self, pin1=None, pin2=None, width1=None, width2=None, xs=None, name=None, arrow: bool = False): ...
def strt_p2p(self, pin1=None, pin2=None, width=None, xs=None, name=None, arrow: bool = False): ...
-113
View File
@@ -1,113 +0,0 @@
import numpy as np
from _typeshed import Incomplete
class hole:
cell: Incomplete
def __init__(self, r_hole: float = 0.3, Dx_hole: float = 0.3, Dy_hole: float = 0.3, Lx_sq: int = 6, Ly_sq: int = 6, offset: int = 0, res: float = 0.05, xs: str = 'strip', layer=None, sharp_patch: bool = True, hole_shape: str = 'circle') -> None: ...
class strt_round_courner:
cell: Incomplete
def __init__(self, width: int = 5, length: int = 10, layer=None, radius: int = 1, n_points: int = 64) -> None: ...
class circle:
vtx: Incomplete
sz: Incomplete
w: Incomplete
cell: Incomplete
def __init__(self, radius: int = 10, width: float = 0.45, theta_start: int = 0, theta_stop: int = 360, res: float = 0.05, angle=None, xs: str = 'strip', layer=None, sharp_patch: bool = True, y_cut=None) -> None: ...
class mx_bend:
sz: Incomplete
w: Incomplete
cell: Incomplete
def __init__(self, radius: int = 10, width: float = 0.45, theta_start: int = 0, theta_stop: int = 360, res: float = 0.05, angle=None, xs: str = 'strip', layer=None, sharp_patch: bool = True) -> None: ...
class Elipse_dual:
ORx: Incomplete
ORy: Incomplete
IRx: Incomplete
IRy: Incomplete
offset_X: Incomplete
offset_Y: Incomplete
xs: Incomplete
layer: Incomplete
res: Incomplete
theta_start: Incomplete
theta_stop: Incomplete
y_cut: Incomplete
cell: Incomplete
wa: Incomplete
wb: Incomplete
def __init__(self, ORx: float, ORy: float, IRx: float, IRy: float, offset_X: float = 0, offset_Y: float = 0, xs: str = None, layer: str = None, theta_start: float = 0, theta_stop: float = 360, sharp_patch: bool = True, res: float = 0.001, y_cut=None) -> None: ...
sz: Incomplete
def generate_gds(self, sharp_patch): ...
class Elipse:
La: Incomplete
Lb: Incomplete
wa: Incomplete
wb: Incomplete
offset_a: Incomplete
offset_b: Incomplete
type: Incomplete
layer: Incomplete
xs: Incomplete
theta_start: Incomplete
theta_stop: Incomplete
res: Incomplete
cell: Incomplete
def __init__(self, La=None, Lb=None, wa=None, wb=None, offset_a: int = 0, offset_b: int = 0, type: str = 'center', width_type: str = 'sine', layer=None, xs=None, theta_start: int = 0, theta_stop: int = 360, res: float = 0.001, sharp_patch: bool = False, show_pins: bool = False) -> None: ...
sz: Incomplete
def generate_gds(self, sharp_patch, show_pins): ...
class Conchoid:
Atilt: Incomplete
L: Incomplete
cell: Incomplete
vtx_center: Incomplete
vtx: Incomplete
K_end: Incomplete
R_end: Incomplete
def __init__(self, R0, kR, T, w, layer, w_end=None, res: float = 0.1, final_flat=None, begin_flat=None, xs=None) -> None: ...
class Clothoid:
name: Incomplete
R: Incomplete
A: Incomplete
width_type: Incomplete
spiral_order: Incomplete
dL_cal: Incomplete
xs: Incomplete
layer: Incomplete
dL_wg: Incomplete
x: Incomplete
y: Incomplete
L: Incomplete
L0: Incomplete
theta: Incomplete
vtx_center: Incomplete
end_patch: Incomplete
sz: Incomplete
n_points: Incomplete
w: Incomplete
cell: Incomplete
def __init__(self, name: str = None, R: list | np.ndarray = [10, 20], w: list | np.ndarray | float = [0.4, 0.5], A: list | np.ndarray = [0, 45], width_type: str = 'sine', spiral_order: float | list = 1, Rmax: float = 10000, dL_cal: float = 0.001, dL_wg: float = 0.1, xs: str = 'strip', layer: str = None, sharp_patch: bool = True, end_patch: bool = True, show_pins: bool = False) -> None: ...
instantiate: bool
vtx: Incomplete
sz_p2p: Incomplete
def generate_gds(self, sharp_patch, show_pins): ...
class Racetrack:
dLx: Incomplete
R_bend: Incomplete
dLy: Incomplete
xs: Incomplete
layer: Incomplete
bend_cell: Incomplete
A_bend: Incomplete
w: Incomplete
w_crack: float
cell: Incomplete
def __init__(self, bend_cell=None, xs: str = 'strip', layer=None, R_bend: int = 10, w: float = 0.5, dLx: int = 100, dLy: int = 100, res: float = 0.001) -> None: ...
sz: Incomplete
def generate_gds(self): ...
+1
View File
@@ -0,0 +1 @@
"""Build and export helpers for mxpic."""
+137
View File
@@ -0,0 +1,137 @@
import argparse
import os
from typing import Any, Dict
import yaml
def build_silterra_eom1_manifest() -> Dict[str, Any]:
"""Build the Silterra EOM1 manifest consumed by mxpic_EDA."""
layers = {
"WG_HM": {"layer": 275, "datatype": 0},
"WG_STRIP": {"layer": 101, "datatype": 251},
"WG_LOWRIB": {"layer": 100, "datatype": 90},
"WG_SRIB": {"layer": 100, "datatype": 90},
"WG_HIGHRIB": {"layer": 232, "datatype": 0},
"HEATER": {"layer": 29, "datatype": 30},
"CT_SI": {"layer": 268, "datatype": 0},
"CT_GE": {"layer": 35, "datatype": 0},
"UTV": {"layer": 172, "datatype": 0},
"RDL_VIA": {"layer": 194, "datatype": 0},
"UTM": {"layer": 173, "datatype": 0},
"UTM2": {"layer": 197, "datatype": 0},
"RDL_MET": {"layer": 195, "datatype": 0},
"PAD_ELE": {"layer": 100, "datatype": 170},
"PAD_OPTICAL": {"layer": 100, "datatype": 160},
"PAD_AL": {"layer": 145, "datatype": 0},
"WG_N": {"layer": 263, "datatype": 0},
"SiN_Rib_WG": {"layer": 63, "datatype": 30},
"SSIN0": {"layer": 283, "datatype": 0},
"SSIN1": {"layer": 289, "datatype": 0},
"SSIN2": {"layer": 290, "datatype": 0},
"SSIN3": {"layer": 291, "datatype": 0},
"EXCLUSION": {"layer": 57, "datatype": 0},
"SALICIDE": {"layer": 128, "datatype": 60},
"DM_EXL": {"layer": 23, "datatype": 0},
"DM_EXL_FE": {"layer": 23, "datatype": 40},
"DM_EXL_BE": {"layer": 23, "datatype": 41},
"OXIDE_FACET": {"layer": 90, "datatype": 0},
"DT": {"layer": 404, "datatype": 0},
"P": {"layer": 256, "datatype": 0},
"N": {"layer": 257, "datatype": 0},
"PP": {"layer": 258, "datatype": 0},
"NP": {"layer": 259, "datatype": 0},
"PPP": {"layer": 260, "datatype": 0},
"NPP": {"layer": 261, "datatype": 0},
"PD_SIPP": {"layer": 100, "datatype": 140},
"PD_SINP": {"layer": 100, "datatype": 150},
}
return {
"schema_version": "1.0.0",
"foundry": "Silterra",
"technology": "EMO1_2ML_CU_Al_RDL",
"source_class": "mxpic.foundries.Silterra.EOM1_2ML_CU_RDL",
"constants": {
"STD_SMWG_WIDTH": 0.45,
"SLAB_GROWTH": 2,
"W_METAL_MIN": 5,
"SPACING_HEATER_MIN": 2,
"SPACING_METAL_MIN": 4,
"W_HEATER_MIN": 3,
},
"layers": layers,
"routing_types": ["euler_bend", "standard_bend"],
"defaults": {
"xsection": "strip",
"family": "optical",
"width": 0.45,
"radius": 10,
"routing_type": "euler_bend",
},
"xsections": {
"strip": {
"family": "optical",
"default_width": 0.45,
"default_radius": 10,
"layers": [
{"layer": "WG_HM", "growx": 0, "growy": 0},
{"layer": "WG_STRIP", "growx": 4, "growy": 4},
],
},
"rib_low": {
"family": "optical",
"default_width": 0.45,
"default_radius": 10,
"layers": [
{"layer": "WG_HM", "growx": 0, "growy": 0},
{"layer": "WG_SRIB", "growx": 3, "growy": 3},
{"layer": "WG_STRIP", "leftedge": [-0.5, -3], "rightedge": [-0.5, -3.5]},
{"layer": "WG_STRIP", "leftedge": [0.5, 3.5], "rightedge": [0.5, 3]},
],
},
"metal_1": {
"family": "electrical",
"default_width": 5,
"default_radius": 10,
"layers": [
{"layer": "UTM", "growx": 0, "growy": 0},
{"layer": "SSIN0", "growx": 2.5, "growy": 2.5},
],
},
"metal_2": {
"family": "electrical",
"default_width": 5,
"default_radius": 10,
"layers": [
{"layer": "UTM2", "growx": 0, "growy": 0},
{"layer": "SSIN1", "growx": 2.5, "growy": 2.5},
],
},
},
}
def export_manifests(destination_root: str) -> None:
"""Export supported technology manifests into an EDA PDK root."""
manifest = build_silterra_eom1_manifest()
technology_dir = os.path.join(destination_root, manifest["foundry"], manifest["technology"])
os.makedirs(technology_dir, exist_ok=True)
output_path = os.path.join(technology_dir, "technology.yml")
with open(output_path, "w", encoding="utf-8") as file:
yaml.safe_dump(manifest, file, sort_keys=False, allow_unicode=True)
def main() -> None:
parser = argparse.ArgumentParser(description="Export mxpic technology manifests for mxpic_EDA.")
parser.add_argument(
"--dest",
default=os.path.abspath(os.path.join(os.getcwd(), "..", "mxpic_EDAX", "mxpic", "PDKs")),
help="Destination mxpic_EDA PDK root.",
)
args = parser.parse_args()
export_manifests(os.path.abspath(args.dest))
if __name__ == "__main__":
main()
+39
View File
@@ -0,0 +1,39 @@
import os
import sys
import tempfile
import unittest
import yaml
ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
sys.path.insert(0, ROOT)
from scripts.export_technology_manifests import build_silterra_eom1_manifest, export_manifests
class TechnologyManifestExportTest(unittest.TestCase):
def test_silterra_manifest_contains_route_xsections(self):
manifest = build_silterra_eom1_manifest()
self.assertEqual(manifest["foundry"], "Silterra")
self.assertEqual(manifest["technology"], "EMO1_2ML_CU_Al_RDL")
self.assertEqual(manifest["defaults"]["xsection"], "strip")
self.assertEqual(manifest["defaults"]["routing_type"], "euler_bend")
self.assertIn("standard_bend", manifest["routing_types"])
self.assertEqual(manifest["xsections"]["strip"]["family"], "optical")
self.assertEqual(manifest["xsections"]["rib_low"]["family"], "optical")
self.assertEqual(manifest["xsections"]["metal_1"]["family"], "electrical")
self.assertEqual(manifest["xsections"]["metal_2"]["family"], "electrical")
self.assertIn("WG_STRIP", manifest["layers"])
def test_export_writes_eda_technology_yml(self):
with tempfile.TemporaryDirectory() as temp_dir:
export_manifests(temp_dir)
output = os.path.join(temp_dir, "Silterra", "EMO1_2ML_CU_Al_RDL", "technology.yml")
self.assertTrue(os.path.exists(output))
with open(output, "r", encoding="utf-8") as file:
data = yaml.safe_load(file)
self.assertEqual(data["xsections"]["metal_1"]["family"], "electrical")
if __name__ == "__main__":
unittest.main()