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 CHANGED
@@ -1,101 +1,291 @@
1
1
  import os.path
2
- import siliconcompiler.package as sc_package
2
+ from siliconcompiler.pathschema import PathSchema
3
3
 
4
+ from siliconcompiler.package import PythonPathResolver
4
5
 
5
- __version__ = "0.1.56"
6
+ from siliconcompiler.tools.klayout import KLayoutPDK
7
+ from siliconcompiler.tools.openroad import OpenROADPDK
6
8
 
9
+ from siliconcompiler.tools.yosys import YosysStdCellLibrary
10
+ from siliconcompiler.tools.openroad import OpenROADStdCellLibrary
11
+ from siliconcompiler.tools.bambu import BambuStdCellLibrary
12
+ from siliconcompiler.tools.klayout import KLayoutLibrary
7
13
 
8
- def register_data_source(chip):
9
- sc_package.register_python_data_source(
10
- chip,
11
- "lambdapdk",
12
- "lambdapdk",
13
- "https://github.com/siliconcompiler/lambdapdk/archive/refs/tags/",
14
- alternative_ref=f"v{__version__}",
15
- python_module_path_append=".."
16
- )
14
+ __version__ = "0.2.0-rc2"
17
15
 
18
16
 
19
- def setup_libs():
20
- '''
21
- Returns a list of libraries in lambdapdk
22
- '''
17
+ class _LambdaPath(PathSchema):
18
+ def __init__(self):
19
+ super().__init__()
20
+ PythonPathResolver.set_dataroot(
21
+ self,
22
+ "lambdapdk",
23
+ "lambdapdk",
24
+ "https://github.com/siliconcompiler/lambdapdk/archive/refs/tags/",
25
+ alternative_ref=f"v{__version__}",
26
+ python_module_path_append="..")
23
27
 
24
- from lambdapdk.asap7.libs import asap7sc7p5t, fakeram7, fakeio7, fakekit7
25
- from lambdapdk.freepdk45.libs import nangate45, fakeram45
26
- from lambdapdk.sky130.libs import sky130sc, sky130io, sky130sram
27
- from lambdapdk.gf180.libs import gf180mcu, gf180io, gf180sram
28
- from lambdapdk.ihp130.libs import sg13g2_stdcell, sg13g2_sram, sg13g2_io
29
- from lambdapdk.interposer.libs import bumps as interposer_bumps
30
-
31
- all_libs = []
32
- for lib_mod in [
33
- asap7sc7p5t, fakeram7, fakeio7, fakekit7,
34
- nangate45, fakeram45,
35
- sky130sc, sky130io, sky130sram,
36
- gf180mcu, gf180io, gf180sram,
37
- sg13g2_stdcell, sg13g2_sram, sg13g2_io,
38
- interposer_bumps]:
39
- libs = lib_mod.setup()
40
- if not isinstance(libs, (list, tuple)):
41
- libs = [libs]
42
- for lib in libs:
43
- all_libs.append(lib)
44
-
45
- return all_libs
46
-
47
-
48
- def setup_pdks():
49
- '''
50
- Returns a list of pdks in lambdapdk
51
- '''
52
28
 
53
- from lambdapdk import asap7, freepdk45, sky130, gf180, ihp130, interposer
29
+ class LambdaPDK(KLayoutPDK, OpenROADPDK, _LambdaPath):
30
+ def __init__(self):
31
+ super().__init__()
54
32
 
55
- all_pdks = []
56
- for pdk_mod in [asap7, freepdk45, sky130, gf180, ihp130, interposer]:
57
- pdks = pdk_mod.setup()
58
- if not isinstance(pdks, (list, tuple)):
59
- pdks = [pdks]
60
- for pdk in pdks:
61
- all_pdks.append(pdk)
62
33
 
63
- return all_pdks
34
+ class LambdaLibrary(YosysStdCellLibrary,
35
+ OpenROADStdCellLibrary,
36
+ KLayoutLibrary,
37
+ BambuStdCellLibrary,
38
+ _LambdaPath):
39
+ def __init__(self):
40
+ super().__init__()
64
41
 
65
42
 
