siliconcompiler 0.31.1__py3-none-any.whl → 0.32.0__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,5 +1,5 @@
1
1
  # Version number following semver standard.
2
- version = '0.31.1'
2
+ version = '0.32.0'
3
3
 
4
4
  # Default server address for remote runs, if unspecified.
5
5
  default_server = 'https://server.siliconcompiler.com'
@@ -99,6 +99,7 @@ def main():
99
99
 
100
100
  # Print Job Summary
101
101
  chip.summary()
102
+ chip.snapshot()
102
103
  except SiliconCompilerError:
103
104
  return 1
104
105
  except Exception as e:
@@ -37,7 +37,7 @@ def main():
37
37
  return 1
38
38
 
39
39
  # Print Job Summary
40
- chip.summary(generate_image=False, generate_html=False)
40
+ chip.summary()
41
41
 
42
42
  return 0
43
43
 
siliconcompiler/core.py CHANGED
@@ -26,7 +26,6 @@ from siliconcompiler import _metadata
26
26
  from siliconcompiler import NodeStatus, SiliconCompilerError
27
27
  from siliconcompiler.report import _show_summary_table
28
28
  from siliconcompiler.report import _generate_summary_image, _open_summary_image
29
- from siliconcompiler.report import _generate_html_report, _open_html_report
30
29
  from siliconcompiler.report import Dashboard
31
30
  from siliconcompiler import package as sc_package
32
31
  import glob
@@ -211,6 +210,8 @@ class Chip:
211
210
 
212
211
  self.logger.addHandler(file_handler)
213
212
 
213
+ return file_handler
214
+
214
215
  ###########################################################################
215
216
  def _init_logger(self, step=None, index=None, in_run=False):
216
217
 
@@ -2889,7 +2890,7 @@ class Chip:
2889
2890
  return self._dash
2890
2891
 
2891
2892
  ###########################################################################
2892
- def summary(self, show_all_indices=False, generate_image=True, generate_html=False):
2893
+ def summary(self, show_all_indices=False):
2893
2894
  '''
2894
2895
  Prints a summary of the compilation manifest.
2895
2896
 
@@ -2902,13 +2903,6 @@ class Chip:
2902
2903
  show_all_indices (bool): If True, displays metrics for all indices
2903
2904
  of each step. If False, displays metrics only for winning
2904
2905
  indices.
2905
- generate_image (bool): If True, generates a summary image featuring
2906
- a layout screenshot and a subset of metrics. Requires that the
2907
- current job has an ending node that generated a PNG file.
2908
- generate_html (bool): If True, generates an HTML report featuring a
2909
- metrics summary table and manifest tree view. The report will
2910
- include a layout screenshot if the current job has an ending node
2911
- that generated a PNG file.
2912
2906
 
2913
2907
  Examples:
2914
2908
  >>> chip.summary()
@@ -2921,36 +2915,36 @@ class Chip:
2921
2915
 
2922
2916
  _show_summary_table(self, flow, nodes_to_execute, show_all_indices=show_all_indices)
2923
2917
 
2924
- # Create a report for the Chip object which can be viewed in a web browser.
2925
- # Place report files in the build's root directory.
2926
- work_dir = self.getworkdir()
2927
- if os.path.isdir(work_dir):
2928
- # Mark file paths where the reports can be found if they were generated.
2929
- results_img = os.path.join(work_dir, f'{self.design}.png')
2930
- results_html = os.path.join(work_dir, 'report.html')
2931
-
2932
- for path in (results_img, results_html):
2933
- if os.path.exists(path):
2934
- os.remove(path)
2935
-
2936
- if generate_image:
2937
- _generate_summary_image(self, results_img)
2938
-
2939
- if generate_html:
2940
- _generate_html_report(self, flow, nodes_to_execute, results_html)
2941
-
2942
- # dashboard does not generate any data
2943
- self.logger.info(f'Dashboard at "sc-dashboard -cfg {work_dir}/{self.design}.pkg.json"')
2944
-
2945
- # Try to open the results and layout only if '-nodisplay' is not set.
2946
- # Priority: PNG > HTML > dashboard.
2947
- if not self.get('option', 'nodisplay'):
2948
- if os.path.isfile(results_img):
2949
- _open_summary_image(results_img)
2950
- elif os.path.isfile(results_html):
2951
- _open_html_report(self, results_html)
2952
- else:
2953
- self.dashboard(wait=False)
2918
+ # dashboard does not generate any data
2919
+ self.logger.info('Dashboard at "sc-dashboard '
2920
+ f'-cfg {self.getworkdir()}/{self.design}.pkg.json"')
2921
+
2922
+ ###########################################################################
2923
+ def snapshot(self, path=None, display=True):
2924
+ '''
2925
+ Creates a snapshot image of the job
2926
+
2927
+ Args:
2928
+ path (str): Path to generate the image at, if not provided will default to
2929
+ <job>/<design>.png
2930
+ display (bool): If True, will open the image for viewing. If :keypath:`option,nodisplay`
2931
+ is True, this argument will be ignored.
2932
+
2933
+ Examples:
2934
+ >>> chip.snapshot()
2935
+ Creates a snapshot image in the default location
2936
+ '''
2937
+
2938
+ if not path:
2939
+ path = os.path.join(self.getworkdir(), f'{self.design}.png')
2940
+
2941
+ if os.path.exists(path):
2942
+ os.remove(path)
2943
+
2944
+ _generate_summary_image(self, path)
2945
+
2946
+ if os.path.isfile(path) and not self.get('option', 'nodisplay') and display:
2947
+ _open_summary_image(path)
2954
2948
 
2955
2949
  ###########################################################################
2956
2950
  def clock(self, pin, period, jitter=0, mode='global'):
@@ -1,4 +1,5 @@
1
1
  from siliconcompiler.tools.surelog import parse as surelog_parse
2
+ from siliconcompiler.tools.slang import elaborate as slang_preprocess
2
3
  from siliconcompiler.tools.chisel import convert as chisel_convert
3
4
  from siliconcompiler.tools.bambu import convert as bambu_convert
4
5
  from siliconcompiler.tools.bluespec import convert as bluespec_convert
@@ -7,6 +8,8 @@ from siliconcompiler.tools.sv2v import convert as sv2v_convert
7
8
 
8
9
  from siliconcompiler.tools.builtin import concatenate
9
10
 
11
+ from siliconcompiler.tools.slang import has_pyslang
12
+
10
13
 
11
14
  def _make_docs(chip):
12
15
  from siliconcompiler.targets import freepdk45_demo
@@ -20,9 +23,12 @@ def _make_docs(chip):
20
23
  chip.use(freepdk45_demo)
21
24
 
22
25
 
23
- def __get_frontends(allow_system_verilog):
26
+ def __get_frontends(allow_system_verilog, use_surelog=False):
27
+ parser = surelog_parse
28
+ if not use_surelog and has_pyslang():
29
+ parser = slang_preprocess
24
30
  systemverilog_frontend = [
25
- ('import.verilog', surelog_parse)
31
+ ('import.verilog', parser)
26
32
  ]
27
33
  if not allow_system_verilog:
28
34
  systemverilog_frontend.append(('import.convert', sv2v_convert))
@@ -36,7 +42,7 @@ def __get_frontends(allow_system_verilog):
36
42
  }
37
43
 
38
44
 
39
- def setup_multiple_frontends(flow, allow_system_verilog=False):
45
+ def setup_multiple_frontends(flow, allow_system_verilog=False, use_surelog=False):
40
46
  '''
41
47
  Sets of multiple frontends if different frontends are required.
42
48
 
@@ -45,7 +51,7 @@ def setup_multiple_frontends(flow, allow_system_verilog=False):
45
51
 
46
52
  concat_nodes = []
47
53
  flowname = flow.design
48
- for _, pipe in __get_frontends(allow_system_verilog).items():
54
+ for _, pipe in __get_frontends(allow_system_verilog, use_surelog=use_surelog).items():
49
55
  prev_step = None
50
56
  for step, task in pipe:
51
57
  flow.node(flowname, step, task)
@@ -41,11 +41,11 @@ def get_download_cache_path(chip, package, ref):
41
41
  os.path.join(cache_path, f'{package}-{ref}.lock')
42
42
 
43
43
 
44
- def _file_path_resolver(chip, package, path, ref, url):
44
+ def _file_path_resolver(chip, package, path, ref, url, fetch):
45
45
  return os.path.abspath(path.replace('file://', ''))
46
46
 
47
47
 
