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 +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 +216 -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 +44 -48
- lambdapdk/sky130/libs/sky130sc.py +170 -206
- lambdapdk/sky130/libs/sky130sram.py +44 -34
- {lambdapdk-0.1.56.dist-info → lambdapdk-0.2.0rc2.dist-info}/METADATA +3 -3
- lambdapdk-0.2.0rc2.dist-info/RECORD +30 -0
- lambdapdk-0.2.0rc2.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.0rc2.dist-info}/WHEEL +0 -0
- {lambdapdk-0.1.56.dist-info → lambdapdk-0.2.0rc2.dist-info}/licenses/LICENSE +0 -0
- {lambdapdk-0.1.56.dist-info → lambdapdk-0.2.0rc2.dist-info}/top_level.txt +0 -0
lambdapdk/sky130/__init__.py
CHANGED
|
@@ -1,13 +1,9 @@
|
|
|
1
|
+
from pathlib import Path
|
|
1
2
|
|
|
2
|
-
import
|
|
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
|
-
|
|
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
|
-
# 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
|
|
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
|
-
|
|
6
|
+
|
|
7
|
+
class Sky130_IOLibrary(LambdaLibrary):
|
|
7
8
|
'''
|
|
8
9
|
Skywater130 I/O library.
|
|
9
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
|
-
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")
|