New forge coding added

This commit is contained in:
=
2026-06-04 23:21:39 +08:00
parent 518eb06591
commit 8da92ced57
288 changed files with 52017 additions and 1913 deletions
+68
View File
@@ -0,0 +1,68 @@
from typing import Any
import nazca as nd
from .Foundry import Foundry
from .layer_models import LayerSpec
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
LAYERS = {
'RIB' : LayerSpec('RIB', (10,0), aliases=('STRIP_COR',)),
'GRAT' : LayerSpec('GRAT', (11,0), aliases=('SRIB_COR',)),
'SLAB' : LayerSpec('SLAB', (12,0), aliases=('RIB_COR',)),
'SINWIN1' : (53,0),
'SINWG1' : (54,0),
'HTR' : LayerSpec('HTR', (115,0), aliases=('HEATER',)),
'VIA1' : LayerSpec('VIA1', (100,0), aliases=('VIA_S2M',)),
'VIA2' : LayerSpec('VIA2', (120,0), aliases=('VIA_H2M','VIA_M2M')),
'METAL' : (105,0),
'METAL_2' : (125,0),
'BONDPAD' : LayerSpec('BONDPAD', (150,0), aliases=('PAD',)),
'OX_OPEN' : LayerSpec('OX_OPEN', (151,0), aliases=('OPEN',)),
'DT' : LayerSpec('DT', (160,0), aliases=('ISL',)),
### Active part
'PCONT' : LayerSpec('PCONT', (21,0), aliases=('PP',)),
'NCONT' : LayerSpec('NCONT', (22,0), aliases=('NP',)),
'PIM' : LayerSpec('PIM', (23,0), aliases=('PLD',)),
'NIM' : LayerSpec('NIM', (24,0), aliases=('NLD',)),
'IPD' : LayerSpec('IPD', (25,0), aliases=('PLD2',)),
'NPD' : LayerSpec('NPD', (26,0), aliases=('NLD2',)),
'GeEP' : LayerSpec('GeEP', (40,0), aliases=('GE',)),
'PPPGE' : (20,0),
'NPPGE' : (41,0),
}
ROLES = {}
def __init__(self, layermap: Any=None, roles: Any=None) -> None:
super().__init__(layermap=layermap or self.LAYERS, roles=roles or self.ROLES)
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]
+40
View File
@@ -0,0 +1,40 @@
from typing import Any
import nazca as nd
from .Foundry import Foundry
from .layer_models import LayerSpec
class ANT_Si220_MPW(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\\'
LAYERS = {
'RIB' : LayerSpec('RIB', 1, aliases=('STRIP_COR',)),
'METAL' : 12,
'HTR' : LayerSpec('HTR', 11, aliases=('HEATER',)),
'BONDPAD' : LayerSpec('BONDPAD', 13, aliases=('PAD',)),
'ISOLATION' : LayerSpec('ISOLATION', 203, aliases=('ISL',)),
'DEEPTRENCH' : LayerSpec('DEEPTRENCH', 201, aliases=('DT',)),
}
ROLES = {}
def __init__(self, layermap: Any=None, roles: Any=None) -> None:
super().__init__(layermap=layermap or self.LAYERS, roles=roles or self.ROLES)
self._add_xsection_(xsection='strip',layers=['STRIP_COR'],growth=[0])
self._add_xsection_(xsection='pad',layers=['METAL','PAD'],growth=[0,-5])
+151
View File
@@ -0,0 +1,151 @@
from typing import Any
import nazca as nd
import numpy as np
from .Foundry import Foundry
from .layer_models import LayerSpec
class CUMEC_CSiP130Cu(Foundry) :
lib_path = 'GDS_lib\\'
W_ISL = 5
SP_ISL = 5
SZ_CT = 0.25
SP_CT = 0.35
SP_METAL = 1.5
LAYERS = {
'FETCH_COR' : LayerSpec('FETCH_COR', (31,1), aliases=('STRIP_COR',)),
'FETCH_CLD' : LayerSpec('FETCH_CLD', (31,2), aliases=('STRIP_CLD',)),
'FETCH_TRE' : LayerSpec('FETCH_TRE', (31,3), aliases=('STRIP_TRE',)),
'FETCH_HOL' : LayerSpec('FETCH_HOL', (31,4), aliases=('STRIP_HOL',)),
'SETCH_COR' : LayerSpec('SETCH_COR', (32,1), aliases=('SRIB_COR',)),
'SETCH_CLD' : LayerSpec('SETCH_CLD', (32,2), aliases=('SRIB_CLD',)),
'SETCH_TRE' : LayerSpec('SETCH_TRE', (32,3), aliases=('SRIB_TRE',)),
'SETCH_HOL' : LayerSpec('SETCH_HOL', (32,4), aliases=('SRIB_HOL',)),
'METCH_COR' : LayerSpec('METCH_COR', (33,1), aliases=('RIB_COR',)),
'METCH_CLD' : LayerSpec('METCH_CLD', (33,2), aliases=('RIB_CLD',)),
'METCH_TRE' : LayerSpec('METCH_TRE', (33,3), aliases=('RIB_TRE',)),
'METCH_HOL' : LayerSpec('METCH_HOL', (33,4), aliases=('RIB_HOL',)),
'HEATER' : (19,0),
'CT' : LayerSpec('CT', (50,0), aliases=('VIA_H2M','VIA_S2M')),
'V1' : LayerSpec('V1', (51,0), aliases=('VIA_M2M',)),
'METAL' : (11,1),
'METAL_SLTBK' : (11,21),
'METAL_2' : (12,1),
'METAL_2_SLTBK' : (12,21),
'BOND_PAD' : LayerSpec('BOND_PAD', (20,0), aliases=('PAD',)),
'PASS1' : (60,0),
'PASS2' : (63,0),
'OPEN' : LayerSpec('OPEN', (61,0), aliases=('GC_OPEN',)),
'ISL' : (67,0),
'NW' : (21,0),
'PW' : (22,0),
'NLD' : (23,0),
'PLD' : (24,0),
'NLD2' : (25,0),
'PLD2' : (26,0),
'NP' : (27,0),
'PP' : (28,0),
'EPI' : LayerSpec('EPI', (40,0), aliases=('GE',)),
'SA' : (36,0),
'ABOX' : (97,1),
'PBOX' : (97,2),
'NOFILL' : (92,0),
'LOGO' : (90,0),
'PINREC' : (95,0),
'DEVREC' : (1001,0),
}
ROLES = {}
def __init__(self, layermap: Any=None, roles: Any=None) -> None:
super().__init__(layermap=layermap or self.LAYERS, roles=roles or self.ROLES)
""" Default xsection """
self._add_xsection_(xsection='strip',layers=['STRIP_COR','STRIP_CLD'],growth=[0,self.SLAB_GROWTH])
self._add_xsection_(xsection='rib_s',layers=['STRIP_COR','STRIP_CLD'],growth=[0,self.SLAB_GROWTH])
self._add_xsection_(xsection='rib',layers=['RIB_COR','RIB_CLD','STRIP_COR','STRIP_CLD'],growth=[0,self.SLAB_GROWTH*2,self.SLAB_GROWTH,self.SLAB_GROWTH*2])
self._add_xsection_(xsection='rib_slab',layers=['RIB_COR','RIB_CLD',],growth=[0,self.SLAB_GROWTH*2])
self._add_xsection_(xsection='drib',layers=['RIB_COR','RIB_CLD','STRIP_COR','STRIP_CLD'],growth=[0,self.SLAB_GROWTH*2,self.SLAB_GROWTH,self.SLAB_GROWTH*2])
self._add_xsection_(xsection='pad',layers=['METAL_2','PAD','PASS1', 'PASS2'],growth=[0,0,-2.5,-2.5])
self._add_xsection_(xsection='isl',layers=['ISL','STRIP_CLD','GC_OPEN'],growth=[0,1,3])
self._add_xsection_(xsection='metal',layers=['METAL','METAL_SLTBK'],growth=[0,0])
self._add_xsection_(xsection='metal_2',layers=['METAL_2','METAL_2_SLTBK'],growth=[0,0])
class CUMEC_CSiP180Al_PASSIVE(Foundry) :
lib_path = 'GDS_lib\\'
W_ISL = 5
SP_ISL = 5
SZ_CT = 0.25
SP_CT = 0.35
SP_METAL = 1.5
LAYERS = {
'FETCH_COR' : LayerSpec('FETCH_COR', (31,1), aliases=('STRIP_COR',)),
'FETCH_CLD' : LayerSpec('FETCH_CLD', (31,2), aliases=('STRIP_CLD',)),
'FETCH_TRE' : LayerSpec('FETCH_TRE', (31,3), aliases=('STRIP_TRE',)),
'FETCH_HOL' : LayerSpec('FETCH_HOL', (31,4), aliases=('STRIP_HOL',)),
'SETCH_COR' : LayerSpec('SETCH_COR', (32,1), aliases=('SRIB_COR',)),
'SETCH_CLD' : LayerSpec('SETCH_CLD', (32,2), aliases=('SRIB_CLD',)),
'SETCH_TRE' : LayerSpec('SETCH_TRE', (32,3), aliases=('SRIB_TRE',)),
'SETCH_HOL' : LayerSpec('SETCH_HOL', (32,4), aliases=('SRIB_HOL',)),
'METCH_COR' : LayerSpec('METCH_COR', (33,1), aliases=('RIB_COR',)),
'METCH_CLD' : LayerSpec('METCH_CLD', (33,2), aliases=('RIB_CLD',)),
'METCH_TRE' : LayerSpec('METCH_TRE', (33,3), aliases=('RIB_TRE',)),
'METCH_HOL' : LayerSpec('METCH_HOL', (33,4), aliases=('RIB_HOL',)),
'HEATER' : (19,0),
# 'CT' : LayerSpec('CT', (50,0), aliases=('VIA_H2M',)),
'METAL' : (11,1),
'PASS1' : (60,0),
# 'OPEN' : LayerSpec('OPEN', (61,0), aliases=('GC_OPEN',)),
'ISL' : (67,0),
}
ROLES = {}
def __init__(self, layermap: Any=None, roles: Any=None) -> None:
super().__init__(layermap=layermap or self.LAYERS, roles=roles or self.ROLES)
""" Default xsection """
self._add_xsection_(xsection='strip',layers=['STRIP_COR','STRIP_CLD'],growth=[0,self.SLAB_GROWTH])
self._add_xsection_(xsection='rib_s',layers=['SRIB_COR','SRIB_CLD'],growth=[0,self.SLAB_GROWTH])
self._add_xsection_(xsection='rib',layers=['RIB_COR','RIB_CLD','STRIP_COR','STRIP_CLD'],growth=[0,self.SLAB_GROWTH*2,self.SLAB_GROWTH,self.SLAB_GROWTH*2])
self._add_xsection_(xsection='rib_s_wg',layers=['SRIB_COR','SRIB_CLD','STRIP_COR','STRIP_CLD'],growth=[0,5,2.5,5])
self._add_xsection_(xsection='rib_slab',layers=['RIB_COR','RIB_CLD',],growth=[0,self.SLAB_GROWTH*2])
self._add_xsection_(xsection='drib',layers=['RIB_COR','RIB_CLD','STRIP_COR','STRIP_CLD'],growth=[0,self.SLAB_GROWTH*2,self.SLAB_GROWTH,self.SLAB_GROWTH*2])
self._add_xsection_(xsection='pad',layers=['METAL','PASS1'],growth=[0,-2.5])
self._add_xsection_(xsection='isl',layers=['ISL','STRIP_CLD'],growth=[0,1])
+77
View File
@@ -0,0 +1,77 @@
from typing import Any
import nazca as nd
from .Foundry import Foundry
from .layer_models import LayerSpec
class CT_CU3ML(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
LAYERS = {
'RIB' : LayerSpec('RIB', (275,0), aliases=('STRIP_COR',)),
'GRAT' : LayerSpec('GRAT', (407,0), aliases=('SRIB_COR',)),
'SLAB' : LayerSpec('SLAB', (406,0), aliases=('RIB_COR',)),
'NitrideWG' : LayerSpec('NitrideWG', (263,0), aliases=('SINWG',)),
'NitrideWG_RIB' : LayerSpec('NitrideWG_RIB', (415,0), aliases=('RIB_SIN',), description='Legacy map used NitrideWG for this layer.'),
'TIN' : LayerSpec('TIN', (398,0), aliases=('HEATER',)),
'ContSi' : LayerSpec('ContSi', (268,0), aliases=('VIA_S2M',)),
'ContGe' : LayerSpec('ContGe', (35,0), aliases=('VIA_G2M',)),
# 'VIA1' : LayerSpec('VIA1', (85,0), aliases=('VIA_H2M',)),
'VIA1' : LayerSpec('VIA1', (85,0), aliases=('VIA_M2M',)),
'VIA2' : LayerSpec('VIA2', (86,0), aliases=('VIA_M2M_2',)),
'VIA3' : LayerSpec('VIA3', (419,0), aliases=('VIA_M2M_3',)),
'M1' : LayerSpec('M1', (6,0), aliases=('METAL',)),
'M2' : LayerSpec('M2', (86,0), aliases=('METAL_2',)),
'M3' : LayerSpec('M3', (27,0), aliases=('METAL_3','PAD')),
'BEOL_N0_RMV' : LayerSpec('BEOL_N0_RMV', (283,0), aliases=('N0RMV',)),
'BEOL_N1_RMV' : LayerSpec('BEOL_N1_RMV', (289,0), aliases=('N1RMV',)),
'BEOL_N2_RMV' : LayerSpec('BEOL_N2_RMV', (290,0), aliases=('N2RMV',)),
'BEOL_N3_RMV' : LayerSpec('BEOL_N3_RMV', (291,0), aliases=('N3RMV',)),
'SIN_RMV' : LayerSpec('SIN_RMV', (483,0), aliases=('PAD_OPEN',)),
'DT' : LayerSpec('DT', (404,0), aliases=('ISL',)),
### Active part
'P' : (256,0),
'N' : (257,0),
'P+' : (258,0),
'N+' : (259,0),
'P++' : (260,0),
'N++' : (261,0),
'GePD' : LayerSpec('GePD', (262,0), aliases=('GE',)),
'GeN+' : LayerSpec('GeN+', (265,0), aliases=('GN+',)),
'GeP+' : LayerSpec('GeP+', (266,0), aliases=('GP+',)),
'GeWindow' : LayerSpec('GeWindow', (264,0), aliases=('GW',)),
}
ROLES = {}
def __init__(self, layermap: Any=None, roles: Any=None) -> None:
super().__init__(layermap=layermap or self.LAYERS, roles=roles or self.ROLES)
self._add_xsection_(xsection='strip',layers=['STRIP_COR'],growth=[0])
self._add_xsection_(xsection='rib',layers=['STRIP_COR','RIB_COR'],growth=[0,4]) ## 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_3','PAD_OPEN'],growth=[0,-2.5]) ## DRC 4.2 - [AMF-QP-RND-006]
+203
View File
@@ -0,0 +1,203 @@
from typing import Any
import nazca as nd
from .layer_models import LayerSpec, XSectionSpec
class Foundry:
## Generall parameters
STD_SMWG_WIDTH = 0.45
SLAB_GROWTH = 2
W_METAL_MIN = 1
SPACING_HEATER_MIN = 1
SPACING_METAL_MIN = 1.5
W_HEATER_MIN = 1
W_VIA_H2M = 0.25
SPACING_VIA_H2M = 0.35
ISL_W_MIN = 4
ISL_SP_MIN = 5
LAYERS = {}
ROLES = {}
ROLE_CANDIDATES = {
"strip_core": ("STRIP_COR", "WG_STRIP", "FECOR", "WG_COR", "RIB"),
"strip_clad": ("STRIP_CLD", "WG_CLD", "FECLD"),
"strip_trench": ("STRIP_TRE", "WG_TRE", "FETCH", "FETCH_TRE"),
"rib_core": ("RIB_COR", "MECOR", "SKT_COR", "WG_LOWRIB"),
"rib_clad": ("RIB_CLD", "MECLD", "SKT_CLD"),
"rib_trench": ("RIB_TRE", "METCH", "SKT_TRE"),
"shallow_rib_core": ("SRIB_COR", "SECOR", "FC_COR", "WG_HIGHRIB"),
"shallow_rib_clad": ("SRIB_CLD", "SECLD", "FC_CLD"),
"heater": ("HEATER", "HTR", "TIN", "MHD"),
"metal1": ("METAL", "M1", "M1_DRW", "UTM"),
"metal2": ("METAL_2", "M2", "M2_DRW", "UTM2"),
"metal3": ("METAL_3", "M3", "RDL_MET"),
"pad": ("PAD", "PAD_ELE", "PAD_AL", "BONDPAD", "BOND_PAD", "METPASS"),
"pad_open": ("PAD_OPEN", "OPEN", "OX_OPEN", "PASS2"),
"via_s2m": ("VIA_S2M", "CT_SI", "PCON", "CS"),
"via_h2m": ("VIA_H2M", "PVH", "VIA1"),
"via_m2m": ("VIA_M2M", "VIA12", "V1", "RDL_VIA"),
"isolation": ("ISL", "DT", "EXCLUSION", "ISOLATION"),
"n_implant": ("NLD", "N", "N1", "N2", "NBODY", "NW"),
"p_implant": ("PLD", "P", "P1", "P2", "PBODY", "PW"),
"np_implant": ("NP", "NPP", "N+", "NCONT"),
"pp_implant": ("PP", "PPP", "P+", "PCONT"),
"salicide": ("SALICIDE", "SA"),
}
show_pins = False
def __init__(self, layermap: Any=None, roles: Any=None) -> None:
self.layermap = dict(layermap or self.LAYERS)
self.native_layers = {}
self.layer_specs = {}
self.aliases = {}
self.roles = {}
self.xsections = {}
self._register_layermap(self.layermap)
self.roles.update(self._derive_roles())
self.roles.update(getattr(self, "ROLES", {}) or {})
if roles:
self.roles.update(roles)
def layer(self, name_or_role):
layer_name, spec, from_role = self._resolve_layer_ref(name_or_role)
if from_role:
return spec.native_name
return layer_name
def layer_gds(self, name_or_role):
return self._resolve_layer_ref(name_or_role)[1].gds
def native_name(self, name_or_role):
return self._resolve_layer_ref(name_or_role)[1].native_name
def add_xsection(self, xsection=None, layers=None, growth=None, growy=None):
return self._add_xsection_(xsection=xsection, layers=layers, growth=growth, growy=growy)
def _add_xsection_(self, xsection=None, layers=None, growth=None, growy=None):
if layers is None:
layers = []
if growth is None:
growth = []
if len(layers) != len(growth):
print("WARNING: In <mxpic::Foundry> layer growth do not match number of layer")
return 0
if xsection is not None:
nd.add_xsection(name=xsection)
resolved_layers = []
for idx in range(0, len(layers)):
layer_ref = self._layer_for_nazca(layers[idx])
resolved_layers.append(layer_ref)
nd.add_layer2xsection(
xsection=xsection,
layer=layer_ref,
leftedge=(0.5, growth[idx]),
rightedge=(-0.5, -growth[idx]),
overwrite=True,
growy1=growy,
growy2=growy,
)
self.xsections[xsection] = XSectionSpec(
name=xsection,
layers=tuple(resolved_layers),
growth=tuple(growth),
growy=growy,
)
setattr(self, "XS_" + xsection.upper(), xsection)
def _register_layermap(self, layermap):
for layer_name, layer_value in layermap.items():
self._register_layer_spec(self._normalize_layer_entry(layer_name, layer_value))
def _register_layer_spec(self, spec):
existing = self.native_layers.get(spec.native_name)
if existing is not None:
aliases = tuple(dict.fromkeys(existing.aliases + spec.aliases))
spec = LayerSpec(
native_name=spec.native_name,
gds=existing.gds,
aliases=aliases,
description=existing.description or spec.description,
)
self.native_layers[spec.native_name] = spec
names = (spec.native_name,) + spec.aliases
for name in names:
self.layer_specs[name] = spec
if name != spec.native_name:
self.aliases[name] = spec.native_name
self._register_nazca_layer(name, spec.gds)
self._register_default_xsection(name)
setattr(self, "LAYER_" + name, name)
setattr(self, "XS_" + name, name.lower())
def _normalize_layer_entry(self, layer_name, layer_value):
if isinstance(layer_value, LayerSpec):
return layer_value
if self._is_legacy_layer_value(layer_value):
gds, native_name = layer_value
aliases = () if layer_name == native_name else (layer_name,)
return LayerSpec(
native_name=native_name,
gds=self._normalize_gds(gds),
aliases=aliases,
)
return LayerSpec(native_name=layer_name, gds=self._normalize_gds(layer_value))
def _is_legacy_layer_value(self, layer_value):
return (
isinstance(layer_value, tuple)
and len(layer_value) == 2
and isinstance(layer_value[1], str)
)
def _normalize_gds(self, gds):
if isinstance(gds, list):
gds = tuple(gds)
if isinstance(gds, tuple) and len(gds) == 1:
return gds[0]
return gds
def _register_nazca_layer(self, name, gds):
nd.add_layer(name=name, layer=gds, overwrite=True)
def _register_default_xsection(self, layer_name):
xsection = layer_name.lower()
nd.add_xsection(name=xsection)
nd.add_layer2xsection(xsection=xsection, layer=layer_name)
def _derive_roles(self):
roles = {}
for role, candidates in self.ROLE_CANDIDATES.items():
for candidate in candidates:
if candidate in self.layer_specs:
roles[role] = candidate
break
return roles
def _resolve_layer_ref(self, name_or_role):
if name_or_role in self.roles:
target = self.roles[name_or_role]
return self._resolve_layer_name(target, from_role=True)
return self._resolve_layer_name(name_or_role, from_role=False)
def _resolve_layer_name(self, layer_name, from_role=False):
if layer_name not in self.layer_specs:
raise KeyError("Layer or role not found in technology: " + str(layer_name))
return layer_name, self.layer_specs[layer_name], from_role
def _layer_for_nazca(self, layer_ref):
if isinstance(layer_ref, str) and (layer_ref in self.layer_specs or layer_ref in self.roles):
return self.layer(layer_ref)
return layer_ref
+87
View File
@@ -0,0 +1,87 @@
from typing import Any
import nazca as nd
import numpy as np
from .Foundry import Foundry
from .layer_models import LayerSpec
class IMEC_Si220_Active(Foundry) :
lib_path = 'GDS_lib\\'
W_ISL = 5
SP_ISL = 5
SZ_CT = 0.25
SP_CT = 0.35
SP_METAL = 1.5
LAYERS = {
'WG_COR' : LayerSpec('WG_COR', (37,4), aliases=('STRIP_COR',)),
'WG_CLD' : LayerSpec('WG_CLD', (37,5), aliases=('STRIP_CLD',)),
'WG_TRE' : LayerSpec('WG_TRE', (37,6), aliases=('STRIP_TRE',)),
# 'WG_HOL' : LayerSpec('WG_HOL', (37,2), aliases=('STRIP_HOL',)),
'WG_PRI' : LayerSpec('WG_PRI', (38,0), aliases=('STRIP_PRI',)),
'FC_COR' : LayerSpec('FC_COR', (35,4), aliases=('SRIB_COR',)),
'FC_CLD' : LayerSpec('FC_CLD', (35,5), aliases=('SRIB_CLD',)),
'FC_TRE' : LayerSpec('FC_TRE', (35,6), aliases=('SRIB_TRE',)),
# 'FC_HOL' : LayerSpec('FC_HOL', (35,2), aliases=('SRIB_HOL',)),
'FC_PRI' : LayerSpec('FC_PRI', (36,0), aliases=('SRIB_PRI',)),
'SKT_COR' : LayerSpec('SKT_COR', (43,4), aliases=('RIB_COR',)),
'SKT_CLD' : LayerSpec('SKT_CLD', (43,5), aliases=('RIB_CLD',)),
'SKT_TRE' : LayerSpec('SKT_TRE', (43,6), aliases=('RIB_TRE',)),
# 'SKT_HOL' : LayerSpec('SKT_HOL', (43,2), aliases=('RIB_HOL',)),
'SKT_PRI' : LayerSpec('SKT_PRI', (44,0), aliases=('RIB_PRI',)),
'FCW_COR' : (31,24),
'FCW_CLD' : (31,25),
'FCW_TRE' : (31,26),
'FCW_PRI' : (32,0),
'METPASS' : LayerSpec('METPASS', (18,0), aliases=('PAD',)),
'MHD' : LayerSpec('MHD', (14,0), aliases=('HEATER',)),
'PCON' : LayerSpec('PCON', (10,0), aliases=('VIA_S2M',)), ## silicide to metal
'PVH' : LayerSpec('PVH', (53,0), aliases=('VIA_H2M',)), ## heaters to metal
'M1_DRW' : LayerSpec('M1_DRW', (11,0), aliases=('METAL',)),
'M1_NOFILL' : (11,9),
'M2_DRW' : LayerSpec('M2_DRW', (13,0), aliases=('METAL_2',)),
'M2_NOFILL' : (13,9),
'VIA12' : LayerSpec('VIA12', (12,0), aliases=('VIA_M2M',)),
'LPASS' : LayerSpec('LPASS', (91,0), aliases=('GC_OPEN',)),
'PASS1' : LayerSpec('PASS1', (16,0), aliases=('SiN_OPEN',)),
'PASS2' : LayerSpec('PASS2', (17,0), aliases=('PAD_OPEN',)),
'EXPOWG' : (84,0),
'N1': (2,0),
'P1': (3,0),
'N2': (6,0),
'P2': (7,0),
'NBODY': (25,0),
'PBODY': (26,0),
'NP': (4,0),
'PP': (5,0),
}
ROLES = {}
def __init__(self, layermap: Any=None, roles: Any=None) -> None:
super().__init__(layermap=layermap or self.LAYERS, roles=roles or self.ROLES)
self._add_xsection_(xsection='strip',layers=['STRIP_COR','STRIP_CLD'],growth=[0,self.SLAB_GROWTH])
self._add_xsection_(xsection='rib_s',layers=['RIB_COR','RIB_CLD'],growth=[0,self.SLAB_GROWTH])
self._add_xsection_(xsection='rib',layers=['RIB_COR','RIB_CLD','STRIP_COR','STRIP_CLD'],growth=[0,4.1,4,6.5])
self._add_xsection_(xsection='drib',layers=['RIB_COR','RIB_CLD','STRIP_COR','STRIP_CLD'],growth=[0,self.SLAB_GROWTH*2,self.SLAB_GROWTH,self.SLAB_GROWTH*2])
self._add_xsection_(xsection='pad',layers=['METAL_2','SiN_OPEN','PAD','PAD_OPEN'],growth=[0,-3,0,-3])
self._add_xsection_(xsection='expowg',layers=['EXPOWG','FCW_COR','FCW_CLD'],growth=[0,1,3])
+50
View File
@@ -0,0 +1,50 @@
from typing import Any
import nazca as nd
import numpy as np
from .Foundry import Foundry
from .layer_models import LayerSpec
class IMECAS_SiP(Foundry) :
lib_path = 'GDS_lib\\'
W_ISL = 10
SP_ISL = 10
SP_METAL = 1.5
LAYERS = {
'FECOR' : LayerSpec('FECOR', (10,2), aliases=('STRIP_COR',)),
'FECLD' : LayerSpec('FECLD', (10,3), aliases=('STRIP_CLD',)),
'FETCH' : LayerSpec('FETCH', (10,4), aliases=('STRIP_TRE',)),
'SECOR' : LayerSpec('SECOR', (11,2), aliases=('SRIB_COR',)),
'SECLD' : LayerSpec('SECLD', (11,3), aliases=('SRIB_CLD',)),
'SETCH' : LayerSpec('SETCH', (11,4), aliases=('SRIB_TRE',)),
'MECOR' : LayerSpec('MECOR', (12,2), aliases=('RIB_COR',)),
'MECLD' : LayerSpec('MECLD', (12,3), aliases=('RIB_CLD',)),
'METCH' : LayerSpec('METCH', (12,4), aliases=('RIB_TRE',)),
'M1' : LayerSpec('M1', (31,0), aliases=('METAL',)),
'TIN' : LayerSpec('TIN', (34,0), aliases=('HEATER',)),
'PAD' : (36,0),
'DETCH' : (80,0),
}
ROLES = {}
def __init__(self, layermap: Any=None, roles: Any=None) -> None:
super().__init__(layermap=layermap or self.LAYERS, roles=roles or self.ROLES)
self._add_xsection_(xsection='strip',layers=['STRIP_COR','STRIP_CLD'],growth=[0,self.SLAB_GROWTH])
self._add_xsection_(xsection='rib_s',layers=['RIB_COR','RIB_CLD'],growth=[0,self.SLAB_GROWTH])
self._add_xsection_(xsection='rib',layers=['RIB_COR','RIB_CLD','STRIP_COR','STRIP_CLD'],growth=[0,self.SLAB_GROWTH*2,self.SLAB_GROWTH,self.SLAB_GROWTH*2])
self._add_xsection_(xsection='drib',layers=['RIB_COR','RIB_CLD','STRIP_COR','STRIP_CLD'],growth=[0,self.SLAB_GROWTH*2,self.SLAB_GROWTH,self.SLAB_GROWTH*2])
self._add_xsection_(xsection='pad',layers=['METAL','PAD'],growth=[5,0])
self._add_xsection_(xsection='isl',layers=['DETCH'],growth=[0])
+88
View File
@@ -0,0 +1,88 @@
from typing import Any
import nazca as nd
import numpy as np
from .Foundry import Foundry
from .layer_models import LayerSpec
class SITRI_LSIN_SOI(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
LAYERS = {
'RIB' : LayerSpec('RIB', (1,0), aliases=('STRIP_COR',)),
'GRAT' : LayerSpec('GRAT', (3,0), aliases=('SRIB_COR',)),
'SLAB' : LayerSpec('SLAB', (2,0), aliases=('RIB_COR',)),
'SINWIN1' : (53,0),
'SINWG1' : (54,0),
'HTR' : LayerSpec('HTR', (45,0), aliases=('HEATER',)),
'VIA1' : LayerSpec('VIA1', (50,0), aliases=('VIA_H2M',)),
'CS' : LayerSpec('CS', (35,0), aliases=('VIA_S2M',)),
'METAL' : (40,0),
'METAL_2' : (55,0),
'BONDPAD' : LayerSpec('BONDPAD', (66,0), aliases=('PAD',)),
'DT' : LayerSpec('DT', (71,0), aliases=('ISL',)),
'OX_OPEN' : LayerSpec('OX_OPEN', (151,0), aliases=('OPEN',)),
### Active part
'PM_P' : LayerSpec('PM_P', (13,0), aliases=('P',), description='Legacy map used PM for this P implant layer.'),
'PM_N' : LayerSpec('PM_N', (14,0), aliases=('N',), description='Legacy map used PM for this N implant layer.'),
'PM' : (15,0),
'NM' : (16,0),
'PH' : (11,0),
'NH' : (12,0),
'PP' : (17,0),
'NP' : (18,0),
'GEN' : (21,0),
'GEP' : (22,0),
'GeEP' : LayerSpec('GeEP', (20,0), aliases=('GE',)),
'CG' : (36,0),
}
ROLES = {}
def __init__(self, layermap: Any=None, roles: Any=None) -> None:
super().__init__(layermap=layermap or self.LAYERS, roles=roles or self.ROLES)
self._add_xsection_(xsection='strip',layers=['STRIP_COR'],growth=[0])
self._add_xsection_(xsection='rib',layers=['STRIP_COR','RIB_COR','SRIB_COR'],growth=[0,4,2]) ## 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]
+100
View File
@@ -0,0 +1,100 @@
from typing import Any
import nazca as nd
from .Foundry import Foundry
class EOM1_2ML_CU(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
LAYERS = {
'WG_HM' : ((275,0)),
'WG_STRIP' : ((101,251)),
'WG_LOWRIB' : ((100,90)),
'WG_HIGHRIB' : ((232,0)),
'HEATER' : ((29,30)),
'CT_SI' : ((268,0)),
'CT_GE' : ((35,0)),
'UTV' : ((172,0)),
'RDL_VIA' : ((194,0)),
'UTM' : ((173,0)),
'UTM2' : ((197,0)),
'RDL_MET' : ((195,0)),
'PAD_ELE' : ((100,170)),
'PAD_OPTICAL' : ((100,160)),
"PAD_AL" : ((145,0)),
"WG_N" : ((263,0)),
"SiN_Rib_WG" : ((63,30)),
"SSIN0" : ((283,0)),
"SSIN1" : ((289,0)),
"SSIN2" : ((290,0)),
"SSIN3" : ((291,0)),
"EXCLUSION" : (57,0),
"SALICIDE" : ((128,60)),
"DM_EXL" : ((23,0)),
"DM_EXL_FE" : ((23,40)),
"DM_EXL_BE" : ((23,41)),
"OXIDE_FACET" : ((90,0)),
"DT" : ((404,0)),
### Active part
'P' : ((256,0)),
'N' : ((257,0)),
'PP' : ((258,0)),
'NP' : ((259,0)),
'PPP' : ((260,0)),
'NPP' : ((261,0)),
'PD_SIPP' : ((100,140)),
'PD_SINP' : ((100,150)),
}
ROLES = {
"strip_core": "WG_STRIP",
"rib_core": "WG_LOWRIB",
"rib_low": "WG_LOWRIB",
"shallow_rib_core": "WG_HIGHRIB",
"rib_high": "WG_HIGHRIB",
"heater": "HEATER",
"metal1": "UTM",
"metal2": "UTM2",
"metal3": "RDL_MET",
"pad": "PAD_ELE",
"electrical_pad": "PAD_ELE",
"optical_pad": "PAD_OPTICAL",
"pad_al": "PAD_AL",
"via_s2m": "CT_SI",
"via_h2m": "CT_SI",
"via_m2m": "RDL_VIA",
"isolation": "DT",
"exclusion": "EXCLUSION",
"n_implant": "N",
"p_implant": "P",
"np_implant": "NP",
"pp_implant": "PP",
"salicide": "SALICIDE",
}
def __init__(self, layermap: Any=None, roles: Any=None) -> None:
super().__init__(layermap=layermap or self.LAYERS, roles=roles or self.ROLES)
+26
View File
@@ -0,0 +1,26 @@
from .CUMEC import CUMEC_CSiP130Cu,CUMEC_CSiP180Al_PASSIVE
from .AMF import AMF_Si220_Active
from .ANT import ANT_Si220_MPW
from .IMEC import IMEC_Si220_Active
from .IMECAS import IMECAS_SiP
from .Foundry import Foundry
from .layer_models import LayerSpec, XSectionSpec
from .CompTek import CT_CU3ML
from .SITRI import SITRI_LSIN_SOI
from .Silterra import EOM1_2ML_CU
+18
View File
@@ -0,0 +1,18 @@
from dataclasses import dataclass
from typing import Any, Optional, Tuple
@dataclass(frozen=True)
class LayerSpec:
native_name: str
gds: Any
aliases: Tuple[str, ...] = ()
description: str = ""
@dataclass(frozen=True)
class XSectionSpec:
name: str
layers: Tuple[Any, ...]
growth: Tuple[Any, ...]
growy: Optional[Any] = None