48
- def _python_path_resolver(chip, package, path, ref, url):
48
+ def _python_path_resolver(chip, package, path, ref, url, fetch):
49
49
  return path_from_python(chip, url.netloc)
50
50
 
51
51
 
@@ -66,7 +66,7 @@ def _get_path_resolver(path):
66
66
  raise ValueError(f"{path} is not supported")
67
67
 
68
68
 
69
- def _path(chip, package):
69
+ def _path(chip, package, fetch):
70
70
  # Initially try retrieving data source from schema
71
71
  data = {}
72
72
  data['path'] = chip.get('package', 'source', package, 'path')
@@ -84,22 +84,23 @@ def _path(chip, package):
84
84
 
85
85
  path_resolver, url = _get_path_resolver(data['path'])
86
86
 
87
- return path_resolver(chip, package, data['path'], data['ref'], url)
87
+ return path_resolver(chip, package, data['path'], data['ref'], url, fetch)
88
88
 
89
89
 
90
- def path(chip, package):
90
+ def path(chip, package, fetch=True):
91
91
  """
92
92
  Compute data source data path
93
93
  Additionally cache data source data if possible
94
94
  Parameters:
95
95
  package (str): Name of the data source
96
+ fetch (bool): Flag to indicate that the path should be fetched
96
97
  Returns:
97
98
  path: Location of data source on the local system
98
99
  """
99
100
 
100
101
  if package not in chip._packages:
101
102
  changed = False
102
- data_path = _path(chip, package)
103
+ data_path = _path(chip, package, fetch)
103
104
 
104
105
  if isinstance(data_path, tuple) and len(data_path) == 2:
105
106
  data_path, changed = data_path
@@ -15,9 +15,12 @@ def get_resolver(url):
15
15
  return None
16
16
 
17
17
 
18
- def git_resolver(chip, package, path, ref, url):
18
+ def git_resolver(chip, package, path, ref, url, fetch):
19
19
  data_path, data_path_lock = get_download_cache_path(chip, package, ref)
20
20
 
21
+ if not fetch:
22
+ return data_path, False
23
+
21
24
  # Acquire lock
22
25
  data_lock = InterProcessLock(data_path_lock)
23
26
  aquire_data_lock(data_path, data_lock)
@@ -21,16 +21,20 @@ def get_resolver(url):
21
21
  return None
22
22
 
23
23
 
24
- def http_resolver(chip, package, path, ref, url):
24
+ def http_resolver(chip, package, path, ref, url, fetch):
25
25
  data_path, data_path_lock = get_download_cache_path(chip, package, ref)
26
26
 
27
- if os.path.exists(data_path):
27
+ if not fetch:
28
28
  return data_path, False
29
29
 
30
30
  # Acquire lock
31
31
  data_lock = InterProcessLock(data_path_lock)
32
32
  aquire_data_lock(data_path, data_lock)
33
33
 
34
+ if os.path.exists(data_path):
35
+ release_data_lock(data_lock)
36
+ return data_path, False
37
+
34
38
  extract_from_url(chip, package, path, ref, url, data_path)
35
39
 
36
40
  release_data_lock(data_lock)
@@ -433,7 +433,7 @@ def node_file_tree_viewer(chip, step, index):
433
433
  lookup = {}
434
434
  tree_items = []
435
435
 
436
- file_metrics = report.get_metrics_source(chip, step, index)
436
+ metrics_source, file_metrics = report.get_metrics_source(chip, step, index)
437
437
  work_dir = chip.getworkdir(step=step, index=index)
438
438
 
439
439
  def make_item(file):
@@ -446,12 +446,22 @@ def node_file_tree_viewer(chip, step, index):
446
446
 
447
447
  check_file = os.path.relpath(file['value'], work_dir)
448
448
  if check_file in file_metrics:
449
- for metric in file_metrics[check_file]:
450
- if len(item.tag) < 5:
451
- item.tag.append(sac.Tag(metric, color='green'))
452
- else:
453
- item.tag.append(sac.Tag('metrics...', color='geekblue'))
449
+ metrics = set(file_metrics[check_file])
450
+ primary_source = set()
451
+ if check_file in metrics_source:
452
+ primary_source = set(metrics_source[check_file])
453
+ metrics = metrics - primary_source
454
+
455
+ for color, metric_set in (('blue', primary_source), ('green', metrics)):
456
+ if len(item.tag) >= 5:
454
457
  break
458
+
459
+ for metric in metric_set:
460
+ if len(item.tag) < 5:
461
+ item.tag.append(sac.Tag(metric, color=color))
462
+ else:
463
+ item.tag.append(sac.Tag('metrics...', color='geekblue'))
464
+ break
455
465
  item.tooltip = "metrics: " + ", ".join(file_metrics[check_file])
456
466
 
457
467
  if 'children' in file:
@@ -302,20 +302,20 @@ def get_metrics_source(chip, step, index):
302
302
  index (string) : Index of node.
303
303
  '''
304
304
  file_to_metric = {}
305
+ metric_primary_source = {}
305
306
  tool, task = get_tool_task(chip, step, index)
306
307
  if not chip.valid('tool', tool, 'task', task, 'report'):
307
- return file_to_metric
308
+ return metric_primary_source, file_to_metric
308
309
 
309
310
  metrics = chip.getkeys('tool', tool, 'task', task, 'report')
310
311
 
311
312
  for metric in metrics:
312
313
  sources = chip.get('tool', tool, 'task', task, 'report', metric, step=step, index=index)
314
+ if sources:
315
+ metric_primary_source.setdefault(sources[0], []).append(metric)
313
316
  for source in sources:
314
- if source in file_to_metric:
315
- file_to_metric[source].append(metric)
316
- else:
317
- file_to_metric[source] = [metric]
318
- return file_to_metric
317
+ file_to_metric.setdefault(source, []).append(metric)
318
+ return metric_primary_source, file_to_metric
319
319
 
320
320
 
321
321
  def get_files(chip, step, index):
@@ -45,6 +45,9 @@ def main():
45
45
  metavar='<package>:<directory>',
46
46
  nargs='+',
47
47
  help='Map of caches to prepopulate runner with')
48
+ parser.add_argument('-fetch_cache',
49
+ action='store_true',
50
+ help='Allow for cache downloads')
48
51
  parser.add_argument('-step',
49
52
  required=True,
50
53
  metavar='<step>',
@@ -105,7 +108,7 @@ def main():
105
108
 
106
109
  # Populate cache
107
110
  for package in chip.getkeys('package', 'source'):
108
- sc_path(chip, package)
111
+ sc_path(chip, package, fetch=args.fetch_cache)
109
112
 
110
113
  # Run the task.
111
114
  error = True
@@ -84,12 +84,16 @@ def extract_metrics(chip):
84
84
  metric_reports = {
85
85
  "setuptns": [
86
86
  "timing/total_negative_slack.rpt",
87
- "timing/setup.rpt"
87
+ "timing/setup.rpt",
88
+ "timing/setup.histogram.rpt",
89
+ "images/timing/setup.histogram.png"
88
90
  ],
89
91
  "setupslack": [
90
92
  "timing/worst_slack.setup.rpt",
91
93
  "timing/setup.rpt",
92
- "timing/setup.topN.rpt"
94
+ "timing/setup.topN.rpt",
95
+ "timing/setup.histogram.rpt",
96
+ "images/timing/setup.histogram.png"
93
97
  ],
94
98
  "setupskew": [
95
99
  "timing/skew.setup.rpt",
@@ -99,12 +103,16 @@ def extract_metrics(chip):
99
103
  ],
100
104
  "setuppaths": [
101
105
  "timing/setup.rpt",
102
- "timing/setup.topN.rpt"
106
+ "timing/setup.topN.rpt",
107
+ "timing/setup.histogram.rpt",
108
+ "images/timing/setup.histogram.png"
103
109
  ],
104
110
  "holdslack": [
105
111
  "timing/worst_slack.hold.rpt",
106
112
  "timing/hold.rpt",
107
- "timing/hold.topN.rpt"
113
+ "timing/hold.topN.rpt",
114
+ "timing/hold.histogram.rpt",
115
+ "images/timing/hold.histogram.png"
108
116
  ],
109
117
  "holdskew": [
110
118
  "timing/skew.hold.rpt",
@@ -114,7 +122,9 @@ def extract_metrics(chip):
114
122
  ],
115
123
  "holdpaths": [
116
124
  "timing/hold.rpt",
117
- "timing/hold.topN.rpt"
125
+ "timing/hold.topN.rpt",
126
+ "timing/hold.histogram.rpt",
127
+ "images/timing/hold.histogram.png"
118
128
  ],
119
129
  "unconstrained": [
120
130
  "timing/unconstrained.rpt",
@@ -27,6 +27,11 @@ if { [sc_cfg_tool_task_check_in_list setup var reports] } {
27
27
  tee -file reports/timing/total_negative_slack.rpt \
28
28
  "report_tns"
29
29
  report_tns_metric -setup
30
+
31
+ if { [sc_check_version 19519] } {
32
+ tee -quiet -file reports/timing/setup.histogram.rpt \
33
+ "report_timing_histogram -num_bins 20 -setup"
34
+ }
30
35
  }
31
36
 
32
37
  if { [sc_cfg_tool_task_check_in_list hold var reports] } {
@@ -42,6 +47,11 @@ if { [sc_cfg_tool_task_check_in_list hold var reports] } {
42
47
  report_worst_slack_metric -hold
43
48
 
44
49
  report_tns_metric -hold
50
+
51
+ if { [sc_check_version 19519] } {
52
+ tee -quiet -file reports/timing/hold.histogram.rpt \
53
+ "report_timing_histogram -num_bins 20 -hold"
54
+ }
45
55
  }
46
56
 
47
57
  if { [sc_cfg_tool_task_check_in_list unconstrained var reports] } {
@@ -304,6 +304,30 @@ proc sc_image_clocktree { } {
304
304
  gui::hide_widget "Clock Tree Viewer"
305
305
  }
306
306
 
307
+ proc sc_image_timing_histograms { } {
308
+ if { ![sc_check_version 19526] } {
309
+ return
310
+ }
311
+ file mkdir reports/images/timing
312
+
313
+ if { [sc_cfg_tool_task_check_in_list setup var reports] } {
314
+ set path reports/images/timing/setup.histogram.png
315
+ utl::info FLW 1 "Saving setup timing histogram to $path"
316
+ save_histogram_image $path \
317
+ -mode setup \
318
+ -width 500 \
319
+ -height 500
320
+ }
321
+ if { [sc_cfg_tool_task_check_in_list hold var reports] } {
322
+ set path reports/images/timing/hold.histogram.png
323
+ utl::info FLW 1 "Saving hold timing histogram to $path"
324
+ save_histogram_image $path \
325
+ -mode hold \
326
+ -width 500 \
327
+ -height 500
328
+ }
329
+ }
330
+
307
331
  proc sc_image_optimizer { } {
308
332
  global sc_design
309
333
  sc_image_setup_default
@@ -390,6 +414,9 @@ if { [sc_cfg_tool_task_check_in_list module_view var reports] } {
390
414
  # Markers
391
415
  sc_image_markers
392
416
 
417
+ # Histograms
418
+ sc_image_timing_histograms
419
+
393
420
  # Heatmaps
394
421
  if { [sc_cfg_tool_task_check_in_list placement_density var reports] } {
395
422
  sc_image_placement_density
@@ -10,55 +10,56 @@ Sources: https://github.com/MikePopoloski/slang
10
10
 
11
11
  Installation: https://sv-lang.com/building.html
12
12
  '''