66
- def setup():
43
+ def get_pdks():
67
44
  '''
68
- Returns a list of all pdks and libraries in lambdapdk
45
+ Returns a list of pdks in lambdapdk
69
46
  '''
70
47
 
71
- return [
72
- *setup_pdks(),
73
- *setup_libs()
74
- ]
75
-
76
-
77
- def get_pdks():
48
+ from lambdapdk.asap7 import ASAP7PDK
49
+ from lambdapdk.freepdk45 import FreePDK45PDK
50
+ from lambdapdk.sky130 import Sky130PDK
51
+ from lambdapdk.gf180 import GF180_3LM_1TM_6K_7t, \
52
+ GF180_3LM_1TM_6K_9t, \
53
+ GF180_3LM_1TM_9K_7t, \
54
+ GF180_3LM_1TM_9K_9t, \
55
+ GF180_3LM_1TM_11K_7t, \
56
+ GF180_3LM_1TM_11K_9t, \
57
+ GF180_3LM_1TM_30K_7t, \
58
+ GF180_3LM_1TM_30K_9t, \
59
+ GF180_4LM_1TM_6K_7t, \
60
+ GF180_4LM_1TM_6K_9t, \
61
+ GF180_4LM_1TM_9K_7t, \
62
+ GF180_4LM_1TM_9K_9t, \
63
+ GF180_4LM_1TM_11K_7t, \
64
+ GF180_4LM_1TM_11K_9t, \
65
+ GF180_4LM_1TM_30K_7t, \
66
+ GF180_4LM_1TM_30K_9t, \
67
+ GF180_5LM_1TM_9K_7t, \
68
+ GF180_5LM_1TM_9K_9t, \
69
+ GF180_5LM_1TM_11K_7t, \
70
+ GF180_5LM_1TM_11K_9t, \
71
+ GF180_6LM_1TM_9K_7t, \
72
+ GF180_6LM_1TM_9K_9t
73
+ from lambdapdk.ihp130 import IHP130PDK
74
+ from lambdapdk.interposer import Interposer_3ML_0400, \
75
+ Interposer_3ML_0800, \
76
+ Interposer_3ML_2000, \
77
+ Interposer_3ML_0400_2000, \
78
+ Interposer_4ML_0400, \
79
+ Interposer_4ML_0800, \
80
+ Interposer_4ML_2000, \
81
+ Interposer_4ML_0400_2000, \
82
+ Interposer_5ML_0400, \
83
+ Interposer_5ML_0800, \
84
+ Interposer_5ML_2000, \
85
+ Interposer_5ML_0400_2000
86
+
87
+ return set([
88
+ ASAP7PDK(),
89
+ FreePDK45PDK(),
90
+ Sky130PDK(),
91
+ IHP130PDK(),
92
+ GF180_3LM_1TM_6K_7t(),
93
+ GF180_3LM_1TM_6K_9t(),
94
+ GF180_3LM_1TM_9K_7t(),
95
+ GF180_3LM_1TM_9K_9t(),
96
+ GF180_3LM_1TM_11K_7t(),
97
+ GF180_3LM_1TM_11K_9t(),
98
+ GF180_3LM_1TM_30K_7t(),
99
+ GF180_3LM_1TM_30K_9t(),
100
+ GF180_4LM_1TM_6K_7t(),
101
+ GF180_4LM_1TM_6K_9t(),
102
+ GF180_4LM_1TM_9K_7t(),
103
+ GF180_4LM_1TM_9K_9t(),
104
+ GF180_4LM_1TM_11K_7t(),
105
+ GF180_4LM_1TM_11K_9t(),
106
+ GF180_4LM_1TM_30K_7t(),
107
+ GF180_4LM_1TM_30K_9t(),
108
+ GF180_5LM_1TM_9K_7t(),
109
+ GF180_5LM_1TM_9K_9t(),
110
+ GF180_5LM_1TM_11K_7t(),
111
+ GF180_5LM_1TM_11K_9t(),
112
+ GF180_6LM_1TM_9K_7t(),
113
+ GF180_6LM_1TM_9K_9t(),
114
+ Interposer_3ML_0400(),
115
+ Interposer_3ML_0800(),
116
+ Interposer_3ML_2000(),
117
+ Interposer_3ML_0400_2000(),
118
+ Interposer_4ML_0400(),
119
+ Interposer_4ML_0800(),
120
+ Interposer_4ML_2000(),
121
+ Interposer_4ML_0400_2000(),
122
+ Interposer_5ML_0400(),
123
+ Interposer_5ML_0800(),
124
+ Interposer_5ML_2000(),
125
+ Interposer_5ML_0400_2000()
126
+ ])
127
+
128
+
129
+ def get_pdk_names():
78
130
  '''
79
- Returns a list of pdk names in lambdapdk
131
+ Returns a list of pdks in lambdapdk
80
132
  '''
