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.
Files changed (154) hide show
  1. siliconcompiler/__init__.py +19 -2
  2. siliconcompiler/_metadata.py +1 -1
  3. siliconcompiler/apps/sc.py +2 -2
  4. siliconcompiler/apps/sc_install.py +3 -3
  5. siliconcompiler/apps/sc_issue.py +1 -1
  6. siliconcompiler/apps/sc_remote.py +4 -4
  7. siliconcompiler/apps/sc_show.py +2 -2
  8. siliconcompiler/apps/utils/replay.py +5 -3
  9. siliconcompiler/asic.py +120 -0
  10. siliconcompiler/checklist.py +150 -0
  11. siliconcompiler/core.py +267 -289
  12. siliconcompiler/flowgraph.py +803 -515
  13. siliconcompiler/fpga.py +84 -0
  14. siliconcompiler/metric.py +420 -0
  15. siliconcompiler/optimizer/vizier.py +2 -3
  16. siliconcompiler/package/__init__.py +29 -6
  17. siliconcompiler/pdk.py +415 -0
  18. siliconcompiler/record.py +449 -0
  19. siliconcompiler/remote/client.py +6 -3
  20. siliconcompiler/remote/schema.py +116 -112
  21. siliconcompiler/remote/server.py +3 -5
  22. siliconcompiler/report/dashboard/cli/__init__.py +13 -722
  23. siliconcompiler/report/dashboard/cli/board.py +895 -0
  24. siliconcompiler/report/dashboard/web/__init__.py +10 -10
  25. siliconcompiler/report/dashboard/web/components/__init__.py +5 -4
  26. siliconcompiler/report/dashboard/web/components/flowgraph.py +3 -3
  27. siliconcompiler/report/dashboard/web/components/graph.py +6 -3
  28. siliconcompiler/report/dashboard/web/state.py +1 -1
  29. siliconcompiler/report/dashboard/web/utils/__init__.py +4 -3
  30. siliconcompiler/report/html_report.py +2 -3
  31. siliconcompiler/report/report.py +13 -7
  32. siliconcompiler/report/summary_image.py +1 -1
  33. siliconcompiler/report/summary_table.py +3 -3
  34. siliconcompiler/report/utils.py +11 -10
  35. siliconcompiler/scheduler/__init__.py +145 -280
  36. siliconcompiler/scheduler/run_node.py +2 -1
  37. siliconcompiler/scheduler/send_messages.py +4 -4
  38. siliconcompiler/scheduler/slurm.py +2 -2
  39. siliconcompiler/schema/__init__.py +19 -2
  40. siliconcompiler/schema/baseschema.py +493 -0
  41. siliconcompiler/schema/cmdlineschema.py +250 -0
  42. siliconcompiler/{sphinx_ext → schema/docs}/__init__.py +3 -1
  43. siliconcompiler/{sphinx_ext → schema/docs}/dynamicgen.py +63 -81
  44. siliconcompiler/{sphinx_ext → schema/docs}/schemagen.py +73 -85
  45. siliconcompiler/{sphinx_ext → schema/docs}/utils.py +12 -13
  46. siliconcompiler/schema/editableschema.py +136 -0
  47. siliconcompiler/schema/journalingschema.py +238 -0
  48. siliconcompiler/schema/namedschema.py +41 -0
  49. siliconcompiler/schema/packageschema.py +101 -0
  50. siliconcompiler/schema/parameter.py +791 -0
  51. siliconcompiler/schema/parametertype.py +323 -0
  52. siliconcompiler/schema/parametervalue.py +736 -0
  53. siliconcompiler/schema/safeschema.py +37 -0
  54. siliconcompiler/schema/schema_cfg.py +109 -1789
  55. siliconcompiler/schema/utils.py +5 -68
  56. siliconcompiler/schema_obj.py +119 -0
  57. siliconcompiler/tool.py +1308 -0
  58. siliconcompiler/tools/_common/__init__.py +6 -10
  59. siliconcompiler/tools/_common/sdc/sc_constraints.sdc +1 -1
  60. siliconcompiler/tools/bluespec/convert.py +7 -7
  61. siliconcompiler/tools/builtin/_common.py +1 -1
  62. siliconcompiler/tools/builtin/concatenate.py +2 -2
  63. siliconcompiler/tools/builtin/minimum.py +1 -1
  64. siliconcompiler/tools/builtin/mux.py +2 -1
  65. siliconcompiler/tools/builtin/nop.py +1 -1
  66. siliconcompiler/tools/builtin/verify.py +6 -4
  67. siliconcompiler/tools/chisel/convert.py +4 -4
  68. siliconcompiler/tools/genfasm/bitstream.py +3 -3
  69. siliconcompiler/tools/ghdl/convert.py +1 -1
  70. siliconcompiler/tools/icarus/compile.py +4 -4
  71. siliconcompiler/tools/icepack/bitstream.py +6 -1
  72. siliconcompiler/tools/klayout/convert_drc_db.py +5 -0
  73. siliconcompiler/tools/klayout/klayout_export.py +0 -1
  74. siliconcompiler/tools/klayout/klayout_utils.py +3 -10
  75. siliconcompiler/tools/nextpnr/apr.py +6 -1
  76. siliconcompiler/tools/nextpnr/nextpnr.py +4 -4
  77. siliconcompiler/tools/openroad/_apr.py +13 -0
  78. siliconcompiler/tools/openroad/rdlroute.py +3 -3
  79. siliconcompiler/tools/openroad/scripts/apr/postamble.tcl +1 -1
  80. siliconcompiler/tools/openroad/scripts/apr/preamble.tcl +5 -5
  81. siliconcompiler/tools/openroad/scripts/apr/sc_antenna_repair.tcl +2 -2
  82. siliconcompiler/tools/openroad/scripts/apr/sc_clock_tree_synthesis.tcl +2 -2
  83. siliconcompiler/tools/openroad/scripts/apr/sc_detailed_placement.tcl +2 -2
  84. siliconcompiler/tools/openroad/scripts/apr/sc_detailed_route.tcl +2 -2
  85. siliconcompiler/tools/openroad/scripts/apr/sc_endcap_tapcell_insertion.tcl +2 -2
  86. siliconcompiler/tools/openroad/scripts/apr/sc_fillercell_insertion.tcl +2 -2
  87. siliconcompiler/tools/openroad/scripts/apr/sc_fillmetal_insertion.tcl +2 -2
  88. siliconcompiler/tools/openroad/scripts/apr/sc_global_placement.tcl +2 -2
  89. siliconcompiler/tools/openroad/scripts/apr/sc_global_route.tcl +2 -2
  90. siliconcompiler/tools/openroad/scripts/apr/sc_init_floorplan.tcl +2 -2
  91. siliconcompiler/tools/openroad/scripts/apr/sc_macro_placement.tcl +3 -3
  92. siliconcompiler/tools/openroad/scripts/apr/sc_metrics.tcl +2 -2
  93. siliconcompiler/tools/openroad/scripts/apr/sc_pin_placement.tcl +2 -2
  94. siliconcompiler/tools/openroad/scripts/apr/sc_power_grid.tcl +2 -2
  95. siliconcompiler/tools/openroad/scripts/apr/sc_repair_design.tcl +2 -2
  96. siliconcompiler/tools/openroad/scripts/apr/sc_repair_timing.tcl +2 -2
  97. siliconcompiler/tools/openroad/scripts/apr/sc_write_data.tcl +2 -2
  98. siliconcompiler/tools/openroad/scripts/common/procs.tcl +57 -1
  99. siliconcompiler/tools/openroad/scripts/common/screenshot.tcl +2 -2
  100. siliconcompiler/tools/openroad/scripts/common/write_images.tcl +28 -3
  101. siliconcompiler/tools/openroad/scripts/sc_rcx.tcl +1 -1
  102. siliconcompiler/tools/openroad/scripts/sc_rdlroute.tcl +3 -3
  103. siliconcompiler/tools/openroad/scripts/sc_show.tcl +6 -6
  104. siliconcompiler/tools/slang/__init__.py +10 -10
  105. siliconcompiler/tools/surelog/parse.py +4 -4
  106. siliconcompiler/tools/sv2v/convert.py +20 -3
  107. siliconcompiler/tools/verilator/compile.py +2 -2
  108. siliconcompiler/tools/verilator/verilator.py +3 -3
  109. siliconcompiler/tools/vpr/place.py +1 -1
  110. siliconcompiler/tools/vpr/route.py +4 -4
  111. siliconcompiler/tools/vpr/screenshot.py +1 -1
  112. siliconcompiler/tools/vpr/show.py +5 -5
  113. siliconcompiler/tools/vpr/vpr.py +24 -24
  114. siliconcompiler/tools/xdm/convert.py +2 -2
  115. siliconcompiler/tools/xyce/simulate.py +1 -1
  116. siliconcompiler/tools/yosys/sc_synth_asic.tcl +74 -68
  117. siliconcompiler/tools/yosys/syn_asic.py +2 -2
  118. siliconcompiler/toolscripts/_tools.json +7 -7
  119. siliconcompiler/toolscripts/ubuntu22/install-vpr.sh +0 -2
  120. siliconcompiler/toolscripts/ubuntu24/install-vpr.sh +0 -2
  121. siliconcompiler/utils/__init__.py +8 -112
  122. siliconcompiler/utils/flowgraph.py +339 -0
  123. siliconcompiler/{issue.py → utils/issue.py} +4 -3
  124. siliconcompiler/utils/logging.py +1 -2
  125. {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/METADATA +9 -8
  126. {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/RECORD +151 -134
  127. {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/WHEEL +1 -1
  128. {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/entry_points.txt +8 -8
  129. siliconcompiler/schema/schema_obj.py +0 -1936
  130. siliconcompiler/toolscripts/ubuntu20/install-vpr.sh +0 -29
  131. siliconcompiler/toolscripts/ubuntu20/install-yosys-parmys.sh +0 -61
  132. /siliconcompiler/{templates → data/templates}/__init__.py +0 -0
  133. /siliconcompiler/{templates → data/templates}/email/__init__.py +0 -0
  134. /siliconcompiler/{templates → data/templates}/email/general.j2 +0 -0
  135. /siliconcompiler/{templates → data/templates}/email/summary.j2 +0 -0
  136. /siliconcompiler/{templates → data/templates}/issue/README.txt +0 -0
  137. /siliconcompiler/{templates → data/templates}/issue/__init__.py +0 -0
  138. /siliconcompiler/{templates → data/templates}/issue/run.sh +0 -0
  139. /siliconcompiler/{templates → data/templates}/replay/replay.py.j2 +0 -0
  140. /siliconcompiler/{templates → data/templates}/replay/replay.sh.j2 +0 -0
  141. /siliconcompiler/{templates → data/templates}/replay/requirements.txt +0 -0
  142. /siliconcompiler/{templates → data/templates}/replay/setup.sh +0 -0
  143. /siliconcompiler/{templates → data/templates}/report/__init__.py +0 -0
  144. /siliconcompiler/{templates → data/templates}/report/bootstrap.min.css +0 -0
  145. /siliconcompiler/{templates → data/templates}/report/bootstrap.min.js +0 -0
  146. /siliconcompiler/{templates → data/templates}/report/bootstrap_LICENSE.md +0 -0
  147. /siliconcompiler/{templates → data/templates}/report/sc_report.j2 +0 -0
  148. /siliconcompiler/{templates → data/templates}/slurm/__init__.py +0 -0
  149. /siliconcompiler/{templates → data/templates}/slurm/run.sh +0 -0
  150. /siliconcompiler/{templates → data/templates}/tcl/__init__.py +0 -0
  151. /siliconcompiler/{templates → data/templates}/tcl/manifest.tcl.j2 +0 -0
  152. /siliconcompiler/{units.py → utils/units.py} +0 -0
  153. {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/licenses/LICENSE +0 -0
  154. {siliconcompiler-0.32.3.dist-info → siliconcompiler-0.33.0.dist-info}/top_level.txt +0 -0
@@ -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
- '''Helper function for cleaning up indentation of docstring.
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))