siliconcompiler 0.32.3__py3-none-any.whl → 0.33.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.
- siliconcompiler/__init__.py +19 -2
- siliconcompiler/_metadata.py +1 -1
- siliconcompiler/apps/sc.py +2 -2
- siliconcompiler/apps/sc_install.py +3 -3
- siliconcompiler/apps/sc_issue.py +1 -1
- siliconcompiler/apps/sc_remote.py +4 -4
- siliconcompiler/apps/sc_show.py +2 -2
- siliconcompiler/apps/utils/replay.py +5 -3
- siliconcompiler/asic.py +120 -0
- siliconcompiler/checklist.py +150 -0
- siliconcompiler/core.py +267 -289
- siliconcompiler/flowgraph.py +803 -515
- siliconcompiler/fpga.py +84 -0
- siliconcompiler/metric.py +420 -0
- siliconcompiler/optimizer/vizier.py +2 -3
- siliconcompiler/package/__init__.py +29 -6
- siliconcompiler/pdk.py +415 -0
- siliconcompiler/record.py +449 -0
- siliconcompiler/remote/client.py +6 -3
- siliconcompiler/remote/schema.py +116 -112
- siliconcompiler/remote/server.py +3 -5
- siliconcompiler/report/dashboard/cli/__init__.py +13 -722
- siliconcompiler/report/dashboard/cli/board.py +895 -0
- siliconcompiler/report/dashboard/web/__init__.py +10 -10
- siliconcompiler/report/dashboard/web/components/__init__.py +5 -4
- siliconcompiler/report/dashboard/web/components/flowgraph.py +3 -3
- siliconcompiler/report/dashboard/web/components/graph.py +6 -3
- siliconcompiler/report/dashboard/web/state.py +1 -1
- siliconcompiler/report/dashboard/web/utils/__init__.py +4 -3
- siliconcompiler/report/html_report.py +2 -3
- siliconcompiler/report/report.py +13 -7
- siliconcompiler/report/summary_image.py +1 -1
- siliconcompiler/report/summary_table.py +3 -3
- siliconcompiler/report/utils.py +11 -10
- siliconcompiler/scheduler/__init__.py +145 -280
- siliconcompiler/scheduler/run_node.py +2 -1
- siliconcompiler/scheduler/send_messages.py +4 -4
- siliconcompiler/scheduler/slurm.py +2 -2
- siliconcompiler/schema/__init__.py +19 -2
- siliconcompiler/schema/baseschema.py +493 -0
- siliconcompiler/schema/cmdlineschema.py +250 -0
- siliconcompiler/{sphinx_ext → schema/docs}/__init__.py +3 -1
- siliconcompiler/{sphinx_ext → schema/docs}/dynamicgen.py +63 -81
- siliconcompiler/{sphinx_ext → schema/docs}/schemagen.py +73 -85
- siliconcompiler/{sphinx_ext → schema/docs}/utils.py +12 -13
- siliconcompiler/schema/editableschema.py +136 -0
- siliconcompiler/schema/journalingschema.py +238 -0
- siliconcompiler/schema/namedschema.py +41 -0
- siliconcompiler/schema/packageschema.py +101 -0
- siliconcompiler/schema/parameter.py +791 -0
- siliconcompiler/schema/parametertype.py +323 -0
- siliconcompiler/schema/parametervalue.py +736 -0
- siliconcompiler/schema/safeschema.py +37 -0
- siliconcompiler/schema/schema_cfg.py +109 -1789
- siliconcompiler/schema/utils.py +5 -68
- siliconcompiler/schema_obj.py +119 -0
- siliconcompiler/tool.py +1308 -0
- siliconcompiler/tools/_common/__init__.py +6 -10
- siliconcompiler/tools/_common/sdc/sc_constraints.sdc +1 -1
- siliconcompiler/tools/bluespec/convert.py +7 -7
- siliconcompiler/tools/builtin/_common.py +1 -1
- siliconcompiler/tools/builtin/concatenate.py +2 -2
- siliconcompiler/tools/builtin/minimum.py +1 -1
- siliconcompiler/tools/builtin/mux.py +2 -1
- siliconcompiler/tools/builtin/nop.py +1 -1
- siliconcompiler/tools/builtin/verify.py +6 -4
- siliconcompiler/tools/chisel/convert.py +4 -4
- siliconcompiler/tools/genfasm/bitstream.py +3 -3
- siliconcompiler/tools/ghdl/convert.py +1 -1
- siliconcompiler/tools/icarus/compile.py +4 -4
- siliconcompiler/tools/icepack/bitstream.py +6 -1
- siliconcompiler/tools/klayout/convert_drc_db.py +5 -0
- siliconcompiler/tools/klayout/klayout_export.py +0 -1
- siliconcompiler/tools/klayout/klayout_utils.py +3 -10
- siliconcompiler/tools/nextpnr/apr.py +6 -1
- siliconcompiler/tools/nextpnr/nextpnr.py +4 -4
- siliconcompiler/tools/openroad/_apr.py +13 -0
- siliconcompiler/tools/openroad/rdlroute.py +3 -3
- siliconcompiler/tools/openroad/scripts/apr/postamble.tcl +1 -1
- siliconcompiler/tools/openroad/scripts/apr/preamble.tcl +5 -5
- siliconcompiler/tools/openroad/scripts/apr/sc_antenna_repair.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_clock_tree_synthesis.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_detailed_placement.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_detailed_route.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_endcap_tapcell_insertion.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_fillercell_insertion.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_fillmetal_insertion.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_global_placement.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_global_route.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_init_floorplan.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_macro_placement.tcl +3 -3
- siliconcompiler/tools/openroad/scripts/apr/sc_metrics.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_pin_placement.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_power_grid.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_repair_design.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_repair_timing.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/apr/sc_write_data.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/common/procs.tcl +57 -1
- siliconcompiler/tools/openroad/scripts/common/screenshot.tcl +2 -2
- siliconcompiler/tools/openroad/scripts/common/write_images.tcl +28 -3
- siliconcompiler/tools/openroad/scripts/sc_rcx.tcl +1 -1
- siliconcompiler/tools/openroad/scripts/sc_rdlroute.tcl +3 -3
- siliconcompiler/tools/openroad/scripts/sc_show.tcl +6 -6
- siliconcompiler/tools/slang/__init__.py +10 -10
- siliconcompiler/tools/surelog/parse.py +4 -4
- siliconcompiler/tools/sv2v/convert.py +20 -3
- siliconcompiler/tools/verilator/compile.py +2 -2
- siliconcompiler/tools/verilator/verilator.py +3 -3
- siliconcompiler/tools/vpr/place.py +1 -1
- siliconcompiler/tools/vpr/route.py +4 -4
- siliconcompiler/tools/vpr/screenshot.py +1 -1
- siliconcompiler/tools/vpr/show.py +5 -5
- siliconcompiler/tools/vpr/vpr.py +24 -24
- siliconcompiler/tools/xdm/convert.py +2 -2
- siliconcompiler/tools/xyce/simulate.py +1 -1
- siliconcompiler/tools/yosys/sc_synth_asic.tcl +74 -68
- siliconcompiler/tools/yosys/syn_asic.py +2 -2
- siliconcompiler/toolscripts/_tools.json +7 -7
- siliconcompiler/toolscripts/ubuntu22/install-vpr.sh +0 -2
- siliconcompiler/toolscripts/ubuntu24/install-vpr.sh +0 -2
- siliconcompiler/utils/__init__.py +8 -112
- siliconcompiler/utils/flowgraph.py +339 -0
- siliconcompiler/{issue.py → utils/issue.py} +4 -3
- siliconcompiler/utils/logging.py +1 -2
- {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/METADATA +9 -8
- {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/RECORD +151 -134
- {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/WHEEL +1 -1
- {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/entry_points.txt +8 -8
- siliconcompiler/schema/schema_obj.py +0 -1936
- siliconcompiler/toolscripts/ubuntu20/install-vpr.sh +0 -29
- siliconcompiler/toolscripts/ubuntu20/install-yosys-parmys.sh +0 -61
- /siliconcompiler/{templates → data/templates}/__init__.py +0 -0
- /siliconcompiler/{templates → data/templates}/email/__init__.py +0 -0
- /siliconcompiler/{templates → data/templates}/email/general.j2 +0 -0
- /siliconcompiler/{templates → data/templates}/email/summary.j2 +0 -0
- /siliconcompiler/{templates → data/templates}/issue/README.txt +0 -0
- /siliconcompiler/{templates → data/templates}/issue/__init__.py +0 -0
- /siliconcompiler/{templates → data/templates}/issue/run.sh +0 -0
- /siliconcompiler/{templates → data/templates}/replay/replay.py.j2 +0 -0
- /siliconcompiler/{templates → data/templates}/replay/replay.sh.j2 +0 -0
- /siliconcompiler/{templates → data/templates}/replay/requirements.txt +0 -0
- /siliconcompiler/{templates → data/templates}/replay/setup.sh +0 -0
- /siliconcompiler/{templates → data/templates}/report/__init__.py +0 -0
- /siliconcompiler/{templates → data/templates}/report/bootstrap.min.css +0 -0
- /siliconcompiler/{templates → data/templates}/report/bootstrap.min.js +0 -0
- /siliconcompiler/{templates → data/templates}/report/bootstrap_LICENSE.md +0 -0
- /siliconcompiler/{templates → data/templates}/report/sc_report.j2 +0 -0
- /siliconcompiler/{templates → data/templates}/slurm/__init__.py +0 -0
- /siliconcompiler/{templates → data/templates}/slurm/run.sh +0 -0
- /siliconcompiler/{templates → data/templates}/tcl/__init__.py +0 -0
- /siliconcompiler/{templates → data/templates}/tcl/manifest.tcl.j2 +0 -0
- /siliconcompiler/{units.py → utils/units.py} +0 -0
- {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/licenses/LICENSE +0 -0
- {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/top_level.txt +0 -0
siliconcompiler/schema/utils.py
CHANGED
|
@@ -4,82 +4,19 @@
|
|
|
4
4
|
# SC dependencies outside of its directory, since it may be used by tool drivers
|
|
5
5
|
# that have isolated Python environments.
|
|
6
6
|
|
|
7
|
-
import re
|
|
8
7
|
import sys
|
|
9
|
-
from enum import Enum
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
#############################################################################
|
|
13
|
-
# ENUM DEFINITIONs
|
|
14
|
-
#############################################################################
|
|
15
|
-
class Scope(Enum):
|
|
16
|
-
GLOBAL = 'global'
|
|
17
|
-
JOB = 'job'
|
|
18
|
-
SCRATCH = 'scratch'
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
class PerNode(Enum):
|
|
22
|
-
NEVER = 'never'
|
|
23
|
-
OPTIONAL = 'optional'
|
|
24
|
-
REQUIRED = 'required'
|
|
25
|
-
|
|
26
|
-
def is_never(self):
|
|
27
|
-
return self == PerNode.NEVER
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
def escape_val_tcl(val, typestr):
|
|
31
|
-
'''Recursive helper function for converting Python values to safe TCL
|
|
32
|
-
values, based on the SC type string.'''
|
|
33
|
-
if val is None:
|
|
34
|
-
return ''
|
|
35
|
-
elif typestr.startswith('('):
|
|
36
|
-
# Recurse into each item of tuple
|
|
37
|
-
subtypes = typestr.strip('()').split(',')
|
|
38
|
-
valstr = ' '.join(escape_val_tcl(v, subtype.strip())
|
|
39
|
-
for v, subtype in zip(val, subtypes))
|
|
40
|
-
return f'[list {valstr}]'
|
|
41
|
-
elif typestr.startswith('['):
|
|
42
|
-
# Recurse into each item of list
|
|
43
|
-
subtype = typestr.strip('[]')
|
|
44
|
-
valstr = ' '.join(escape_val_tcl(v, subtype) for v in val)
|
|
45
|
-
return f'[list {valstr}]'
|
|
46
|
-
elif typestr == 'bool':
|
|
47
|
-
return 'true' if val else 'false'
|
|
48
|
-
elif typestr in ('str', 'enum'):
|
|
49
|
-
# Escape string by surrounding it with "" and escaping the few
|
|
50
|
-
# special characters that still get considered inside "". We don't
|
|
51
|
-
# use {}, since this requires adding permanent backslashes to any
|
|
52
|
-
# curly braces inside the string.
|
|
53
|
-
# Source: https://www.tcl.tk/man/tcl8.4/TclCmd/Tcl.html (section [4] on)
|
|
54
|
-
escaped_val = (val.replace('\\', '\\\\') # escape '\' to avoid backslash substitution
|
|
55
|
-
# (do this first, since other replaces insert '\')
|
|
56
|
-
.replace('[', '\\[') # escape '[' to avoid command substitution
|
|
57
|
-
.replace('$', '\\$') # escape '$' to avoid variable substitution
|
|
58
|
-
.replace('"', '\\"')) # escape '"' to avoid string terminating early
|
|
59
|
-
return '"' + escaped_val + '"'
|
|
60
|
-
elif typestr in ('file', 'dir'):
|
|
61
|
-
# Replace $VAR with $env(VAR) for tcl
|
|
62
|
-
val = re.sub(r'\$(\w+)', r'$env(\1)', val)
|
|
63
|
-
# Same escapes as applied to string, minus $ (since we want to resolve env vars).
|
|
64
|
-
escaped_val = (val.replace('\\', '\\\\') # escape '\' to avoid backslash substitution
|
|
65
|
-
# (do this first, since other replaces insert '\')
|
|
66
|
-
.replace('[', '\\[') # escape '[' to avoid command substitution
|
|
67
|
-
.replace('"', '\\"')) # escape '"' to avoid string terminating early
|
|
68
|
-
return '"' + escaped_val + '"'
|
|
69
|
-
elif typestr in ('int', 'float'):
|
|
70
|
-
# floats/ints just become strings
|
|
71
|
-
return str(val)
|
|
72
|
-
else:
|
|
73
|
-
raise TypeError(f'{typestr} is not a supported type')
|
|
74
8
|
|
|
75
9
|
|
|
76
10
|
def trim(docstring):
|
|
77
|
-
'''
|
|
11
|
+
'''
|
|
12
|
+
Helper function for cleaning up indentation of docstring.
|
|
78
13
|
|
|
79
14
|
This is important for properly parsing complex RST in our docs.
|
|
80
15
|
|
|
81
16
|
Source:
|
|
82
|
-
https://www.python.org/dev/peps/pep-0257/#handling-docstring-indentation
|
|
17
|
+
https://www.python.org/dev/peps/pep-0257/#handling-docstring-indentation
|
|
18
|
+
'''
|
|
19
|
+
|
|
83
20
|
if not docstring:
|
|
84
21
|
return ''
|
|
85
22
|
# Convert tabs to spaces (following the normal Python rules)
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# Copyright 2025 Silicon Compiler Authors. All Rights Reserved.
|
|
2
|
+
|
|
3
|
+
# NOTE: this file cannot rely on any third-party dependencies, including other
|
|
4
|
+
# SC dependencies outside of its directory, since it may be used by tool drivers
|
|
5
|
+
# that have isolated Python environments.
|
|
6
|
+
|
|
7
|
+
from siliconcompiler.schema import BaseSchema
|
|
8
|
+
from siliconcompiler.schema import SafeSchema
|
|
9
|
+
from siliconcompiler.schema import EditableSchema
|
|
10
|
+
from siliconcompiler.schema import CommandLineSchema
|
|
11
|
+
from siliconcompiler.schema import Parameter
|
|
12
|
+
from siliconcompiler.schema.baseschema import json
|
|
13
|
+
|
|
14
|
+
from siliconcompiler.schema.schema_cfg import schema_cfg
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class Schema(BaseSchema):
|
|
18
|
+
def __init__(self):
|
|
19
|
+
super().__init__()
|
|
20
|
+
|
|
21
|
+
schema_cfg(self)
|
|
22
|
+
|
|
23
|
+
@staticmethod
|
|
24
|
+
def _extractversion(manifest):
|
|
25
|
+
schema_version = manifest.get("schemaversion", None)
|
|
26
|
+
if schema_version:
|
|
27
|
+
param = Parameter.from_dict(schema_version, ["schemaversion"], None)
|
|
28
|
+
return tuple([int(v) for v in param.get().split('.')])
|
|
29
|
+
return None
|
|
30
|
+
|
|
31
|
+
def _from_dict(self, manifest, keypath, version=None):
|
|
32
|
+
# find schema version
|
|
33
|
+
if not version:
|
|
34
|
+
version = Schema._extractversion(manifest)
|
|
35
|
+
|
|
36
|
+
current_verison = tuple([int(v) for v in self.get("schemaversion").split('.')])
|
|
37
|
+
if version is None:
|
|
38
|
+
version = current_verison
|
|
39
|
+
|
|
40
|
+
return super()._from_dict(manifest, keypath, version=version)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class SchemaTmp(Schema, CommandLineSchema):
|
|
44
|
+
"""Object for storing and accessing configuration values corresponding to
|
|
45
|
+
the SiliconCompiler schema.
|
|
46
|
+
|
|
47
|
+
Most user-facing interaction with the schema should occur through an
|
|
48
|
+
instance of :class:`~siliconcompiler.core.Chip`, but this class is available
|
|
49
|
+
for schema manipulation tasks that don't require the additional context of a
|
|
50
|
+
Chip object.
|
|
51
|
+
|
|
52
|
+
The two arguments to this class are mutually exclusive. If neither are
|
|
53
|
+
provided, the object is initialized to default values for all parameters.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
cfg (dict): Initial configuration dictionary. This may be a subtree of
|
|
57
|
+
the schema.
|
|
58
|
+
manifest (str): Initial manifest.
|
|
59
|
+
logger (logging.Logger): instance of the parent logger if available
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
# TMP until cleanup
|
|
63
|
+
GLOBAL_KEY = Parameter.GLOBAL_KEY
|
|
64
|
+
_RECORD_ACCESS_IDENTIFIER = "SC_CFG_ACCESS_KEY"
|
|
65
|
+
|
|
66
|
+
def __init__(self, cfg=None, manifest=None, logger=None):
|
|
67
|
+
super().__init__()
|
|
68
|
+
|
|
69
|
+
schema = EditableSchema(self)
|
|
70
|
+
schema.insert("history", BaseSchema())
|
|
71
|
+
schema.insert("library", BaseSchema())
|
|
72
|
+
|
|
73
|
+
if cfg:
|
|
74
|
+
self._from_dict(cfg, [], None)
|
|
75
|
+
if manifest:
|
|
76
|
+
self.read_manifest(manifest)
|
|
77
|
+
|
|
78
|
+
def _from_dict(self, manifest, keypath, version=None):
|
|
79
|
+
for section, cls in (("library", SafeSchema),
|
|
80
|
+
("history", SchemaTmp)):
|
|
81
|
+
if section in manifest:
|
|
82
|
+
for name, sub_manifest in manifest[section].items():
|
|
83
|
+
EditableSchema(self).insert(section, name, cls.from_manifest(cfg=sub_manifest))
|
|
84
|
+
del manifest[section]
|
|
85
|
+
|
|
86
|
+
super()._from_dict(manifest, keypath, version=version)
|
|
87
|
+
|
|
88
|
+
def record_history(self):
|
|
89
|
+
'''
|
|
90
|
+
Copies all non-empty parameters from current job into the history
|
|
91
|
+
dictionary.
|
|
92
|
+
'''
|
|
93
|
+
|
|
94
|
+
job = self.get("option", "jobname")
|
|
95
|
+
EditableSchema(self).insert("history", job, self.copy(), clobber=True)
|
|
96
|
+
|
|
97
|
+
def history(self, job):
|
|
98
|
+
'''
|
|
99
|
+
Returns a *mutable* reference to ['history', job] as a Schema object.
|
|
100
|
+
|
|
101
|
+
If job doesn't currently exist in history, create it with default
|
|
102
|
+
values.
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
job (str): Name of historical job to return.
|
|
106
|
+
'''
|
|
107
|
+
try:
|
|
108
|
+
return EditableSchema(self).search("history", job)
|
|
109
|
+
except KeyError:
|
|
110
|
+
blank = SchemaTmp()
|
|
111
|
+
EditableSchema(self).insert("history", job, blank)
|
|
112
|
+
return blank
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
##############################################################################
|
|
116
|
+
# Main routine
|
|
117
|
+
if __name__ == "__main__":
|
|
118
|
+
import json as main_json
|
|
119
|
+
print(main_json.dumps(SchemaTmp().getdict(), indent=4, sort_keys=True))
|