81
133
 
82
- all_pdks = []
83
- for pdk in setup_pdks():
84
- all_pdks.append(pdk.design)
85
-
86
- return set(all_pdks)
134
+ return set([pdk.name for pdk in get_pdks()])
87
135
 
88
136
 
89
137
  def get_libs():
90
138
  '''
91
- Returns a list of libraries names in lambdapdk
139
+ Returns a list of libraries in lambdapdk
92
140
  '''
93
141
 
94
- all_libs = []
95
- for lib in setup_libs():
96
- all_libs.append(lib.design)
142
+ from lambdapdk.asap7.libs.asap7sc7p5t import ASAP7SC7p5RVT, ASAP7SC7p5SLVT, ASAP7SC7p5LVT
143
+ from lambdapdk.asap7.libs.fakeio7 import FakeIO7Library
144
+ from lambdapdk.asap7.libs.fakekit7 import FakeKit7Library
145
+ from lambdapdk.asap7.libs.fakeram7 import \
146
+ FakeRAM7_dp_64x32, \
147
+ FakeRAM7_sp_64x32, \
148
+ FakeRAM7_dp_128x32, \
149
+ FakeRAM7_sp_128x32, \
150
+ FakeRAM7_dp_256x32, \
151
+ FakeRAM7_sp_256x32, \
152
+ FakeRAM7_dp_256x64, \
153
+ FakeRAM7_sp_256x64, \
154
+ FakeRAM7_dp_512x32, \
155
+ FakeRAM7_sp_512x32, \
156
+ FakeRAM7_dp_512x64, \
157
+ FakeRAM7_sp_512x64, \
158
+ FakeRAM7_dp_512x128, \
159
+ FakeRAM7_sp_512x128, \
160
+ FakeRAM7_dp_1024x32, \
161
+ FakeRAM7_sp_1024x32, \
162
+ FakeRAM7_dp_1024x64, \
163
+ FakeRAM7_sp_1024x64, \
164
+ FakeRAM7_dp_2048x32, \
165
+ FakeRAM7_sp_2048x32, \
166
+ FakeRAM7_dp_2048x64, \
167
+ FakeRAM7_sp_2048x64, \
168
+ FakeRAM7_dp_4096x32, \
169
+ FakeRAM7_sp_4096x32, \
170
+ FakeRAM7_dp_4096x64, \
171
+ FakeRAM7_sp_4096x64, \
172
+ FakeRAM7_dp_8192x32, \
173
+ FakeRAM7_sp_8192x32, \
174
+ FakeRAM7_dp_8192x64, \
175
+ FakeRAM7_sp_8192x64, \
176
+ FakeRAM7Lambdalib_SinglePort, \
177
+ FakeRAM7Lambdalib_DoublePort
178
+ from lambdapdk.freepdk45.libs.nangate45 import Nangate45
179
+ from lambdapdk.freepdk45.libs.fakeram45 import \
180
+ FakeRAM45_64x32, \
181
+ FakeRAM45_128x32, \
182
+ FakeRAM45_256x32, \
183
+ FakeRAM45_256x64, \
184
+ FakeRAM45_512x32, \
185
+ FakeRAM45_512x64, \
186
+ FakeRAM45Lambdalib_SinglePort
187
+ from lambdapdk.gf180.libs.gf180io import GF180_IO_3LM, GF180_IO_4LM, GF180_IO_5LM
188
+ from lambdapdk.gf180.libs.gf180mcu import GF180_MCU_7T_3LMLibrary, \
189
+ GF180_MCU_7T_4LMLibrary, \
190
+ GF180_MCU_7T_5LMLibrary, \
191
+ GF180_MCU_7T_6LMLibrary, \
192
+ GF180_MCU_9T_3LMLibrary, \
193
+ GF180_MCU_9T_4LMLibrary, \
194
+ GF180_MCU_9T_5LMLibrary, \
195
+ GF180_MCU_9T_6LMLibrary
196
+ from lambdapdk.gf180.libs.gf180sram import GF180_SRAM_64x8, \
197
+ GF180_SRAM_128x8, \
198
+ GF180_SRAM_256x8, \
199
+ GF180_SRAM_512x8, \
200
+ GF180Lambdalib_SinglePort
201
+ from lambdapdk.ihp130.libs.sg13g2_io import IHP130_IO_1p2, IHP130_IO_1p5
202
+ from lambdapdk.ihp130.libs.sg13g2_sram import \
203
+ IHP130_SRAM_1024x64, IHP130_SRAM_2048x64, \
204
+ IHP130_SRAM_256x48, IHP130_SRAM_256x64, \
205
+ IHP130_SRAM_512x64, IHP130_SRAM_64x64, \
206
+ IHP130Lambdalib_SinglePort
207
+ from lambdapdk.ihp130.libs.sg13g2_stdcell import IHP130StdCell_1p2, IHP130StdCell_1p5
208
+ from lambdapdk.interposer.libs.bumps import BumpLibrary
209
+ from lambdapdk.sky130.libs.sky130io import Sky130_IOLibrary
210
+ from lambdapdk.sky130.libs.sky130sc import Sky130_SCHDLibrary, Sky130_SCHDLLLibrary
211
+ from lambdapdk.sky130.libs.sky130sram import Sky130_SRAM_64x256, Sky130Lambdalib_SinglePort
212
+
213
+ return set([
214
+ ASAP7SC7p5RVT(), ASAP7SC7p5SLVT(), ASAP7SC7p5LVT(),
215
+ FakeIO7Library(), FakeKit7Library(),
216
+ FakeRAM7_dp_64x32(),
217
+ FakeRAM7_sp_64x32(),
218
+ FakeRAM7_dp_128x32(),
219
+ FakeRAM7_sp_128x32(),
220
+ FakeRAM7_dp_256x32(),
221
+ FakeRAM7_sp_256x32(),
222
+ FakeRAM7_dp_256x64(),
223
+ FakeRAM7_sp_256x64(),
224
+ FakeRAM7_dp_512x32(),
225
+ FakeRAM7_sp_512x32(),
226
+ FakeRAM7_dp_512x64(),
227
+ FakeRAM7_sp_512x64(),
228
+ FakeRAM7_dp_512x128(),
229
+ FakeRAM7_sp_512x128(),
230
+ FakeRAM7_dp_1024x32(),
231
+ FakeRAM7_sp_1024x32(),
232
+ FakeRAM7_dp_1024x64(),
233
+ FakeRAM7_sp_1024x64(),
234
+ FakeRAM7_dp_2048x32(),
235
+ FakeRAM7_sp_2048x32(),
236
+ FakeRAM7_dp_2048x64(),
237
+ FakeRAM7_sp_2048x64(),
238
+ FakeRAM7_dp_4096x32(),
239
+ FakeRAM7_sp_4096x32(),
240
+ FakeRAM7_dp_4096x64(),
241
+ FakeRAM7_sp_4096x64(),
242
+ FakeRAM7_dp_8192x32(),
243
+ FakeRAM7_sp_8192x32(),
244
+ FakeRAM7_dp_8192x64(),
245
+ FakeRAM7_sp_8192x64(),
246
+ FakeRAM7Lambdalib_SinglePort(),
247
+ FakeRAM7Lambdalib_DoublePort(),
248
+ Nangate45(),
249
+ FakeRAM45_64x32(),
250
+ FakeRAM45_128x32(),
251
+ FakeRAM45_256x32(),
252
+ FakeRAM45_256x64(),
253
+ FakeRAM45_512x32(),
254
+ FakeRAM45_512x64(),
255
+ FakeRAM45Lambdalib_SinglePort(),
256
+ GF180_IO_3LM(), GF180_IO_4LM(), GF180_IO_5LM(),
257
+ GF180_MCU_7T_3LMLibrary(),
258
+ GF180_MCU_7T_4LMLibrary(),
259
+ GF180_MCU_7T_5LMLibrary(),
260
+ GF180_MCU_7T_6LMLibrary(),
261
+ GF180_MCU_9T_3LMLibrary(),
262
+ GF180_MCU_9T_4LMLibrary(),
263
+ GF180_MCU_9T_5LMLibrary(),
264
+ GF180_MCU_9T_6LMLibrary(),
265
+ GF180_SRAM_64x8(),
266
+ GF180_SRAM_128x8(),
267
+ GF180_SRAM_256x8(),
268
+ GF180_SRAM_512x8(),
269
+ GF180Lambdalib_SinglePort(),
270
+ IHP130_IO_1p2(), IHP130_IO_1p5(),
271
+ IHP130_SRAM_1024x64(), IHP130_SRAM_2048x64(),
272
+ IHP130_SRAM_256x48(), IHP130_SRAM_256x64(),
273
+ IHP130_SRAM_512x64(), IHP130_SRAM_64x64(),
274
+ IHP130Lambdalib_SinglePort(),
275
+ IHP130StdCell_1p2(), IHP130StdCell_1p5(),
276
+ BumpLibrary(),
277
+ Sky130_IOLibrary(),
278
+ Sky130_SCHDLibrary(), Sky130_SCHDLLLibrary(),
279
+ Sky130_SRAM_64x256(), Sky130Lambdalib_SinglePort()
280
+ ])
281
+
282
+
283
+ def get_lib_names():
284
+ '''
285
+ Returns a list of libraries names in lambdapdk
286
+ '''
97
287
 
