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.
Files changed (34) hide show
  1. siliconcompiler/_metadata.py +1 -1
  2. siliconcompiler/asic.py +4 -4
  3. siliconcompiler/design.py +6 -1
  4. siliconcompiler/package/__init__.py +3 -2
  5. siliconcompiler/project.py +36 -18
  6. siliconcompiler/schema/baseschema.py +7 -4
  7. siliconcompiler/schema/docschema.py +3 -3
  8. siliconcompiler/schema/editableschema.py +1 -1
  9. siliconcompiler/schema/namedschema.py +6 -6
  10. siliconcompiler/schema_support/cmdlineschema.py +5 -3
  11. siliconcompiler/schema_support/filesetschema.py +9 -1
  12. siliconcompiler/schema_support/pathschema.py +16 -10
  13. siliconcompiler/tool.py +7 -3
  14. siliconcompiler/tools/builtin/wait.py +16 -0
  15. siliconcompiler/tools/keplerformal/lec.py +2 -2
  16. siliconcompiler/tools/klayout/export.py +1 -3
  17. siliconcompiler/tools/klayout/merge.py +95 -0
  18. siliconcompiler/tools/klayout/scripts/klayout_merge.py +79 -0
  19. siliconcompiler/tools/openroad/_apr.py +69 -11
  20. siliconcompiler/tools/openroad/power_grid.py +1 -1
  21. siliconcompiler/tools/openroad/scripts/common/read_timing_constraints.tcl +17 -15
  22. siliconcompiler/tools/openroad/scripts/common/write_data_timing.tcl +3 -1
  23. siliconcompiler/tools/vpr/__init__.py +9 -9
  24. siliconcompiler/tools/vpr/place.py +1 -2
  25. siliconcompiler/tools/yosys/syn_asic.py +4 -4
  26. siliconcompiler/tools/yosys/syn_fpga.py +7 -8
  27. siliconcompiler/toolscripts/_tools.json +6 -6
  28. siliconcompiler/utils/logging.py +6 -0
  29. {siliconcompiler-0.36.1.dist-info → siliconcompiler-0.36.3.dist-info}/METADATA +3 -3
  30. {siliconcompiler-0.36.1.dist-info → siliconcompiler-0.36.3.dist-info}/RECORD +34 -31
  31. {siliconcompiler-0.36.1.dist-info → siliconcompiler-0.36.3.dist-info}/WHEEL +1 -1
  32. {siliconcompiler-0.36.1.dist-info → siliconcompiler-0.36.3.dist-info}/entry_points.txt +0 -0
  33. {siliconcompiler-0.36.1.dist-info → siliconcompiler-0.36.3.dist-info}/licenses/LICENSE +0 -0
  34. {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.get("library", asiclib, field="schema")
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.get("library", lib, field="schema")
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
- self.set("var", "reports", set(task_reports).difference(self.get("var", "skip_reports")))
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 f"{self.design_topmodule}.sdc" in self.get_files_from_input_nodes():
1378
- self.add_input_file(ext="sdc")
1379
- else:
1380
- for lib, fileset in self.project.get_filesets():
1381
- if lib.has_file(fileset=fileset, filetype="sdc"):
1382
- self.add_required_key(lib, "fileset", fileset, "file", "sdc")
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.add_output_file(ext="sdc")
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.get("library", lib, field="schema")
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.get("library", lib, field="schema")
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 { [file exists "inputs/${sc_topmodule}.sdc"] } {
6
- set sdc "inputs/${sc_topmodule}.sdc"
7
- puts "Reading SDC: ${sdc}"
8
- read_sdc $sdc
9
- } else {
10
- set sdcs [sc_cfg_get_fileset $sc_designlib [sc_cfg_get option fileset] sdc]
11
- if { [llength $sdcs] > 0 } {
12
- foreach sdc $sdcs {
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
- read_sdc $sdc
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
  }
@@ -1 +1,3 @@
1
- write_sdc "outputs/${sc_topmodule}.sdc"
1
+ if { [sc_cfg_tool_task_get var load_sdcs] } {
2
+ write_sdc "outputs/${sc_topmodule}.sdc"
3
+ }
@@ -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.get("library", self.project.get("fpga", "device"), field="schema")
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.get("library", self.project.get("fpga", "device"), field="schema")
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 self.project.valid("library", fpga, "tool", "yosys", "registers"):
400
- dff_cells = self.project.get("library", fpga, "tool", "yosys", "registers")
399
+ if fpga.valid("tool", "yosys", "registers"):
400
+ dff_cells = fpga.get("tool", "yosys", "registers")
401
401
  brams_cells = []
402
- if self.project.valid("library", fpga, "tool", "yosys", "brams"):
403
- brams_cells = self.project.get("library", fpga, "tool", "yosys", "brams")
402
+ if fpga.valid("tool", "yosys", "brams"):
403
+ brams_cells = fpga.get("tool", "yosys", "brams")
404
404
  dsps_cells = []
405
- if self.project.valid("library", fpga, "tool", "yosys", "dsps"):
406
- dsps_cells = self.project.get("library", fpga, "tool", "yosys", "dsps")
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.get("library", self.project.get("fpga", "device"),
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.get("library", lib, field="schema")
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.get("library", lib, field="schema")
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.get("library", self.project.get("asic", "mainlib"), field="schema")
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.get("library", mainlib, field="schema").get(
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 self.project.valid("library", fpga, "tool", "yosys", "registers"):
117
- dff_cells = self.project.get("library", fpga, "tool", "yosys", "registers")
116
+ if fpga.valid("tool", "yosys", "registers"):
117
+ dff_cells = fpga.get("tool", "yosys", "registers")
118
118
  brams_cells = []
119
- if self.project.valid("library", fpga, "tool", "yosys", "brams"):
120
- brams_cells = self.project.get("library", fpga, "tool", "yosys", "brams")
119
+ if fpga.valid("tool", "yosys", "brams"):
120
+ brams_cells = fpga.get("tool", "yosys", "brams")
121
121
  dsps_cells = []
122
- if self.project.valid("library", fpga, "tool", "yosys", "dsps"):
123
- dsps_cells = self.project.get("library", fpga, "tool", "yosys", "dsps")
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": "0004adbadb9b28cbc00b87c0b2a089164e439441",
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": "128ea3cf283ba2ac0af699543c8e037cc9bfc0a5",
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.60",
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": "64b44616a3798f07453b14ea03e4ac8a16b77313",
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": "c1edd4a196536385255f4c882e4001d534d4638b",
171
+ "git-commit": "d647673f3b3960256069a79e8d92d36a3b89d9a4",
172
172
  "auto-update": false
173
173
  }
174
- }
174
+ }
@@ -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.1
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.6
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==9.1.0
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"