lambdapdk 0.1.56__py3-none-any.whl → 0.2.0__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.
@@ -1,13 +1,9 @@
1
+ from pathlib import Path
1
2
 
2
- import os
3
- import siliconcompiler
4
- from lambdapdk import register_data_source
3
+ from lambdapdk import LambdaPDK
5
4
 
6
5
 
7
- ####################################################
8
- # PDK Setup
9
- ####################################################
10
- def setup():
6
+ class Sky130PDK(LambdaPDK):
11
7
  '''
12
8
  The 'skywater130' Open Source PDK is a collaboration between Google and
13
9
  SkyWater Technology Foundry to provide a fully open source Process
@@ -36,88 +32,70 @@ def setup():
36
32
 
37
33
  * https://github.com/google/skywater-pdk
38
34
  '''
39
-
40
- foundry = 'skywater'
41
- process = 'skywater130'
42
- rev = 'v0_0_2'
43
- stackup = '5M1LI'
44
-
45
- node = 130
46
- # TODO: dummy numbers, only matter for cost estimation
47
- wafersize = 300
48
- hscribe = 0.1
49
- vscribe = 0.1
50
- edgemargin = 2
51
-
52
- pdkdir = os.path.join('lambdapdk', 'sky130', 'base')
53
-
54
- pdk = siliconcompiler.PDK(process, package='lambdapdk')
55
- register_data_source(pdk)
56
-
57
- # process name
58
- pdk.set('pdk', process, 'foundry', foundry)
59
- pdk.set('pdk', process, 'node', node)
60
- pdk.set('pdk', process, 'version', rev)
61
- pdk.set('pdk', process, 'stackup', stackup)
62
- pdk.set('pdk', process, 'wafersize', wafersize)
63
- pdk.set('pdk', process, 'edgemargin', edgemargin)
64
- pdk.set('pdk', process, 'scribe', (hscribe, vscribe))
65
-
66
- # APR Setup
67
- # TODO: remove libtype
68
- for tool in ('openroad', 'klayout', 'magic'):
69
- for libtype in ('hd', 'hdll'):
70
- pdk.set('pdk', process, 'aprtech', tool, stackup, libtype, 'lef',
71
- pdkdir + '/apr/sky130_fd_sc.tlef')
72
-
73
- pdk.set('pdk', process, 'minlayer', stackup, 'met1')
74
- pdk.set('pdk', process, 'maxlayer', stackup, 'met5')
75
-
76
- # DRC Runsets
77
- pdk.set('pdk', process, 'drc', 'runset', 'magic', stackup, 'basic',
78
- pdkdir + '/setup/magic/sky130A.tech')
79
-
80
- # LVS Runsets
81
- pdk.set('pdk', process, 'lvs', 'runset', 'netgen', stackup, 'basic',
82
- pdkdir + '/setup/netgen/lvs_setup.tcl')
83
-
84
- # Layer map and display file
85
- pdk.set('pdk', process, 'layermap', 'klayout', 'def', 'klayout', stackup,
86
- pdkdir + '/setup/klayout/skywater130.lyt')
87
- pdk.set('pdk', process, 'display', 'klayout', stackup, pdkdir + '/setup/klayout/sky130A.lyp')
88
-
89
- # Openroad global routing grid derating
90
- openroad_layer_adjustments = {
91
- 'li1': 1.0,
92
- 'met1': 0.40,
93
- 'met2': 0.40,
94
- 'met3': 0.30,
95
- 'met4': 0.30,
96
- 'met5': 0.30
97
- }
98
- for layer, adj in openroad_layer_adjustments.items():
99
- pdk.set('pdk', process, 'var', 'openroad', f'{layer}_adjustment', stackup, str(adj))
100
-
101
- pdk.set('pdk', process, 'var', 'openroad', 'rclayer_signal', stackup, 'met2')
102
- pdk.set('pdk', process, 'var', 'openroad', 'rclayer_clock', stackup, 'met5')
103
-
104
- pdk.set('pdk', process, 'var', 'openroad', 'pin_layer_vertical', stackup, 'met2')
105
- pdk.set('pdk', process, 'var', 'openroad', 'pin_layer_horizontal', stackup, 'met3')
106
-
107
- # Hide the 81/4 'areaid.standardc' layer by default; it puts opaque purple over most core areas.
108
- pdk.set('pdk', process, 'var', 'klayout', 'hide_layers', stackup, ['areaid.standardc'])
109
-
110
- # PEX
111
- for corner in ["minimum", "typical", "maximum"]:
112
- pdk.set('pdk', process, 'pexmodel', 'openroad', stackup, corner,
113
- pdkdir + '/pex/openroad/' + corner + '.tcl')
114
- pdk.set('pdk', process, 'pexmodel', 'openroad-openrcx', stackup, corner,
115
- pdkdir + '/pex/openroad/' + corner + '.rules')
116
-
117
- return pdk
118
-
119
-
120
- #########################
121
- if __name__ == "__main__":
122
- pdk = setup()
123
- pdk.write_manifest(f'{pdk.top()}.json')
35
+ def __init__(self):
36
+ super().__init__()
37
+ self.set_name("skywater130")
38
+
39
+ self.set_foundry("skywater")
40
+ self.package.set_version("v0_0_2")
41
+ self.set_stackup("5M1LI")
42
+ self.set_node(130)
43
+
44
+ pdk_path = Path("lambdapdk", "sky130", "base")
45
+
46
+ with self.active_dataroot("lambdapdk"):
47
+ # APR Setup
48
+ with self.active_fileset("views.lef"):
49
+ self.add_file(pdk_path / "apr" / "sky130_fd_sc.tlef", filetype="lef")
50
+ for tool in ('openroad', 'klayout', 'magic'):
51
+ self.add_aprtechfileset(tool)
52
+
53
+ # DRC Runset
54
+ with self.active_fileset("magic.drc"):
55
+ self.add_file(pdk_path / "setup" / "magic" / "sky130A.tech", filetype="tech")
56
+ self.add_runsetfileset("drc", "magic", "basic")
57
+
58
+ # LVS Runset
59
+ with self.active_fileset("netgen.lvs"):
60
+ self.add_file(pdk_path / "setup" / "netgen" / "lvs_setup.tcl", filetype="tcl")
61
+ self.add_runsetfileset("lvs", "netgen", "basic")
62
+
63
+ self.set_aprroutinglayers(min="met1", max="met5")
64
+
65
+ # Klayout setup
66
+ with self.active_dataroot("lambdapdk"):
67
+ with self.active_fileset("klayout.techmap"):
68
+ self.add_file(pdk_path / "setup" / "klayout" / "skywater130.lyt",
69
+ filetype="layermap")
70
+ self.add_file(pdk_path / "setup" / "klayout" / "sky130A.lyp", filetype="display")
71
+ self.add_layermapfileset("klayout", "def", "klayout")
72
+ self.add_displayfileset("klayout")
73
+ # Hide the 81/4 'areaid.standardc' layer by default; it puts opaque purple over most
74
+ # core areas.
75
+ self.add_klayout_hidelayers('areaid.standardc')
76
+
77
+ # OpenROAD setup
78
+ self.set_openroad_rclayers(signal="met3", clock="met5")
79
+
80
+ # OpenROAD global routing grid derating
81
+ for layer, derate in [
82
+ ('li1', 1.0),
83
+ ('met1', 0.40),
84
+ ('met2', 0.40),
85
+ ('met3', 0.30),
86
+ ('met4', 0.30),
87
+ ('met5', 0.30)]:
88
+ self.set_openroad_globalroutingderating(layer, derate)
89
+
90
+ self.add_openroad_pinlayers(vertical="met2", horizontal="met3")
91
+
92
+ # OpenROAD PEX
93
+ with self.active_dataroot("lambdapdk"):
94
+ for corner in ["minimum", "typical", "maximum"]:
95
+ with self.active_fileset(f"openroad.pex.{corner}"):
96
+ self.add_file(pdk_path / "pex" / "openroad" / f"{corner}.tcl", filetype="tcl")
97
+ self.add_file(pdk_path / "pex" / "openroad" / f"{corner}.rules",
98
+ filetype="openrcx")
99
+
100
+ self.add_pexmodelfileset("openroad", corner)
101
+ self.add_pexmodelfileset("openroad-openrcx", corner)
@@ -1,53 +1,264 @@
1
- import os
2
- import siliconcompiler
3
- from lambdapdk import register_data_source
1
+ from pathlib import Path
4
2
 
