siliconcompiler 0.36.1__py3-none-any.whl → 0.36.3__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/_metadata.py +1 -1
- siliconcompiler/asic.py +4 -4
- siliconcompiler/design.py +6 -1
- siliconcompiler/package/__init__.py +3 -2
- siliconcompiler/project.py +36 -18
- siliconcompiler/schema/baseschema.py +7 -4
- siliconcompiler/schema/docschema.py +3 -3
- siliconcompiler/schema/editableschema.py +1 -1
- siliconcompiler/schema/namedschema.py +6 -6
- siliconcompiler/schema_support/cmdlineschema.py +5 -3
- siliconcompiler/schema_support/filesetschema.py +9 -1
- siliconcompiler/schema_support/pathschema.py +16 -10
- siliconcompiler/tool.py +7 -3
- siliconcompiler/tools/builtin/wait.py +16 -0
- siliconcompiler/tools/keplerformal/lec.py +2 -2
- siliconcompiler/tools/klayout/export.py +1 -3
- siliconcompiler/tools/klayout/merge.py +95 -0
- siliconcompiler/tools/klayout/scripts/klayout_merge.py +79 -0
- siliconcompiler/tools/openroad/_apr.py +69 -11
- siliconcompiler/tools/openroad/power_grid.py +1 -1
- siliconcompiler/tools/openroad/scripts/common/read_timing_constraints.tcl +17 -15
- siliconcompiler/tools/openroad/scripts/common/write_data_timing.tcl +3 -1
- siliconcompiler/tools/vpr/__init__.py +9 -9
- siliconcompiler/tools/vpr/place.py +1 -2
- siliconcompiler/tools/yosys/syn_asic.py +4 -4
- siliconcompiler/tools/yosys/syn_fpga.py +7 -8
- siliconcompiler/toolscripts/_tools.json +6 -6
- siliconcompiler/utils/logging.py +6 -0
- {siliconcompiler-0.36.1.dist-info → siliconcompiler-0.36.3.dist-info}/METADATA +3 -3
- {siliconcompiler-0.36.1.dist-info → siliconcompiler-0.36.3.dist-info}/RECORD +34 -31
- {siliconcompiler-0.36.1.dist-info → siliconcompiler-0.36.3.dist-info}/WHEEL +1 -1
- {siliconcompiler-0.36.1.dist-info → siliconcompiler-0.36.3.dist-info}/entry_points.txt +0 -0
- {siliconcompiler-0.36.1.dist-info → siliconcompiler-0.36.3.dist-info}/licenses/LICENSE +0 -0
- {siliconcompiler-0.36.1.dist-info → siliconcompiler-0.36.3.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import pya
|
|
2
|
+
import sys
|
|
3
|
+
|
|
4
|
+
import os.path
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
if __name__ == "__main__":
|
|
8
|
+
# SC_ROOT provided by CLI
|
|
9
|
+
sys.path.append(SC_KLAYOUT_ROOT) # noqa: F821
|
|
10
|
+
sys.path.append(SC_TOOLS_ROOT) # noqa: F821
|
|
11
|
+
sys.path.append(SC_ROOT) # noqa: F821
|
|
12
|
+
|
|
13
|
+
from klayout_utils import (
|
|
14
|
+
technology,
|
|
15
|
+
get_schema,
|
|
16
|
+
generate_metrics
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
from klayout_operations import (
|
|
20
|
+
read_layout,
|
|
21
|
+
write_stream
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
schema = get_schema(manifest='sc_manifest.json')
|
|
25
|
+
|
|
26
|
+
# Extract info from manifest
|
|
27
|
+
sc_step = schema.get('arg', 'step')
|
|
28
|
+
sc_index = schema.get('arg', 'index')
|
|
29
|
+
sc_tool = 'klayout'
|
|
30
|
+
sc_task = 'merge'
|
|
31
|
+
|
|
32
|
+
design_name = schema.get('option', 'design')
|
|
33
|
+
fileset = schema.get("option", "fileset")[0]
|
|
34
|
+
design = schema.get("library", design_name, "fileset", fileset, "topmodule")
|
|
35
|
+
|
|
36
|
+
ref_type, ref_source0, ref_source1 = schema.get("tool", sc_tool, "task", sc_task,
|
|
37
|
+
"var", "reference",
|
|
38
|
+
step=sc_step, index=sc_index)
|
|
39
|
+
if ref_type == 'input':
|
|
40
|
+
step, index = ref_source0, ref_source1
|
|
41
|
+
input_file = os.path.join('inputs', f"{design}.{ref_source0}{ref_source1}.gds")
|
|
42
|
+
else:
|
|
43
|
+
input_file = schema.get("library", ref_source0, "fileset", ref_source1, "file", "gds")[0]
|
|
44
|
+
|
|
45
|
+
merge_files = []
|
|
46
|
+
for merge_type, merge_source0, merge_source1, prefix in \
|
|
47
|
+
schema.get("tool", sc_tool, "task", sc_task, "var", "merge",
|
|
48
|
+
step=sc_step, index=sc_index):
|
|
49
|
+
if merge_type == 'input':
|
|
50
|
+
merge_file = os.path.join('inputs', f"{design}.{merge_source0}{merge_source1}.gds")
|
|
51
|
+
else:
|
|
52
|
+
merge_file = schema.get("library", merge_source0, "fileset", merge_source1,
|
|
53
|
+
"file", "gds")[0]
|
|
54
|
+
merge_files.append((prefix, merge_file))
|
|
55
|
+
|
|
56
|
+
tech = technology(design, schema)
|
|
57
|
+
base_layout = read_layout(input_file)
|
|
58
|
+
top_cell = base_layout.top_cell()
|
|
59
|
+
base_layout.technology_name = tech.name
|
|
60
|
+
|
|
61
|
+
for prefix, merge_file in merge_files:
|
|
62
|
+
print(f"[INFO] Merging file '{merge_file}' with prefix '{prefix}'")
|
|
63
|
+
merge_layout = read_layout(merge_file)
|
|
64
|
+
|
|
65
|
+
merge_top = merge_layout.top_cell()
|
|
66
|
+
|
|
67
|
+
new_cell_name = f"{prefix}{merge_top.name}"
|
|
68
|
+
if base_layout.cell(new_cell_name):
|
|
69
|
+
print(f"[WARN] Cell '{new_cell_name}' already exists in base layout. Skipping.")
|
|
70
|
+
continue
|
|
71
|
+
print(f"[INFO] Adding cell '{merge_top.name}' as '{new_cell_name}'")
|
|
72
|
+
new_cell = base_layout.create_cell(new_cell_name)
|
|
73
|
+
new_cell.copy_tree(merge_top)
|
|
74
|
+
cell_inst = pya.CellInstArray(new_cell.cell_index(), pya.Trans())
|
|
75
|
+
top_cell.insert(cell_inst)
|
|
76
|
+
|
|
77
|
+
write_stream(base_layout, f"outputs/{design}.gds", True)
|
|
78
|
+
|
|
79
|
+
generate_metrics()
|
|
@@ -1218,6 +1218,10 @@ class APRTask(OpenROADTask):
|
|
|
1218
1218
|
"used to indicate if global routing information should be loaded",
|
|
1219
1219
|
defvalue=False)
|
|
1220
1220
|
|
|
1221
|
+
self.add_parameter("load_sdcs", "bool",
|
|
1222
|
+
"used to indicate if SDC files should be loaded before APR",
|
|
1223
|
+
defvalue=True)
|
|
1224
|
+
|
|
1221
1225
|
self.add_parameter("global_connect_fileset", "[(str,str)]",
|
|
1222
1226
|
"list of libraries and filesets to generate connects from")
|
|
1223
1227
|
|
|
@@ -1264,6 +1268,18 @@ class APRTask(OpenROADTask):
|
|
|
1264
1268
|
"""
|
|
1265
1269
|
self.set("var", "ord_heatmap_bins", (x, y), step=step, index=index)
|
|
1266
1270
|
|
|
1271
|
+
def set_openroad_loadsdcs(self, enable: bool,
|
|
1272
|
+
step: Optional[str] = None, index: Optional[str] = None) -> None:
|
|
1273
|
+
"""
|
|
1274
|
+
Enables or disables loading SDC files before APR.
|
|
1275
|
+
|
|
1276
|
+
Args:
|
|
1277
|
+
enable: True to load SDC files, False to disable.
|
|
1278
|
+
step: The specific step to apply this configuration to.
|
|
1279
|
+
index: The specific index to apply this configuration to.
|
|
1280
|
+
"""
|
|
1281
|
+
self.set("var", "load_sdcs", enable, step=step, index=index)
|
|
1282
|
+
|
|
1267
1283
|
def set_openroad_powercorner(self, corner: str,
|
|
1268
1284
|
step: Optional[str] = None, index: Optional[str] = None) -> None:
|
|
1269
1285
|
"""
|
|
@@ -1334,6 +1350,7 @@ class APRTask(OpenROADTask):
|
|
|
1334
1350
|
self.add_required_key("var", "ord_enable_images")
|
|
1335
1351
|
self.add_required_key("var", "ord_heatmap_bins")
|
|
1336
1352
|
self.add_required_key("var", "load_grt_setup")
|
|
1353
|
+
self.add_required_key("var", "load_sdcs")
|
|
1337
1354
|
|
|
1338
1355
|
if not self.get("var", "global_connect_fileset"):
|
|
1339
1356
|
self.__import_globalconnect_filesets()
|
|
@@ -1346,9 +1363,20 @@ class APRTask(OpenROADTask):
|
|
|
1346
1363
|
libcorners = set()
|
|
1347
1364
|
for scenario in self.project.constraint.timing.get_scenario().values():
|
|
1348
1365
|
libcorners.update(scenario.get_libcorner(self.step, self.index))
|
|
1366
|
+
self.add_required_key(scenario, "pexcorner")
|
|
1367
|
+
self.add_required_key(scenario, "libcorner")
|
|
1368
|
+
if scenario.get_check(self.step, self.index):
|
|
1369
|
+
self.add_required_key(scenario, "check")
|
|
1370
|
+
mode = scenario.get_mode(self.step, self.index)
|
|
1371
|
+
if mode:
|
|
1372
|
+
self.add_required_key(scenario, "mode")
|
|
1373
|
+
if self.get("var", "load_sdcs"):
|
|
1374
|
+
mode_obj = self.project.constraint.timing.get_mode(mode)
|
|
1375
|
+
self.add_required_key(mode_obj, "sdcfileset")
|
|
1376
|
+
|
|
1349
1377
|
delay_model = self.project.get("asic", "delaymodel")
|
|
1350
1378
|
for asiclib in self.project.get("asic", "asiclib"):
|
|
1351
|
-
lib = self.project.
|
|
1379
|
+
lib = self.project.get_library(asiclib)
|
|
1352
1380
|
for corner in libcorners:
|
|
1353
1381
|
if not lib.valid("asic", "libcornerfileset", corner, delay_model):
|
|
1354
1382
|
continue
|
|
@@ -1362,24 +1390,53 @@ class APRTask(OpenROADTask):
|
|
|
1362
1390
|
|
|
1363
1391
|
def __import_globalconnect_filesets(self):
|
|
1364
1392
|
for lib in self.project.get("asic", "asiclib"):
|
|
1365
|
-
libobj = self.project.
|
|
1393
|
+
libobj = self.project.get_library(lib)
|
|
1366
1394
|
if libobj.valid("tool", "openroad", "global_connect_fileset"):
|
|
1367
1395
|
for fileset in libobj.get("tool", "openroad", "global_connect_fileset"):
|
|
1368
1396
|
self.add_openroad_globalconnectfileset(lib, fileset)
|
|
1369
1397
|
|
|
1370
1398
|
def _set_reports(self, task_reports: List[str]):
|
|
1371
|
-
|
|
1399
|
+
skip_reports = set(self.get("var", "skip_reports"))
|
|
1400
|
+
|
|
1401
|
+
if not self.get("var", "load_sdcs"):
|
|
1402
|
+
skip_reports.update((
|
|
1403
|
+
"setup",
|
|
1404
|
+
"hold",
|
|
1405
|
+
"unconstrained",
|
|
1406
|
+
"clock_skew",
|
|
1407
|
+
"fmax",
|
|
1408
|
+
"check_setup",
|
|
1409
|
+
"clock_placement",
|
|
1410
|
+
"clock_trees"))
|
|
1411
|
+
|
|
1412
|
+
self.set("var", "reports", set(task_reports).difference(skip_reports))
|
|
1372
1413
|
|
|
1373
1414
|
if "power" in self.get("var", "reports"):
|
|
1374
1415
|
self.add_required_key("var", "power_corner")
|
|
1375
1416
|
|
|
1376
1417
|
def _add_pnr_inputs(self):
|
|
1377
|
-
if
|
|
1378
|
-
self.
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1418
|
+
if self.get("var", "load_sdcs"):
|
|
1419
|
+
if f"{self.design_topmodule}.sdc" in self.get_files_from_input_nodes():
|
|
1420
|
+
self.add_input_file(ext="sdc")
|
|
1421
|
+
else:
|
|
1422
|
+
for lib, fileset in self.project.get_filesets():
|
|
1423
|
+
if lib.has_file(fileset=fileset, filetype="sdc"):
|
|
1424
|
+
self.add_required_key(lib, "fileset", fileset, "file", "sdc")
|
|
1425
|
+
|
|
1426
|
+
modes = set()
|
|
1427
|
+
for scenario in self.project.constraint.timing.get_scenario().values():
|
|
1428
|
+
mode = scenario.get_mode(self.step, self.index)
|
|
1429
|
+
if mode:
|
|
1430
|
+
modes.add(mode)
|
|
1431
|
+
self.add_required_key(scenario, "mode")
|
|
1432
|
+
mode_obj = self.project.constraint.timing.get_mode(mode)
|
|
1433
|
+
self.add_required_key(mode_obj, "sdcfileset")
|
|
1434
|
+
|
|
1435
|
+
for mode in modes:
|
|
1436
|
+
mode_obj = self.project.constraint.timing.get_mode(mode)
|
|
1437
|
+
for lib, fileset in mode_obj.get_sdcfileset():
|
|
1438
|
+
libobj = self.project.get_library(lib)
|
|
1439
|
+
self.add_required_key(libobj, "fileset", fileset, "file", "sdc")
|
|
1383
1440
|
|
|
1384
1441
|
if f"{self.design_topmodule}.odb" in self.get_files_from_input_nodes():
|
|
1385
1442
|
self.add_input_file(ext="odb")
|
|
@@ -1389,14 +1446,15 @@ class APRTask(OpenROADTask):
|
|
|
1389
1446
|
pass
|
|
1390
1447
|
|
|
1391
1448
|
def _add_pnr_outputs(self):
|
|
1392
|
-
self.
|
|
1449
|
+
if self.get("var", "load_sdcs"):
|
|
1450
|
+
self.add_output_file(ext="sdc")
|
|
1393
1451
|
self.add_output_file(ext="vg")
|
|
1394
1452
|
self.add_output_file(ext="lec.vg")
|
|
1395
1453
|
self.add_output_file(ext="def")
|
|
1396
1454
|
self.add_output_file(ext="odb")
|
|
1397
1455
|
|
|
1398
1456
|
for lib in self.project.get("asic", "asiclib"):
|
|
1399
|
-
libobj = self.project.
|
|
1457
|
+
libobj = self.project.get_library(lib)
|
|
1400
1458
|
for celltype in ["decap", "tie", "filler", "tap", "endcap", "antenna", "physicalonly"]:
|
|
1401
1459
|
if libobj.valid("asic", "cells", celltype) and \
|
|
1402
1460
|
libobj.get("asic", "cells", celltype):
|
|
@@ -94,7 +94,7 @@ class PowerGridTask(APRTask, OpenROADSTAParameter, OpenROADPSMParameter):
|
|
|
94
94
|
|
|
95
95
|
def __import_pdn_filesets(self):
|
|
96
96
|
for lib in self.project.get("asic", "asiclib"):
|
|
97
|
-
libobj = self.project.
|
|
97
|
+
libobj = self.project.get_library(lib)
|
|
98
98
|
if libobj.valid("tool", "openroad", "power_grid_fileset"):
|
|
99
99
|
for fileset in libobj.get("tool", "openroad", "power_grid_fileset"):
|
|
100
100
|
self.add_openroad_powergridfileset(lib, fileset)
|
|
@@ -2,22 +2,24 @@
|
|
|
2
2
|
# Read timing constraints
|
|
3
3
|
###############################
|
|
4
4
|
|
|
5
|
-
if { [
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
5
|
+
if { [sc_cfg_tool_task_get var load_sdcs] } {
|
|
6
|
+
if { [file exists "inputs/${sc_topmodule}.sdc"] } {
|
|
7
|
+
set sdc "inputs/${sc_topmodule}.sdc"
|
|
8
|
+
puts "Reading SDC: ${sdc}"
|
|
9
|
+
read_sdc $sdc
|
|
10
|
+
} else {
|
|
11
|
+
set sdcs [sc_cfg_get_fileset $sc_designlib [sc_cfg_get option fileset] sdc]
|
|
12
|
+
if { [llength $sdcs] > 0 } {
|
|
13
|
+
foreach sdc $sdcs {
|
|
14
|
+
puts "Reading SDC: ${sdc}"
|
|
15
|
+
read_sdc $sdc
|
|
16
|
+
}
|
|
17
|
+
} else {
|
|
18
|
+
# fall back on default auto generated constraints file
|
|
19
|
+
set sdc [sc_cfg_tool_task_get var opensta_generic_sdc]
|
|
13
20
|
puts "Reading SDC: ${sdc}"
|
|
14
|
-
|
|
21
|
+
utl::warn FLW 1 "Defaulting back to default SDC"
|
|
22
|
+
read_sdc "${sdc}"
|
|
15
23
|
}
|
|
16
|
-
} else {
|
|
17
|
-
# fall back on default auto generated constraints file
|
|
18
|
-
set sdc [sc_cfg_tool_task_get var opensta_generic_sdc]
|
|
19
|
-
puts "Reading SDC: ${sdc}"
|
|
20
|
-
utl::warn FLW 1 "Defaulting back to default SDC"
|
|
21
|
-
read_sdc "${sdc}"
|
|
22
24
|
}
|
|
23
25
|
}
|
|
@@ -273,7 +273,7 @@ class VPRTask(Task):
|
|
|
273
273
|
self.add_required_key(lib, "fileset", fileset, "file", "sdc")
|
|
274
274
|
self.set("var", "enable_timing_analysis", True)
|
|
275
275
|
|
|
276
|
-
fpga = self.project.
|
|
276
|
+
fpga = self.project.get_library(self.project.get("fpga", "device"))
|
|
277
277
|
self.add_required_key(fpga, "tool", "vpr", "devicecode")
|
|
278
278
|
self.add_required_key(fpga, "tool", "vpr", "clock_model")
|
|
279
279
|
self.add_required_key(fpga, "tool", "vpr", "archfile")
|
|
@@ -287,7 +287,7 @@ class VPRTask(Task):
|
|
|
287
287
|
def runtime_options(self):
|
|
288
288
|
options = super().runtime_options()
|
|
289
289
|
|
|
290
|
-
fpga = self.project.
|
|
290
|
+
fpga = self.project.get_library(self.project.get("fpga", "device"))
|
|
291
291
|
|
|
292
292
|
options.extend(["--device", fpga.get("tool", "vpr", "devicecode")])
|
|
293
293
|
|
|
@@ -393,17 +393,17 @@ class VPRTask(Task):
|
|
|
393
393
|
for report in glob.glob("*.rpt"):
|
|
394
394
|
shutil.move(report, 'reports')
|
|
395
395
|
|
|
396
|
-
fpga = self.project.get("fpga", "device")
|
|
396
|
+
fpga = self.project.get_library(self.project.get("fpga", "device"))
|
|
397
397
|
|
|
398
398
|
dff_cells = []
|
|
399
|
-
if
|
|
400
|
-
dff_cells =
|
|
399
|
+
if fpga.valid("tool", "yosys", "registers"):
|
|
400
|
+
dff_cells = fpga.get("tool", "yosys", "registers")
|
|
401
401
|
brams_cells = []
|
|
402
|
-
if
|
|
403
|
-
brams_cells =
|
|
402
|
+
if fpga.valid("tool", "yosys", "brams"):
|
|
403
|
+
brams_cells = fpga.get("tool", "yosys", "brams")
|
|
404
404
|
dsps_cells = []
|
|
405
|
-
if
|
|
406
|
-
dsps_cells =
|
|
405
|
+
if fpga.valid("tool", "yosys", "dsps"):
|
|
406
|
+
dsps_cells = fpga.get("tool", "yosys", "dsps")
|
|
407
407
|
|
|
408
408
|
stat_extract = re.compile(r' \s*(.*)\s*:\s*([0-9]+)')
|
|
409
409
|
lut_match = re.compile(r'([0-9]+)-LUT')
|
|
@@ -48,8 +48,7 @@ class PlaceTask(VPRTask):
|
|
|
48
48
|
if files:
|
|
49
49
|
pcf_file = files[0]
|
|
50
50
|
|
|
51
|
-
fpga = self.project.
|
|
52
|
-
field="schema")
|
|
51
|
+
fpga = self.project.get_library(self.project.get("fpga", "device"))
|
|
53
52
|
map_file = fpga.find_files("tool", "vpr", "constraintsmap")
|
|
54
53
|
|
|
55
54
|
constraints_map = load_constraints_map(map_file)
|
|
@@ -39,7 +39,7 @@ class _ASICTask(ASICTask, YosysTask):
|
|
|
39
39
|
|
|
40
40
|
delaymodel = self.project.get("asic", "delaymodel")
|
|
41
41
|
for lib in self.project.get("asic", "asiclib"):
|
|
42
|
-
lib_obj = self.project.
|
|
42
|
+
lib_obj = self.project.get_library(lib)
|
|
43
43
|
for corner in self.get("var", "synthesis_corner"):
|
|
44
44
|
if lib_obj.get("asic", "libcornerfileset", corner, delaymodel):
|
|
45
45
|
self.add_required_key(lib_obj, "asic", "libcornerfileset", corner, delaymodel)
|
|
@@ -81,7 +81,7 @@ class _ASICTask(ASICTask, YosysTask):
|
|
|
81
81
|
# Generate synthesis_libraries for Yosys use
|
|
82
82
|
fileset_map = []
|
|
83
83
|
for lib in self.project.get("asic", "asiclib"):
|
|
84
|
-
lib_obj = self.project.
|
|
84
|
+
lib_obj = self.project.get_library(lib)
|
|
85
85
|
for corner in self.get("var", "synthesis_corner"):
|
|
86
86
|
for fileset in lib_obj.get("asic", "libcornerfileset", corner, delaymodel):
|
|
87
87
|
fileset_map.append((lib_obj, fileset))
|
|
@@ -696,7 +696,7 @@ class ASICSynthesis(_ASICTask, YosysTask):
|
|
|
696
696
|
self.add_output_file(ext="vg", clobber=True)
|
|
697
697
|
self.add_output_file(ext="netlist.json")
|
|
698
698
|
|
|
699
|
-
mainlib = self.project.
|
|
699
|
+
mainlib = self.project.get_library(self.project.get("asic", "mainlib"))
|
|
700
700
|
|
|
701
701
|
if self.get('var', 'abc_constraint_driver') is not None:
|
|
702
702
|
self.add_required_key("var", "abc_constraint_driver")
|
|
@@ -799,7 +799,7 @@ class ASICSynthesis(_ASICTask, YosysTask):
|
|
|
799
799
|
|
|
800
800
|
def _get_clock_period(self):
|
|
801
801
|
mainlib = self.project.get("asic", "mainlib")
|
|
802
|
-
clock_units_multiplier = self.project.
|
|
802
|
+
clock_units_multiplier = self.project.get_library(mainlib).get(
|
|
803
803
|
"tool", "yosys", "abc_clock_multiplier") / 1000
|
|
804
804
|
|
|
805
805
|
_, period = self.get_clock()
|
|
@@ -98,7 +98,7 @@ class FPGASynthesis(YosysTask):
|
|
|
98
98
|
|
|
99
99
|
self._synthesis_post_process()
|
|
100
100
|
|
|
101
|
-
fpga = self.project.get("fpga", "device")
|
|
101
|
+
fpga = self.project.get_library(self.project.get("fpga", "device"))
|
|
102
102
|
|
|
103
103
|
with sc_open("reports/stat.json") as f:
|
|
104
104
|
metrics = json.load(f)
|
|
@@ -113,15 +113,14 @@ class FPGASynthesis(YosysTask):
|
|
|
113
113
|
return
|
|
114
114
|
|
|
115
115
|
dff_cells = []
|
|
116
|
-
if
|
|
117
|
-
dff_cells =
|
|
116
|
+
if fpga.valid("tool", "yosys", "registers"):
|
|
117
|
+
dff_cells = fpga.get("tool", "yosys", "registers")
|
|
118
118
|
brams_cells = []
|
|
119
|
-
if
|
|
120
|
-
brams_cells =
|
|
119
|
+
if fpga.valid("tool", "yosys", "brams"):
|
|
120
|
+
brams_cells = fpga.get("tool", "yosys", "brams")
|
|
121
121
|
dsps_cells = []
|
|
122
|
-
if
|
|
123
|
-
dsps_cells =
|
|
124
|
-
|
|
122
|
+
if fpga.valid("tool", "yosys", "dsps"):
|
|
123
|
+
dsps_cells = fpga.get("tool", "yosys", "dsps")
|
|
125
124
|
data = {
|
|
126
125
|
"registers": 0,
|
|
127
126
|
"luts": 0,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"openroad": {
|
|
3
3
|
"git-url": "https://github.com/The-OpenROAD-Project/OpenROAD.git",
|
|
4
|
-
"git-commit": "
|
|
4
|
+
"git-commit": "11bd3ead9d12211b72706ac7c8653234cc136b8b",
|
|
5
5
|
"docker-cmds": [
|
|
6
6
|
"# Remove OR-Tools files",
|
|
7
7
|
"RUN rm -f $SC_PREFIX/Makefile $SC_PREFIX/README.md",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
},
|
|
18
18
|
"opensta": {
|
|
19
19
|
"git-url": "https://github.com/parallaxsw/OpenSTA.git",
|
|
20
|
-
"git-commit": "
|
|
20
|
+
"git-commit": "dda887bc6e5160fd7c15489cc5845eaff72b5252",
|
|
21
21
|
"auto-update": true
|
|
22
22
|
},
|
|
23
23
|
"netgen": {
|
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
},
|
|
102
102
|
"yosys": {
|
|
103
103
|
"git-url": "https://github.com/YosysHQ/yosys.git",
|
|
104
|
-
"git-commit": "v0.
|
|
104
|
+
"git-commit": "v0.61",
|
|
105
105
|
"version-prefix": "",
|
|
106
106
|
"auto-update": true
|
|
107
107
|
},
|
|
@@ -145,7 +145,7 @@
|
|
|
145
145
|
},
|
|
146
146
|
"yosys-slang": {
|
|
147
147
|
"git-url": "https://github.com/povik/yosys-slang.git",
|
|
148
|
-
"git-commit": "
|
|
148
|
+
"git-commit": "4e1ad7c11e23cffe131aa5c478083f1d99f0c0be",
|
|
149
149
|
"docker-depends": "yosys",
|
|
150
150
|
"auto-update": true
|
|
151
151
|
},
|
|
@@ -168,7 +168,7 @@
|
|
|
168
168
|
},
|
|
169
169
|
"keplerformal": {
|
|
170
170
|
"git-url": "https://github.com/keplertech/kepler-formal.git",
|
|
171
|
-
"git-commit": "
|
|
171
|
+
"git-commit": "d647673f3b3960256069a79e8d92d36a3b89d9a4",
|
|
172
172
|
"auto-update": false
|
|
173
173
|
}
|
|
174
|
-
}
|
|
174
|
+
}
|
siliconcompiler/utils/logging.py
CHANGED
|
@@ -145,3 +145,9 @@ def get_console_formatter(project, in_run, step, index):
|
|
|
145
145
|
if support_color:
|
|
146
146
|
return SCColorLoggerFormatter(base_format)
|
|
147
147
|
return base_format
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def get_stream_handler(project, in_run, step, index):
|
|
151
|
+
handler = logging.StreamHandler(stream=sys.stdout)
|
|
152
|
+
handler.setFormatter(get_console_formatter(project, in_run, step, index))
|
|
153
|
+
return handler
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: siliconcompiler
|
|
3
|
-
Version: 0.36.
|
|
3
|
+
Version: 0.36.3
|
|
4
4
|
Summary: A compiler framework that automates translation from source code to silicon.
|
|
5
5
|
Author: Zero ASIC
|
|
6
6
|
License: Apache License 2.0
|
|
@@ -38,12 +38,12 @@ Requires-Dist: PyYAML<7.0.0,>=6.0.0
|
|
|
38
38
|
Requires-Dist: GitPython<3.2,>=3.1.44
|
|
39
39
|
Requires-Dist: PyGithub<2.9.0,>=2.8.0
|
|
40
40
|
Requires-Dist: urllib3>=1.26.0
|
|
41
|
-
Requires-Dist: lambdapdk>=0.2.
|
|
41
|
+
Requires-Dist: lambdapdk>=0.2.7
|
|
42
42
|
Requires-Dist: fasteners>=0.20
|
|
43
43
|
Requires-Dist: pandas>=1.1.5
|
|
44
44
|
Requires-Dist: psutil>=5.8.0
|
|
45
45
|
Requires-Dist: Jinja2>=2.11.3
|
|
46
|
-
Requires-Dist: pyslang==
|
|
46
|
+
Requires-Dist: pyslang==10.0.0
|
|
47
47
|
Requires-Dist: importlib_metadata; python_version < "3.10"
|
|
48
48
|
Requires-Dist: streamlit==1.46.1; python_full_version != "3.9.7"
|
|
49
49
|
Requires-Dist: streamlit_agraph==0.0.45; python_full_version != "3.9.7"
|