siliconcompiler 0.32.1__py3-none-any.whl → 0.32.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 +3 -2
- siliconcompiler/apps/sc_install.py +13 -5
- siliconcompiler/apps/sc_remote.py +2 -1
- siliconcompiler/core.py +68 -55
- siliconcompiler/issue.py +3 -1
- siliconcompiler/remote/client.py +55 -16
- siliconcompiler/report/__init__.py +3 -2
- siliconcompiler/report/dashboard/__init__.py +61 -170
- siliconcompiler/report/dashboard/cli/__init__.py +788 -0
- siliconcompiler/report/dashboard/web/__init__.py +196 -0
- siliconcompiler/report/dashboard/{components → web/components}/__init__.py +4 -4
- siliconcompiler/report/dashboard/{components → web/components}/graph.py +1 -1
- siliconcompiler/report/dashboard/{layouts → web/layouts}/__init__.py +3 -3
- siliconcompiler/report/dashboard/{layouts → web/layouts}/_common.py +1 -1
- siliconcompiler/report/dashboard/{layouts → web/layouts}/vertical_flowgraph.py +5 -5
- siliconcompiler/report/dashboard/{layouts → web/layouts}/vertical_flowgraph_node_tab.py +6 -6
- siliconcompiler/report/dashboard/{layouts → web/layouts}/vertical_flowgraph_sac_tabs.py +6 -6
- siliconcompiler/report/dashboard/{viewer.py → web/viewer.py} +4 -4
- siliconcompiler/scheduler/__init__.py +44 -13
- siliconcompiler/scheduler/docker_runner.py +2 -1
- siliconcompiler/sphinx_ext/dynamicgen.py +11 -11
- siliconcompiler/templates/replay/replay.sh.j2 +2 -2
- siliconcompiler/templates/tcl/manifest.tcl.j2 +4 -120
- siliconcompiler/tools/_common/__init__.py +2 -0
- siliconcompiler/tools/_common/tcl/sc_schema_access.tcl +126 -0
- siliconcompiler/tools/openroad/_apr.py +7 -0
- siliconcompiler/tools/openroad/fillmetal_insertion.py +14 -14
- siliconcompiler/tools/openroad/scripts/apr/sc_antenna_repair.tcl +1 -1
- siliconcompiler/tools/openroad/scripts/apr/sc_clock_tree_synthesis.tcl +1 -1
- siliconcompiler/tools/openroad/scripts/apr/sc_detailed_placement.tcl +1 -1
- siliconcompiler/tools/openroad/scripts/apr/sc_detailed_route.tcl +1 -1
- siliconcompiler/tools/openroad/scripts/apr/sc_endcap_tapcell_insertion.tcl +1 -1
- siliconcompiler/tools/openroad/scripts/apr/sc_fillercell_insertion.tcl +1 -1
- siliconcompiler/tools/openroad/scripts/apr/sc_fillmetal_insertion.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_global_placement.tcl +1 -1
- siliconcompiler/tools/openroad/scripts/apr/sc_global_route.tcl +1 -1
- siliconcompiler/tools/openroad/scripts/apr/sc_init_floorplan.tcl +1 -1
- siliconcompiler/tools/openroad/scripts/apr/sc_macro_placement.tcl +1 -1
- siliconcompiler/tools/openroad/scripts/apr/sc_metrics.tcl +1 -1
- siliconcompiler/tools/openroad/scripts/apr/sc_pin_placement.tcl +1 -1
- siliconcompiler/tools/openroad/scripts/apr/sc_power_grid.tcl +1 -1
- siliconcompiler/tools/openroad/scripts/apr/sc_repair_design.tcl +1 -1
- siliconcompiler/tools/openroad/scripts/apr/sc_repair_timing.tcl +54 -8
- siliconcompiler/tools/openroad/scripts/apr/sc_write_data.tcl +1 -1
- siliconcompiler/tools/openroad/scripts/common/procs.tcl +19 -1
- siliconcompiler/tools/openroad/scripts/common/reports.tcl +18 -7
- siliconcompiler/tools/openroad/scripts/sc_rcx.tcl +1 -1
- siliconcompiler/tools/openroad/scripts/sc_rdlroute.tcl +1 -1
- siliconcompiler/tools/openroad/scripts/sc_show.tcl +1 -1
- siliconcompiler/tools/opensta/__init__.py +1 -1
- siliconcompiler/tools/opensta/scripts/sc_check_library.tcl +1 -1
- siliconcompiler/tools/opensta/scripts/sc_procs.tcl +16 -0
- siliconcompiler/tools/opensta/scripts/sc_report_libraries.tcl +1 -1
- siliconcompiler/tools/opensta/scripts/sc_timing.tcl +35 -7
- siliconcompiler/tools/opensta/timing.py +6 -2
- siliconcompiler/tools/slang/__init__.py +7 -8
- siliconcompiler/tools/sv2v/sv2v.py +4 -1
- siliconcompiler/tools/yosys/__init__.py +4 -36
- siliconcompiler/tools/yosys/lec.py +3 -4
- siliconcompiler/tools/yosys/{syn_asic.tcl → sc_synth_asic.tcl} +87 -0
- siliconcompiler/tools/yosys/{syn_fpga.tcl → sc_synth_fpga.tcl} +78 -0
- siliconcompiler/tools/yosys/syn_asic.py +36 -11
- siliconcompiler/tools/yosys/syn_fpga.py +23 -16
- siliconcompiler/toolscripts/_tools.json +23 -9
- siliconcompiler/toolscripts/rhel8/install-chisel.sh +2 -0
- siliconcompiler/toolscripts/rhel8/install-icarus.sh +1 -0
- siliconcompiler/toolscripts/rhel8/install-klayout.sh +2 -0
- siliconcompiler/toolscripts/rhel8/install-magic.sh +1 -2
- siliconcompiler/toolscripts/rhel8/install-netgen.sh +1 -1
- siliconcompiler/toolscripts/rhel8/install-slang.sh +2 -0
- siliconcompiler/toolscripts/rhel8/install-surelog.sh +3 -1
- siliconcompiler/toolscripts/rhel8/install-sv2v.sh +1 -0
- siliconcompiler/toolscripts/rhel8/install-verible.sh +2 -0
- siliconcompiler/toolscripts/rhel8/install-verilator.sh +1 -0
- siliconcompiler/toolscripts/rhel8/install-xyce.sh +2 -0
- siliconcompiler/toolscripts/rhel9/install-chisel.sh +2 -0
- siliconcompiler/toolscripts/rhel9/install-ghdl.sh +1 -0
- siliconcompiler/toolscripts/rhel9/install-gtkwave.sh +2 -1
- siliconcompiler/toolscripts/rhel9/install-icarus.sh +1 -0
- siliconcompiler/toolscripts/rhel9/install-klayout.sh +2 -0
- siliconcompiler/toolscripts/rhel9/install-magic.sh +1 -2
- siliconcompiler/toolscripts/rhel9/install-netgen.sh +1 -1
- siliconcompiler/toolscripts/rhel9/install-openroad.sh +2 -0
- siliconcompiler/toolscripts/rhel9/install-opensta.sh +76 -0
- siliconcompiler/toolscripts/rhel9/install-slang.sh +3 -1
- siliconcompiler/toolscripts/rhel9/install-surelog.sh +2 -1
- siliconcompiler/toolscripts/rhel9/install-sv2v.sh +1 -0
- siliconcompiler/toolscripts/rhel9/install-verible.sh +2 -0
- siliconcompiler/toolscripts/rhel9/install-verilator.sh +1 -0
- siliconcompiler/toolscripts/rhel9/install-vpr.sh +31 -0
- siliconcompiler/toolscripts/rhel9/install-xdm.sh +2 -0
- siliconcompiler/toolscripts/rhel9/install-xyce.sh +2 -0
- siliconcompiler/toolscripts/rhel9/install-yosys-moosic.sh +2 -0
- siliconcompiler/toolscripts/rhel9/install-yosys-parmys.sh +61 -0
- siliconcompiler/toolscripts/rhel9/install-yosys-slang.sh +3 -1
- siliconcompiler/toolscripts/rhel9/install-yosys.sh +2 -0
- siliconcompiler/toolscripts/ubuntu20/install-bambu.sh +2 -0
- siliconcompiler/toolscripts/ubuntu20/install-bluespec.sh +2 -0
- siliconcompiler/toolscripts/ubuntu20/install-chisel.sh +2 -0
- siliconcompiler/toolscripts/ubuntu20/install-ghdl.sh +2 -0
- siliconcompiler/toolscripts/ubuntu20/install-gtkwave.sh +2 -0
- siliconcompiler/toolscripts/ubuntu20/install-icarus.sh +2 -0
- siliconcompiler/toolscripts/ubuntu20/install-icepack.sh +2 -0
- siliconcompiler/toolscripts/ubuntu20/install-klayout.sh +2 -0
- siliconcompiler/toolscripts/ubuntu20/install-magic.sh +2 -0
- siliconcompiler/toolscripts/ubuntu20/install-netgen.sh +2 -0
- siliconcompiler/toolscripts/ubuntu20/install-nextpnr.sh +1 -3
- siliconcompiler/toolscripts/ubuntu20/install-openroad.sh +2 -0
- siliconcompiler/toolscripts/ubuntu20/install-opensta.sh +72 -0
- siliconcompiler/toolscripts/ubuntu20/install-slang.sh +3 -1
- siliconcompiler/toolscripts/ubuntu20/install-slurm.sh +2 -0
- siliconcompiler/toolscripts/ubuntu20/install-surelog.sh +3 -1
- siliconcompiler/toolscripts/ubuntu20/install-sv2v.sh +1 -1
- siliconcompiler/toolscripts/ubuntu20/install-verible.sh +2 -0
- siliconcompiler/toolscripts/ubuntu20/install-verilator.sh +2 -0
- siliconcompiler/toolscripts/ubuntu20/install-vpr.sh +2 -0
- siliconcompiler/toolscripts/ubuntu20/install-xdm.sh +2 -0
- siliconcompiler/toolscripts/ubuntu20/install-xyce.sh +2 -0
- siliconcompiler/toolscripts/ubuntu20/install-yosys-moosic.sh +2 -0
- siliconcompiler/toolscripts/ubuntu20/install-yosys-parmys.sh +61 -0
- siliconcompiler/toolscripts/ubuntu20/install-yosys.sh +2 -0
- siliconcompiler/toolscripts/ubuntu22/install-bambu.sh +2 -0
- siliconcompiler/toolscripts/ubuntu22/install-bluespec.sh +27 -2
- siliconcompiler/toolscripts/ubuntu22/install-chisel.sh +2 -0
- siliconcompiler/toolscripts/ubuntu22/install-ghdl.sh +4 -2
- siliconcompiler/toolscripts/ubuntu22/install-gtkwave.sh +2 -0
- siliconcompiler/toolscripts/ubuntu22/install-icarus.sh +2 -0
- siliconcompiler/toolscripts/ubuntu22/install-icepack.sh +2 -0
- siliconcompiler/toolscripts/ubuntu22/install-klayout.sh +2 -0
- siliconcompiler/toolscripts/ubuntu22/install-magic.sh +2 -0
- siliconcompiler/toolscripts/ubuntu22/install-netgen.sh +2 -0
- siliconcompiler/toolscripts/ubuntu22/install-nextpnr.sh +1 -2
- siliconcompiler/toolscripts/ubuntu22/install-openroad.sh +2 -0
- siliconcompiler/toolscripts/ubuntu22/install-opensta.sh +72 -0
- siliconcompiler/toolscripts/ubuntu22/install-slang.sh +3 -1
- siliconcompiler/toolscripts/ubuntu22/install-slurm.sh +2 -0
- siliconcompiler/toolscripts/ubuntu22/install-surelog.sh +3 -1
- siliconcompiler/toolscripts/ubuntu22/install-sv2v.sh +1 -1
- siliconcompiler/toolscripts/ubuntu22/install-verible.sh +2 -0
- siliconcompiler/toolscripts/ubuntu22/install-verilator.sh +2 -0
- siliconcompiler/toolscripts/ubuntu22/install-vpr.sh +2 -0
- siliconcompiler/toolscripts/ubuntu22/install-xdm.sh +2 -0
- siliconcompiler/toolscripts/ubuntu22/install-xyce.sh +2 -0
- siliconcompiler/toolscripts/ubuntu22/install-yosys-moosic.sh +2 -0
- siliconcompiler/toolscripts/ubuntu22/install-yosys-parmys.sh +61 -0
- siliconcompiler/toolscripts/ubuntu22/install-yosys-slang.sh +3 -1
- siliconcompiler/toolscripts/ubuntu22/install-yosys.sh +2 -0
- siliconcompiler/toolscripts/ubuntu24/install-bambu.sh +2 -0
- siliconcompiler/toolscripts/ubuntu24/install-bluespec.sh +2 -0
- siliconcompiler/toolscripts/ubuntu24/install-chisel.sh +2 -0
- siliconcompiler/toolscripts/ubuntu24/install-ghdl.sh +4 -2
- siliconcompiler/toolscripts/ubuntu24/install-gtkwave.sh +2 -0
- siliconcompiler/toolscripts/ubuntu24/install-icarus.sh +2 -0
- siliconcompiler/toolscripts/ubuntu24/install-icepack.sh +2 -0
- siliconcompiler/toolscripts/ubuntu24/install-klayout.sh +2 -0
- siliconcompiler/toolscripts/ubuntu24/install-magic.sh +2 -0
- siliconcompiler/toolscripts/ubuntu24/install-netgen.sh +2 -0
- siliconcompiler/toolscripts/ubuntu24/install-nextpnr.sh +1 -3
- siliconcompiler/toolscripts/ubuntu24/install-openroad.sh +2 -0
- siliconcompiler/toolscripts/ubuntu24/install-opensta.sh +72 -0
- siliconcompiler/toolscripts/ubuntu24/install-slang.sh +3 -1
- siliconcompiler/toolscripts/ubuntu24/install-slurm.sh +2 -0
- siliconcompiler/toolscripts/ubuntu24/install-surelog.sh +3 -1
- siliconcompiler/toolscripts/ubuntu24/install-sv2v.sh +1 -1
- siliconcompiler/toolscripts/ubuntu24/install-verible.sh +2 -0
- siliconcompiler/toolscripts/ubuntu24/install-verilator.sh +2 -0
- siliconcompiler/toolscripts/ubuntu24/install-vpr.sh +2 -0
- siliconcompiler/toolscripts/ubuntu24/install-xdm.sh +2 -0
- siliconcompiler/toolscripts/ubuntu24/install-xyce.sh +2 -0
- siliconcompiler/toolscripts/ubuntu24/install-yosys-moosic.sh +2 -0
- siliconcompiler/toolscripts/ubuntu24/install-yosys-parmys.sh +61 -0
- siliconcompiler/toolscripts/ubuntu24/install-yosys-slang.sh +3 -1
- siliconcompiler/toolscripts/ubuntu24/install-yosys.sh +2 -0
- siliconcompiler/utils/__init__.py +4 -1
- siliconcompiler/utils/logging.py +88 -34
- {siliconcompiler-0.32.1.dist-info → siliconcompiler-0.32.3.dist-info}/METADATA +14 -10
- {siliconcompiler-0.32.1.dist-info → siliconcompiler-0.32.3.dist-info}/RECORD +185 -175
- {siliconcompiler-0.32.1.dist-info → siliconcompiler-0.32.3.dist-info}/WHEEL +1 -1
- siliconcompiler/tools/yosys/sc_syn.tcl +0 -87
- siliconcompiler/toolscripts/ubuntu20/install-yosys-slang.sh +0 -22
- /siliconcompiler/report/dashboard/{components → web/components}/flowgraph.py +0 -0
- /siliconcompiler/report/dashboard/{state.py → web/state.py} +0 -0
- /siliconcompiler/report/dashboard/{utils → web/utils}/__init__.py +0 -0
- /siliconcompiler/report/dashboard/{utils → web/utils}/file_utils.py +0 -0
- {siliconcompiler-0.32.1.dist-info → siliconcompiler-0.32.3.dist-info}/entry_points.txt +0 -0
- {siliconcompiler-0.32.1.dist-info → siliconcompiler-0.32.3.dist-info/licenses}/LICENSE +0 -0
- {siliconcompiler-0.32.1.dist-info → siliconcompiler-0.32.3.dist-info}/top_level.txt +0 -0
siliconcompiler/_metadata.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Version number following semver standard.
|
|
2
|
-
version = '0.32.
|
|
2
|
+
version = '0.32.3'
|
|
3
3
|
|
|
4
4
|
# Default server address for remote runs, if unspecified.
|
|
5
5
|
default_server = 'https://server.siliconcompiler.com'
|
|
@@ -21,7 +21,8 @@ authors = [
|
|
|
21
21
|
'Aulihan Teng',
|
|
22
22
|
'Peter Grossmann',
|
|
23
23
|
'Gabriel Aguirre',
|
|
24
|
-
'Martin Troiber'
|
|
24
|
+
'Martin Troiber',
|
|
25
|
+
'Ciprian Antoci'
|
|
25
26
|
]
|
|
26
27
|
|
|
27
28
|
# CLI entry banner autogenerated using pyfiglet.
|
|
@@ -139,8 +139,8 @@ def _get_tools_list():
|
|
|
139
139
|
|
|
140
140
|
def _recommended_tool_groups(tools):
|
|
141
141
|
groups = {
|
|
142
|
-
"asic": {"
|
|
143
|
-
"fpga": {"
|
|
142
|
+
"asic": {"sv2v", "yosys", "openroad", "klayout"},
|
|
143
|
+
"fpga": {"sv2v", "yosys", "vpr"},
|
|
144
144
|
"digital-simulation": {"verilator", "icarus", "gtkwave"},
|
|
145
145
|
"analog-simulation": {"xyce"}
|
|
146
146
|
}
|
|
@@ -162,7 +162,13 @@ class HelpFormatter(argparse.ArgumentDefaultsHelpFormatter, argparse.RawDescript
|
|
|
162
162
|
|
|
163
163
|
def main():
|
|
164
164
|
progname = "sc-install"
|
|
165
|
-
|
|
165
|
+
|
|
166
|
+
tools = _get_tools_list()
|
|
167
|
+
group_desc = "\n".join(
|
|
168
|
+
[f" {grp}: {', '.join(grp_tools)}"
|
|
169
|
+
for grp, grp_tools in _recommended_tool_groups(tools).items()])
|
|
170
|
+
|
|
171
|
+
description = f"""
|
|
166
172
|
-----------------------------------------------------------
|
|
167
173
|
SC app install supported tools.
|
|
168
174
|
|
|
@@ -187,14 +193,16 @@ To show the install script:
|
|
|
187
193
|
To system debugging information (this should only be used to debug):
|
|
188
194
|
sc-install -debug_machine
|
|
189
195
|
-----------------------------------------------------------
|
|
196
|
+
Tool groups:
|
|
197
|
+
{group_desc}
|
|
198
|
+
-----------------------------------------------------------
|
|
190
199
|
"""
|
|
200
|
+
|
|
191
201
|
parser = argparse.ArgumentParser(
|
|
192
202
|
prog=progname,
|
|
193
203
|
description=description,
|
|
194
204
|
formatter_class=HelpFormatter)
|
|
195
205
|
|
|
196
|
-
tools = _get_tools_list()
|
|
197
|
-
|
|
198
206
|
if _get_os_name() is None:
|
|
199
207
|
print("Unsupported operating system", file=sys.stderr)
|
|
200
208
|
print_machine_info()
|
|
@@ -97,8 +97,9 @@ To delete a job, use:
|
|
|
97
97
|
chip.logger.error(f'Error: {", ".join(["-"+e for e in exclusive])} are mutually exclusive')
|
|
98
98
|
return 1
|
|
99
99
|
chip_cfg = chip.get('option', 'cfg')
|
|
100
|
-
if chip_cfg and
|
|
100
|
+
if not chip_cfg and any([args[arg] for arg in cfg_only]):
|
|
101
101
|
chip.logger.error(f'Error: -cfg is required for {", ".join(["-"+e for e in cfg_only])}')
|
|
102
|
+
return 2
|
|
102
103
|
if any([args[arg] for arg in cfg_only]) and args['server']:
|
|
103
104
|
chip.logger.error('Error: -server cannot be specified with '
|
|
104
105
|
f'{", ".join(["-"+e for e in cfg_only])}')
|
siliconcompiler/core.py
CHANGED
|
@@ -17,16 +17,20 @@ import graphviz
|
|
|
17
17
|
import codecs
|
|
18
18
|
import copy
|
|
19
19
|
from inspect import getfullargspec
|
|
20
|
-
from siliconcompiler.remote import client
|
|
21
20
|
from siliconcompiler.schema import Schema, SCHEMA_VERSION
|
|
22
21
|
from siliconcompiler.schema import utils as schema_utils
|
|
23
22
|
from siliconcompiler import utils
|
|
24
|
-
from siliconcompiler.utils.logging import
|
|
23
|
+
from siliconcompiler.utils.logging import SCColorLoggerFormatter, \
|
|
24
|
+
SCLoggerFormatter, SCInRunLoggerFormatter, \
|
|
25
|
+
SCDebugLoggerFormatter, SCDebugInRunLoggerFormatter, \
|
|
26
|
+
SCBlankLoggerFormatter
|
|
25
27
|
from siliconcompiler import _metadata
|
|
26
28
|
from siliconcompiler import NodeStatus, SiliconCompilerError
|
|
27
29
|
from siliconcompiler.report import _show_summary_table
|
|
28
30
|
from siliconcompiler.report import _generate_summary_image, _open_summary_image
|
|
29
|
-
from siliconcompiler.report import
|
|
31
|
+
from siliconcompiler.report.dashboard.web import WebDashboard
|
|
32
|
+
from siliconcompiler.report.dashboard.cli import CliDashboard
|
|
33
|
+
from siliconcompiler.report.dashboard import DashboardType
|
|
30
34
|
from siliconcompiler import package as sc_package
|
|
31
35
|
import glob
|
|
32
36
|
from siliconcompiler.scheduler import run as sc_runner
|
|
@@ -203,13 +207,11 @@ class Chip:
|
|
|
203
207
|
|
|
204
208
|
def _add_file_logger(self, filename):
|
|
205
209
|
# Add a file handler for logging
|
|
206
|
-
logformat = self.logger.handlers[0].formatter
|
|
207
|
-
|
|
208
210
|
file_handler = logging.FileHandler(filename)
|
|
209
|
-
file_handler.setFormatter(logformat)
|
|
210
|
-
|
|
211
211
|
self.logger.addHandler(file_handler)
|
|
212
212
|
|
|
213
|
+
self._init_logger_formats()
|
|
214
|
+
|
|
213
215
|
return file_handler
|
|
214
216
|
|
|
215
217
|
###########################################################################
|
|
@@ -227,58 +229,54 @@ class Chip:
|
|
|
227
229
|
else:
|
|
228
230
|
in_run = False
|
|
229
231
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
log_format.append('%(lineno)-4s')
|
|
235
|
-
|
|
236
|
-
if in_run:
|
|
237
|
-
max_column_width = 20
|
|
238
|
-
# Figure out how wide to make step and index fields
|
|
239
|
-
max_step_len = 1
|
|
240
|
-
max_index_len = 1
|
|
241
|
-
nodes_to_run = _get_flowgraph_nodes(self, flow=self.get('option', 'flow'))
|
|
242
|
-
if self.get('option', 'remote'):
|
|
243
|
-
nodes_to_run.append((client.remote_step_name, '0'))
|
|
244
|
-
for future_step, future_index in nodes_to_run:
|
|
245
|
-
max_step_len = max(len(future_step), max_step_len)
|
|
246
|
-
max_index_len = max(len(future_index), max_index_len)
|
|
247
|
-
max_step_len = min(max_step_len, max_column_width)
|
|
248
|
-
max_index_len = min(max_index_len, max_column_width)
|
|
232
|
+
# Save in run flag
|
|
233
|
+
self.logger._in_run = in_run
|
|
234
|
+
self.logger._in_step = step
|
|
235
|
+
self.logger._in_index = index
|
|
249
236
|
|
|
250
|
-
|
|
237
|
+
self.logger.setLevel(schema_utils.translate_loglevel(loglevel))
|
|
251
238
|
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
239
|
+
if not self.logger.hasHandlers():
|
|
240
|
+
stream_handler = logging.StreamHandler(stream=sys.stdout)
|
|
241
|
+
# Save console handler
|
|
242
|
+
self.logger._console = stream_handler
|
|
243
|
+
self.logger.addHandler(stream_handler)
|
|
256
244
|
|
|
257
|
-
|
|
258
|
-
log_format.append(f'{utils.truncate_text(step, max_step_len): <{max_step_len}}')
|
|
259
|
-
log_format.append(f'{utils.truncate_text(index, max_step_len): >{max_index_len}}')
|
|
245
|
+
self.logger._support_color = SCColorLoggerFormatter.supports_color(stream_handler)
|
|
260
246
|
|
|
261
|
-
|
|
262
|
-
if loglevel == "quiet":
|
|
263
|
-
log_format = []
|
|
264
|
-
log_formatprefix = ""
|
|
247
|
+
self._init_logger_formats(loglevel=loglevel)
|
|
265
248
|
|
|
266
|
-
|
|
267
|
-
|
|
249
|
+
def _init_logger_formats(self, loglevel=None):
|
|
250
|
+
if not loglevel:
|
|
251
|
+
loglevel = self.schema.get('option', 'loglevel',
|
|
252
|
+
step=self.logger._in_step, index=self.logger._in_index)
|
|
268
253
|
|
|
269
|
-
if
|
|
270
|
-
|
|
271
|
-
|
|
254
|
+
if loglevel == 'quiet':
|
|
255
|
+
base_format = SCBlankLoggerFormatter()
|
|
256
|
+
elif self.logger._in_run:
|
|
257
|
+
if loglevel == 'debug':
|
|
258
|
+
base_format = SCDebugInRunLoggerFormatter(
|
|
259
|
+
self,
|
|
260
|
+
self.get('option', 'jobname'),
|
|
261
|
+
self.logger._in_step, self.logger._in_index)
|
|
262
|
+
else:
|
|
263
|
+
base_format = SCInRunLoggerFormatter(
|
|
264
|
+
self,
|
|
265
|
+
self.get('option', 'jobname'),
|
|
266
|
+
self.logger._in_step, self.logger._in_index)
|
|
267
|
+
else:
|
|
268
|
+
if loglevel == 'debug':
|
|
269
|
+
base_format = SCDebugLoggerFormatter()
|
|
270
|
+
else:
|
|
271
|
+
base_format = SCLoggerFormatter()
|
|
272
272
|
|
|
273
|
-
for handler in self.logger.handlers:
|
|
274
|
-
if
|
|
275
|
-
formatter =
|
|
273
|
+
for handler in self.logger.handlers.copy():
|
|
274
|
+
if handler == self.logger._console and self.logger._support_color:
|
|
275
|
+
formatter = SCColorLoggerFormatter(base_format)
|
|
276
276
|
else:
|
|
277
|
-
formatter =
|
|
277
|
+
formatter = base_format
|
|
278
278
|
handler.setFormatter(formatter)
|
|
279
279
|
|
|
280
|
-
self.logger.setLevel(schema_utils.translate_loglevel(loglevel))
|
|
281
|
-
|
|
282
280
|
###########################################################################
|
|
283
281
|
def _init_codecs(self):
|
|
284
282
|
# Custom error handlers used to provide warnings when invalid characters
|
|
@@ -2850,7 +2848,7 @@ class Chip:
|
|
|
2850
2848
|
return hashlist
|
|
2851
2849
|
|
|
2852
2850
|
###########################################################################
|
|
2853
|
-
def dashboard(self, wait=True, port=None, graph_chips=None):
|
|
2851
|
+
def dashboard(self, wait=True, port=None, graph_chips=None, type=DashboardType.WEB):
|
|
2854
2852
|
'''
|
|
2855
2853
|
Open a session of the dashboard.
|
|
2856
2854
|
|
|
@@ -2864,6 +2862,8 @@ class Chip:
|
|
|
2864
2862
|
dashboard to.
|
|
2865
2863
|
graph_chips (list): A list of dictionaries of the format
|
|
2866
2864
|
{'chip': chip object, 'name': chip name}
|
|
2865
|
+
type (enum): A string specifying what kind of dashboard to
|
|
2866
|
+
launch. Available options: 'cli', 'web'.
|
|
2867
2867
|
|
|
2868
2868
|
Examples:
|
|
2869
2869
|
>>> chip.dashboard()
|
|
@@ -2874,7 +2874,14 @@ class Chip:
|
|
|
2874
2874
|
self._dash.stop()
|
|
2875
2875
|
self._dash = None
|
|
2876
2876
|
|
|
2877
|
-
|
|
2877
|
+
# Select dashboard type
|
|
2878
|
+
type = DashboardType(type)
|
|
2879
|
+
if type == DashboardType.WEB:
|
|
2880
|
+
self._dash = WebDashboard(self, port=port, graph_chips=graph_chips)
|
|
2881
|
+
elif type == DashboardType.CLI:
|
|
2882
|
+
self._dash = CliDashboard(self)
|
|
2883
|
+
wait = False
|
|
2884
|
+
|
|
2878
2885
|
self._dash.open_dashboard()
|
|
2879
2886
|
|
|
2880
2887
|
if wait:
|
|
@@ -3000,7 +3007,7 @@ class Chip:
|
|
|
3000
3007
|
flow (str): Flow name
|
|
3001
3008
|
step (str): Step name
|
|
3002
3009
|
task (module/str): Task to associate with this node
|
|
3003
|
-
index (int): Step index
|
|
3010
|
+
index (int/str): Step index
|
|
3004
3011
|
|
|
3005
3012
|
Examples:
|
|
3006
3013
|
>>> import siliconcomiler.tools.openroad.place as place
|
|
@@ -3059,8 +3066,8 @@ class Chip:
|
|
|
3059
3066
|
flow (str): Name of flow
|
|
3060
3067
|
tail (str): Name of tail node
|
|
3061
3068
|
head (str): Name of head node
|
|
3062
|
-
tail_index (int): Index of tail node to connect
|
|
3063
|
-
head_index (int): Index of head node to connect
|
|
3069
|
+
tail_index (int/str): Index of tail node to connect
|
|
3070
|
+
head_index (int/str): Index of head node to connect
|
|
3064
3071
|
|
|
3065
3072
|
Examples:
|
|
3066
3073
|
>>> chip.edge('place', 'cts')
|
|
@@ -3090,7 +3097,7 @@ class Chip:
|
|
|
3090
3097
|
Args:
|
|
3091
3098
|
flow (str): Flow name
|
|
3092
3099
|
step (str): Step name
|
|
3093
|
-
index (int): Step index
|
|
3100
|
+
index (int/str): Step index
|
|
3094
3101
|
'''
|
|
3095
3102
|
|
|
3096
3103
|
if flow not in self.getkeys('flowgraph'):
|
|
@@ -3202,6 +3209,12 @@ class Chip:
|
|
|
3202
3209
|
raise e
|
|
3203
3210
|
self.logger.error(str(e))
|
|
3204
3211
|
return False
|
|
3212
|
+
finally:
|
|
3213
|
+
# Update dashboard if running
|
|
3214
|
+
if self._dash:
|
|
3215
|
+
self._dash.update_manifest()
|
|
3216
|
+
self._dash.end_of_run()
|
|
3217
|
+
|
|
3205
3218
|
return True
|
|
3206
3219
|
|
|
3207
3220
|
###########################################################################
|
siliconcompiler/issue.py
CHANGED
|
@@ -273,7 +273,9 @@ def generate_testcase(chip,
|
|
|
273
273
|
full_archive_path = os.path.join(archive_directory, archive_name)
|
|
274
274
|
full_archive_path = os.path.abspath(full_archive_path)
|
|
275
275
|
# Build archive
|
|
276
|
-
arch_base_dir = os.path.basename(archive_name)
|
|
276
|
+
arch_base_dir = os.path.basename(archive_name)
|
|
277
|
+
while arch_base_dir.lower().split('.')[-1] in ('gz', 'tar'):
|
|
278
|
+
arch_base_dir = '.'.join(arch_base_dir.split('.')[0:-1])
|
|
277
279
|
with tarfile.open(full_archive_path, "w:gz") as tar:
|
|
278
280
|
# Add individual files
|
|
279
281
|
add_files = [manifest_path,
|
siliconcompiler/remote/client.py
CHANGED
|
@@ -10,11 +10,12 @@ import tarfile
|
|
|
10
10
|
import tempfile
|
|
11
11
|
import multiprocessing
|
|
12
12
|
|
|
13
|
-
from siliconcompiler import utils, SiliconCompilerError
|
|
13
|
+
from siliconcompiler import utils, SiliconCompilerError, NodeStatus
|
|
14
14
|
from siliconcompiler import NodeStatus as SCNodeStatus
|
|
15
15
|
from siliconcompiler._metadata import default_server
|
|
16
16
|
from siliconcompiler.flowgraph import nodes_to_execute
|
|
17
17
|
from siliconcompiler.remote import JobStatus
|
|
18
|
+
from siliconcompiler.report.dashboard import DashboardType
|
|
18
19
|
|
|
19
20
|
# Step name to use while logging
|
|
20
21
|
remote_step_name = 'remote'
|
|
@@ -298,18 +299,19 @@ service, provided by SiliconCompiler, is not intended to process proprietary IP.
|
|
|
298
299
|
self.__logger.info(nodes_log)
|
|
299
300
|
|
|
300
301
|
def _report_job_status(self, info):
|
|
302
|
+
completed = []
|
|
303
|
+
starttimes = {}
|
|
304
|
+
|
|
301
305
|
if not info['busy']:
|
|
302
306
|
# Job is not running
|
|
303
|
-
return
|
|
307
|
+
return completed, starttimes, False
|
|
304
308
|
|
|
305
309
|
try:
|
|
306
310
|
# Decode response JSON, if possible.
|
|
307
311
|
job_info = json.loads(info['message'])
|
|
308
312
|
except json.JSONDecodeError as e:
|
|
309
313
|
self.__logger.warning(f"Job is still running: {e}")
|
|
310
|
-
return
|
|
311
|
-
|
|
312
|
-
completed = []
|
|
314
|
+
return completed, starttimes, True
|
|
313
315
|
|
|
314
316
|
nodes_to_log = {}
|
|
315
317
|
for node, node_info in job_info.items():
|
|
@@ -335,7 +337,16 @@ service, provided by SiliconCompiler, is not intended to process proprietary IP.
|
|
|
335
337
|
self.__log_node_status(stat, nodes)
|
|
336
338
|
|
|
337
339
|
# Running / in-progress flowgraph nodes should all be printed:
|
|
340
|
+
base_time = time.time()
|
|
338
341
|
for stat, nodes in nodes_to_log.items():
|
|
342
|
+
for node, node_info in nodes:
|
|
343
|
+
if 'elapsed_time' in node_info:
|
|
344
|
+
runtime = 0
|
|
345
|
+
for part in node_info['elapsed_time'].split(":"):
|
|
346
|
+
runtime = 60 * runtime + float(part)
|
|
347
|
+
starttimes[(self.__node_information[node]["step"],
|
|
348
|
+
self.__node_information[node]["index"])] = base_time - runtime
|
|
349
|
+
|
|
339
350
|
if SCNodeStatus.is_running(stat):
|
|
340
351
|
self.__logger.info(f' {stat.title()} ({len(nodes)}):')
|
|
341
352
|
for node, node_info in nodes:
|
|
@@ -349,7 +360,7 @@ service, provided by SiliconCompiler, is not intended to process proprietary IP.
|
|
|
349
360
|
if SCNodeStatus.is_waiting(stat):
|
|
350
361
|
self.__log_node_status(stat, nodes)
|
|
351
362
|
|
|
352
|
-
return completed, True
|
|
363
|
+
return completed, starttimes, True
|
|
353
364
|
|
|
354
365
|
def __check(self):
|
|
355
366
|
def post_action(url):
|
|
@@ -438,6 +449,9 @@ service, provided by SiliconCompiler, is not intended to process proprietary IP.
|
|
|
438
449
|
raise SiliconCompilerError('Cannot pass [arg,index] parameter into remote flow.',
|
|
439
450
|
chip=self.__chip)
|
|
440
451
|
|
|
452
|
+
if not self.__chip._dash:
|
|
453
|
+
self.__chip.dashboard(type=DashboardType.CLI)
|
|
454
|
+
|
|
441
455
|
# Only run the pre-process step if the job doesn't already have a remote ID.
|
|
442
456
|
if not remote_resume:
|
|
443
457
|
self.__run_preprocess()
|
|
@@ -450,10 +464,12 @@ service, provided by SiliconCompiler, is not intended to process proprietary IP.
|
|
|
450
464
|
self.__request_run()
|
|
451
465
|
|
|
452
466
|
# Run the main 'check_progress' loop to monitor job status until it finishes.
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
467
|
+
try:
|
|
468
|
+
self._run_loop()
|
|
469
|
+
finally:
|
|
470
|
+
# Restore logger
|
|
471
|
+
self.__chip._dash.end_of_run()
|
|
472
|
+
self.__chip._init_logger(in_run=True)
|
|
457
473
|
|
|
458
474
|
def __request_run(self):
|
|
459
475
|
'''
|
|
@@ -559,7 +575,7 @@ service, provided by SiliconCompiler, is not intended to process proprietary IP.
|
|
|
559
575
|
self.__logger.info(f'To cancel this job use: {cancel_cmd}')
|
|
560
576
|
raise SiliconCompilerError('Job canceled by user keyboard interrupt')
|
|
561
577
|
|
|
562
|
-
def __import_run_manifests(self):
|
|
578
|
+
def __import_run_manifests(self, starttimes):
|
|
563
579
|
changed = False
|
|
564
580
|
for _, node_info in self.__node_information.items():
|
|
565
581
|
if node_info["imported"]:
|
|
@@ -577,6 +593,16 @@ service, provided by SiliconCompiler, is not intended to process proprietary IP.
|
|
|
577
593
|
except: # noqa E722
|
|
578
594
|
# Import may fail if file is still getting written
|
|
579
595
|
pass
|
|
596
|
+
elif self.__chip.get('record', 'status',
|
|
597
|
+
step=node_info["step"], index=node_info["index"]) \
|
|
598
|
+
== NodeStatus.SKIPPED:
|
|
599
|
+
node_info["imported"] = True
|
|
600
|
+
changed = True
|
|
601
|
+
|
|
602
|
+
if changed and self.__chip._dash:
|
|
603
|
+
# Update dashboard if active
|
|
604
|
+
self.__chip._dash.update_manifest({"starttimes": starttimes})
|
|
605
|
+
|
|
580
606
|
return changed
|
|
581
607
|
|
|
582
608
|
def __ensure_run_loop_information(self):
|
|
@@ -605,17 +631,30 @@ service, provided by SiliconCompiler, is not intended to process proprietary IP.
|
|
|
605
631
|
# Check the job's progress periodically until it finishes.
|
|
606
632
|
running = True
|
|
607
633
|
|
|
634
|
+
starttimes = {}
|
|
635
|
+
|
|
608
636
|
while running:
|
|
609
|
-
|
|
610
|
-
|
|
637
|
+
sleepremaining = self.__check_interval
|
|
638
|
+
while any([nodeinfo["fetched"] and not nodeinfo["imported"]
|
|
639
|
+
for nodeinfo in self.__node_information.values()]):
|
|
640
|
+
self.__import_run_manifests(starttimes)
|
|
641
|
+
sleepremaining -= 1
|
|
642
|
+
if sleepremaining <= 0:
|
|
643
|
+
break
|
|
644
|
+
time.sleep(1)
|
|
645
|
+
if sleepremaining > 0:
|
|
646
|
+
time.sleep(sleepremaining)
|
|
611
647
|
|
|
612
648
|
# Check progress
|
|
613
649
|
job_info = self.check_job_status()
|
|
614
|
-
completed, running = self._report_job_status(job_info)
|
|
650
|
+
completed, new_starttimes, running = self._report_job_status(job_info)
|
|
651
|
+
|
|
652
|
+
# preserve old starttimes
|
|
653
|
+
starttimes = {**starttimes, **new_starttimes}
|
|
615
654
|
|
|
616
655
|
if self.__chip._dash:
|
|
617
656
|
# Update dashboard if active
|
|
618
|
-
self.__chip._dash.update_manifest()
|
|
657
|
+
self.__chip._dash.update_manifest({"starttimes": starttimes})
|
|
619
658
|
|
|
620
659
|
nodes_to_fetch = []
|
|
621
660
|
for node in completed:
|
|
@@ -648,7 +687,7 @@ service, provided by SiliconCompiler, is not intended to process proprietary IP.
|
|
|
648
687
|
self.__download_pool.join()
|
|
649
688
|
self.__download_pool = None
|
|
650
689
|
|
|
651
|
-
self.__import_run_manifests()
|
|
690
|
+
self.__import_run_manifests({})
|
|
652
691
|
|
|
653
692
|
def __schedule_fetch_result(self, node):
|
|
654
693
|
self.__node_information[node]["fetched"] = True
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
from .summary_image import _generate_summary_image, _open_summary_image
|
|
2
2
|
from .html_report import _generate_html_report, _open_html_report
|
|
3
3
|
from .summary_table import _show_summary_table
|
|
4
|
-
from .dashboard import
|
|
4
|
+
from .dashboard.web import WebDashboard
|
|
5
|
+
# from .dashboard import Dashboard
|
|
5
6
|
|
|
6
7
|
__all__ = [
|
|
7
8
|
"_generate_summary_image",
|
|
@@ -9,5 +10,5 @@ __all__ = [
|
|
|
9
10
|
"_generate_html_report",
|
|
10
11
|
"_open_html_report",
|
|
11
12
|
"_show_summary_table",
|
|
12
|
-
"
|
|
13
|
+
"WebDashboard"
|
|
13
14
|
]
|