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.
@@ -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.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,49 @@
1
- import os
2
- import siliconcompiler
3
- from lambdapdk import register_data_source
1
+ from pathlib import Path
4
2
 
3
+ from lambdapdk import LambdaLibrary
4
+ from lambdapdk.sky130 import Sky130PDK
5
5
 
6
- def setup():
6
+
7
+ class Sky130_IOLibrary(LambdaLibrary):
7
8
  '''
8
9
  Skywater130 I/O library.
9
10
  '''
10
- process = 'skywater130'
11
- libname = 'sky130io'
12
- stackup = '5M1LI'
13
-
14
- lib = siliconcompiler.Library(libname, package='lambdapdk')
15
- register_data_source(lib)
16
-
17
- libdir = os.path.join('lambdapdk', 'sky130', 'libs', libname)
18
-
19
- # pdk
20
- lib.set('option', 'pdk', process)
21
-
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'))
26
-
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
-
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'])
37
-
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'))
40
-
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)
46
-
47
- return [lib, lambda_lib]
48
-
49
-
50
- #########################
51
- if __name__ == "__main__":
52
- for lib in setup(siliconcompiler.Chip('<lib>')):
53
- lib.write_manifest(f'{lib.top()}.json')
11
+ def __init__(self):
12
+ super().__init__()
13
+ self.set_name("sky130io")
14
+
15
+ self.add_asic_pdk(Sky130PDK())
16
+
17
+ path_base = Path('lambdapdk', 'sky130', 'libs', "sky130io")
18
+
19
+ with self.active_dataroot("lambdapdk"):
20
+ with self.active_fileset("models.timing.nldm"):
21
+ self.add_file(path_base / "nldm" / "sky130_dummy_io.lib")
22
+ self.add_asic_libcornerfileset("generic", "nldm")
23
+
24
+ with self.active_dataroot("lambdapdk"):
25
+ with self.active_fileset("models.physical"):
26
+ self.add_file(path_base / "lef" / "sky130_ef_io.lef")
27
+ self.add_file(path_base / "gds" / "sky130_ef_io.gds")
28
+ self.add_file(path_base / "gds" / "sky130_fd_io.gds")
29
+ self.add_file(path_base / "gds" / "sky130_ef_io__gpiov2_pad_wrapped.gds")
30
+ self.add_asic_aprfileset()
31
+
32
+ with self.active_fileset("rtl"):
33
+ self.add_file(path_base / "verilog" / "sky130_ef_io.v")
34
+ self.add_file(path_base / "verilog" / "sky130_fd_io.v")
35
+ self.add_file(path_base / "verilog" / "sky130_ef_io__gpiov2_pad_wrapped.v")
36
+ self.add_file(path_base / "verilog" / "sky130_ef_io__analog_pad.v")
37
+
38
+ # TODO defines?
39
+
40
+ self.add_asic_celllist('filler', ['sky130_ef_io__com_bus_slice_1um',
41
+ 'sky130_ef_io__com_bus_slice_5um',
42
+ 'sky130_ef_io__com_bus_slice_10um',
43
+ 'sky130_ef_io__com_bus_slice_20um'])
44
+
45
+ with self.active_dataroot("lambdapdk"):
46
+ with self.active_fileset("models.blackbox"):
47
+ self.add_file(path_base / "blackbox" / "sky130_ef_io.v")
48
+ self.add_file(path_base / "blackbox" / "sky130_fd_io.v")
49
+ self.add_yosys_blackbox_fileset("models.blackbox")