3
+ from siliconcompiler import ASIC
4
+ from lambdalib import LambalibTechLibrary
5
+ from lambdapdk import LambdaLibrary, _LambdaPath
6
+ from lambdapdk.sky130 import Sky130PDK
5
7
 
6
- def setup():
8
+
9
+ class Sky130_IOLibrary(LambdaLibrary):
7
10
  '''
8
11
  Skywater130 I/O library.
9
12
  '''
10
- process = 'skywater130'
11
- libname = 'sky130io'
12
- stackup = '5M1LI'
13
+ def __init__(self):
14
+ super().__init__()
15
+ self.set_name("sky130io")
16
+
17
+ self.add_asic_pdk(Sky130PDK())
18
+
19
+ path_base = Path('lambdapdk', 'sky130', 'libs', "sky130io")
20
+
21
+ with self.active_dataroot("lambdapdk"):
22
+ with self.active_fileset("models.timing.nldm"):
23
+ self.add_file(path_base / "nldm" / "sky130_dummy_io.lib")
24
+ self.add_asic_libcornerfileset("generic", "nldm")
25
+
26
+ with self.active_dataroot("lambdapdk"):
27
+ with self.active_fileset("models.physical"):
28
+ self.add_file(path_base / "lef" / "sky130_ef_io.lef")
29
+ self.add_file(path_base / "gds" / "sky130_ef_io.gds")
30
+ self.add_file(path_base / "gds" / "sky130_fd_io.gds")
31
+ self.add_file(path_base / "gds" / "sky130_ef_io__gpiov2_pad_wrapped.gds")
32
+ self.add_asic_aprfileset()
33
+
34
+ with self.active_fileset("rtl"):
35
+ self.add_file(path_base / "verilog" / "sky130_ef_io.v")
36
+ self.add_file(path_base / "verilog" / "sky130_fd_io.v")
37
+ self.add_file(path_base / "verilog" / "sky130_ef_io__gpiov2_pad_wrapped.v")
38
+ self.add_file(path_base / "verilog" / "sky130_ef_io__analog_pad.v")
39
+
40
+ # TODO defines?
41
+
42
+ self.add_asic_celllist('filler', ['sky130_ef_io__com_bus_slice_1um',
43
+ 'sky130_ef_io__com_bus_slice_5um',
44
+ 'sky130_ef_io__com_bus_slice_10um',
45
+ 'sky130_ef_io__com_bus_slice_20um'])
46
+
47
+ with self.active_dataroot("lambdapdk"):
48
+ with self.active_fileset("models.blackbox"):
49
+ self.add_file(path_base / "blackbox" / "sky130_ef_io.v")
50
+ self.add_file(path_base / "blackbox" / "sky130_fd_io.v")
51
+ self.add_yosys_blackbox_fileset("models.blackbox")
52
+
53
+
54
+ class Sky130Lambdalib_la_ioanalog(LambalibTechLibrary, _LambdaPath):
55
+ def __init__(self):
56
+ super().__init__("la_ioanalog", [Sky130_IOLibrary])
57
+ self.set_name("sky130_la_ioanalog")
58
+
59
+ # version
60
+ self.package.set_version("v1")
61
+
62
+ lib_path = Path("lambdapdk", "sky130", "libs", "sky130io")
63
+
64
+ with self.active_dataroot("lambdapdk"):
65
+ with self.active_fileset("rtl"):
66
+ self.add_file(lib_path / "lambda" / "la_ioanalog.v")
67
+
68
+
69
+ class Sky130Lambdalib_la_iobidir(LambalibTechLibrary, _LambdaPath):
70
+ def __init__(self):
71
+ super().__init__("la_iobidir", [Sky130_IOLibrary])
72
+ self.set_name("sky130_la_iobidir")
73
+
74
+ # version
75
+ self.package.set_version("v1")
76
+
77
+ lib_path = Path("lambdapdk", "sky130", "libs", "sky130io")
78
+
79
+ with self.active_dataroot("lambdapdk"):
80
+ with self.active_fileset("rtl"):
81
+ self.add_file(lib_path / "lambda" / "la_iobidir.v")
82
+
83
+
84
+ class Sky130Lambdalib_la_ioclamp(LambalibTechLibrary, _LambdaPath):
85
+ def __init__(self):
86
+ super().__init__("la_ioclamp", [Sky130_IOLibrary])
87
+ self.set_name("sky130_la_ioclamp")
88
+
89
+ # version
90
+ self.package.set_version("v1")
91
+
92
+ lib_path = Path("lambdapdk", "sky130", "libs", "sky130io")
93
+
94
+ with self.active_dataroot("lambdapdk"):
95
+ with self.active_fileset("rtl"):
96
+ self.add_file(lib_path / "lambda" / "la_ioclamp.v")
97
+
98
+
99
+ class Sky130Lambdalib_la_iocorner(LambalibTechLibrary, _LambdaPath):
100
+ def __init__(self):
101
+ super().__init__("la_iocorner", [Sky130_IOLibrary])
102
+ self.set_name("sky130_la_iocorner")
103
+
104
+ # version
105
+ self.package.set_version("v1")
106
+
107
+ lib_path = Path("lambdapdk", "sky130", "libs", "sky130io")
108
+
109
+ with self.active_dataroot("lambdapdk"):
110
+ with self.active_fileset("rtl"):
111
+ self.add_file(lib_path / "lambda" / "la_iocorner.v")
112
+
113
+
114
+ class Sky130Lambdalib_la_ioinput(LambalibTechLibrary, _LambdaPath):
115
+ def __init__(self):
116
+ super().__init__("la_ioinput", [Sky130_IOLibrary])
117
+ self.set_name("sky130_la_ioinput")
118
+
119
+ # version
120
+ self.package.set_version("v1")
121
+
122
+ lib_path = Path("lambdapdk", "sky130", "libs", "sky130io")
123
+
124
+ with self.active_dataroot("lambdapdk"):
125
+ with self.active_fileset("rtl"):
126
+ self.add_file(lib_path / "lambda" / "la_ioinput.v")
127
+
128
+
129
+ class Sky130Lambdalib_la_iorxdiff(LambalibTechLibrary, _LambdaPath):
130
+ def __init__(self):
131
+ super().__init__("la_iorxdiff", [Sky130_IOLibrary])
132
+ self.set_name("sky130_la_iorxdiff")
133
+
134
+ # version
135
+ self.package.set_version("v1")
136
+
137
+ lib_path = Path("lambdapdk", "sky130", "libs", "sky130io")
138
+
139
+ with self.active_dataroot("lambdapdk"):
140
+ with self.active_fileset("rtl"):
141
+ self.add_file(lib_path / "lambda" / "la_iorxdiff.v")
142
+
143
+
144
+ class Sky130Lambdalib_la_iotxdiff(LambalibTechLibrary, _LambdaPath):
145
+ def __init__(self):
146
+ super().__init__("la_iotxdiff", [Sky130_IOLibrary])
147
+ self.set_name("sky130_la_iotxdiff")
148
+
149
+ # version
150
+ self.package.set_version("v1")
151
+
152
+ lib_path = Path("lambdapdk", "sky130", "libs", "sky130io")
153
+
154
+ with self.active_dataroot("lambdapdk"):
155
+ with self.active_fileset("rtl"):
156
+ self.add_file(lib_path / "lambda" / "la_iotxdiff.v")
157
+
158
+
159
+ class Sky130Lambdalib_la_iovdd(LambalibTechLibrary, _LambdaPath):
160
+ def __init__(self):
161
+ super().__init__("la_iovdd", [Sky130_IOLibrary])
162
+ self.set_name("sky130_la_iovdd")
163
+
164
+ # version
165
+ self.package.set_version("v1")
166
+
167
+ lib_path = Path("lambdapdk", "sky130", "libs", "sky130io")
168
+
169
+ with self.active_dataroot("lambdapdk"):
170
+ with self.active_fileset("rtl"):
171
+ self.add_file(lib_path / "lambda" / "la_iovdd.v")
172
+
173
+
174
+ class Sky130Lambdalib_la_iovdda(LambalibTechLibrary, _LambdaPath):
175
+ def __init__(self):
176
+ super().__init__("la_iovdda", [Sky130_IOLibrary])
177
+ self.set_name("sky130_la_iovdda")
178
+
179
+ # version
180
+ self.package.set_version("v1")
181
+
182
+ lib_path = Path("lambdapdk", "sky130", "libs", "sky130io")
183
+
184
+ with self.active_dataroot("lambdapdk"):
185
+ with self.active_fileset("rtl"):
186
+ self.add_file(lib_path / "lambda" / "la_iovdda.v")
187
+
188
+
189
+ class Sky130Lambdalib_la_iovddio(LambalibTechLibrary, _LambdaPath):
190
+ def __init__(self):
191
+ super().__init__("la_iovddio", [Sky130_IOLibrary])
192
+ self.set_name("sky130_la_iovddio")
193
+
194
+ # version
195
+ self.package.set_version("v1")
196
+
197
+ lib_path = Path("lambdapdk", "sky130", "libs", "sky130io")
198
+
199
+ with self.active_dataroot("lambdapdk"):
200
+ with self.active_fileset("rtl"):
201
+ self.add_file(lib_path / "lambda" / "la_iovddio.v")
202
+
203
+
204
+ class Sky130Lambdalib_la_iovss(LambalibTechLibrary, _LambdaPath):
205
+ def __init__(self):
206
+ super().__init__("la_iovss", [Sky130_IOLibrary])
207
+ self.set_name("sky130_la_iovss")
208
+
209
+ # version
210
+ self.package.set_version("v1")
211
+
212
+ lib_path = Path("lambdapdk", "sky130", "libs", "sky130io")
213
+
214
+ with self.active_dataroot("lambdapdk"):
215
+ with self.active_fileset("rtl"):
216
+ self.add_file(lib_path / "lambda" / "la_iovss.v")
217
+
13
218
 