98
- return set(all_libs)
288
+ return set([lib.name for lib in get_libs()])
99
289
 
100
290
 
101
291
  def get_docs_codeurl(file=None):
@@ -118,44 +308,3 @@ def get_docs_codeurl(file=None):
118
308
  return None
119
309
 
120
310
  return f"{base_url}/{file}"
121
-
122
-
123
- def get_docs_pdks():
124
- from lambdapdk import asap7, freepdk45, sky130, gf180, ihp130, interposer
125
-
126
- return [
127
- (asap7, "asap7"),
128
- (freepdk45, "freepdk45"),
129
- (sky130, "skywater130"),
130
- (gf180, "gf180"),
131
- (ihp130, "ihp130"),
132
- (interposer, "interposer")
133
- ]
134
-
135
-
136
- def get_docs_libraries():
137
- from lambdapdk.asap7.libs import asap7sc7p5t, fakeram7, fakeio7, fakekit7
138
- from lambdapdk.freepdk45.libs import nangate45, fakeram45
139
- from lambdapdk.sky130.libs import sky130sc, sky130io, sky130sram
140
- from lambdapdk.gf180.libs import gf180mcu, gf180io, gf180sram
141
- from lambdapdk.ihp130.libs import sg13g2_stdcell, sg13g2_sram, sg13g2_io
142
- from lambdapdk.interposer.libs import bumps as interposer_bumps
143
-
144
- return [
145
- (asap7sc7p5t, "asap7sc7p5t"),
146
- (fakeram7, "fakeram7"),
147
- (fakeio7, "fakeio7"),
148
- (fakekit7, "fakekit7"),
149
- (nangate45, "nangate45"),
150
- (fakeram45, "fakeram45"),
151
- (sky130sc, "sky130sc"),
152
- (sky130io, "sky130io"),
153
- (sky130sram, "sky130sram"),
154
- (gf180mcu, "gf180mcu"),
155
- (gf180io, "gf180io"),
156
- (gf180sram, "gf180sram"),
157
- (sg13g2_stdcell, "sg13g2_stdcell"),
158
- (sg13g2_sram, "sg13g2_sram"),
159
- (sg13g2_io, "sg13g2_io"),
160
- (interposer_bumps, "interposer_bumps")
161
- ]
@@ -1,12 +1,9 @@
1
- import os
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
- ####################################################
7
- # PDK Setup
8
- ####################################################
9
- def setup():
5
+
6
+ class ASAP7PDK(LambdaPDK):
10
7
  '''
11
8
  The asap7 PDK was developed at ASU in collaboration with ARM Research.
12
9
  With funding from the DARPA IDEA program, the PDK was released
@@ -43,92 +40,72 @@ def setup():
43
40
  Work in progress (not ready for use)
44
41
  '''
