lambdapdk 0.1.56__py3-none-any.whl → 0.2.0rc2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- lambdapdk/__init__.py +262 -113
- lambdapdk/asap7/__init__.py +73 -96
- lambdapdk/asap7/libs/asap7sc7p5t.py +120 -159
- lambdapdk/asap7/libs/fakeio7.py +17 -26
- lambdapdk/asap7/libs/fakekit7.py +14 -19
- lambdapdk/asap7/libs/fakeram7.py +230 -33
- lambdapdk/freepdk45/__init__.py +59 -89
- lambdapdk/freepdk45/libs/fakeram45.py +72 -27
- lambdapdk/freepdk45/libs/nangate45.py +86 -125
- lambdapdk/gf180/__init__.py +216 -131
- lambdapdk/gf180/libs/gf180io.py +103 -68
- lambdapdk/gf180/libs/gf180mcu.py +184 -138
- lambdapdk/gf180/libs/gf180sram.py +121 -63
- lambdapdk/ihp130/__init__.py +84 -119
- lambdapdk/ihp130/libs/sg13g2_io.py +54 -41
- lambdapdk/ihp130/libs/sg13g2_sram.py +94 -52
- lambdapdk/ihp130/libs/sg13g2_stdcell.py +113 -135
- lambdapdk/interposer/__init__.py +110 -74
- lambdapdk/interposer/libs/bumps.py +41 -26
- lambdapdk/sky130/__init__.py +70 -92
- lambdapdk/sky130/libs/sky130io.py +44 -48
- lambdapdk/sky130/libs/sky130sc.py +170 -206
- lambdapdk/sky130/libs/sky130sram.py +44 -34
- {lambdapdk-0.1.56.dist-info → lambdapdk-0.2.0rc2.dist-info}/METADATA +3 -3
- lambdapdk-0.2.0rc2.dist-info/RECORD +30 -0
- lambdapdk-0.2.0rc2.dist-info/entry_points.txt +2 -0
- lambdapdk-0.1.56.dist-info/RECORD +0 -30
- lambdapdk-0.1.56.dist-info/entry_points.txt +0 -4
- {lambdapdk-0.1.56.dist-info → lambdapdk-0.2.0rc2.dist-info}/WHEEL +0 -0
- {lambdapdk-0.1.56.dist-info → lambdapdk-0.2.0rc2.dist-info}/licenses/LICENSE +0 -0
- {lambdapdk-0.1.56.dist-info → lambdapdk-0.2.0rc2.dist-info}/top_level.txt +0 -0
lambdapdk/ihp130/__init__.py
CHANGED
|
@@ -1,23 +1,18 @@
|
|
|
1
|
+
from pathlib import Path
|
|
1
2
|
|
|
2
|
-
import
|
|
3
|
-
import siliconcompiler
|
|
4
|
-
from lambdapdk import register_data_source
|
|
3
|
+
from lambdapdk import LambdaPDK, _LambdaPath
|
|
5
4
|
|
|
6
5
|
|
|
7
6
|
pdk_rev = '0854e9bcd558b68c573149038b4c95706314e2f1'
|
|
8
7
|
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
ref=pdk_rev)
|
|
9
|
+
class _IHP130Path(_LambdaPath):
|
|
10
|
+
def __init__(self):
|
|
11
|
+
super().__init__()
|
|
12
|
+
self.set_dataroot("ihp130", "git+https://github.com/IHP-GmbH/IHP-Open-PDK", pdk_rev)
|
|
15
13
|
|
|
16
14
|
|
|
17
|
-
|
|
18
|
-
# PDK Setup
|
|
19
|
-
####################################################
|
|
20
|
-
def setup():
|
|
15
|
+
class IHP130PDK(LambdaPDK, _IHP130Path):
|
|
21
16
|
'''
|
|
22
17
|
130nm BiCMOS Open Source PDK, dedicated for Analog/Digital, Mixed Signal and RF Design
|
|
23
18
|
|
|
@@ -38,110 +33,80 @@ def setup():
|
|
|
38
33
|
|
|
39
34
|
* https://github.com/IHP-GmbH/IHP-Open-PDK
|
|
40
35
|
'''
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
'
|
|
89
|
-
|
|
90
|
-
'
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
pdk.set('pdk', process, 'pexmodel', 'openroad-openrcx', stackup, corner,
|
|
119
|
-
lpdkdir + '/pex/openroad/' + corner + '.rules', package='lambdapdk')
|
|
120
|
-
|
|
121
|
-
# DRC
|
|
122
|
-
drcs = {
|
|
123
|
-
"maximal": 'ihp-sg13g2/libs.tech/klayout/tech/drc/sg13g2_maximal.lydrc',
|
|
124
|
-
"minimal": 'ihp-sg13g2/libs.tech/klayout/tech/drc/sg13g2_minimal.lydrc'
|
|
125
|
-
}
|
|
126
|
-
for drc, runset in drcs.items():
|
|
127
|
-
pdk.set('pdk', process, 'drc', 'runset', 'klayout', stackup, drc, runset)
|
|
128
|
-
|
|
129
|
-
key = f'drc_params:{drc}'
|
|
130
|
-
pdk.add('pdk', process, 'var', 'klayout', stackup, key, 'in_gds=<input>')
|
|
131
|
-
pdk.add('pdk', process, 'var', 'klayout', stackup, key, 'cell=<topcell>')
|
|
132
|
-
pdk.add('pdk', process, 'var', 'klayout', stackup, key, 'report_file=<report>')
|
|
133
|
-
|
|
134
|
-
# Documentation
|
|
135
|
-
pdk.set('pdk', process, 'doc', 'overview',
|
|
136
|
-
'ihp-sg13g2/libs.doc/doc/SG13G2_os_process_spec.pdf')
|
|
137
|
-
pdk.set('pdk', process, 'doc', 'drc_rules',
|
|
138
|
-
'ihp-sg13g2/libs.doc/doc/SG13G2_os_layout_rules.pdf')
|
|
139
|
-
|
|
140
|
-
return pdk
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
#########################
|
|
144
|
-
if __name__ == "__main__":
|
|
145
|
-
pdk = setup()
|
|
146
|
-
pdk.write_manifest(f'{pdk.top()}.json')
|
|
147
|
-
pdk.check_filepaths()
|
|
36
|
+
def __init__(self):
|
|
37
|
+
super().__init__()
|
|
38
|
+
self.set_name("ihp130")
|
|
39
|
+
|
|
40
|
+
self.set_foundry("Leibniz-Institut für innovative Mikroelektronik")
|
|
41
|
+
self.set_version(pdk_rev)
|
|
42
|
+
self.set_node(130)
|
|
43
|
+
self.set_stackup("5M2TL")
|
|
44
|
+
|
|
45
|
+
pdk_path = Path("lambdapdk", "ihp130", "base")
|
|
46
|
+
|
|
47
|
+
# Docs
|
|
48
|
+
with self.active_dataroot("ihp130"):
|
|
49
|
+
self.add_doc("quickstart", "ihp-sg13g2/libs.doc/doc/SG13G2_os_process_spec.pdf")
|
|
50
|
+
self.add_doc("signoff", "ihp-sg13g2/libs.doc/doc/SG13G2_os_layout_rules.pdf")
|
|
51
|
+
|
|
52
|
+
with self.active_dataroot("ihp130"):
|
|
53
|
+
# APR Setup
|
|
54
|
+
with self.active_fileset("views.lef"):
|
|
55
|
+
self.add_file("ihp-sg13g2/libs.ref/sg13g2_stdcell/lef/sg13g2_tech.lef")
|
|
56
|
+
for tool in ('openroad', 'klayout', 'magic'):
|
|
57
|
+
self.add_aprtechfileset(tool)
|
|
58
|
+
|
|
59
|
+
with self.active_fileset("layermap"):
|
|
60
|
+
self.add_file("ihp-sg13g2/libs.tech/klayout/tech/sg13g2.map", filetype="layermap")
|
|
61
|
+
|
|
62
|
+
self.set_aprroutinglayers(min="Metal2", max="Metal5")
|
|
63
|
+
|
|
64
|
+
# Klayout setup
|
|
65
|
+
with self.active_dataroot("ihp130"):
|
|
66
|
+
with self.active_fileset("klayout.techmap"):
|
|
67
|
+
self.add_file("ihp-sg13g2/libs.tech/klayout/tech/sg13g2.lyt", filetype="layermap")
|
|
68
|
+
self.add_file("ihp-sg13g2/libs.tech/klayout/tech/sg13g2.lyp", filetype="display")
|
|
69
|
+
self.add_layermapfileset("klayout", "def", "klayout")
|
|
70
|
+
self.add_displayfileset("klayout")
|
|
71
|
+
self.add_layermapfileset("klayout", "def", "gds", fileset="layermap")
|
|
72
|
+
|
|
73
|
+
# OpenROAD setup
|
|
74
|
+
self.set_openroad_rclayers(signal="Metal2", clock="Metal5")
|
|
75
|
+
self.add_openroad_pinlayers(vertical="Metal2", horizontal="Metal3")
|
|
76
|
+
|
|
77
|
+
# Openroad global routing grid derating
|
|
78
|
+
openroad_layer_adjustments = {
|
|
79
|
+
'Metal1': 0.25,
|
|
80
|
+
'Metal2': 0.25,
|
|
81
|
+
'Metal3': 0.25,
|
|
82
|
+
'Metal4': 0.25,
|
|
83
|
+
'Metal5': 0.25,
|
|
84
|
+
'TopMetal1': 0.00,
|
|
85
|
+
'TopMetal2': 0.00
|
|
86
|
+
}
|
|
87
|
+
for layer, adj in openroad_layer_adjustments.items():
|
|
88
|
+
self.set_openroad_globalroutingderating(layer, adj)
|
|
89
|
+
|
|
90
|
+
# PEX
|
|
91
|
+
with self.active_dataroot("lambdapdk"):
|
|
92
|
+
with self.active_fileset("openroad.pex"):
|
|
93
|
+
self.add_file(pdk_path / "pex" / "openroad" / "typical.tcl", filetype="tcl")
|
|
94
|
+
self.add_file(pdk_path / "pex" / "openroad" / "typical.rules", filetype="openrcx")
|
|
95
|
+
|
|
96
|
+
self.add_pexmodelfileset("openroad", "typical")
|
|
97
|
+
self.add_pexmodelfileset("openroad-openrcx", "typical")
|
|
98
|
+
|
|
99
|
+
# DRC
|
|
100
|
+
drcs = {
|
|
101
|
+
"maximal": 'ihp-sg13g2/libs.tech/klayout/tech/drc/sg13g2_maximal.lydrc',
|
|
102
|
+
"minimal": 'ihp-sg13g2/libs.tech/klayout/tech/drc/sg13g2_minimal.lydrc'
|
|
103
|
+
}
|
|
104
|
+
with self.active_dataroot("ihp130"):
|
|
105
|
+
for drc, runset in drcs.items():
|
|
106
|
+
with self.active_fileset(f"klayout.drc.{drc}"):
|
|
107
|
+
self.add_file(runset, filetype="drc")
|
|
108
|
+
self.add_runsetfileset("drc", "klayout", drc)
|
|
109
|
+
|
|
110
|
+
self.add_klayout_drcparam(drc, "in_gds=<input>")
|
|
111
|
+
self.add_klayout_drcparam(drc, "cell=<topcell>")
|
|
112
|
+
self.add_klayout_drcparam(drc, "report_file=<report>")
|
|
@@ -1,57 +1,70 @@
|
|
|
1
|
-
import
|
|
2
|
-
import siliconcompiler
|
|
3
|
-
from lambdapdk import register_data_source
|
|
4
|
-
from lambdapdk.ihp130 import register_ihp130_data_source
|
|
1
|
+
from pathlib import Path
|
|
5
2
|
|
|
3
|
+
from lambdapdk import LambdaLibrary
|
|
4
|
+
from lambdapdk.ihp130 import IHP130PDK, _IHP130Path
|
|
6
5
|
|
|
7
|
-
|
|
6
|
+
|
|
7
|
+
class _IHP130_IOLibrary(LambdaLibrary, _IHP130Path):
|
|
8
8
|
'''
|
|
9
9
|
IHP 130 IO Cells
|
|
10
10
|
'''
|
|
11
|
-
|
|
11
|
+
def __init__(self, voltage):
|
|
12
|
+
super().__init__()
|
|
13
|
+
self.set_name(f"sg13g2_io_{voltage}")
|
|
14
|
+
|
|
15
|
+
path_base = Path("lambdapdk", "ihp130", "libs", "sg13g2_io")
|
|
12
16
|
|
|
13
|
-
|
|
14
|
-
register_ihp130_data_source(lib)
|
|
15
|
-
register_data_source(lib)
|
|
17
|
+
self.add_asic_pdk(IHP130PDK())
|
|
16
18
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
+
with self.active_dataroot("ihp130"):
|
|
20
|
+
if voltage == "1p2V":
|
|
21
|
+
for corner_name, filename in [
|
|
22
|
+
('slow', 'sg13g2_io_slow_1p08V_3p0V_125C.lib'),
|
|
23
|
+
('typical', 'sg13g2_io_typ_1p2V_3p3V_25C.lib'),
|
|
24
|
+
('fast', 'sg13g2_io_fast_1p32V_3p6V_m40C.lib')]:
|
|
25
|
+
with self.active_fileset(f"models.timing.{corner_name}.nldm"):
|
|
26
|
+
self.add_file(f"ihp-sg13g2/libs.ref/sg13g2_io/lib/{filename}")
|
|
27
|
+
self.add_asic_libcornerfileset(corner_name, "nldm")
|
|
28
|
+
else:
|
|
29
|
+
for corner_name, filename in [
|
|
30
|
+
('slow', 'sg13g2_io_slow_1p35V_3p0V_125C.lib'),
|
|
31
|
+
('typical', 'sg13g2_io_typ_1p5V_3p3V_25C.lib'),
|
|
32
|
+
('fast', 'sg13g2_io_fast_1p65V_3p6V_m40C.lib')]:
|
|
33
|
+
with self.active_fileset(f"models.timing.{corner_name}.nldm"):
|
|
34
|
+
self.add_file(f"ihp-sg13g2/libs.ref/sg13g2_io/lib/{filename}")
|
|
35
|
+
self.add_asic_libcornerfileset(corner_name, "nldm")
|
|
19
36
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
lib.set('output', 'typical', 'nldm',
|
|
23
|
-
'ihp-sg13g2/libs.ref/sg13g2_io/lib/sg13g2_io_typ_1p5V_3p3V_25C.lib')
|
|
24
|
-
lib.set('output', 'fast', 'nldm',
|
|
25
|
-
'ihp-sg13g2/libs.ref/sg13g2_io/lib/sg13g2_io_fast_1p32V_3p6V_m40C.lib')
|
|
37
|
+
with self.active_fileset("models.spice"):
|
|
38
|
+
self.add_file("ihp-sg13g2/libs.ref/sg13g2_io/spice/sg13g2_io.spi", filetype="spice")
|
|
26
39
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
40
|
+
with self.active_dataroot("ihp130"):
|
|
41
|
+
with self.active_fileset("models.physical"):
|
|
42
|
+
self.add_file("ihp-sg13g2/libs.ref/sg13g2_io/lef/sg13g2_io.lef")
|
|
43
|
+
self.add_file("ihp-sg13g2/libs.ref/sg13g2_io/gds/sg13g2_io.gds")
|
|
44
|
+
self.add_asic_aprfileset()
|
|
30
45
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
46
|
+
with self.active_fileset("models.lvs"):
|
|
47
|
+
self.add_file("ihp-sg13g2/libs.ref/sg13g2_io/cdl/sg13g2_io.cdl")
|
|
48
|
+
self.add_asic_aprfileset()
|
|
34
49
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
50
|
+
self.add_asic_celllist('filler', ['sg13g2_Filler200',
|
|
51
|
+
'sg13g2_Filler400',
|
|
52
|
+
'sg13g2_Filler1000',
|
|
53
|
+
'sg13g2_Filler2000',
|
|
54
|
+
'sg13g2_Filler4000',
|
|
55
|
+
'sg13g2_Filler10000'])
|
|
41
56
|
|
|
42
|
-
|
|
43
|
-
|
|
57
|
+
with self.active_dataroot("lambdapdk"):
|
|
58
|
+
with self.active_fileset("models.blackbox"):
|
|
59
|
+
self.add_file(path_base / "blackbox" / "sg13g2_io.v")
|
|
60
|
+
self.add_yosys_blackbox_fileset("models.blackbox")
|
|
44
61
|
|
|
45
|
-
lambda_lib = siliconcompiler.Library('lambdalib_sg13g2_io', package='lambdapdk')
|
|
46
|
-
register_data_source(lambda_lib)
|
|
47
|
-
lambda_lib.add('option', 'ydir', os.path.join(libdir, 'lambda'))
|
|
48
|
-
lambda_lib.use(lib)
|
|
49
|
-
lambda_lib.set('asic', 'macrolib', lib.design)
|
|
50
62
|
|
|
51
|
-
|
|
63
|
+
class IHP130_IO_1p2(_IHP130_IOLibrary):
|
|
64
|
+
def __init__(self):
|
|
65
|
+
super().__init__("1p2")
|
|
52
66
|
|
|
53
67
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
lib.write_manifest(f'{lib.top()}.json')
|
|
68
|
+
class IHP130_IO_1p5(_IHP130_IOLibrary):
|
|
69
|
+
def __init__(self):
|
|
70
|
+
super().__init__("1p5")
|
|
@@ -1,52 +1,94 @@
|
|
|
1
|
-
from
|
|
2
|
-
|
|
3
|
-
from
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
path_base =
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
|
|
3
|
+
from lambdalib import LambalibTechLibrary
|
|
4
|
+
from lambdapdk import LambdaLibrary, _LambdaPath
|
|
5
|
+
from lambdapdk.ihp130 import IHP130PDK, _IHP130Path
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class _IHP130SRAMLibrary(LambdaLibrary, _IHP130Path):
|
|
9
|
+
def __init__(self, config):
|
|
10
|
+
super().__init__()
|
|
11
|
+
self.set_name(f'RM_IHPSG13_1P_{config}_c2_bm_bist')
|
|
12
|
+
|
|
13
|
+
self.add_asic_pdk(IHP130PDK())
|
|
14
|
+
|
|
15
|
+
path_base = Path("lambdapdk", "ihp130", "libs", "sg13g2_sram")
|
|
16
|
+
|
|
17
|
+
with self.active_dataroot("ihp130"):
|
|
18
|
+
with self.active_fileset("models.physical"):
|
|
19
|
+
self.add_file(f"ihp-sg13g2/libs.ref/sg13g2_sram/lef/{self.name}.lef")
|
|
20
|
+
self.add_file(f"ihp-sg13g2/libs.ref/sg13g2_sram/gds/{self.name}.gds")
|
|
21
|
+
self.add_asic_aprfileset()
|
|
22
|
+
|
|
23
|
+
with self.active_fileset("models.lvs"):
|
|
24
|
+
self.add_file(f"ihp-sg13g2/libs.ref/sg13g2_sram/cdl/{self.name}.cdl")
|
|
25
|
+
self.add_asic_aprfileset()
|
|
26
|
+
|
|
27
|
+
for corner_name, filename in [
|
|
28
|
+
('slow', f'{self.name}_slow_1p08V_125C.lib'),
|
|
29
|
+
('typical', f'{self.name}_typ_1p20V_25C.lib'),
|
|
30
|
+
('fast', f'{self.name}_fast_1p32V_m55C.lib')]:
|
|
31
|
+
with self.active_fileset(f"models.timing.nldm.{corner_name}"):
|
|
32
|
+
self.add_file(f"ihp-sg13g2/libs.ref/sg13g2_sram/lib/{filename}")
|
|
33
|
+
self.add_asic_libcornerfileset(corner_name, "nldm")
|
|
34
|
+
|
|
35
|
+
with self.active_fileset("rtl"):
|
|
36
|
+
self.add_file(f"ihp-sg13g2/libs.ref/sg13g2_sram/verilog/{self.name}.v")
|
|
37
|
+
self.add_file("ihp-sg13g2/libs.ref/sg13g2_sram/verilog/"
|
|
38
|
+
"RM_IHPSG13_1P_core_behavioral_bm_bist.v")
|
|
39
|
+
|
|
40
|
+
with self.active_dataroot("lambdapdk"):
|
|
41
|
+
self.add_openroad_power_grid_file(path_base / "apr" / "openroad" / "pdngen.tcl")
|
|
42
|
+
self.add_openroad_global_connect_file(
|
|
43
|
+
path_base / "apr" / "openroad" / "global_connect.tcl")
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class IHP130_SRAM_1024x64(_IHP130SRAMLibrary):
|
|
47
|
+
def __init__(self):
|
|
48
|
+
super().__init__("1024x64")
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class IHP130_SRAM_2048x64(_IHP130SRAMLibrary):
|
|
52
|
+
def __init__(self):
|
|
53
|
+
super().__init__("2048x64")
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class IHP130_SRAM_256x48(_IHP130SRAMLibrary):
|
|
57
|
+
def __init__(self):
|
|
58
|
+
super().__init__("256x48")
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class IHP130_SRAM_256x64(_IHP130SRAMLibrary):
|
|
62
|
+
def __init__(self):
|
|
63
|
+
super().__init__("256x64")
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class IHP130_SRAM_512x64(_IHP130SRAMLibrary):
|
|
67
|
+
def __init__(self):
|
|
68
|
+
super().__init__("512x64")
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class IHP130_SRAM_64x64(_IHP130SRAMLibrary):
|
|
72
|
+
def __init__(self):
|
|
73
|
+
super().__init__("64x64")
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class IHP130Lambdalib_SinglePort(LambalibTechLibrary, _LambdaPath):
|
|
77
|
+
def __init__(self):
|
|
78
|
+
super().__init__("la_spram", [
|
|
79
|
+
IHP130_SRAM_1024x64,
|
|
80
|
+
IHP130_SRAM_2048x64,
|
|
81
|
+
IHP130_SRAM_256x48,
|
|
82
|
+
IHP130_SRAM_256x64,
|
|
83
|
+
IHP130_SRAM_512x64,
|
|
84
|
+
IHP130_SRAM_64x64])
|
|
85
|
+
self.set_name("ihp130_la_spram")
|
|
86
|
+
|
|
87
|
+
# version
|
|
88
|
+
self.set_version("v1")
|
|
89
|
+
|
|
90
|
+
lib_path = Path("lambdapdk", "ihp130", "libs", "sg13g2_sram")
|
|
91
|
+
|
|
92
|
+
with self.active_dataroot("lambdapdk"):
|
|
93
|
+
with self.active_fileset("rtl"):
|
|
94
|
+
self.add_file(lib_path / "lambda" / "la_spram.v")
|