14
- lib = siliconcompiler.Library(libname, package='lambdapdk')
15
- register_data_source(lib)
219
+ class Sky130Lambdalib_la_iovssa(LambalibTechLibrary, _LambdaPath):
220
+ def __init__(self):
221
+ super().__init__("la_iovssa", [Sky130_IOLibrary])
222
+ self.set_name("sky130_la_iovssa")
16
223
 
17
- libdir = os.path.join('lambdapdk', 'sky130', 'libs', libname)
224
+ # version
225
+ self.package.set_version("v1")
18
226
 
19
- # pdk
20
- lib.set('option', 'pdk', process)
227
+ lib_path = Path("lambdapdk", "sky130", "libs", "sky130io")
21
228
 
22
- for corner in ['slow', 'typical', 'fast']:
23
- # Only one corner provided
24
- lib.set('output', corner, 'nldm', os.path.join(libdir, 'nldm', 'sky130_dummy_io.lib'))
25
- lib.set('output', stackup, 'lef', os.path.join(libdir, 'lef', 'sky130_ef_io.lef'))
229
+ with self.active_dataroot("lambdapdk"):
230
+ with self.active_fileset("rtl"):
231
+ self.add_file(lib_path / "lambda" / "la_iovssa.v")
26
232
 
27
- # Need both GDS files: ef relies on fd one
28
- lib.add('output', stackup, 'gds', os.path.join(libdir, 'gds', 'sky130_ef_io.gds'))
29
- lib.add('output', stackup, 'gds', os.path.join(libdir, 'gds', 'sky130_fd_io.gds'))
30
- lib.add('output', stackup, 'gds', os.path.join(libdir, 'gds',
31
- 'sky130_ef_io__gpiov2_pad_wrapped.gds'))
32
233
 