45
42
 
46
- foundry = 'virtual'
47
- process = 'asap7'
48
- node = 7
49
- rev = 'r1p7'
50
- stackup = '10M'
51
- wafersize = 300
52
- libtype = '7p5t'
53
- pdkdir = os.path.join('lambdapdk', 'asap7', 'base')
54
-
55
- pdk = siliconcompiler.PDK(process, package='lambdapdk')
56
- register_data_source(pdk)
57
-
58
- # process name
59
- pdk.set('pdk', process, 'foundry', foundry)
60
- pdk.set('pdk', process, 'node', node)
61
- pdk.set('pdk', process, 'wafersize', wafersize)
62
- pdk.set('pdk', process, 'version', rev)
63
- pdk.set('pdk', process, 'stackup', stackup)
64
-
65
- # APR tech file
66
- for tool in ('openroad', 'klayout', 'magic'):
67
- pdk.set('pdk', process, 'aprtech', tool, stackup, libtype, 'lef',
68
- pdkdir + '/apr/asap7_tech.lef')
69
-
70
- pdk.set('pdk', process, 'minlayer', stackup, 'M2')
71
- pdk.set('pdk', process, 'maxlayer', stackup, 'M7')
72
-
73
- # Device models
74
- pdk.set('pdk', process, 'devmodel', 'xyce', 'hspice', stackup,
75
- pdkdir + '/spice/hspice/7nm.lib')
76
-
77
- # Klayout setup file
78
- pdk.set('pdk', process, 'layermap', 'klayout', 'def', 'klayout', stackup,
79
- pdkdir + '/setup/klayout/asap7.lyt')
80
- pdk.set('pdk', process, 'layermap', 'klayout', 'def', 'gds', stackup,
81
- pdkdir + '/apr/asap7.layermap')
82
-
83
- pdk.set('pdk', process, 'display', 'klayout', stackup,
84
- pdkdir + '/setup/klayout/asap7.lyp')
85
-
86
- # Openroad global routing grid derating
87
- openroad_layer_adjustments = {
88
- 'M1': 0.25,
89
- 'M2': 0.25,
90
- 'M3': 0.25,
91
- 'M4': 0.25,
92
- 'M5': 0.25,
93
- 'M6': 0.25,
94
- 'M7': 0.25,
95
- 'M8': 0.25,
96
- 'M9': 0.25,
97
- 'Pad': 1.0
98
- }
99
- for layer, adj in openroad_layer_adjustments.items():
100
- pdk.set('pdk', process, 'var', 'openroad', f'{layer}_adjustment', stackup, str(adj))
101
-
102
- pdk.set('pdk', process, 'var', 'openroad', 'rclayer_signal', stackup, 'M3')
103
- pdk.set('pdk', process, 'var', 'openroad', 'rclayer_clock', stackup, 'M3')
104
-
105
- pdk.set('pdk', process, 'var', 'openroad', 'pin_layer_vertical', stackup, 'M5')
106
- pdk.set('pdk', process, 'var', 'openroad', 'pin_layer_horizontal', stackup, 'M4')
107
-
108
- # PEX
109
- pdk.set('pdk', process, 'pexmodel', 'openroad', stackup, 'typical',
110
- pdkdir + '/pex/openroad/typical.tcl')
111
- pdk.set('pdk', process, 'pexmodel', 'openroad-openrcx', stackup, 'typical',
112
- pdkdir + '/pex/openroad/typical.rules')
113
-
114
- # Relaxed routing rules
115
- pdk.set('pdk', process, 'file', 'openroad', 'relax_routing_rules', stackup,
116
- pdkdir + '/apr/openroad_relaxed_rules.tcl')
117
-
118
- # Hide the DIEAREA layer 235/*.
119
- pdk.add('pdk', process, 'var', 'klayout', 'hide_layers', stackup, '235/0')
120
- pdk.add('pdk', process, 'var', 'klayout', 'hide_layers', stackup, '235/5')
121
- # Hide boundary layer
122
- pdk.add('pdk', process, 'var', 'klayout', 'hide_layers', stackup, '100/0')
123
- # Hide vt layers
124
- pdk.add('pdk', process, 'var', 'klayout', 'hide_layers', stackup, '97/0')
125
- pdk.add('pdk', process, 'var', 'klayout', 'hide_layers', stackup, '98/0')
126
-
127
- return pdk
128
-
129
-
130
- #########################
131
- if __name__ == "__main__":
132
- pdk = setup()
133
- register_data_source(pdk)
134
- pdk.check_filepaths()
43
+ def __init__(self):
44
+ super().__init__()
45
+ self.set_name("asap7")
46
+
47
+ pdk_path = Path("lambdapdk", "asap7", "base")
48
+
49
+ self.set_foundry("virtual")
50
+ self.set_version("r1p7")
51
+ self.set_node(7)
52
+ self.set_stackup("10M")
53
+ self.set_wafersize(300)
54
+ self.set_scribewidth(0.1, 0.1)
55
+ self.set_edgemargin(2)
56
+ self.set_defectdensity(1.25)
57
+
58
+ with self.active_dataroot("lambdapdk"):
59
+ # APR Setup
60
+ with self.active_fileset("views.lef"):
61
+ self.add_file(pdk_path / "apr" / "asap7_tech.lef")
62
+ for tool in ('openroad', 'klayout', 'magic'):
63
+ self.add_aprtechfileset(tool)
64
+
65
+ with self.active_fileset("layermap"):
66
+ self.add_file(pdk_path / "apr" / "asap7.layermap", filetype="layermap")
67
+
68
+ with self.active_fileset("models.spice"):
69
+ self.add_file(pdk_path / "spice" / "hspice" / "7nm.lib", filetype="library")
70
+ self.add_devmodelfileset("xyce", "spice")
71
+
72
+ # Klayout setup
73
+ with self.active_fileset("klayout.techmap"):
74
+ self.add_file(pdk_path / "setup" / "klayout" / "asap7.lyt", filetype="layermap")
75
+ self.add_file(pdk_path / "setup" / "klayout" / "asap7.lyp", filetype="display")
76
+ self.add_layermapfileset("klayout", "def", "klayout")
77
+ self.add_displayfileset("klayout")
78
+ self.add_layermapfileset("klayout", "def", "gds", fileset="layermap")
79
+
80
+ self.set_aprroutinglayers(min="M2", max="M7")
81
+
82
+ # OpenROAD setup
83
+ self.set_openroad_rclayers(signal="M3", clock="M3")
84
+
85
+ # Openroad global routing grid derating
86
+ for layer, derate in [
87
+ ('M1', 0.25),
88
+ ('M2', 0.25),
89
+ ('M3', 0.25),
90
+ ('M4', 0.25),
91
+ ('M5', 0.25),
92
+ ('M6', 0.25),
93
+ ('M7', 0.25),
94
+ ('M8', 0.25),
95
+ ('M9', 0.25),
96
+ ('Pad', 0.25)]:
97
+ self.set_openroad_globalroutingderating(layer, derate)
98
+
99
+ self.add_openroad_pinlayers(vertical="M5", horizontal="M4")
100
+
101
+ with self.active_fileset("openroad.routing"):
102
+ # Relaxed routing rules
103
+ self.add_file(pdk_path / "apr" / "openroad_relaxed_rules.tcl", filetype="tcl")
104
+
105
+ # PEX
106
+ with self.active_fileset("openroad.pex"):
107
+ self.add_file(pdk_path / "pex" / "openroad" / "typical.tcl", filetype="tcl")
108
+ self.add_file(pdk_path / "pex" / "openroad" / "typical.rules", filetype="openrcx")
109
+
110
+ self.add_pexmodelfileset("openroad", "typical")
111
+ self.add_pexmodelfileset("openroad-openrcx", "typical")