New forge coding added
This commit is contained in:
@@ -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]
|
||||
@@ -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])
|
||||
|
||||
@@ -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])
|
||||
|
||||
|
||||
@@ -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]
|
||||
@@ -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
|
||||
@@ -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])
|
||||
|
||||
@@ -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])
|
||||
@@ -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]
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user