siliconcompiler 0.28.2__py3-none-any.whl → 0.28.4__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.
- siliconcompiler/_common.py +12 -0
- siliconcompiler/_metadata.py +1 -1
- siliconcompiler/apps/sc_dashboard.py +6 -2
- siliconcompiler/apps/sc_install.py +61 -13
- siliconcompiler/apps/sc_remote.py +1 -1
- siliconcompiler/core.py +132 -68
- siliconcompiler/fpgas/vpr_example.py +8 -0
- siliconcompiler/package.py +3 -2
- siliconcompiler/remote/client.py +41 -10
- siliconcompiler/report/__init__.py +1 -1
- siliconcompiler/report/{streamlit_report.py → dashboard/__init__.py} +56 -10
- siliconcompiler/report/dashboard/components/__init__.py +546 -0
- siliconcompiler/report/dashboard/components/flowgraph.py +114 -0
- siliconcompiler/report/dashboard/components/graph.py +208 -0
- siliconcompiler/report/dashboard/layouts/__init__.py +20 -0
- siliconcompiler/report/dashboard/layouts/_common.py +43 -0
- siliconcompiler/report/dashboard/layouts/vertical_flowgraph.py +96 -0
- siliconcompiler/report/dashboard/layouts/vertical_flowgraph_node_tab.py +117 -0
- siliconcompiler/report/dashboard/layouts/vertical_flowgraph_sac_tabs.py +110 -0
- siliconcompiler/report/dashboard/state.py +217 -0
- siliconcompiler/report/dashboard/utils/__init__.py +73 -0
- siliconcompiler/report/dashboard/utils/file_utils.py +120 -0
- siliconcompiler/report/dashboard/viewer.py +36 -0
- siliconcompiler/report/report.py +22 -4
- siliconcompiler/report/summary_table.py +1 -2
- siliconcompiler/report/utils.py +1 -2
- siliconcompiler/scheduler/__init__.py +45 -6
- siliconcompiler/schema/schema_obj.py +4 -2
- siliconcompiler/sphinx_ext/dynamicgen.py +6 -0
- siliconcompiler/tools/_common/__init__.py +44 -6
- siliconcompiler/tools/_common/asic.py +79 -23
- siliconcompiler/tools/genfasm/genfasm.py +7 -0
- siliconcompiler/tools/ghdl/convert.py +7 -0
- siliconcompiler/tools/klayout/convert_drc_db.py +60 -0
- siliconcompiler/tools/klayout/drc.py +156 -0
- siliconcompiler/tools/klayout/export.py +2 -0
- siliconcompiler/tools/klayout/klayout.py +0 -1
- siliconcompiler/tools/klayout/klayout_convert_drc_db.py +182 -0
- siliconcompiler/tools/klayout/operations.py +2 -0
- siliconcompiler/tools/klayout/screenshot.py +2 -0
- siliconcompiler/tools/klayout/show.py +4 -4
- siliconcompiler/tools/magic/drc.py +21 -0
- siliconcompiler/tools/magic/extspice.py +21 -0
- siliconcompiler/tools/magic/magic.py +29 -0
- siliconcompiler/tools/magic/sc_drc.tcl +2 -12
- siliconcompiler/tools/magic/sc_extspice.tcl +3 -15
- siliconcompiler/tools/openroad/floorplan.py +5 -0
- siliconcompiler/tools/openroad/openroad.py +56 -5
- siliconcompiler/tools/openroad/scripts/sc_apr.tcl +15 -0
- siliconcompiler/tools/openroad/scripts/sc_cts.tcl +18 -13
- siliconcompiler/tools/openroad/scripts/sc_floorplan.tcl +61 -10
- siliconcompiler/tools/openroad/scripts/sc_metrics.tcl +10 -0
- siliconcompiler/tools/openroad/scripts/sc_procs.tcl +31 -1
- siliconcompiler/tools/openroad/scripts/sc_route.tcl +8 -2
- siliconcompiler/tools/openroad/scripts/sc_screenshot.tcl +0 -5
- siliconcompiler/tools/openroad/scripts/sc_write_images.tcl +36 -6
- siliconcompiler/tools/surelog/__init__.py +12 -0
- siliconcompiler/tools/verilator/compile.py +27 -0
- siliconcompiler/tools/verilator/verilator.py +9 -0
- siliconcompiler/tools/vpr/vpr.py +18 -0
- siliconcompiler/tools/yosys/{syn_asic_fpga_shared.tcl → procs.tcl} +23 -0
- siliconcompiler/tools/yosys/sc_screenshot.tcl +104 -0
- siliconcompiler/tools/yosys/sc_syn.tcl +7 -9
- siliconcompiler/tools/yosys/screenshot.py +153 -0
- siliconcompiler/tools/yosys/syn_asic.py +3 -0
- siliconcompiler/tools/yosys/syn_asic.tcl +1 -3
- siliconcompiler/tools/yosys/syn_fpga.tcl +3 -2
- siliconcompiler/toolscripts/_tools.json +10 -5
- siliconcompiler/toolscripts/rhel8/install-chisel.sh +26 -0
- siliconcompiler/toolscripts/rhel8/install-ghdl.sh +25 -0
- siliconcompiler/toolscripts/rhel8/install-icarus.sh +40 -0
- siliconcompiler/toolscripts/rhel8/install-klayout.sh +17 -0
- siliconcompiler/toolscripts/rhel8/install-magic.sh +26 -0
- siliconcompiler/toolscripts/rhel8/install-montage.sh +5 -0
- siliconcompiler/toolscripts/rhel8/install-netgen.sh +25 -0
- siliconcompiler/toolscripts/rhel8/install-openroad.sh +31 -0
- siliconcompiler/toolscripts/rhel8/install-slang.sh +31 -0
- siliconcompiler/toolscripts/rhel8/install-surelog.sh +32 -0
- siliconcompiler/toolscripts/rhel8/install-sv2v.sh +27 -0
- siliconcompiler/toolscripts/rhel8/install-verible.sh +24 -0
- siliconcompiler/toolscripts/rhel8/install-verilator.sh +40 -0
- siliconcompiler/toolscripts/rhel8/install-xyce.sh +64 -0
- siliconcompiler/toolscripts/rhel8/install-yosys.sh +23 -0
- siliconcompiler/toolscripts/rhel9/install-chisel.sh +26 -0
- siliconcompiler/toolscripts/rhel9/install-ghdl.sh +25 -0
- siliconcompiler/toolscripts/rhel9/install-icarus.sh +40 -0
- siliconcompiler/toolscripts/rhel9/install-klayout.sh +17 -0
- siliconcompiler/toolscripts/rhel9/install-magic.sh +26 -0
- siliconcompiler/toolscripts/rhel9/install-montage.sh +5 -0
- siliconcompiler/toolscripts/rhel9/install-netgen.sh +25 -0
- siliconcompiler/toolscripts/rhel9/install-slang.sh +31 -0
- siliconcompiler/toolscripts/rhel9/install-surelog.sh +32 -0
- siliconcompiler/toolscripts/rhel9/install-sv2v.sh +27 -0
- siliconcompiler/toolscripts/rhel9/install-verible.sh +24 -0
- siliconcompiler/toolscripts/rhel9/install-verilator.sh +40 -0
- siliconcompiler/toolscripts/rhel9/install-xdm.sh +43 -0
- siliconcompiler/toolscripts/rhel9/install-xyce.sh +64 -0
- siliconcompiler/toolscripts/rhel9/install-yosys.sh +23 -0
- siliconcompiler/toolscripts/ubuntu20/install-icepack.sh +1 -1
- siliconcompiler/toolscripts/ubuntu20/install-xdm.sh +40 -0
- siliconcompiler/toolscripts/ubuntu20/install-yosys.sh +2 -2
- siliconcompiler/toolscripts/ubuntu22/install-icepack.sh +1 -1
- siliconcompiler/toolscripts/ubuntu22/install-xdm.sh +40 -0
- siliconcompiler/toolscripts/ubuntu22/install-yosys.sh +2 -2
- siliconcompiler/toolscripts/ubuntu24/install-icepack.sh +1 -1
- siliconcompiler/toolscripts/ubuntu24/install-klayout.sh +2 -0
- siliconcompiler/toolscripts/ubuntu24/install-xdm.sh +40 -0
- siliconcompiler/toolscripts/ubuntu24/install-yosys.sh +2 -2
- siliconcompiler/utils/__init__.py +30 -1
- siliconcompiler/utils/showtools.py +4 -0
- {siliconcompiler-0.28.2.dist-info → siliconcompiler-0.28.4.dist-info}/METADATA +22 -8
- {siliconcompiler-0.28.2.dist-info → siliconcompiler-0.28.4.dist-info}/RECORD +116 -67
- {siliconcompiler-0.28.2.dist-info → siliconcompiler-0.28.4.dist-info}/WHEEL +1 -1
- siliconcompiler/report/streamlit_viewer.py +0 -944
- {siliconcompiler-0.28.2.dist-info → siliconcompiler-0.28.4.dist-info}/LICENSE +0 -0
- {siliconcompiler-0.28.2.dist-info → siliconcompiler-0.28.4.dist-info}/entry_points.txt +0 -0
- {siliconcompiler-0.28.2.dist-info → siliconcompiler-0.28.4.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# KLayout script to export an OpenROAD marker DB from a DRC db
|
|
2
|
+
#
|
|
3
|
+
# Based on:
|
|
4
|
+
# https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts/blob/master/flow/util/convertDrc.py
|
|
5
|
+
|
|
6
|
+
import pya
|
|
7
|
+
import glob
|
|
8
|
+
import json
|
|
9
|
+
import os
|
|
10
|
+
import sys
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def convert_drc(view, path):
|
|
14
|
+
rdb_id = view.create_rdb(os.path.basename(path))
|
|
15
|
+
rdb = view.rdb(rdb_id)
|
|
16
|
+
print(f"[INFO] reading {path}")
|
|
17
|
+
rdb.load(path)
|
|
18
|
+
|
|
19
|
+
source = os.path.abspath(path)
|
|
20
|
+
|
|
21
|
+
ordb = {
|
|
22
|
+
"source": source,
|
|
23
|
+
"description": "KLayout DRC conversion",
|
|
24
|
+
"category": {}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
for category in rdb.each_category():
|
|
28
|
+
if category.num_items() == 0:
|
|
29
|
+
# ignore categories with no data
|
|
30
|
+
continue
|
|
31
|
+
|
|
32
|
+
ordb_category = {
|
|
33
|
+
"description": category.description,
|
|
34
|
+
"source": source,
|
|
35
|
+
"violations": []
|
|
36
|
+
}
|
|
37
|
+
ordb["category"][category.name()] = ordb_category
|
|
38
|
+
|
|
39
|
+
for item in rdb.each_item_per_category(category.rdb_id()):
|
|
40
|
+
violation = {
|
|
41
|
+
"visited": item.is_visited(),
|
|
42
|
+
"visible": True,
|
|
43
|
+
"waived": "waived" in item.tags_str
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
ordb_category["violations"].append(violation)
|
|
47
|
+
|
|
48
|
+
shapes = []
|
|
49
|
+
violation["shape"] = shapes
|
|
50
|
+
|
|
51
|
+
text = []
|
|
52
|
+
|
|
53
|
+
for value in item.each_value():
|
|
54
|
+
if value.is_box():
|
|
55
|
+
shapes.append({
|
|
56
|
+
"type": "box",
|
|
57
|
+
"points": [{
|
|
58
|
+
"x": value.box().left,
|
|
59
|
+
"y": value.box().bottom
|
|
60
|
+
}, {
|
|
61
|
+
"x": value.box().right,
|
|
62
|
+
"y": value.box().top
|
|
63
|
+
}]
|
|
64
|
+
})
|
|
65
|
+
elif value.is_edge():
|
|
66
|
+
shapes.append({
|
|
67
|
+
"type": "line",
|
|
68
|
+
"points": [{
|
|
69
|
+
"x": value.edge().p1.x,
|
|
70
|
+
"y": value.edge().p1.y
|
|
71
|
+
}, {
|
|
72
|
+
"x": value.edge().p2.x,
|
|
73
|
+
"y": value.edge().p2.y
|
|
74
|
+
}]
|
|
75
|
+
})
|
|
76
|
+
elif value.is_edge_pair():
|
|
77
|
+
edge1 = value.edge_pair().first
|
|
78
|
+
edge2 = value.edge_pair().second
|
|
79
|
+
|
|
80
|
+
shapes.append({
|
|
81
|
+
"type": "line",
|
|
82
|
+
"points": [{
|
|
83
|
+
"x": edge1.p1.x,
|
|
84
|
+
"y": edge1.p1.y
|
|
85
|
+
}, {
|
|
86
|
+
"x": edge1.p2.x,
|
|
87
|
+
"y": edge1.p2.y
|
|
88
|
+
}]
|
|
89
|
+
})
|
|
90
|
+
shapes.append({
|
|
91
|
+
"type": "line",
|
|
92
|
+
"points": [{
|
|
93
|
+
"x": edge2.p1.x,
|
|
94
|
+
"y": edge2.p1.y
|
|
95
|
+
}, {
|
|
96
|
+
"x": edge2.p2.x,
|
|
97
|
+
"y": edge2.p2.y
|
|
98
|
+
}]
|
|
99
|
+
})
|
|
100
|
+
elif value.is_polygon():
|
|
101
|
+
points = []
|
|
102
|
+
for edge in value.polygon().each_edge():
|
|
103
|
+
points.append({
|
|
104
|
+
"x": edge.p1.x,
|
|
105
|
+
"y": edge.p1.y
|
|
106
|
+
})
|
|
107
|
+
points.append({
|
|
108
|
+
"x": edge.p2.x,
|
|
109
|
+
"y": edge.p2.y
|
|
110
|
+
})
|
|
111
|
+
shapes.append({
|
|
112
|
+
"type": "polygon",
|
|
113
|
+
"points": points
|
|
114
|
+
})
|
|
115
|
+
elif value.is_path():
|
|
116
|
+
points = []
|
|
117
|
+
for edge in value.path().polygon().each_edge():
|
|
118
|
+
points.append({
|
|
119
|
+
"x": edge.p1.x,
|
|
120
|
+
"y": edge.p1.y
|
|
121
|
+
})
|
|
122
|
+
points.append({
|
|
123
|
+
"x": edge.p2.x,
|
|
124
|
+
"y": edge.p2.y
|
|
125
|
+
})
|
|
126
|
+
shapes.append({
|
|
127
|
+
"type": "polygon",
|
|
128
|
+
"points": points
|
|
129
|
+
})
|
|
130
|
+
elif value.is_text():
|
|
131
|
+
text.append(value.text())
|
|
132
|
+
elif value.is_string():
|
|
133
|
+
text.append(value.string())
|
|
134
|
+
else:
|
|
135
|
+
print("[WARN] Unknown violation shape:", value)
|
|
136
|
+
|
|
137
|
+
comment = ""
|
|
138
|
+
if hasattr(item, 'comment'):
|
|
139
|
+
comment = item.comment
|
|
140
|
+
if text:
|
|
141
|
+
if comment:
|
|
142
|
+
comment += ": "
|
|
143
|
+
comment += ", ".join(text)
|
|
144
|
+
|
|
145
|
+
if comment:
|
|
146
|
+
violation["comment"] = comment
|
|
147
|
+
|
|
148
|
+
return ordb
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def main():
|
|
152
|
+
# SC_ROOT provided by CLI
|
|
153
|
+
sys.path.append(SC_ROOT) # noqa: F821
|
|
154
|
+
|
|
155
|
+
from tools.klayout.klayout_utils import get_schema
|
|
156
|
+
|
|
157
|
+
schema = get_schema(manifest='sc_manifest.json')
|
|
158
|
+
|
|
159
|
+
design = schema.get('design')
|
|
160
|
+
|
|
161
|
+
app = pya.Application.instance()
|
|
162
|
+
win = app.main_window()
|
|
163
|
+
|
|
164
|
+
# Create a dummy view to use for loading
|
|
165
|
+
cell_view = win.create_layout(0)
|
|
166
|
+
layout_view = cell_view.view()
|
|
167
|
+
|
|
168
|
+
ordb = {}
|
|
169
|
+
for file in glob.glob(f'inputs/{design}*.lyrdb') + glob.glob('inputs/{design}*.ascii'):
|
|
170
|
+
name = os.path.basename(file)
|
|
171
|
+
|
|
172
|
+
ordb[name] = convert_drc(layout_view, file)
|
|
173
|
+
|
|
174
|
+
with open(f"outputs/{design}.json", "w") as outfile:
|
|
175
|
+
json.dump(
|
|
176
|
+
ordb,
|
|
177
|
+
outfile,
|
|
178
|
+
indent=2)
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
if __name__ == '__main__':
|
|
182
|
+
main()
|
|
@@ -109,6 +109,8 @@ def setup(chip):
|
|
|
109
109
|
_, task = get_tool_task(chip, step, index)
|
|
110
110
|
clobber = False
|
|
111
111
|
|
|
112
|
+
chip.set('tool', tool, 'task', task, 'threads', 1, step=step, index=index, clobber=clobber)
|
|
113
|
+
|
|
112
114
|
script = 'klayout_operations.py'
|
|
113
115
|
option = ['-z', '-nc', '-rx', '-r']
|
|
114
116
|
chip.set('tool', tool, 'task', task, 'script', script, step=step, index=index, clobber=clobber)
|
|
@@ -73,12 +73,12 @@ def setup(chip):
|
|
|
73
73
|
|
|
74
74
|
step = chip.get('arg', 'step')
|
|
75
75
|
index = chip.get('arg', 'index')
|
|
76
|
-
|
|
76
|
+
tool, task = get_tool_task(chip, step, index)
|
|
77
|
+
clobber = False
|
|
77
78
|
|
|
78
|
-
|
|
79
|
+
chip.set('tool', tool, 'task', task, 'threads', 1, step=step, index=index, clobber=clobber)
|
|
79
80
|
|
|
80
|
-
|
|
81
|
-
clobber = False
|
|
81
|
+
general_gui_setup(chip, task, False)
|
|
82
82
|
|
|
83
83
|
option = ['-nc', '-rm']
|
|
84
84
|
chip.set('tool', tool, 'task', task, 'option', option, step=step, index=index, clobber=clobber)
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import re
|
|
2
2
|
|
|
3
3
|
from siliconcompiler.tools.magic.magic import setup as setup_tool
|
|
4
|
+
from siliconcompiler.tools.magic.magic import process_file
|
|
4
5
|
from siliconcompiler import sc_open
|
|
5
6
|
from siliconcompiler.tools._common import get_tool_task, record_metric
|
|
7
|
+
from siliconcompiler.tools._common.asic import get_mainlib, get_libraries
|
|
6
8
|
|
|
7
9
|
|
|
8
10
|
def setup(chip):
|
|
@@ -22,6 +24,25 @@ def setup(chip):
|
|
|
22
24
|
chip.set('tool', tool, 'task', task, 'output', f'{design}.drc.mag', step=step, index=index)
|
|
23
25
|
|
|
24
26
|
|
|
27
|
+
def pre_process(chip):
|
|
28
|
+
step = chip.get('arg', 'step')
|
|
29
|
+
index = chip.get('arg', 'index')
|
|
30
|
+
tool, task = get_tool_task(chip, step, index)
|
|
31
|
+
|
|
32
|
+
pdk = chip.get('option', 'pdk')
|
|
33
|
+
stackup = chip.get('option', 'stackup')
|
|
34
|
+
mainlib = get_mainlib(chip)
|
|
35
|
+
libtype = chip.get('library', mainlib, 'asic', 'libarch', step=step, index=index)
|
|
36
|
+
process_file('lef', chip, 'pdk', pdk, 'aprtech', 'magic', stackup, libtype, 'lef')
|
|
37
|
+
|
|
38
|
+
for lib in get_libraries(chip, 'logic'):
|
|
39
|
+
process_file('lef', chip, 'library', lib, 'output', stackup, 'lef')
|
|
40
|
+
|
|
41
|
+
for lib in get_libraries(chip, 'macro'):
|
|
42
|
+
if lib in chip.get('tool', tool, 'task', task, 'var', 'exclude', step=step, index=index):
|
|
43
|
+
process_file('lef', chip, 'library', lib, 'output', stackup, 'lef')
|
|
44
|
+
|
|
45
|
+
|
|
25
46
|
################################
|
|
26
47
|
# Post_process (post executable)
|
|
27
48
|
################################
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
from siliconcompiler.tools.magic.magic import setup as setup_tool
|
|
2
|
+
from siliconcompiler.tools.magic.magic import process_file
|
|
2
3
|
from siliconcompiler.tools._common import get_tool_task
|
|
4
|
+
from siliconcompiler.tools._common.asic import get_mainlib, get_libraries
|
|
3
5
|
|
|
4
6
|
|
|
5
7
|
def setup(chip):
|
|
@@ -17,3 +19,22 @@ def setup(chip):
|
|
|
17
19
|
design = chip.top()
|
|
18
20
|
|
|
19
21
|
chip.add('tool', tool, 'task', task, 'output', f'{design}.spice', step=step, index=index)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def pre_process(chip):
|
|
25
|
+
step = chip.get('arg', 'step')
|
|
26
|
+
index = chip.get('arg', 'index')
|
|
27
|
+
tool, task = get_tool_task(chip, step, index)
|
|
28
|
+
|
|
29
|
+
pdk = chip.get('option', 'pdk')
|
|
30
|
+
stackup = chip.get('option', 'stackup')
|
|
31
|
+
mainlib = get_mainlib(chip)
|
|
32
|
+
libtype = chip.get('library', mainlib, 'asic', 'libarch', step=step, index=index)
|
|
33
|
+
process_file('lef', chip, 'pdk', pdk, 'aprtech', 'magic', stackup, libtype, 'lef')
|
|
34
|
+
|
|
35
|
+
for lib in get_libraries(chip, 'logic'):
|
|
36
|
+
process_file('lef', chip, 'library', lib, 'output', stackup, 'lef')
|
|
37
|
+
|
|
38
|
+
for lib in get_libraries(chip, 'macro'):
|
|
39
|
+
if lib in chip.get('tool', tool, 'task', task, 'var', 'exclude', step=step, index=index):
|
|
40
|
+
process_file('lef', chip, 'library', lib, 'output', stackup, 'lef')
|
|
@@ -9,9 +9,12 @@ Installation: https://github.com/RTimothyEdwards/magic
|
|
|
9
9
|
Sources: https://github.com/RTimothyEdwards/magic
|
|
10
10
|
'''
|
|
11
11
|
|
|
12
|
+
import gzip
|
|
13
|
+
import shutil
|
|
12
14
|
import os
|
|
13
15
|
from siliconcompiler.tools._common import input_provides, get_tool_task
|
|
14
16
|
from siliconcompiler.targets import freepdk45_demo
|
|
17
|
+
from siliconcompiler import utils
|
|
15
18
|
|
|
16
19
|
|
|
17
20
|
####################################################################
|
|
@@ -79,6 +82,32 @@ def parse_version(stdout):
|
|
|
79
82
|
return stdout.strip('\n')
|
|
80
83
|
|
|
81
84
|
|
|
85
|
+
def process_file(file_type, chip, *key):
|
|
86
|
+
step = chip.get('arg', 'step')
|
|
87
|
+
index = chip.get('arg', 'index')
|
|
88
|
+
tool, task = get_tool_task(chip, step, index)
|
|
89
|
+
|
|
90
|
+
if chip.get(*key, field='pernode') == 'never':
|
|
91
|
+
files = chip.find_files(*key)
|
|
92
|
+
else:
|
|
93
|
+
files = chip.find_files(*key, step=step, index=index)
|
|
94
|
+
|
|
95
|
+
for file in files:
|
|
96
|
+
if file.lower().endswith('.gz'):
|
|
97
|
+
new_file_name = f'inputs/sc_{utils.get_hashed_filename(file[:-3])}'
|
|
98
|
+
|
|
99
|
+
with gzip.open(file, 'rt', encoding="utf-8") as fin:
|
|
100
|
+
with open(new_file_name, 'w') as fout:
|
|
101
|
+
fout.write(fin.read().encode("ascii", "ignore").decode("ascii"))
|
|
102
|
+
else:
|
|
103
|
+
new_file_name = f'inputs/sc_{utils.get_hashed_filename(file)}'
|
|
104
|
+
shutil.copy(file, new_file_name)
|
|
105
|
+
|
|
106
|
+
chip.add('tool', tool, 'task', task, 'file', f'read_{file_type}',
|
|
107
|
+
os.path.join(chip.getworkdir(step=step, index=index), new_file_name),
|
|
108
|
+
step=step, index=index)
|
|
109
|
+
|
|
110
|
+
|
|
82
111
|
##################################################
|
|
83
112
|
if __name__ == "__main__":
|
|
84
113
|
|
|
@@ -23,18 +23,8 @@ set sc_design [sc_top]
|
|
|
23
23
|
set sc_macrolibs [sc_get_asic_libraries macro]
|
|
24
24
|
set sc_stackup [sc_cfg_get option stackup]
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
} else {
|
|
29
|
-
set sc_exclude [list]
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
# Ignore specific libraries by reading their LEFs (causes magic to abstract them)
|
|
33
|
-
foreach lib $sc_macrolibs {
|
|
34
|
-
puts $lib
|
|
35
|
-
if { [lsearch -exact $sc_exclude $lib] >= 0 } {
|
|
36
|
-
lef read [sc_cfg_get library $lib output $sc_stackup lef]
|
|
37
|
-
}
|
|
26
|
+
foreach sc_lef [sc_cfg_tool_task_get file read_lef] {
|
|
27
|
+
lef read $sc_lef
|
|
38
28
|
}
|
|
39
29
|
|
|
40
30
|
gds noduplicates true
|
|
@@ -14,21 +14,9 @@ set sc_techlef [sc_cfg_get pdk $sc_pdk aprtech magic $sc_stackup $sc_libtype lef
|
|
|
14
14
|
set sc_liblef [sc_cfg_get library $sc_mainlib output $sc_stackup lef]
|
|
15
15
|
set sc_macrolibs [sc_get_asic_libraries macro]
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
set sc_exclude [list]
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
lef read $sc_techlef
|
|
24
|
-
lef read $sc_liblef
|
|
25
|
-
|
|
26
|
-
# Ignore specific libraries by reading their LEFs (causes magic to abstract them)
|
|
27
|
-
foreach lib $sc_macrolibs {
|
|
28
|
-
puts $lib
|
|
29
|
-
if { [lsearch -exact $sc_exclude $lib] >= 0 } {
|
|
30
|
-
lef read [sc_cfg_get library $lib output $sc_stackup lef]
|
|
31
|
-
}
|
|
17
|
+
foreach sc_lef [sc_cfg_tool_task_get file read_lef] {
|
|
18
|
+
puts "Reading LEF $sc_lef"
|
|
19
|
+
lef read $sc_lef
|
|
32
20
|
}
|
|
33
21
|
|
|
34
22
|
if { [file exists "inputs/$sc_design.gds"] } {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from siliconcompiler.tools._common import input_provides, add_common_file, get_tool_task
|
|
2
|
+
from siliconcompiler.tools._common.asic import set_tool_task_var
|
|
2
3
|
from siliconcompiler.tools.openroad.openroad import setup as setup_tool
|
|
3
4
|
from siliconcompiler.tools.openroad.openroad import build_pex_corners
|
|
4
5
|
from siliconcompiler.tools.openroad.openroad import post_process as or_post_process
|
|
@@ -46,6 +47,10 @@ def setup(chip):
|
|
|
46
47
|
'script to insert the padring',
|
|
47
48
|
field='help')
|
|
48
49
|
|
|
50
|
+
set_tool_task_var(chip, param_key='remove_synth_buffers',
|
|
51
|
+
default_value=True,
|
|
52
|
+
schelp='remove buffers inserted by synthesis')
|
|
53
|
+
|
|
49
54
|
snap = chip.get('tool', tool, 'task', task, 'var', 'ifp_snap_strategy',
|
|
50
55
|
step=step, index=index)[0]
|
|
51
56
|
snaps_allowed = ('none', 'site', 'manufacturing_grid')
|
|
@@ -38,7 +38,7 @@ def setup_tool(chip, exit=True, clobber=True):
|
|
|
38
38
|
|
|
39
39
|
chip.set('tool', tool, 'exe', tool)
|
|
40
40
|
chip.set('tool', tool, 'vswitch', '-version')
|
|
41
|
-
chip.set('tool', tool, 'version', '>=v2.0-
|
|
41
|
+
chip.set('tool', tool, 'version', '>=v2.0-16580', clobber=clobber)
|
|
42
42
|
chip.set('tool', tool, 'format', 'tcl', clobber=clobber)
|
|
43
43
|
|
|
44
44
|
# exit automatically in batch mode and not breakpoint
|
|
@@ -274,7 +274,10 @@ def post_process(chip):
|
|
|
274
274
|
"floating_nets.rpt",
|
|
275
275
|
f"{chip.design}_antenna.rpt",
|
|
276
276
|
f"{chip.design}_antenna_post_repair.rpt"],
|
|
277
|
-
"drcs": [f"{chip.design}_drc.rpt"
|
|
277
|
+
"drcs": [f"{chip.design}_drc.rpt",
|
|
278
|
+
f"markers/{chip.design}.drc.rpt",
|
|
279
|
+
f"markers/{chip.design}.drc.json",
|
|
280
|
+
f"images/markers/{chip.design}.drc.png"]
|
|
278
281
|
}
|
|
279
282
|
metric_reports["leakagepower"] = metric_reports["peakpower"]
|
|
280
283
|
|
|
@@ -583,10 +586,16 @@ def _define_pad_params(chip):
|
|
|
583
586
|
|
|
584
587
|
|
|
585
588
|
def _define_rsz_params(chip):
|
|
589
|
+
set_tool_task_var(chip, param_key='rsz_skip_setup_repair',
|
|
590
|
+
default_value=False,
|
|
591
|
+
schelp='skip setup timing repair')
|
|
586
592
|
set_tool_task_var(chip, param_key='rsz_setup_slack_margin',
|
|
587
593
|
default_value='0.0',
|
|
588
594
|
schelp='specifies the margin to apply when performing setup repair '
|
|
589
595
|
'in library timing units')
|
|
596
|
+
set_tool_task_var(chip, param_key='rsz_skip_hold_repair',
|
|
597
|
+
default_value=False,
|
|
598
|
+
schelp='skip hold timing repair')
|
|
590
599
|
set_tool_task_var(chip, param_key='rsz_hold_slack_margin',
|
|
591
600
|
default_value='0.0',
|
|
592
601
|
schelp='specifies the margin to apply when performing setup repair '
|
|
@@ -667,6 +676,10 @@ def _define_dpl_params(chip):
|
|
|
667
676
|
default_value='false',
|
|
668
677
|
schelp='true/false, disallow single site gaps in detail placement')
|
|
669
678
|
|
|
679
|
+
set_tool_task_var(chip, param_key='dpl_use_decap_fillers',
|
|
680
|
+
default_value='true',
|
|
681
|
+
schelp='true/false, use decap fillers along with non-decap fillers')
|
|
682
|
+
|
|
670
683
|
|
|
671
684
|
def _define_cts_params(chip):
|
|
672
685
|
step = chip.get('arg', 'step')
|
|
@@ -846,6 +859,41 @@ def _define_mpl_params(chip):
|
|
|
846
859
|
schelp='minimum number of macros to use while clustering for macro placement')
|
|
847
860
|
set_tool_task_var(chip, param_key='rtlmp_max_macros',
|
|
848
861
|
schelp='maximum number of macros to use while clustering for macro placement')
|
|
862
|
+
set_tool_task_var(chip, param_key='rtlmp_max_levels',
|
|
863
|
+
schelp='maximum depth of physical hierarchical tree')
|
|
864
|
+
set_tool_task_var(chip, param_key='rtlmp_min_aspect_ratio',
|
|
865
|
+
schelp='Specifies the minimum aspect ratio of its width to height of a '
|
|
866
|
+
'standard cell cluster')
|
|
867
|
+
set_tool_task_var(chip, param_key='rtlmp_fence',
|
|
868
|
+
schelp='Defines the global fence bounding box coordinates '
|
|
869
|
+
'(llx, lly, urx, ury)')
|
|
870
|
+
set_tool_task_var(chip, param_key='rtlmp_bus_planning',
|
|
871
|
+
schelp='Flag to enable bus planning')
|
|
872
|
+
set_tool_task_var(chip, param_key='rtlmp_target_dead_space',
|
|
873
|
+
schelp='Specifies the target dead space percentage, which influences '
|
|
874
|
+
'the utilization of standard cell clusters')
|
|
875
|
+
|
|
876
|
+
set_tool_task_var(chip, param_key='rtlmp_area_weight',
|
|
877
|
+
schelp='Weight for the area of current floorplan')
|
|
878
|
+
set_tool_task_var(chip, param_key='rtlmp_outline_weight',
|
|
879
|
+
schelp='Weight for violating the fixed outline constraint, meaning that all '
|
|
880
|
+
'clusters should be placed within the shape of their parent cluster')
|
|
881
|
+
set_tool_task_var(chip, param_key='rtlmp_wirelength_weight',
|
|
882
|
+
schelp='Weight for half-perimeter wirelength')
|
|
883
|
+
set_tool_task_var(chip, param_key='rtlmp_guidance_weight',
|
|
884
|
+
schelp='Weight for guidance cost or clusters being placed near specified '
|
|
885
|
+
'regions if users provide such constraints')
|
|
886
|
+
set_tool_task_var(chip, param_key='rtlmp_fence_weight',
|
|
887
|
+
schelp='Weight for fence cost, or how far the macro is from zero '
|
|
888
|
+
'fence violation')
|
|
889
|
+
set_tool_task_var(chip, param_key='rtlmp_blockage_weight',
|
|
890
|
+
schelp='Weight for the boundary, or how far the hard macro clusters are '
|
|
891
|
+
'from boundaries')
|
|
892
|
+
set_tool_task_var(chip, param_key='rtlmp_notch_weight',
|
|
893
|
+
schelp='Weight for the notch, or the existence of dead space that cannot be '
|
|
894
|
+
'used for placement & routing')
|
|
895
|
+
set_tool_task_var(chip, param_key='rtlmp_macro_blockage_weight',
|
|
896
|
+
schelp='Weight for macro blockage, or the overlapping instances of the macro')
|
|
849
897
|
|
|
850
898
|
|
|
851
899
|
def _define_ord_params(chip):
|
|
@@ -920,9 +968,12 @@ def _set_reports(chip, reports):
|
|
|
920
968
|
def check_enabled(type):
|
|
921
969
|
for key in (('tool', tool, 'task', task, 'var', f'skip_{type}'),
|
|
922
970
|
('option', 'var', f'openroad_skip_{type}')):
|
|
923
|
-
if chip.valid(*key)
|
|
924
|
-
|
|
925
|
-
|
|
971
|
+
if chip.valid(*key):
|
|
972
|
+
if chip.get(*key, field='pernode') == 'never':
|
|
973
|
+
if chip.get(*key) == ["true"]:
|
|
974
|
+
return False
|
|
975
|
+
elif chip.get(*key, step=step, index=index) == ["true"]:
|
|
976
|
+
return False
|
|
926
977
|
return True
|
|
927
978
|
|
|
928
979
|
for report in reports:
|
|
@@ -265,10 +265,24 @@ set openroad_mpl_macro_place_channel [dict get $openroad_task_vars macro_place_c
|
|
|
265
265
|
set openroad_ppl_arguments [dict get $openroad_task_vars ppl_arguments]
|
|
266
266
|
|
|
267
267
|
set openroad_rtlmp_enable [lindex [dict get $openroad_task_vars rtlmp_enable] 0]
|
|
268
|
+
set openroad_rtlmp_max_levels [lindex [dict get $openroad_task_vars rtlmp_max_levels] 0]
|
|
268
269
|
set openroad_rtlmp_min_instances [lindex [dict get $openroad_task_vars rtlmp_min_instances] 0]
|
|
269
270
|
set openroad_rtlmp_max_instances [lindex [dict get $openroad_task_vars rtlmp_max_instances] 0]
|
|
270
271
|
set openroad_rtlmp_min_macros [lindex [dict get $openroad_task_vars rtlmp_min_macros] 0]
|
|
271
272
|
set openroad_rtlmp_max_macros [lindex [dict get $openroad_task_vars rtlmp_max_macros] 0]
|
|
273
|
+
set openroad_rtlmp_min_aspect_ratio [lindex [dict get $openroad_task_vars rtlmp_min_aspect_ratio] 0]
|
|
274
|
+
set openroad_rtlmp_fence [dict get $openroad_task_vars rtlmp_fence]
|
|
275
|
+
set openroad_rtlmp_bus_planning [lindex [dict get $openroad_task_vars rtlmp_bus_planning] 0]
|
|
276
|
+
set openroad_rtlmp_target_dead_space \
|
|
277
|
+
[lindex [dict get $openroad_task_vars rtlmp_target_dead_space] 0]
|
|
278
|
+
set openroad_rtlmp_area_weight [lindex [dict get $openroad_task_vars rtlmp_area_weight] 0]
|
|
279
|
+
set openroad_rtlmp_outline_weight [lindex [dict get $openroad_task_vars rtlmp_outline_weight] 0]
|
|
280
|
+
set openroad_rtlmp_wirelength_weight \
|
|
281
|
+
[lindex [dict get $openroad_task_vars rtlmp_wirelength_weight] 0]
|
|
282
|
+
set openroad_rtlmp_guidance_weight [lindex [dict get $openroad_task_vars rtlmp_guidance_weight] 0]
|
|
283
|
+
set openroad_rtlmp_fence_weight [lindex [dict get $openroad_task_vars rtlmp_fence_weight] 0]
|
|
284
|
+
set openroad_rtlmp_notch_weight [lindex [dict get $openroad_task_vars rtlmp_notch_weight] 0]
|
|
285
|
+
set openroad_rtlmp_blockage_weight [lindex [dict get $openroad_task_vars rtlmp_blockage_weight] 0]
|
|
272
286
|
|
|
273
287
|
set openroad_gpl_place_density [lindex [dict get $openroad_task_vars place_density] 0]
|
|
274
288
|
set openroad_gpl_padding [lindex [dict get $openroad_task_vars pad_global_place] 0]
|
|
@@ -427,6 +441,7 @@ if { $sc_task != "floorplan" } {
|
|
|
427
441
|
# Setup reports directories
|
|
428
442
|
file mkdir reports/timing
|
|
429
443
|
file mkdir reports/power
|
|
444
|
+
file mkdir reports/markers
|
|
430
445
|
|
|
431
446
|
if { $sc_task == "show" || $sc_task == "screenshot" } {
|
|
432
447
|
if { $sc_task == "screenshot" } {
|
|
@@ -31,8 +31,6 @@ if { [llength [all_clocks]] > 0 } {
|
|
|
31
31
|
|
|
32
32
|
sc_detailed_placement
|
|
33
33
|
|
|
34
|
-
estimate_parasitics -placement
|
|
35
|
-
|
|
36
34
|
set repair_timing_args []
|
|
37
35
|
if { $openroad_rsz_skip_pin_swap == "true" } {
|
|
38
36
|
lappend repair_timing_args "-skip_pin_swap"
|
|
@@ -41,18 +39,25 @@ if { [llength [all_clocks]] > 0 } {
|
|
|
41
39
|
lappend repair_timing_args "-skip_gate_cloning"
|
|
42
40
|
}
|
|
43
41
|
|
|
44
|
-
|
|
45
|
-
-
|
|
46
|
-
-hold_margin $openroad_rsz_hold_slack_margin \
|
|
47
|
-
-repair_tns $openroad_rsz_repair_tns \
|
|
48
|
-
{*}$repair_timing_args
|
|
42
|
+
if { [lindex [sc_cfg_tool_task_get var rsz_skip_setup_repair] 0] != "true" } {
|
|
43
|
+
estimate_parasitics -placement
|
|
49
44
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
45
|
+
repair_timing -setup -verbose \
|
|
46
|
+
-setup_margin $openroad_rsz_setup_slack_margin \
|
|
47
|
+
-hold_margin $openroad_rsz_hold_slack_margin \
|
|
48
|
+
-repair_tns $openroad_rsz_repair_tns \
|
|
49
|
+
{*}$repair_timing_args
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if { [lindex [sc_cfg_tool_task_get var rsz_skip_hold_repair] 0] != "true" } {
|
|
53
|
+
estimate_parasitics -placement
|
|
54
|
+
|
|
55
|
+
repair_timing -hold -verbose \
|
|
56
|
+
-setup_margin $openroad_rsz_setup_slack_margin \
|
|
57
|
+
-hold_margin $openroad_rsz_hold_slack_margin \
|
|
58
|
+
-repair_tns $openroad_rsz_repair_tns \
|
|
59
|
+
{*}$repair_timing_args
|
|
60
|
+
}
|
|
56
61
|
|
|
57
62
|
sc_detailed_placement
|
|
58
63
|
}
|