13
- import re
14
- from siliconcompiler import sc_open
15
- from siliconcompiler.tools._common import record_metric
13
+ import os
14
+
15
+ try:
16
+ import pyslang
17
+ except ModuleNotFoundError:
18
+ pyslang = None
19
+
16
20
  from siliconcompiler.tools._common import \
17
- get_frontend_options, get_input_files, get_tool_task
21
+ add_require_input, add_frontend_requires, get_frontend_options, get_input_files, \
22
+ get_tool_task, record_metric
18
23
 
19
24
 
20
- ################################
21
- # Setup Tool (pre executable)
22
- ################################
23
- def setup(chip):
24
- tool = 'slang'
25
+ def has_pyslang():
26
+ return pyslang is not None
25
27
 
26
- # Standard Setup
27
- chip.set('tool', tool, 'exe', 'slang')
28
- chip.set('tool', tool, 'vswitch', '--version')
29
- chip.set('tool', tool, 'version', '>=6.0', clobber=False)
30
28
 
29
+ def test_version():
30
+ if not has_pyslang():
31
+ return "pyslang is not installed"
31
32
 
32
- def parse_version(stdout):
33
- # slang --version output looks like:
34
- # slang version 6.0.121+c2c478cf
33
+ version = pyslang.VersionInfo
34
+ if version.getMajor() >= 7 and version.getMinor() >= 0:
35
+ return None
35
36
 
36
- # grab version # by splitting on whitespace
37
- return stdout.strip().split()[-1].split('+')[0]
37
+ ver = f"{version.getMajor()}.{version.getMinor()}.{version.getPatch()}"
38
38
 
39
+ return f"incorrect pyslang version: {ver}"
39
40
 
40
- def post_process(chip):
41
- step = chip.get('arg', 'step')
42
- index = chip.get('arg', 'index')
43
41
 
44
- log = f'{step}.log'
45
- with sc_open(log) as f:
46
- for line in f:
47
- match = re.search(r'(\d+) errors, (\d+) warnings', line)
48
- if match:
49
- record_metric(chip, step, index, 'errors', match.group(1), log)
50
- record_metric(chip, step, index, 'warnings', match.group(2), log)
42
+ ################################
43
+ # Setup Tool (pre executable)
44
+ ################################
45
+ def setup(chip):
46
+ add_require_input(chip, 'input', 'rtl', 'verilog')
47
+ add_require_input(chip, 'input', 'rtl', 'systemverilog')
48
+ add_require_input(chip, 'input', 'cmdfile', 'f')
49
+ add_frontend_requires(chip, ['ydir', 'idir', 'vlib', 'libext', 'define', 'param'])
51
50
 
52
51
 
53
52
  def common_runtime_options(chip):
54
- options = []
55
-
56
53
  step = chip.get('arg', 'step')
57
54
  index = chip.get('arg', 'index')
58
55
  tool, task = get_tool_task(chip, step, index)
59
56
 
60
- options.extend(['-j', str(chip.get('tool', tool, 'task', task, 'threads',
61
- step=step, index=index))])
57
+ options = chip.get('tool', tool, 'task', task, 'option', step=step, index=index)
58
+
59
+ options.append('--single-unit')
60
+
61
+ options.extend(['--threads', str(chip.get('tool', tool, 'task', task, 'threads',
62
+ step=step, index=index))])
62
63
 