33
- lib.set('asic', 'cells', 'filler', ['sky130_ef_io__com_bus_slice_1um',
34
- 'sky130_ef_io__com_bus_slice_5um',
35
- 'sky130_ef_io__com_bus_slice_10um',
36
- 'sky130_ef_io__com_bus_slice_20um'])
234
+ class Sky130Lambdalib_la_iovssio(LambalibTechLibrary, _LambdaPath):
235
+ def __init__(self):
236
+ super().__init__("la_iovssio", [Sky130_IOLibrary])
237
+ self.set_name("sky130_la_iovssio")
37
238
 
38
- lib.set('output', 'blackbox', 'verilog', os.path.join(libdir, 'blackbox', 'sky130_ef_io.v'))
39
- lib.add('output', 'blackbox', 'verilog', os.path.join(libdir, 'blackbox', 'sky130_fd_io.v'))
239
+ # version
240
+ self.package.set_version("v1")
40
241
 
41
- lambda_lib = siliconcompiler.Library(f'lambdalib_{libname}', package='lambdapdk')
42
- register_data_source(lambda_lib)
43
- lambda_lib.add('option', 'ydir', 'lambdapdk/sky130/libs/sky130io/lambda')
44
- lambda_lib.use(lib)
45
- lambda_lib.set('asic', 'macrolib', lib.design)
242
+ lib_path = Path("lambdapdk", "sky130", "libs", "sky130io")
46
243
 
