lambdapdk 0.1.56__py3-none-any.whl → 0.2.0rc1__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 +217 -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 +45 -48
- lambdapdk/sky130/libs/sky130sc.py +170 -206
- lambdapdk/sky130/libs/sky130sram.py +45 -34
- {lambdapdk-0.1.56.dist-info → lambdapdk-0.2.0rc1.dist-info}/METADATA +3 -3
- lambdapdk-0.2.0rc1.dist-info/RECORD +30 -0
- lambdapdk-0.2.0rc1.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.0rc1.dist-info}/WHEEL +0 -0
- {lambdapdk-0.1.56.dist-info → lambdapdk-0.2.0rc1.dist-info}/licenses/LICENSE +0 -0
- {lambdapdk-0.1.56.dist-info → lambdapdk-0.2.0rc1.dist-info}/top_level.txt +0 -0
|
@@ -1,139 +1,117 @@
|
|
|
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 _IHP130StdCell(LambdaLibrary, _IHP130Path):
|
|
8
8
|
'''
|
|
9
|
-
|
|
9
|
+
Standard cell library for IHP130
|
|
10
10
|
'''
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
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
|
-
lib.set('option', 'var', f'{tool}_tiehigh_port', "L_HI")
|
|
119
|
-
lib.set('option', 'var', f'{tool}_tielow_cell', "sg13g2_tielo")
|
|
120
|
-
lib.set('option', 'var', f'{tool}_tielow_port', "L_LO")
|
|
121
|
-
|
|
122
|
-
# Bambu setup
|
|
123
|
-
lib.set('option', 'var', 'bambu_clock_multiplier', "1") # convert from ns -> ns
|
|
124
|
-
|
|
125
|
-
libs = [lib]
|
|
126
|
-
for libtype in ('stdlib', 'auxlib'):
|
|
127
|
-
lambda_lib = siliconcompiler.Library(f'lambdalib_{libtype}_{libname}',
|
|
128
|
-
package='lambdapdk')
|
|
129
|
-
register_data_source(lambda_lib)
|
|
130
|
-
lambda_lib.add('option', 'ydir', libdir + f'/lambda/{libtype}')
|
|
131
|
-
libs.append(lambda_lib)
|
|
132
|
-
|
|
133
|
-
return libs
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
#########################
|
|
137
|
-
if __name__ == "__main__":
|
|
138
|
-
lib = setup()
|
|
139
|
-
lib.write_manifest(f'{lib.top()}.json')
|
|
11
|
+
def __init__(self, voltage):
|
|
12
|
+
super().__init__()
|
|
13
|
+
self.set_name(f"sg13g2_stdcell_{voltage}")
|
|
14
|
+
|
|
15
|
+
self.add_asic_pdk(IHP130PDK())
|
|
16
|
+
|
|
17
|
+
self.add_asic_site("CoreSite")
|
|
18
|
+
|
|
19
|
+
lib_path = Path('lambdapdk', "ihp130", 'libs', "sg13g2_stdcell")
|
|
20
|
+
|
|
21
|
+
with self.active_dataroot("ihp130"):
|
|
22
|
+
if voltage == "1p2V":
|
|
23
|
+
for corner_name, filename in [
|
|
24
|
+
('slow', 'sg13g2_stdcell_slow_1p08V_125C.lib'),
|
|
25
|
+
('typical', 'sg13g2_stdcell_typ_1p20V_25C.lib'),
|
|
26
|
+
('fast', 'sg13g2_stdcell_fast_1p32V_m40C.lib')]:
|
|
27
|
+
with self.active_fileset(f"models.timing.{corner_name}.nldm"):
|
|
28
|
+
self.add_file(f"ihp-sg13g2/libs.ref/sg13g2_stdcell/lib/{filename}")
|
|
29
|
+
self.add_asic_libcornerfileset(corner_name, "nldm")
|
|
30
|
+
else:
|
|
31
|
+
for corner_name, filename in [
|
|
32
|
+
('slow', 'sg13g2_stdcell_slow_1p35V_125C.lib'),
|
|
33
|
+
('typical', 'sg13g2_stdcell_typ_1p50V_25C.lib'),
|
|
34
|
+
('fast', 'sg13g2_stdcell_fast_1p65V_m40C.lib')]:
|
|
35
|
+
with self.active_fileset(f"models.timing.{corner_name}.nldm"):
|
|
36
|
+
self.add_file(f"ihp-sg13g2/libs.ref/sg13g2_stdcell/lib/{filename}")
|
|
37
|
+
self.add_asic_libcornerfileset(corner_name, "nldm")
|
|
38
|
+
|
|
39
|
+
with self.active_fileset("models.spice"):
|
|
40
|
+
self.add_file("ihp-sg13g2/libs.ref/sg13g2_stdcell/spice/sg13g2_stdcell.spice")
|
|
41
|
+
|
|
42
|
+
with self.active_dataroot("ihp130"):
|
|
43
|
+
with self.active_fileset("models.physical"):
|
|
44
|
+
self.add_file("ihp-sg13g2/libs.ref/sg13g2_stdcell/lef/sg13g2_stdcell.lef")
|
|
45
|
+
self.add_file("ihp-sg13g2/libs.ref/sg13g2_stdcell/gds/sg13g2_stdcell.gds")
|
|
46
|
+
self.add_asic_aprfileset()
|
|
47
|
+
|
|
48
|
+
with self.active_fileset("models.lvs"):
|
|
49
|
+
self.add_file("ihp-sg13g2/libs.ref/sg13g2_stdcell/cdl/sg13g2_stdcell.cdl")
|
|
50
|
+
self.add_asic_aprfileset()
|
|
51
|
+
|
|
52
|
+
with self.active_fileset("rtl"):
|
|
53
|
+
self.add_file("ihp-sg13g2/libs.ref/sg13g2_stdcell/verilog/sg13g2_stdcell.v")
|
|
54
|
+
self.add_asic_aprfileset()
|
|
55
|
+
|
|
56
|
+
# tie cells
|
|
57
|
+
self.add_asic_celllist('tie', ["sg13g2_tiehi",
|
|
58
|
+
"sg13g2_tielo"])
|
|
59
|
+
|
|
60
|
+
# hold cells
|
|
61
|
+
self.add_asic_celllist('hold', ["sg13g2_dlygate4sd1_1",
|
|
62
|
+
"sg13g2_dlygate4sd2_1",
|
|
63
|
+
"sg13g2_dlygate4sd3_1"])
|
|
64
|
+
|
|
65
|
+
# filler
|
|
66
|
+
self.add_asic_celllist('filler', ["sg13g2_fill_1",
|
|
67
|
+
"sg13g2_fill_2",
|
|
68
|
+
"sg13g2_fill_4",
|
|
69
|
+
"sg13g2_fill_8"])
|
|
70
|
+
|
|
71
|
+
# decap
|
|
72
|
+
self.add_asic_celllist('decap', ["sg13g2_decap_4",
|
|
73
|
+
"sg13g2_decap_8"])
|
|
74
|
+
|
|
75
|
+
# antenna
|
|
76
|
+
self.add_asic_celllist('antenna', ["sg13g2_antennanp"])
|
|
77
|
+
|
|
78
|
+
# Dont use
|
|
79
|
+
self.add_asic_celllist('dontuse', ["sg13g2_lgcp_1",
|
|
80
|
+
"sg13g2_sighold",
|
|
81
|
+
"sg13g2_slgcp_1",
|
|
82
|
+
"sg13g2_dfrbp_2"])
|
|
83
|
+
|
|
84
|
+
# Setup for yosys
|
|
85
|
+
with self.active_dataroot("lambdapdk"):
|
|
86
|
+
self.set_yosys_driver_cell("sg13g2_buf_4")
|
|
87
|
+
self.set_yosys_buffer_cell("sg13g2_buf_4", "A", "X")
|
|
88
|
+
self.set_yosys_tielow_cell("sg13g2_tielo", "L_LO")
|
|
89
|
+
self.set_yosys_tiehigh_cell("sg13g2_tiehi", "L_HI")
|
|
90
|
+
self.set_yosys_abc(1000, 17)
|
|
91
|
+
self.set_yosys_tristatebuffer_map(
|
|
92
|
+
lib_path / "techmap" / "yosys" / "cells_tristatebuf.v")
|
|
93
|
+
self.add_yosys_tech_map(lib_path / "techmap" / "yosys" / "cells_latch.v")
|
|
94
|
+
|
|
95
|
+
# Setup for OpenROAD
|
|
96
|
+
with self.active_dataroot("lambdapdk"):
|
|
97
|
+
self.set_openroad_placement_density(0.65)
|
|
98
|
+
self.set_openroad_tielow_cell("sg13g2_tielo", "L_LO")
|
|
99
|
+
self.set_openroad_tiehigh_cell("sg13g2_tiehi", "L_HI")
|
|
100
|
+
self.set_openroad_macro_placement_halo(40, 40)
|
|
101
|
+
self.set_openroad_tapcells_file(lib_path / "apr" / "openroad" / "tapcell.tcl")
|
|
102
|
+
self.add_openroad_global_connect_file(
|
|
103
|
+
lib_path / "apr" / "openroad" / "global_connect.tcl")
|
|
104
|
+
self.add_openroad_power_grid_file(lib_path / "apr" / "openroad" / "pdngen.tcl")
|
|
105
|
+
|
|
106
|
+
# Setup for bambu
|
|
107
|
+
self.set_bambu_clock_multiplier(1)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
class IHP130StdCell_1p2(_IHP130StdCell):
|
|
111
|
+
def __init__(self):
|
|
112
|
+
super().__init__("1p2")
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class IHP130StdCell_1p5(_IHP130StdCell):
|
|
116
|
+
def __init__(self):
|
|
117
|
+
super().__init__("1p5")
|
lambdapdk/interposer/__init__.py
CHANGED
|
@@ -1,18 +1,9 @@
|
|
|
1
|
-
import
|
|
2
|
-
import siliconcompiler
|
|
3
|
-
from lambdapdk import register_data_source
|
|
1
|
+
from pathlib import Path
|
|
4
2
|
|
|
3
|
+
from lambdapdk import LambdaPDK
|
|
5
4
|
|
|
6
|
-
stackups = []
|
|
7
|
-
for m in ("3ML", "4ML", "5ML"):
|
|
8
|
-
for w in ("0400", "0800", "2000", "0400_2000"):
|
|
9
|
-
stackups.append(f'{m}_{w}')
|
|
10
5
|
|
|
11
|
-
|
|
12
|
-
####################################################
|
|
13
|
-
# PDK Setup
|
|
14
|
-
####################################################
|
|
15
|
-
def setup():
|
|
6
|
+
class _Interposer(LambdaPDK):
|
|
16
7
|
'''
|
|
17
8
|
The interposer PDK is a passive technology with a number of
|
|
18
9
|
simulated stackups. The PDK contains enablement for place and
|
|
@@ -20,60 +11,37 @@ def setup():
|
|
|
20
11
|
Note that this process design kit is provided as an academic
|
|
21
12
|
and research aid only and the resulting designs are not manufacturable.
|
|
22
13
|
'''
|
|
14
|
+
def __init__(self, stackup):
|
|
15
|
+
super().__init__()
|
|
16
|
+
self.set_name(f"interposer_{stackup}")
|
|
23
17
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
libtype = 'none'
|
|
28
|
-
|
|
29
|
-
node = 130
|
|
30
|
-
# TODO: dummy numbers, only matter for cost estimation
|
|
31
|
-
wafersize = 300
|
|
32
|
-
hscribe = 0.1
|
|
33
|
-
vscribe = 0.1
|
|
34
|
-
edgemargin = 2
|
|
35
|
-
|
|
36
|
-
pdkdir = os.path.join('lambdapdk', 'interposer', 'base')
|
|
18
|
+
self.set_foundry("virtual")
|
|
19
|
+
self.set_version("v0.0.1")
|
|
20
|
+
self.set_stackup(stackup)
|
|
37
21
|
|
|
38
|
-
|
|
39
|
-
register_data_source(pdk)
|
|
22
|
+
pdk_path = Path("lambdapdk", "interposer", "base")
|
|
40
23
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
pdk.set('pdk', process, 'edgemargin', edgemargin)
|
|
48
|
-
pdk.set('pdk', process, 'scribe', (hscribe, vscribe))
|
|
24
|
+
with self.active_dataroot("lambdapdk"):
|
|
25
|
+
# APR Setup
|
|
26
|
+
with self.active_fileset("views.lef"):
|
|
27
|
+
self.add_file(pdk_path / "apr" / f"{stackup}.lef")
|
|
28
|
+
for tool in ('openroad', 'klayout', 'magic'):
|
|
29
|
+
self.add_aprtechfileset(tool)
|
|
49
30
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
for tool in ('openroad', 'klayout', 'magic'):
|
|
53
|
-
pdk.set('pdk', process, 'aprtech', tool, stackup, libtype, 'lef',
|
|
54
|
-
pdkdir + f'/apr/{stackup}.lef')
|
|
31
|
+
with self.active_fileset("layermap"):
|
|
32
|
+
self.add_file(pdk_path / "apr" / f"{stackup}.layermap", filetype="layermap")
|
|
55
33
|
|
|
56
|
-
|
|
57
|
-
pdk.set('pdk', process, 'maxlayer', stackup, 'topmetal')
|
|
34
|
+
self.set_aprroutinglayers(min="metal1", max="topmetal")
|
|
58
35
|
|
|
59
|
-
#
|
|
60
|
-
|
|
61
|
-
|
|
36
|
+
# KLayout Setup
|
|
37
|
+
with self.active_dataroot("lambdapdk"):
|
|
38
|
+
# Klayout setup file
|
|
39
|
+
with self.active_fileset("klayout.techmap"):
|
|
40
|
+
self.add_file(pdk_path / "setup" / "klayout" / f"{stackup}.lyp", filetype="display")
|
|
41
|
+
self.add_displayfileset("klayout")
|
|
42
|
+
self.add_layermapfileset("klayout", "def", "gds", fileset="layermap")
|
|
62
43
|
|
|
63
|
-
|
|
64
|
-
pdk.add('pdk', process, 'var', 'klayout', stackup, key, 'input=<input>')
|
|
65
|
-
pdk.add('pdk', process, 'var', 'klayout', stackup, key, 'topcell=<topcell>')
|
|
66
|
-
pdk.add('pdk', process, 'var', 'klayout', stackup, key, 'report=<report>')
|
|
67
|
-
pdk.add('pdk', process, 'var', 'klayout', stackup, key, 'threads=<threads>')
|
|
68
|
-
|
|
69
|
-
# Layer map and display file
|
|
70
|
-
pdk.set('pdk', process, 'layermap', 'klayout', 'def', 'gds', stackup,
|
|
71
|
-
pdkdir + f'/apr/{stackup}.layermap')
|
|
72
|
-
pdk.set('pdk', process, 'display', 'klayout', stackup,
|
|
73
|
-
pdkdir + f'/setup/klayout/{stackup}.lyp')
|
|
74
|
-
|
|
75
|
-
pdk.set('pdk', process, 'aprtech', 'openroad', stackup, libtype, 'fill',
|
|
76
|
-
pdkdir + f'/dfm/openroad/{stackup}.fill.json')
|
|
44
|
+
# OpenROAD Setup
|
|
77
45
|
|
|
78
46
|
# Openroad global routing grid derating
|
|
79
47
|
openroad_layer_adjustments = {
|
|
@@ -88,24 +56,92 @@ def setup():
|
|
|
88
56
|
for layer, adj in openroad_layer_adjustments.items():
|
|
89
57
|
if layer != 'topmetal' and int(layer[-1]) >= int(stackup[0]):
|
|
90
58
|
continue
|
|
91
|
-
|
|
59
|
+
self.set_openroad_globalroutingderating(layer, adj)
|
|
60
|
+
|
|
61
|
+
self.set_openroad_rclayers(signal="metal2", clock="metal2")
|
|
62
|
+
self.add_openroad_pinlayers(vertical="metal2", horizontal="metal3")
|
|
63
|
+
|
|
64
|
+
with self.active_dataroot("lambdapdk"):
|
|
65
|
+
with self.active_fileset("openroad.fill"):
|
|
66
|
+
self.add_file(pdk_path / "dfm" / "openroad" / f"{stackup}.fill.json",
|
|
67
|
+
filetype="fill")
|
|
68
|
+
self.add_aprtechfileset("openroad")
|
|
69
|
+
|
|
70
|
+
# PEX
|
|
71
|
+
for corner in ["minimum", "typical", "maximum"]:
|
|
72
|
+
with self.active_fileset(f"openroad.pex.{corner}"):
|
|
73
|
+
self.add_file(pdk_path / "pex" / "openroad" / f"{stackup}.{corner}.tcl",
|
|
74
|
+
filetype="tcl")
|
|
75
|
+
|
|
76
|
+
self.add_pexmodelfileset("openroad", corner)
|
|
77
|
+
|
|
78
|
+
# DRC
|
|
79
|
+
with self.active_dataroot("lambdapdk"):
|
|
80
|
+
with self.active_fileset("klayout.drc"):
|
|
81
|
+
self.add_file(pdk_path / "setup" / "klayout" / f"{stackup}.drc", filetype="drc")
|
|
82
|
+
self.add_runsetfileset("drc", "klayout", "drc")
|
|
83
|
+
|
|
84
|
+
self.add_klayout_drcparam("drc", "in_gds=<input>")
|
|
85
|
+
self.add_klayout_drcparam("drc", "topcell=<topcell>")
|
|
86
|
+
self.add_klayout_drcparam("drc", "report=<report>")
|
|
87
|
+
self.add_klayout_drcparam("drc", "threads=<threads>")
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class Interposer_3ML_0400(_Interposer):
|
|
91
|
+
def __init__(self):
|
|
92
|
+
super().__init__("3ML_0400")
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class Interposer_3ML_0800(_Interposer):
|
|
96
|
+
def __init__(self):
|
|
97
|
+
super().__init__("3ML_0800")
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class Interposer_3ML_2000(_Interposer):
|
|
101
|
+
def __init__(self):
|
|
102
|
+
super().__init__("3ML_2000")
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
class Interposer_3ML_0400_2000(_Interposer):
|
|
106
|
+
def __init__(self):
|
|
107
|
+
super().__init__("3ML_0400_2000")
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
class Interposer_4ML_0400(_Interposer):
|
|
111
|
+
def __init__(self):
|
|
112
|
+
super().__init__("4ML_0400")
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class Interposer_4ML_0800(_Interposer):
|
|
116
|
+
def __init__(self):
|
|
117
|
+
super().__init__("4ML_0800")
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
class Interposer_4ML_2000(_Interposer):
|
|
121
|
+
def __init__(self):
|
|
122
|
+
super().__init__("4ML_2000")
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
class Interposer_4ML_0400_2000(_Interposer):
|
|
126
|
+
def __init__(self):
|
|
127
|
+
super().__init__("4ML_0400_2000")
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
class Interposer_5ML_0400(_Interposer):
|
|
131
|
+
def __init__(self):
|
|
132
|
+
super().__init__("5ML_0400")
|
|
92
133
|
|
|
93
|
-
pdk.set('pdk', process, 'var', 'openroad', 'rclayer_signal', stackup, 'metal2')
|
|
94
|
-
pdk.set('pdk', process, 'var', 'openroad', 'rclayer_clock', stackup, 'metal2')
|
|
95
134
|
|
|
96
|
-
|
|
97
|
-
|
|
135
|
+
class Interposer_5ML_0800(_Interposer):
|
|
136
|
+
def __init__(self):
|
|
137
|
+
super().__init__("5ML_0800")
|
|
98
138
|
|
|
99
|
-
# PEX
|
|
100
|
-
for corner in ["minimum", "typical", "maximum"]:
|
|
101
|
-
pdk.set('pdk', process, 'pexmodel', 'openroad', stackup, corner,
|
|
102
|
-
pdkdir + '/pex/openroad/' + stackup + '.' + corner + '.tcl')
|
|
103
139
|
|
|
104
|
-
|
|
140
|
+
class Interposer_5ML_2000(_Interposer):
|
|
141
|
+
def __init__(self):
|
|
142
|
+
super().__init__("5ML_2000")
|
|
105
143
|
|
|
106
144
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
pdk.write_manifest(f'{pdk.top()}.json')
|
|
111
|
-
pdk.check_filepaths()
|
|
145
|
+
class Interposer_5ML_0400_2000(_Interposer):
|
|
146
|
+
def __init__(self):
|
|
147
|
+
super().__init__("5ML_0400_2000")
|
|
@@ -1,31 +1,46 @@
|
|
|
1
|
-
import
|
|
2
|
-
import siliconcompiler
|
|
3
|
-
from lambdapdk import register_data_source
|
|
4
|
-
from lambdapdk.interposer import stackups
|
|
1
|
+
from pathlib import Path
|
|
5
2
|
|
|
3
|
+
from lambdapdk import LambdaLibrary
|
|
6
4
|
|
|
7
|
-
|
|
5
|
+
from lambdapdk.interposer import Interposer_3ML_0400, \
|
|
6
|
+
Interposer_3ML_0800, \
|
|
7
|
+
Interposer_3ML_2000, \
|
|
8
|
+
Interposer_3ML_0400_2000, \
|
|
9
|
+
Interposer_4ML_0400, \
|
|
10
|
+
Interposer_4ML_0800, \
|
|
11
|
+
Interposer_4ML_2000, \
|
|
12
|
+
Interposer_4ML_0400_2000, \
|
|
13
|
+
Interposer_5ML_0400, \
|
|
14
|
+
Interposer_5ML_0800, \
|
|
15
|
+
Interposer_5ML_2000, \
|
|
16
|
+
Interposer_5ML_0400_2000
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class BumpLibrary(LambdaLibrary):
|
|
8
20
|
'''
|
|
9
21
|
Interposer bump library
|
|
10
22
|
'''
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
23
|
+
def __init__(self):
|
|
24
|
+
super().__init__()
|
|
25
|
+
self.set_name("interposer_bumps")
|
|
26
|
+
|
|
27
|
+
path_base = Path("lambdapdk", "interposer", "libs", 'bumps')
|
|
28
|
+
|
|
29
|
+
self.add_asic_pdk(Interposer_3ML_0400(), default=False)
|
|
30
|
+
self.add_asic_pdk(Interposer_3ML_0800(), default=False)
|
|
31
|
+
self.add_asic_pdk(Interposer_3ML_2000(), default=False)
|
|
32
|
+
self.add_asic_pdk(Interposer_3ML_0400_2000(), default=False)
|
|
33
|
+
self.add_asic_pdk(Interposer_4ML_0400(), default=False)
|
|
34
|
+
self.add_asic_pdk(Interposer_4ML_0800(), default=False)
|
|
35
|
+
self.add_asic_pdk(Interposer_4ML_2000(), default=False)
|
|
36
|
+
self.add_asic_pdk(Interposer_4ML_0400_2000(), default=False)
|
|
37
|
+
self.add_asic_pdk(Interposer_5ML_0400(), default=False)
|
|
38
|
+
self.add_asic_pdk(Interposer_5ML_0800(), default=False)
|
|
39
|
+
self.add_asic_pdk(Interposer_5ML_2000(), default=False)
|
|
40
|
+
self.add_asic_pdk(Interposer_5ML_0400_2000(), default=False)
|
|
41
|
+
|
|
42
|
+
with self.active_dataroot("lambdapdk"):
|
|
43
|
+
with self.active_fileset("models.physical"):
|
|
44
|
+
self.add_file(path_base / "lef" / "bumps.lef")
|
|
45
|
+
self.add_file(path_base / "gds" / "bumps.gds")
|
|
46
|
+
self.add_asic_aprfileset()
|