Skip to content

Commit 07fba47

Browse files
authored
Merge pull request #109 from siliconcompiler/interposer
interposer pdk
2 parents 4a29f3a + 12abfa8 commit 07fba47

File tree

113 files changed

+15203
-12
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

113 files changed

+15203
-12
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Supported PDKs:
1212
* [Skywater130](lambdapdk/sky130/base/README.md)
1313
* [Global Foundries 180](lambdapdk/gf180/README.md)
1414
* [IHP 180](https://github.com/IHP-GmbH/IHP-Open-PDK)
15+
* [interposer](lambdapdk/interposer/README.md)
1516

1617
# License
1718

lambdapdk/__init__.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ def get_pdks():
2020
Returns a list of pdk names in lambdapdk
2121
'''
2222

23-
from lambdapdk import asap7, freepdk45, sky130, gf180, ihp130
23+
from lambdapdk import asap7, freepdk45, sky130, gf180, ihp130, interposer
2424

2525
all_pdks = []
26-
for pdk_mod in [asap7, freepdk45, sky130, gf180, ihp130]:
26+
for pdk_mod in [asap7, freepdk45, sky130, gf180, ihp130, interposer]:
2727
pdks = pdk_mod.setup()
2828
if not isinstance(pdks, (list, tuple)):
2929
pdks = [pdks]
@@ -43,14 +43,16 @@ def get_libs():
4343
from lambdapdk.sky130.libs import sky130sc, sky130io, sky130sram
4444
from lambdapdk.gf180.libs import gf180mcu, gf180io, gf180sram
4545
from lambdapdk.ihp130.libs import sg13g2_stdcell, sg13g2_sram
46+
from lambdapdk.interposer.libs import bumps as interposer_bumps
4647

4748
all_libs = []
4849
for lib_mod in [
4950
asap7sc7p5t, fakeram7, fakeio7,
5051
nangate45, fakeram45,
5152
sky130sc, sky130io, sky130sram,
5253
gf180mcu, gf180io, gf180sram,
53-
sg13g2_stdcell, sg13g2_sram]:
54+
sg13g2_stdcell, sg13g2_sram,
55+
interposer_bumps]:
5456
libs = lib_mod.setup()
5557
if not isinstance(libs, (list, tuple)):
5658
libs = [libs]

lambdapdk/ihp130/libs/sg13g2_sram.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def setup():
1515
path_base = 'ihp-sg13g2/libs.ref/sg13g2_sram'
1616
lib.add('output', stackup, 'lef', f'{path_base}/lef/{mem_name}.lef')
1717
lib.add('output', stackup, 'gds', f'{path_base}/gds/{mem_name}.gds')
18-
lib.add('output', stackup, 'cdl', f'{path_base}/spice/{mem_name}.cdl')
18+
lib.add('output', stackup, 'cdl', f'{path_base}/cdl/{mem_name}.cdl')
1919

2020
lib.add('output', 'typ', 'nldm', f'{path_base}/lib/{mem_name}_typ_1p20V_25C.lib')
2121
lib.add('output', 'slow', 'nldm', f'{path_base}/lib/{mem_name}_slow_1p08V_125C.lib')

lambdapdk/interposer/README.md

+198
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
# Interposer
2+
3+
4+
The interposer PDK is a passive technology with a number of
5+
simulated stackups. The PDK contains enablement for place and
6+
route tools and design rule signoff.
7+
Note that this process design kit is provided as an academic
8+
and research aid only and the resulting designs are not manufacturable.
9+
10+
11+
12+
## Stackups
13+
### 3ML_0400
14+
```
15+
metal name | width | spacing
16+
------------------------------ | ------- | -------
17+
topmetal | 400nm | 400nm
18+
------------------------------ | ------- | -------
19+
metal2 | 400nm | 400nm
20+
------------------------------ | ------- | -------
21+
metal1 | 400nm | 400nm
22+
------------------------------ | ------- | -------
23+
```
24+
25+
### 4ML_0400
26+
```
27+
metal name | width | spacing
28+
------------------------------ | ------- | -------
29+
topmetal | 400nm | 400nm
30+
------------------------------ | ------- | -------
31+
metal3 | 400nm | 400nm
32+
------------------------------ | ------- | -------
33+
metal2 | 400nm | 400nm
34+
------------------------------ | ------- | -------
35+
metal1 | 400nm | 400nm
36+
------------------------------ | ------- | -------
37+
```
38+
39+
### 5ML_0400
40+
```
41+
metal name | width | spacing
42+
------------------------------ | ------- | -------
43+
topmetal | 400nm | 400nm
44+
------------------------------ | ------- | -------
45+
metal4 | 400nm | 400nm
46+
------------------------------ | ------- | -------
47+
metal3 | 400nm | 400nm
48+
------------------------------ | ------- | -------
49+
metal2 | 400nm | 400nm
50+
------------------------------ | ------- | -------
51+
metal1 | 400nm | 400nm
52+
------------------------------ | ------- | -------
53+
```
54+
55+
### 3ML_0800
56+
```
57+
metal name | width | spacing
58+
------------------------------ | ------- | -------
59+
topmetal | 800nm | 800nm
60+
------------------------------ | ------- | -------
61+
metal2 | 800nm | 800nm
62+
------------------------------ | ------- | -------
63+
metal1 | 800nm | 800nm
64+
------------------------------ | ------- | -------
65+
```
66+
67+
### 4ML_0800
68+
```
69+
metal name | width | spacing
70+
------------------------------ | ------- | -------
71+
topmetal | 800nm | 800nm
72+
------------------------------ | ------- | -------
73+
metal3 | 800nm | 800nm
74+
------------------------------ | ------- | -------
75+
metal2 | 800nm | 800nm
76+
------------------------------ | ------- | -------
77+
metal1 | 800nm | 800nm
78+
------------------------------ | ------- | -------
79+
```
80+
81+
### 5ML_0800
82+
```
83+
metal name | width | spacing
84+
------------------------------ | ------- | -------
85+
topmetal | 800nm | 800nm
86+
------------------------------ | ------- | -------
87+
metal4 | 800nm | 800nm
88+
------------------------------ | ------- | -------
89+
metal3 | 800nm | 800nm
90+
------------------------------ | ------- | -------
91+
metal2 | 800nm | 800nm
92+
------------------------------ | ------- | -------
93+
metal1 | 800nm | 800nm
94+
------------------------------ | ------- | -------
95+
```
96+
97+
### 3ML_2000
98+
```
99+
metal name | width | spacing
100+
------------------------------ | ------- | -------
101+
topmetal | 2000nm | 2000nm
102+
------------------------------ | ------- | -------
103+
metal2 | 2000nm | 2000nm
104+
------------------------------ | ------- | -------
105+
metal1 | 2000nm | 2000nm
106+
------------------------------ | ------- | -------
107+
```
108+
109+
### 4ML_2000
110+
```
111+
metal name | width | spacing
112+
------------------------------ | ------- | -------
113+
topmetal | 2000nm | 2000nm
114+
------------------------------ | ------- | -------
115+
metal3 | 2000nm | 2000nm
116+
------------------------------ | ------- | -------
117+
metal2 | 2000nm | 2000nm
118+
------------------------------ | ------- | -------
119+
metal1 | 2000nm | 2000nm
120+
------------------------------ | ------- | -------
121+
```
122+
123+
### 5ML_2000
124+
```
125+
metal name | width | spacing
126+
------------------------------ | ------- | -------
127+
topmetal | 2000nm | 2000nm
128+
------------------------------ | ------- | -------
129+
metal4 | 2000nm | 2000nm
130+
------------------------------ | ------- | -------
131+
metal3 | 2000nm | 2000nm
132+
------------------------------ | ------- | -------
133+
metal2 | 2000nm | 2000nm
134+
------------------------------ | ------- | -------
135+
metal1 | 2000nm | 2000nm
136+
------------------------------ | ------- | -------
137+
```
138+
139+
### 3ML_0400_2000
140+
```
141+
metal name | width | spacing
142+
------------------------------ | ------- | -------
143+
topmetal | 2000nm | 2000nm
144+
------------------------------ | ------- | -------
145+
metal2 | 800nm | 800nm
146+
------------------------------ | ------- | -------
147+
metal1 | 400nm | 400nm
148+
------------------------------ | ------- | -------
149+
```
150+
151+
### 4ML_0400_2000
152+
```
153+
metal name | width | spacing
154+
------------------------------ | ------- | -------
155+
topmetal | 2000nm | 2000nm
156+
------------------------------ | ------- | -------
157+
metal3 | 2000nm | 2000nm
158+
------------------------------ | ------- | -------
159+
metal2 | 400nm | 400nm
160+
------------------------------ | ------- | -------
161+
metal1 | 400nm | 400nm
162+
------------------------------ | ------- | -------
163+
```
164+
165+
### 5ML_0400_2000
166+
```
167+
metal name | width | spacing
168+
------------------------------ | ------- | -------
169+
topmetal | 2000nm | 2000nm
170+
------------------------------ | ------- | -------
171+
metal4 | 2000nm | 2000nm
172+
------------------------------ | ------- | -------
173+
metal3 | 800nm | 800nm
174+
------------------------------ | ------- | -------
175+
metal2 | 400nm | 400nm
176+
------------------------------ | ------- | -------
177+
metal1 | 400nm | 400nm
178+
------------------------------ | ------- | -------
179+
```
180+
181+
182+
## License
183+
```
184+
Copyright 2024 ZeroASIC Corp
185+
186+
Licensed under the Apache License, Version 2.0 (the "License");
187+
you may not use this file except in compliance with the License.
188+
You may obtain a copy of the License at
189+
190+
https://www.apache.org/licenses/LICENSE-2.0
191+
192+
Unless required by applicable law or agreed to in writing, software
193+
distributed under the License is distributed on an "AS IS" BASIS,
194+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
195+
See the License for the specific language governing permissions and
196+
limitations under the License.
197+
198+
```

lambdapdk/interposer/__init__.py

+111
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
import os
2+
import siliconcompiler
3+
from lambdapdk import register_data_source
4+
5+
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+
11+
12+
####################################################
13+
# PDK Setup
14+
####################################################
15+
def setup():
16+
'''
17+
The interposer PDK is a passive technology with a number of
18+
simulated stackups. The PDK contains enablement for place and
19+
route tools and design rule signoff.
20+
Note that this process design kit is provided as an academic
21+
and research aid only and the resulting designs are not manufacturable.
22+
'''
23+
24+
foundry = 'virtual'
25+
process = 'interposer'
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')
37+
38+
pdk = siliconcompiler.PDK(process, package='lambdapdk')
39+
register_data_source(pdk)
40+
41+
# process name
42+
pdk.set('pdk', process, 'foundry', foundry)
43+
pdk.set('pdk', process, 'node', node)
44+
pdk.set('pdk', process, 'version', 'v0.0.1')
45+
pdk.set('pdk', process, 'stackup', stackups)
46+
pdk.set('pdk', process, 'wafersize', wafersize)
47+
pdk.set('pdk', process, 'edgemargin', edgemargin)
48+
pdk.set('pdk', process, 'scribe', (hscribe, vscribe))
49+
50+
# APR Setup
51+
for stackup in stackups:
52+
for tool in ('openroad', 'klayout', 'magic'):
53+
pdk.set('pdk', process, 'aprtech', tool, stackup, libtype, 'lef',
54+
pdkdir + f'/apr/{stackup}.lef')
55+
56+
pdk.set('pdk', process, 'minlayer', stackup, 'metal1')
57+
pdk.set('pdk', process, 'maxlayer', stackup, 'topmetal')
58+
59+
# DRC Runsets
60+
pdk.set('pdk', process, 'drc', 'runset', 'klayout', stackup, 'drc',
61+
pdkdir + f'/setup/klayout/{stackup}.drc')
62+
63+
key = 'drc_params:drc'
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')
77+
78+
# Openroad global routing grid derating
79+
openroad_layer_adjustments = {
80+
'metal1': 0.20,
81+
'metal2': 0.20,
82+
'metal3': 0.20,
83+
'metal4': 0.20,
84+
'metal5': 0.20,
85+
'metal6': 0.20,
86+
'topmetal': 0.20
87+
}
88+
for layer, adj in openroad_layer_adjustments.items():
89+
if layer != 'topmetal' and int(layer[-1]) >= int(stackup[0]):
90+
continue
91+
pdk.set('pdk', process, 'var', 'openroad', f'{layer}_adjustment', stackup, adj)
92+
93+
pdk.set('pdk', process, 'var', 'openroad', 'rclayer_signal', stackup, 'metal2')
94+
pdk.set('pdk', process, 'var', 'openroad', 'rclayer_clock', stackup, 'metal2')
95+
96+
pdk.set('pdk', process, 'var', 'openroad', 'pin_layer_vertical', stackup, 'metal2')
97+
pdk.set('pdk', process, 'var', 'openroad', 'pin_layer_horizontal', stackup, 'metal3')
98+
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+
104+
return pdk
105+
106+
107+
#########################
108+
if __name__ == "__main__":
109+
pdk = setup()
110+
pdk.write_manifest(f'{pdk.top()}.json')
111+
pdk.check_filepaths()

0 commit comments

Comments
 (0)