47
- return [lib, lambda_lib]
244
+ with self.active_dataroot("lambdapdk"):
245
+ with self.active_fileset("rtl"):
246
+ self.add_file(lib_path / "lambda" / "la_iovssio.v")
48
247
 
49
248
 
50
- #########################
51
- if __name__ == "__main__":
52
- for lib in setup(siliconcompiler.Chip('<lib>')):
53
- lib.write_manifest(f'{lib.top()}.json')
249
+ class Sky130LambdaLib_IO(LambalibTechLibrary):
250
+ @classmethod
251
+ def alias(cls, project: ASIC):
252
+ Sky130Lambdalib_la_ioanalog.alias(project)
253
+ Sky130Lambdalib_la_iobidir.alias(project)
254
+ Sky130Lambdalib_la_ioclamp.alias(project)
255
+ Sky130Lambdalib_la_iocorner.alias(project)
256
+ Sky130Lambdalib_la_ioinput.alias(project)
257
+ Sky130Lambdalib_la_iorxdiff.alias(project)
258
+ Sky130Lambdalib_la_iotxdiff.alias(project)
259
+ Sky130Lambdalib_la_iovdd.alias(project)
260
+ Sky130Lambdalib_la_iovdda.alias(project)
261
+ Sky130Lambdalib_la_iovddio.alias(project)
262
+ Sky130Lambdalib_la_iovss.alias(project)
263
+ Sky130Lambdalib_la_iovssa.alias(project)
264
+ Sky130Lambdalib_la_iovssio.alias(project)