63
64
  opts = get_frontend_options(chip,
64
65
  ['ydir',
@@ -113,7 +114,7 @@ def common_runtime_options(chip):
113
114
  #######################
114
115
  # Top Module
115
116
  #######################
116
- options.append('--top ' + chip.top())
117
+ options.append('--top ' + chip.top(step, index))
117
118
 
118
119
  ###############################
119
120
  # Parameters (top module only)
@@ -124,3 +125,92 @@ def common_runtime_options(chip):
124
125
  options.append(f'-G {param}={value}')
125
126
 
126
127
  return options
128
+
129
+
130
+ def _get_driver(chip, options_func, ignored_diagnotics=None):
131
+ driver = pyslang.Driver()
132
+ driver.addStandardArgs()
133
+
134
+ options = options_func(chip)
135
+
136
+ parseOpts = pyslang.CommandLineOptions()
137
+ parseOpts.ignoreProgramName = True
138
+ opts = " ".join(options)
139
+ code = 0
140
+ if not driver.parseCommandLine(opts, parseOpts):
141
+ code = 1
142
+
143
+ if code == 0 and not driver.processOptions():
144
+ code = 2
145
+
146
+ step = chip.get('arg', 'step')
147
+ index = chip.get('arg', 'index')
148
+ tool, task = get_tool_task(chip, step, index)
149
+ for warning in chip.get('tool', tool, 'task', task, 'warningoff', step=step, index=index):
150
+ if hasattr(pyslang.Diags, warning):
151
+ driver.diagEngine.setSeverity(
152
+ getattr(pyslang.Diags, warning),
153
+ pyslang.DiagnosticSeverity.Ignored)
154
+ elif not chip.get('option', 'quiet', step=step, index=index):
155
+ chip.logger.warning(f'{warning} is not a valid slang category')
156
+
157
+ if not ignored_diagnotics:
158
+ ignored_diagnotics = []
159
+ for ignore in ignored_diagnotics:
160
+ driver.diagEngine.setSeverity(
161
+ ignore,
162
+ pyslang.DiagnosticSeverity.Ignored)
163
+
164
+ return driver, code
165
+
166
+
167
+ def _compile(chip, driver):
168
+ ok = driver.parseAllSources()
169
+ compilation = driver.createCompilation()
170
+ return compilation, ok
171
+
172
+
173
+ def _diagnostics(chip, driver, compilation):
174
+ step = chip.get('arg', 'step')
175
+ index = chip.get('arg', 'index')
176
+
177
+ report = {
178
+ "error": [],
179
+ "warning": [],
180
+ }
181
+ diags = driver.diagEngine
182
+ for diag in compilation.getAllDiagnostics():
183
+ severity = diags.getSeverity(diag.code, diag.location)
184
+ report_level = None
185
+ if severity == pyslang.DiagnosticSeverity.Warning:
186
+ report_level = "warning"
187
+ elif severity == pyslang.DiagnosticSeverity.Error:
188
+ report_level = "error"
189
+ elif severity == pyslang.DiagnosticSeverity.Fatal:
190
+ report_level = "error"
191
+
192
+ if report_level:
193
+ for n, line in enumerate(diags.reportAll(driver.sourceManager, [diag]).splitlines()):
194
+ if line.strip():
195
+ if n == 0:
196
+ line_parts = line.split(":")
197
+ if os.path.exists(line_parts[0]):
198
+ line_parts[0] = os.path.abspath(line_parts[0])
199
+ line = ":".join(line_parts)
200
+
201
+ report[report_level].append(line)
202
+
203
+ if not chip.get('option', 'quiet', step=step, index=index):
204
+ if report["warning"]:
205
+ for line in report["warning"]:
206
+ chip.logger.warning(line)
207
+ if report["error"]:
208
+ for line in report["error"]:
209
+ chip.logger.error(line)
210
+
211
+ diags.clearCounts()
212
+ for diag in compilation.getAllDiagnostics():
213
+ diags.issue(diag)
214
+
215
+ record_metric(chip, step, index, 'errors', diags.numErrors, [])
216
+ record_metric(chip, step, index, 'warnings', diags.numWarnings, [])
@@ -1,13 +1,21 @@
1
1
  from siliconcompiler import utils
2
2
  from siliconcompiler.tools import slang
3
- from siliconcompiler.tools._common import \
4
- add_require_input, add_frontend_requires, get_tool_task, has_input_files
3
+ import os
4
+ from siliconcompiler.tools._common import get_tool_task, has_input_files
5
+ from siliconcompiler.tools.slang import pyslang
5
6
 
6
7
 
7
8
  def setup(chip):
8
9
  '''
9
10
  Elaborate verilog design files and generate a unified file.
10
11
  '''
12
+ if slang.test_version():
13
+ return slang.test_version()
14
+
15
+ if not has_input_files(chip, 'input', 'rtl', 'verilog') and \
16
+ not has_input_files(chip, 'input', 'rtl', 'systemverilog'):
17
+ return "no files in [input,rtl,systemverilog] or [input,rtl,verilog]"
18
+
11
19
  slang.setup(chip)
12
20
 
13
21
  step = chip.get('arg', 'step')
@@ -17,30 +25,127 @@ def setup(chip):
17
25
  chip.set('tool', tool, 'task', task, 'threads', utils.get_cores(chip),
18
26
  clobber=False, step=step, index=index)
19
27
 
20
- add_require_input(chip, 'input', 'rtl', 'verilog')
21
- add_require_input(chip, 'input', 'rtl', 'systemverilog')
22
- add_frontend_requires(chip, ['ydir', 'idir', 'vlib', 'libext', 'define', 'param'])
23
-
24
- chip.set('tool', tool, 'task', task, 'stdout', 'destination', 'output', step=step, index=index)
25
- chip.set('tool', tool, 'task', task, 'stdout', 'suffix', 'v', step=step, index=index)
28
+ chip.set('tool', tool, 'task', task, 'stdout', 'destination', 'log', step=step, index=index)
29
+ chip.set('tool', tool, 'task', task, 'stderr', 'destination', 'log', step=step, index=index)
26
30
 
27
31
  chip.set('tool', tool, 'task', task, 'output', __outputfile(chip), step=step, index=index)
28
32
 
33
+ chip.set('tool', tool, 'task', task, 'var', 'include_source_paths', True,
34
+ step=step, index=index, clobber=False)
35
+ chip.set('tool', tool, 'task', task, 'var', 'include_source_paths',
36
+ "true/false, if true add the source file path information", field="help")
37
+
38
+
39
+ def __outputfile(chip):
40
+ is_systemverilog = has_input_files(chip, 'input', 'rtl', 'systemverilog')
41
+ if is_systemverilog:
42
+ return f'{chip.top()}.sv'
43
+ return f'{chip.top()}.v'
44
+
45
+
46
+ def __get_files(manager, tree):
47
+ files = set()
48
+
49
+ from queue import Queue
50
+ nodes = Queue(maxsize=0)
51
+ nodes.put(tree.root)
52
+
53
+ def procRange(range):
54
+ files.add(manager.getFileName(range.start))
55
+ files.add(manager.getFileName(range.end))
56
+
57
+ while not nodes.empty():
58
+ node = nodes.get()
59
+ procRange(node.sourceRange)
60
+ for token in node:
61
+ if isinstance(token, pyslang.Token):
62
+ procRange(token.range)
63
+ else:
64
+ nodes.put(token)
65
+
66
+ return sorted([os.path.abspath(f) for f in files if os.path.isfile(f)])
67
+
68
+
69
+ def run(chip):
70
+ # Override default errors
71
+ ignored = [
72
+ pyslang.Diags.MissingTimeScale,
73
+ pyslang.Diags.UsedBeforeDeclared,
74
+ pyslang.Diags.UnusedParameter,
75
+ pyslang.Diags.UnusedDefinition,
76
+ pyslang.Diags.UnusedVariable,
77
+ pyslang.Diags.UnusedPort,
78
+ pyslang.Diags.UnusedButSetNet,
79
+ pyslang.Diags.UnusedImplicitNet,
80
+ pyslang.Diags.UnusedButSetVariable,
81
+ pyslang.Diags.UnusedButSetPort,
82
+ pyslang.Diags.UnusedTypedef,
83
+ pyslang.Diags.UnusedGenvar,
84
+ pyslang.Diags.UnusedAssertionDecl
85
+ ]
86
+
87
+ driver, exitcode = slang._get_driver(
88
+ chip,
89
+ runtime_options,
90
+ ignored_diagnotics=ignored)
91
+ if exitcode:
92
+ return exitcode
93
+
94
+ compilation, ok = slang._compile(chip, driver)
95
+
96
+ slang._diagnostics(chip, driver, compilation)
97
+
98
+ manager = compilation.sourceManager
99
+
100
+ step = chip.get('arg', 'step')
101
+ index = chip.get('arg', 'index')
102
+ tool, task = get_tool_task(chip, step, index)
103
+ add_source = chip.get('tool', tool, 'task', task, 'var', 'include_source_paths',
104
+ step=step, index=index)[0] == 'true'
105
+
106
+ def printFiles(out, files):
107
+ for src_file in files:
108
+ out.write(f'// File: {src_file}\n')
109
+
110
+ with open(f'outputs/{__outputfile(chip)}', 'w') as out:
111
+ for tree in compilation.getSyntaxTrees():
112
+ files = []
113
+ if add_source:
114
+ files = __get_files(manager, tree)
115
+
116
+ writer = pyslang.SyntaxPrinter(manager)
117
+
118
+ writer.setIncludeMissing(False)
119
+ writer.setIncludeSkipped(False)
120
+ writer.setIncludeDirectives(False)
121
+
122
+ writer.setIncludePreprocessed(True)
123
+ writer.setIncludeTrivia(True)
124
+ writer.setIncludeComments(True)
125
+ writer.setSquashNewlines(True)
126
+
127
+ out.write("////////////////////////////////////////////////////////////////\n")
128
+ out.write("// Start:\n")
129
+ printFiles(out, files)
130
+
131
+ out.write(writer.print(tree).str() + '\n')
132
+
133
+ out.write("// End:\n")
134
+ printFiles(out, files)
135
+ out.write("////////////////////////////////////////////////////////////////\n")
136
+
137
+ if ok:
138
+ return 0
139
+ else:
140
+ return 1
141
+
29
142
 
30
143
  def runtime_options(chip):
31
144
  options = slang.common_runtime_options(chip)
32
145
  options.extend([
33
- "--preprocess",
34
- "--comments",
146
+ "--allow-use-before-declare",
35
147
  "--ignore-unknown-modules",
36
- "--allow-use-before-declare"
148
+ "-Weverything"
37
149
  ])
38
150
 
39
151
  return options
40
-
41
-
42
- def __outputfile(chip):
43
- is_systemverilog = has_input_files(chip, 'input', 'rtl', 'systemverilog')
44
- if is_systemverilog:
45
- return f'{chip.top()}.sv'
46
- return f'{chip.top()}.v'
@@ -1,13 +1,15 @@
1
1
  from siliconcompiler import utils
2
2
  from siliconcompiler.tools import slang
3
- from siliconcompiler.tools._common import \
4
- add_require_input, add_frontend_requires, get_tool_task
3
+ from siliconcompiler.tools._common import get_tool_task
5
4
 
6
5
 
7
6
  def setup(chip):
8
7
  '''
9
8
  Lint system verilog
10
9
  '''
10
+ if slang.test_version():
11
+ return slang.test_version()
12
+
11
13
  slang.setup(chip)
12
14
 
13
15
  step = chip.get('arg', 'step')
@@ -17,19 +19,27 @@ def setup(chip):
17
19
  chip.set('tool', tool, 'task', task, 'threads', utils.get_cores(chip),
18
20
  clobber=False, step=step, index=index)
19
21
 
20
- add_require_input(chip, 'input', 'rtl', 'verilog')
21
- add_require_input(chip, 'input', 'rtl', 'systemverilog')
22
- add_frontend_requires(chip, ['ydir', 'idir', 'vlib', 'libext', 'define', 'param'])
22
+
23
+ def run(chip):
24
+ driver, exitcode = slang._get_driver(chip, runtime_options)
25
+ if exitcode:
26
+ return exitcode
27
+
28
+ compilation, ok = slang._compile(chip, driver)
29
+ slang._diagnostics(chip, driver, compilation)
30
+
31
+ if ok:
32
+ return 0
33
+ else:
34
+ return 1
23
35
 
24
36
 
25
37
  def runtime_options(chip):
26
38
  options = slang.common_runtime_options(chip)
27
39
  options.extend([
28
- "--lint-only"
40
+ "--lint-only",
41
+ "-Weverything",
42
+ "-Werror"
29
43
  ])
30
44
 
31
45
  return options
32
-
33
-
34
- def post_process(chip):
35
- slang.post_process(chip)
@@ -10,7 +10,12 @@ Sources: https://github.com/chipsalliance/Surelog
10
10
  Installation: https://github.com/chipsalliance/Surelog
11
11
  '''
12
12
 
13
- import surelog
13
+ import sys
14
+ try:
15
+ import surelog
16
+ except ModuleNotFoundError:
17
+ surelog = None
18
+
14
19
  from siliconcompiler.tools._common import get_tool_task
15
20
 
16
21
 
@@ -31,9 +36,17 @@ def setup(chip):
31
36
 
32
37
  is_docker = chip.get('option', 'scheduler', 'name', step=step, index=index) == 'docker'
33
38
  if not is_docker:
34
- exe = surelog.get_bin()
39
+ if surelog:
40
+ exe = surelog.get_bin()
41
+ else:
42
+ exe = 'surelog'
43
+ if sys.platform.startswith("win32"):
44
+ exe = f"{exe}.exe"
35
45
  else:
36
- exe = surelog.get_bin('linux')
46
+ if surelog:
47
+ exe = surelog.get_bin('linux')
48
+ else:
49
+ exe = 'surelog'
37
50
 
38
51
  # Standard Setup
39
52
  chip.set('tool', tool, 'exe', exe)
@@ -43,7 +56,7 @@ def setup(chip):
43
56
  # We package SC wheels with a precompiled copy of Surelog installed to
44
57
  # tools/surelog/bin. If the user doesn't have Surelog installed on their
45
58
  # system path, set the path to the bundled copy in the schema.
46
- if not surelog.has_system_surelog() and not is_docker:
59
+ if surelog and not surelog.has_system_surelog() and not is_docker:
47
60
  chip.set('tool', tool, 'path', surelog.get_path(), clobber=False)
48
61
 
49
62
  # Log file parsing
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "openroad": {
3
3
  "git-url": "https://github.com/The-OpenROAD-Project/OpenROAD.git",
4
- "git-commit": "1d7f91584c040b73089e415ec12fd806da1c1161",
4
+ "git-commit": "0fbd4d94c81ef070249ad9d9037a740d0c6e58fa",
5
5
  "docker-cmds": [
6
6
  "# Remove OR-Tools files",
7
7
  "RUN rm -f $SC_PREFIX/Makefile $SC_PREFIX/README.md",
@@ -36,7 +36,7 @@
36
36
  "auto-update": false
37
37
  },
38
38
  "klayout": {
39
- "version": "0.29.11",
39
+ "version": "0.29.12",
40
40
  "git-url": "https://github.com/KLayout/klayout.git",
41
41
  "docker-skip": true,
42
42
  "auto-update": true,
siliconcompiler/units.py CHANGED
@@ -41,7 +41,7 @@ SI_TYPES = (
41
41
  'V',
42
42
  'W',
43
43
  'ohm',
44
- 'C',
44
+ 'C'
45
45
  )
46
46
 
47
47
 
@@ -107,8 +107,6 @@ def get_si_prefix(unit):
107
107
  if matches:
108
108
  return matches[0][0]
109
109
 
110
- return ''
111
-
112
110
 
113
111
  def get_si_power(unit):
114
112
  '''
@@ -164,6 +162,11 @@ def format_si(value, unit, margin=3, digits=3):
164
162
  digits (int): number of digits to print after .
165
163
  '''
166
164
  scaled_value, prefix = scale_si(value, unit, margin=margin, digits=digits)
165
+
166
+ if digits < 0:
167
+ # Default to 1
168
+ digits = 1
169
+
167
170
  # need to do this in case float shortens scaled_value
168
171
  return f'{scaled_value:.{digits}f}{prefix}'
169
172
 
@@ -179,14 +182,14 @@ def scale_si(value, unit, margin=3, digits=3):
179
182
  when picking the right magnitude
180
183
  digits (int): number of digits to print after .
181
184
  '''
185
+ if digits < 0:
186
+ # Default to 1
187
+ digits = 1
188
+
182
189
  if unit and is_base_si_unit(unit):
183
190
  value = float(value)
184
191
  log_value = math.log10(value) - margin
185
192
 
186
- if digits < 0:
187
- # Default to 0
188
- digits = 0
189
-
190
193
  for prefix, scale in SI_UNITS:
191
194
  if log_value <= scale:
192
195
  value /= 10**scale
siliconcompiler/use.py CHANGED
@@ -12,6 +12,7 @@ class PackageChip(Chip):
12
12
  super().__init__(name)
13
13
 
14
14
  if len(args) == 2:
15
+ self.logger = args[0].logger
15
16
  self.logger.warning(
16
17
  f'passing Chip object to {name} ({type(self).__name__}) is deprecated')
17
18
 
@@ -155,7 +156,8 @@ class Flow(Chip):
155
156
  def __init__(self, *args):
156
157
  super().__init__(args[-1])
157
158
  if len(args) == 2:
158
- self.logger.warning(f'passing Chip object to {type(self)} is deprecated')
159
+ self.logger = args[0].logger
160
+ self.logger.warning(f'passing Chip object to {self.design} (Flow) is deprecated')
159
161
 
160
162
 
161
163
  class Checklist(Chip):
@@ -175,4 +177,5 @@ class Checklist(Chip):
175
177
  def __init__(self, *args):
176
178
  super().__init__(args[-1])
177
179
  if len(args) == 2:
178
- self.logger.warning(f'passing Chip object to {type(self)} is deprecated')
180
+ self.logger = args[0].logger
181
+ self.logger.warning(f'passing Chip object to {self.design} (Checklist) is deprecated')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: siliconcompiler
3
- Version: 0.31.1
3
+ Version: 0.32.0
4
4
  Summary: A compiler framework that automates translation from source code to silicon.
5
5
  Author-email: Andreas Olofsson <andreas.d.olofsson@gmail.com>
6
6
  License: Apache License 2.0
@@ -45,10 +45,10 @@ Requires-Dist: fasteners==0.19
45
45
  Requires-Dist: fastjsonschema==2.21.1
46
46
  Requires-Dist: docker==7.1.0
47
47
  Requires-Dist: importlib_metadata; python_version < "3.10"
48
- Requires-Dist: sc-surelog==1.84.1
49
48
  Requires-Dist: orjson==3.10.15
49
+ Requires-Dist: pyslang==8.0.0
50
50
  Requires-Dist: streamlit==1.40.1; python_version <= "3.8"
51
- Requires-Dist: streamlit==1.42.2; python_version >= "3.9" and python_full_version != "3.9.7"
51
+ Requires-Dist: streamlit==1.43.1; python_version >= "3.9" and python_full_version != "3.9.7"
52
52
  Requires-Dist: streamlit_agraph==0.0.45; python_full_version != "3.9.7"
53
53
  Requires-Dist: streamlit-antd-components==0.3.2; python_full_version != "3.9.7"
54
54
  Requires-Dist: streamlit_javascript==0.1.5; python_full_version != "3.9.7"
@@ -74,9 +74,6 @@ Requires-Dist: pydata-sphinx-theme==0.16.1; extra == "docs"
74
74
  Requires-Dist: sc-leflib>=0.2.0; extra == "docs"
75
75
  Provides-Extra: profile
76
76
  Requires-Dist: gprof2dot==2024.6.6; extra == "profile"
77
- Provides-Extra: examples
78
- Requires-Dist: migen==0.9.2; extra == "examples"
79
- Requires-Dist: lambdalib==0.3.3; extra == "examples"
80
77
  Provides-Extra: optimizer
81
78
  Requires-Dist: google-vizier[jax]==0.1.21; python_version >= "3.10" and extra == "optimizer"
82
79
 
@@ -1,15 +1,15 @@
1
1
  siliconcompiler/__init__.py,sha256=Ke_Bcryj9N6MoUq_5z_IDW3qMrUzR-3-kJVsvUenYzY,511
2
2
  siliconcompiler/__main__.py,sha256=JwWkcvaNngqgMWprEQ1cFy2Wdq9GMvk46UGTHyh_qvM,170
3
3
  siliconcompiler/_common.py,sha256=c6r0SbI2xTpNOZayFsyCDo0riJGNJSPN-0zW8R7rDBI,1488
4
- siliconcompiler/_metadata.py,sha256=i_Lo3T11LBCBNlSyyLdOKcVrSbKRGv-UmYl4l1ROY4w,1264
5
- siliconcompiler/core.py,sha256=CA7SEpDkVHucYaD8c8tctObqtep3cEcasJN1SmESMxg,139774
4
+ siliconcompiler/_metadata.py,sha256=3djiiKr5bXhbjJlv9XuluEftoGgcRBwvLs9aEbYWD4s,1264
5
+ siliconcompiler/core.py,sha256=yncn2IGU3qD6frmO2Fk6RXTIBMIdXU66nVW4S9NvQPQ,138892
6
6
  siliconcompiler/flowgraph.py,sha256=Z_c4DEh1JvHE_u0O2M2Y1_dn6aGOAECX-HzrIjn0ky4,22084
7
7
  siliconcompiler/issue.py,sha256=9ZpdEBh8QB56-bZ1YXRnjqgg9hwnFty2u1o5oI66W7M,11125
8
- siliconcompiler/units.py,sha256=SHQWTKuiaYHqqTbhspsED0gw-4Lb7f5VKunWy9dhS3s,5810
9
- siliconcompiler/use.py,sha256=t5TodYt9tkYjNIdB6Ak-P3Gf2dgpX9Q-WXGBTLtVdQo,6058
8
+ siliconcompiler/units.py,sha256=M_ZxViSysymv8mFdCtbQwfccEwEsBeiCmc8TcnoXZbk,5845
9
+ siliconcompiler/use.py,sha256=zu17ogJv0x2t_6J9yb_5tH1DjridVQj0MrIRxJRJVGQ,6202
10
10
  siliconcompiler/apps/__init__.py,sha256=6LuAljPtVB6g5yXl_58ODoB4Svb6UfKaDbX1e0aNZfE,668
11
11
  siliconcompiler/apps/_common.py,sha256=Ph-cD-t9lCzavak3s4YCXXmA_ouf-jJ-7WIEGkSsjOg,3770
12
- siliconcompiler/apps/sc.py,sha256=DAhhyfpHEN0mDmQ3YcFWpGk7R64OEpguZ2QCEFGxyr4,3235
12
+ siliconcompiler/apps/sc.py,sha256=qHrfzgt1y748jX0nLXn9Hx1WuwXXmHFGhF4LaQTCpeE,3259
13
13
  siliconcompiler/apps/sc_dashboard.py,sha256=kGyMYbgKgZMBUrTyft6mEvRnmcrKA7JunrkWZ8VwSwM,3478
14
14
  siliconcompiler/apps/sc_install.py,sha256=qz6Dni7HcYrl9V7mDk2hqMYY4BwqRceNb-Gd2UE5zzk,8569
15
15
  siliconcompiler/apps/sc_issue.py,sha256=PUXFWne6MWY0Ntak3PnMZ84tpEZ5S1Pta5B3AkxMdoY,6404
@@ -18,7 +18,7 @@ siliconcompiler/apps/sc_server.py,sha256=d3SCfKtNneIBiAk7Udc5SqXvSIoFSK40iHWcKuY
18
18
  siliconcompiler/apps/sc_show.py,sha256=H0_evnBqr02FJVlIaFIva4RrYZ6M2otlWTaTCqFQPlg,4653
19
19
  siliconcompiler/apps/smake.py,sha256=jj69IuMLf4jblpVGeLT3GAvC-zDLHwPq16YPKtHosdA,7124
20
20
  siliconcompiler/apps/utils/replay.py,sha256=iAsYFb2mVcXw3c9SYV1pFiiQLwZKiub9uQjsO5v-hlo,5901
21
- siliconcompiler/apps/utils/summarize.py,sha256=mcViWpuS8UI2JqOF-QD99YAl0tjiy6_TbVl_coRCmNI,1291
21
+ siliconcompiler/apps/utils/summarize.py,sha256=CC6YwyEShiuZekU-D1Uk_m074aj8LviwotcgJMvZhuY,1250
22
22
  siliconcompiler/checklists/__init__.py,sha256=xnrgpMdgDLoYinDXVXRIAhX__BiBpBw16_gmg2dAwYo,247
23
23
  siliconcompiler/checklists/oh_tapeout.py,sha256=xBXAHOVNslFUlOfVTLLoPEJazczP8MTsa5EGo5GYQk0,1441
24
24
  siliconcompiler/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -28,7 +28,7 @@ siliconcompiler/data/RobotoMono/LICENSE.txt,sha256=Pd-b5cKP4n2tFDpdx27qJSIq0d1ok
28
28
  siliconcompiler/data/RobotoMono/RobotoMono-Regular.ttf,sha256=w8iOaiprWYm5hBNPzFHOaddn_RgCWHLoz0FsBMTaryA,86908
29
29
  siliconcompiler/data/RobotoMono/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
30
  siliconcompiler/flows/__init__.py,sha256=NwHSILM3yG962UqpgCYyvh07IZ1oLtIh5L-ia_BHrXg,996
31
- siliconcompiler/flows/_common.py,sha256=hcKVUPRK74t6JYU23UnY4qkFnu1-uauLwzsZjqzaYu0,2110
31
+ siliconcompiler/flows/_common.py,sha256=jySYBv7xKMwQ0Uo2rUbvmaopVUMY_Xv_iIvFv_pcPqQ,2392
32
32
  siliconcompiler/flows/asicflow.py,sha256=Hj0goWMxYGSqLmX_07z_uFePJvWcDGhY0afTeJblz7E,8113
33
33
  siliconcompiler/flows/asictopflow.py,sha256=UosrdJhh_NVyjigzz2KGhqcy2UBotkwTUUnCdOVaZXg,1155
34
34
  siliconcompiler/flows/drcflow.py,sha256=CinpSA2eHtqSlOIxTeXSoyV_TstFZ7uZ1VA9qAHihh8,230
@@ -47,9 +47,9 @@ siliconcompiler/fpgas/vpr_example.py,sha256=xcTgCvxSadcBnYVrglAi5XM4nn_raXWFvr_o
47
47
  siliconcompiler/libs/__init__.py,sha256=KXw1vU0KP83fg3rB8iKkpDhJZBLz_PWGZG65L3lAQ1Q,86
48
48
  siliconcompiler/optimizer/__init__.py,sha256=wdSuv3U7hoSdZn-TkaQtYehVdhS5F35Mb1McgaUw3hc,6599
49
49
  siliconcompiler/optimizer/vizier.py,sha256=-JF3E28SLhfkjluz2R5dFnjg5NjU1z7Okb-K_ZK9H3s,9035
50
- siliconcompiler/package/__init__.py,sha256=Dg_GBWERdCGRPjBNxcUHBB8Zf2ns-PgLy2Xqo0tARVw,9054
51
- siliconcompiler/package/git.py,sha256=L6J7H8s8LNdhrhlhuEw0eU4nHx7o6iOIjIf91OcmX80,3200
52
- siliconcompiler/package/https.py,sha256=8jXjNUA21p4fMW9WVbystk_HZTc0KgUUiIwfq-ziuk0,2919
50
+ siliconcompiler/package/__init__.py,sha256=BpOEkHppctqwh1FL9fLA3CtpTHJsNfk5eXywBNrCNPY,9172
51
+ siliconcompiler/package/git.py,sha256=c40uXesG1x-CgH7yat5Cq6iCjoUHp_jE_VXeHGtzeOk,3258
52
+ siliconcompiler/package/https.py,sha256=f3VxIC3YdPgejuGDqp-amsHljtO43XOSS5UQv-k5ktQ,3014
53
53
  siliconcompiler/pdks/__init__.py,sha256=bWhtNR-Kq3fEyknon-x5vQX877b88g9EJXAHBMiDyGM,81
54
54
  siliconcompiler/remote/__init__.py,sha256=MoYnC1lkgbT5hN5Qi-0gTItaTWI2U1E8OuleffdTDSQ,977
55
55
  siliconcompiler/remote/client.py,sha256=qwZaKSt-ScYjfBFpL9Np9Z0nDytYRJHgvNJnrXHGhok,32848
@@ -72,14 +72,14 @@ siliconcompiler/remote/server_schema/responses/get_results.json,sha256=h4XraLW4h
72
72
  siliconcompiler/remote/server_schema/responses/remote_run.json,sha256=FWW_0m46qwIJHiTriISzChKHJF6G9RIwP0rmp1OjIuA,475
73
73
  siliconcompiler/report/__init__.py,sha256=ADa-8Jwy4fl2Wtg0ejy4Tvil805uwA4WWTdK125JKcs,388
74
74
  siliconcompiler/report/html_report.py,sha256=Wh5X7iQpfIEHcs-WrVE9dtDf-gkz3GhT_yf8kVG0O3o,2597
75
- siliconcompiler/report/report.py,sha256=cxnWdYKxB_7xpbMOZnWpRfqwg9SOB7G2d_XkRPlYmTA,15083
75
+ siliconcompiler/report/report.py,sha256=_V8Dpxly06wDAVUVuu7yyZ2fMGV5MHkJ_9DHoxGgt24,15158
76
76
  siliconcompiler/report/summary_image.py,sha256=tKuoLiG6Whvnc8LHeSzU4FookpBkYYCMWUGb-ux2i8k,3570
77
77
  siliconcompiler/report/summary_table.py,sha256=j7MrwGacCemAWNOtyHiYop9XRQPzIEWHyRl4dfS1yI8,3386
78
78
  siliconcompiler/report/utils.py,sha256=70klZsAKwhW55kOxBBdV9zzOU-NorMk6y6riMyKXo7c,6423
79
79
  siliconcompiler/report/dashboard/__init__.py,sha256=bvSfStUvkMa1zW1R5WtzzzKKAMm9FCNiPbIIFXOotJ0,5554
80
80
  siliconcompiler/report/dashboard/state.py,sha256=qBAmLpKb0xXqf2vRbBBgYs8P71v3MGIL6z0WHoAED-Y,5924
81
81
  siliconcompiler/report/dashboard/viewer.py,sha256=scF4MkbOdqM1pRCzGWnXeMrk4r2M4Y2cDyEIrAWCFiw,1095
82
- siliconcompiler/report/dashboard/components/__init__.py,sha256=BkVt0JakAj9kC5WlewdvFESwygjDmhyj85xiV8oc00I,18097
82
+ siliconcompiler/report/dashboard/components/__init__.py,sha256=4AteP9VxNisAGkv_Ib_7bV1ZyEmqH6TglY9d8Xh44KQ,18517
83
83
  siliconcompiler/report/dashboard/components/flowgraph.py,sha256=bjPuaWlEra4HbIUIbtCkYQMNTYueSGP0WO-r16MrBss,3525
84
84
  siliconcompiler/report/dashboard/components/graph.py,sha256=m9y4lxKDgTJNp_eOdLohN1bn6uE3XEnE387xnb4HnUo,6776
85
85
  siliconcompiler/report/dashboard/layouts/__init__.py,sha256=aYhWEoQg4CiwGMCcLH4Yj__d_5tD4vyb164dP2RpURY,638
@@ -91,7 +91,7 @@ siliconcompiler/report/dashboard/utils/__init__.py,sha256=mkcBAlfPovfgoRv9nPbtgQ
91
91
  siliconcompiler/report/dashboard/utils/file_utils.py,sha256=5MKAyf7TGXQIc3yxwbP1H6xi0NGwUfzu2j3LOv1Yei0,3333
92
92
  siliconcompiler/scheduler/__init__.py,sha256=goiNHGe41JjCKoMWIh6i3fcw9kuC7lXcAziA_bFeun4,87291
93
93
  siliconcompiler/scheduler/docker_runner.py,sha256=zeAPHgthkoR8ATY6zmV2kCJWpD13fuq2DCzzG66Ubm8,8052
94
- siliconcompiler/scheduler/run_node.py,sha256=XEY3SNIstK8SLnD7uiHmQ_9maCgdfTECQAJr5OT9rQI,5036
94
+ siliconcompiler/scheduler/run_node.py,sha256=4bIFcPnP8pq4-lDyXPAEu1fk2Q8qQlnlLKwl7CQDQZo,5203
95
95
  siliconcompiler/scheduler/send_messages.py,sha256=mWmkfPVDEfzOawVq6At6fi0JgFkzyFNwAA29lYkN5Xw,6618
96
96
  siliconcompiler/scheduler/slurm.py,sha256=CAuN5xmiWhk_k3CW6yMe5iukex4CWxp5Ox6_qAzgV5Q,7097
97
97
  siliconcompiler/scheduler/validation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -213,7 +213,7 @@ siliconcompiler/tools/nextpnr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5N
213
213
  siliconcompiler/tools/nextpnr/apr.py,sha256=dCMLDS4xnwqCoBtCKd3kwCxjIRqPn_zq3f7pkWPw5mw,802
214
214
  siliconcompiler/tools/nextpnr/nextpnr.py,sha256=B5kr-ZLnt2vDFtS4veIdf0_Cm6yvfS1QVqWhxYa8R24,1712
215
215
  siliconcompiler/tools/openroad/__init__.py,sha256=aJLiAfdleczGD9QXw7TYBGrWFiEJhaAWbQJcNlYCOts,3250
216
- siliconcompiler/tools/openroad/_apr.py,sha256=_ohixH7e3gDfcK6aIBYaEvs3729F_06vNRmujE4HiqE,50796
216
+ siliconcompiler/tools/openroad/_apr.py,sha256=gfVDBZdG9EFr-Z9LRgriDgRIDBUHCtqzSfghW3BUfF0,51247
217
217
  siliconcompiler/tools/openroad/antenna_repair.py,sha256=UC4BjY_qJhYLdb_LFRUXomlmcu1mYnTJF9EAh7xYP_k,2248
218
218
  siliconcompiler/tools/openroad/clock_tree_synthesis.py,sha256=ouS1qu6cztiW7KGnDzCSCmPMYHaKbq2i69tAA44ZQS0,1710
219
219
  siliconcompiler/tools/openroad/detailed_placement.py,sha256=mvFw9E5x9AHx6h7dbwlUHwOqJFRAE4WFiWLDuM9Q-6I,1571
@@ -263,12 +263,12 @@ siliconcompiler/tools/openroad/scripts/common/procs.tcl,sha256=gcnX6ZBzTysO1YaK6
263
263
  siliconcompiler/tools/openroad/scripts/common/read_input_files.tcl,sha256=Jf1K9clDiC9N0LDwCguQMChWQTSfc7uY3Tht_C9wfAg,2089
264
264
  siliconcompiler/tools/openroad/scripts/common/read_liberty.tcl,sha256=GeXZ8H3a8fg8o-4KyfZj2N4Db_P9XArZl2T4apfMSZI,778
265
265
  siliconcompiler/tools/openroad/scripts/common/read_timing_constraints.tcl,sha256=fsHSSGXkrqOKXjwH7U8XMLMnEPoZpavBVkl4qzLugOU,515
266
- siliconcompiler/tools/openroad/scripts/common/reports.tcl,sha256=ErZTGPgd7sAq7zNgtSygCEM4Y3pQXrR-l7R-KwdDrlk,6553
266
+ siliconcompiler/tools/openroad/scripts/common/reports.tcl,sha256=i6P282tAM9Yig2V1z1ShOrKLgYdysx96M4nrhl6kctc,6881
267
267
  siliconcompiler/tools/openroad/scripts/common/screenshot.tcl,sha256=OEE4JpafdOK1cVJw3sie_Fvo03ZkheElhPpvKsgCV0E,447
268
268
  siliconcompiler/tools/openroad/scripts/common/write_data.tcl,sha256=xFFgR6mCpQEy8ATfSz1kUFr2BBnaPsv4cSHnWh7JqC8,100
269
269
  siliconcompiler/tools/openroad/scripts/common/write_data_physical.tcl,sha256=X0ZsHwfQPRokkCuYjtnw_OL98R9PLjZEMxgLClhsbUg,130
270
270
  siliconcompiler/tools/openroad/scripts/common/write_data_timing.tcl,sha256=-clUY9N57lhN_sc0FpjfSj-75cMFdpPnMDiX7YFbp98,37
271
- siliconcompiler/tools/openroad/scripts/common/write_images.tcl,sha256=iQy1WXMLeSBn-ZhlQt44KNNdikHirvwjsHs8MnPhVfg,11926
271
+ siliconcompiler/tools/openroad/scripts/common/write_images.tcl,sha256=xD8usvrk0NhvcJBKOMPsMtrLCfbT_vrOlh0Fc5SHC-M,12714
272
272
  siliconcompiler/tools/openroad/scripts/rcx/sc_rcx_bench.tcl,sha256=95p_XiRPA1PnofMTMUTesI4JniHnvB8f9_oANGRuC8M,692
273
273
  siliconcompiler/tools/openroad/scripts/rcx/sc_rcx_extract.tcl,sha256=Aj9J_8aiOR1WqcQvdx99WyUDcN8RafxXwtrexcS5UcU,489
274
274
  siliconcompiler/tools/openroad/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -282,10 +282,10 @@ siliconcompiler/tools/opensta/scripts/sc_check_library.tcl,sha256=kpb1X4GPwNQqDo
282
282
  siliconcompiler/tools/opensta/scripts/sc_procs.tcl,sha256=4XAgyGRmkk_J2OqxA1glO46BixSgGZFdEYHmezxwwGE,1122
283
283
  siliconcompiler/tools/opensta/scripts/sc_report_libraries.tcl,sha256=LjVH3rwVXgGH4_1uXze8q390uIX62xeKu8WCsV5zj6I,2620
284
284
  siliconcompiler/tools/opensta/scripts/sc_timing.tcl,sha256=gbLr5jmD2o5SwJr04kzpPH0NcvJF-1j5R_Y6ydZgWFc,7982
285
- siliconcompiler/tools/slang/__init__.py,sha256=TwZSHUPYh2iyRExWdU8n7DEOhWe4DmYqumVg2gRtTqg,3894
286
- siliconcompiler/tools/slang/elaborate.py,sha256=txJeAY3aZT_-xckHOlGQfKOCHb1uRIVd9J1p3hTXFEs,1495
287
- siliconcompiler/tools/slang/lint.py,sha256=ByjgrpaJDFSJf7FhkICK7j3mUuCQrzQS_qXkhxJF1Ks,917
288
- siliconcompiler/tools/surelog/__init__.py,sha256=tOv1yRkW4QjKRyN5Q5uAs3ii5-ORgO2Sya1Es4n69cQ,5298
285
+ siliconcompiler/tools/slang/__init__.py,sha256=ZPW82XeX6e7djO-Mbulixv3JkwAkmwwwDTWS8QKY-RU,6877
286
+ siliconcompiler/tools/slang/elaborate.py,sha256=EZmyljTqb0LRqAGCemcLN2eOUdDmQmBNLlL-TXyC_P4,4739
287
+ siliconcompiler/tools/slang/lint.py,sha256=_YdQHMEwNYuMr3rBr-fLhPWuuMI3gFxzya4MUcUXMdo,999
288
+ siliconcompiler/tools/surelog/__init__.py,sha256=vngLIj7mmcpJwRwYdm-EAsNNjkCWRuC8sm2pW77FCi8,5594
289
289
  siliconcompiler/tools/surelog/parse.py,sha256=D2QOY0DN6-AMGX__QL83gTFNoz0nzc1uHMekObcml9s,6016
290
290
  siliconcompiler/tools/surelog/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
291
291
  siliconcompiler/tools/surelog/templates/output.v,sha256=i2dvcHzXxb5rl7tnryQUaWYeqS2q_T70aKoRw0k1DaY,206
@@ -340,7 +340,7 @@ siliconcompiler/tools/yosys/techmaps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeu
340
340
  siliconcompiler/tools/yosys/techmaps/lcu_kogge_stone.v,sha256=M4T-ygiKmlsprl5eGGLaV5w6HVqlEepn0wlUDmOkapg,773
341
341
  siliconcompiler/tools/yosys/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
342
342
  siliconcompiler/tools/yosys/templates/abc.const,sha256=TAq9ThdLMYCJGrtToEU0gWcLuEtjE4Gk8huBbTm1v-I,116
343
- siliconcompiler/toolscripts/_tools.json,sha256=EKdv-EQ_xdD3AacY73aM4sr39gtDY71zOcffQOriQ44,4403
343
+ siliconcompiler/toolscripts/_tools.json,sha256=RWgVsyLPWBwui9J7ugmYUCn2qlv_jJ1Ton2DdxaBDkE,4403
344
344
  siliconcompiler/toolscripts/_tools.py,sha256=P30KY_xbbjl8eHGsPAxDcAzWvJJpiL07ZfGZZDQbdR8,7174
345
345
  siliconcompiler/toolscripts/rhel8/install-chisel.sh,sha256=lPORZN7vlBX6sJSv01JOIiDE9-_7GcCZGA7EP5ri3MQ,525
346
346
  siliconcompiler/toolscripts/rhel8/install-ghdl.sh,sha256=xCLeEUuJVI_6PVEvnTwBsTWoEHiQg0TY3x-tJXfg6Zk,459
@@ -456,9 +456,9 @@ siliconcompiler/utils/__init__.py,sha256=y4S1sRW2C3oYXN6PMZOHFO8-ytQ8yJvUoQtqKln
456
456
  siliconcompiler/utils/asic.py,sha256=cMLs7dneSmh5BlHS0-bZ1tLUpvghTw__gNaUCMpyBds,4986
457
457
  siliconcompiler/utils/logging.py,sha256=5tabLIVEftStGDeDulhfBdw4SFp5nHa4J3ZTJKHny8Q,2325
458
458
  siliconcompiler/utils/showtools.py,sha256=gaAvjMTFlx_0qLKOtpRJx8Bs51TEeQ-4Pjj8kHfFf3o,1871
459
- siliconcompiler-0.31.1.dist-info/LICENSE,sha256=lbLR6sRo_CYJOf7SVgHi-U6CZdD8esESEZE5TZazOQE,10766
460
- siliconcompiler-0.31.1.dist-info/METADATA,sha256=cHiZiRkjqUahZpw7pq-Sxrfr-mVrbVgiIG71F0swDjo,11462
461
- siliconcompiler-0.31.1.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
462
- siliconcompiler-0.31.1.dist-info/entry_points.txt,sha256=69hHdWZQBugdza9dYdxodDySxmq6TgwpRYMeH2KfD4Q,1078
463
- siliconcompiler-0.31.1.dist-info/top_level.txt,sha256=H8TOYhnEUZAV1RJTa8JRtjLIebwHzkQUhA2wkNU2O6M,16
464
- siliconcompiler-0.31.1.dist-info/RECORD,,
459
+ siliconcompiler-0.32.0.dist-info/LICENSE,sha256=lbLR6sRo_CYJOf7SVgHi-U6CZdD8esESEZE5TZazOQE,10766
460
+ siliconcompiler-0.32.0.dist-info/METADATA,sha256=lJeiO2qnQWV9G523iaU4vKHydWLepMChWvkUskYzBDo,11331
461
+ siliconcompiler-0.32.0.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
462
+ siliconcompiler-0.32.0.dist-info/entry_points.txt,sha256=69hHdWZQBugdza9dYdxodDySxmq6TgwpRYMeH2KfD4Q,1078
463
+ siliconcompiler-0.32.0.dist-info/top_level.txt,sha256=H8TOYhnEUZAV1RJTa8JRtjLIebwHzkQUhA2wkNU2O6M,16
464
+ siliconcompiler-0.32.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.2)
2
+ Generator: setuptools (76.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5