siliconcompiler 0.34.2__py3-none-any.whl → 0.34.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. siliconcompiler/__init__.py +12 -5
  2. siliconcompiler/__main__.py +1 -7
  3. siliconcompiler/_metadata.py +1 -1
  4. siliconcompiler/apps/_common.py +104 -23
  5. siliconcompiler/apps/sc.py +4 -8
  6. siliconcompiler/apps/sc_dashboard.py +6 -4
  7. siliconcompiler/apps/sc_install.py +10 -6
  8. siliconcompiler/apps/sc_issue.py +7 -5
  9. siliconcompiler/apps/sc_remote.py +1 -1
  10. siliconcompiler/apps/sc_server.py +9 -14
  11. siliconcompiler/apps/sc_show.py +6 -5
  12. siliconcompiler/apps/smake.py +130 -94
  13. siliconcompiler/apps/utils/replay.py +4 -7
  14. siliconcompiler/apps/utils/summarize.py +3 -5
  15. siliconcompiler/asic.py +420 -0
  16. siliconcompiler/checklist.py +25 -2
  17. siliconcompiler/cmdlineschema.py +534 -0
  18. siliconcompiler/constraints/asic_component.py +2 -2
  19. siliconcompiler/constraints/asic_pins.py +2 -2
  20. siliconcompiler/constraints/asic_timing.py +3 -3
  21. siliconcompiler/core.py +7 -32
  22. siliconcompiler/data/templates/tcl/manifest.tcl.j2 +8 -0
  23. siliconcompiler/dependencyschema.py +89 -31
  24. siliconcompiler/design.py +176 -207
  25. siliconcompiler/filesetschema.py +250 -0
  26. siliconcompiler/flowgraph.py +274 -95
  27. siliconcompiler/fpga.py +124 -1
  28. siliconcompiler/library.py +218 -20
  29. siliconcompiler/metric.py +233 -20
  30. siliconcompiler/package/__init__.py +271 -50
  31. siliconcompiler/package/git.py +92 -16
  32. siliconcompiler/package/github.py +108 -12
  33. siliconcompiler/package/https.py +79 -16
  34. siliconcompiler/packageschema.py +88 -7
  35. siliconcompiler/pathschema.py +31 -2
  36. siliconcompiler/pdk.py +566 -1
  37. siliconcompiler/project.py +1095 -94
  38. siliconcompiler/record.py +38 -1
  39. siliconcompiler/remote/__init__.py +5 -2
  40. siliconcompiler/remote/client.py +11 -6
  41. siliconcompiler/remote/schema.py +5 -23
  42. siliconcompiler/remote/server.py +41 -54
  43. siliconcompiler/report/__init__.py +3 -3
  44. siliconcompiler/report/dashboard/__init__.py +48 -14
  45. siliconcompiler/report/dashboard/cli/__init__.py +99 -21
  46. siliconcompiler/report/dashboard/cli/board.py +364 -179
  47. siliconcompiler/report/dashboard/web/__init__.py +90 -12
  48. siliconcompiler/report/dashboard/web/components/__init__.py +219 -240
  49. siliconcompiler/report/dashboard/web/components/flowgraph.py +49 -26
  50. siliconcompiler/report/dashboard/web/components/graph.py +139 -100
  51. siliconcompiler/report/dashboard/web/layouts/__init__.py +29 -1
  52. siliconcompiler/report/dashboard/web/layouts/_common.py +38 -2
  53. siliconcompiler/report/dashboard/web/layouts/vertical_flowgraph.py +39 -26
  54. siliconcompiler/report/dashboard/web/layouts/vertical_flowgraph_node_tab.py +50 -50
  55. siliconcompiler/report/dashboard/web/layouts/vertical_flowgraph_sac_tabs.py +49 -46
  56. siliconcompiler/report/dashboard/web/state.py +141 -14
  57. siliconcompiler/report/dashboard/web/utils/__init__.py +79 -16
  58. siliconcompiler/report/dashboard/web/utils/file_utils.py +74 -11
  59. siliconcompiler/report/dashboard/web/viewer.py +25 -1
  60. siliconcompiler/report/report.py +5 -2
  61. siliconcompiler/report/summary_image.py +29 -11
  62. siliconcompiler/scheduler/__init__.py +9 -1
  63. siliconcompiler/scheduler/docker.py +79 -1
  64. siliconcompiler/scheduler/run_node.py +35 -19
  65. siliconcompiler/scheduler/scheduler.py +208 -24
  66. siliconcompiler/scheduler/schedulernode.py +372 -46
  67. siliconcompiler/scheduler/send_messages.py +77 -29
  68. siliconcompiler/scheduler/slurm.py +76 -12
  69. siliconcompiler/scheduler/taskscheduler.py +140 -20
  70. siliconcompiler/schema/__init__.py +0 -2
  71. siliconcompiler/schema/baseschema.py +194 -38
  72. siliconcompiler/schema/journal.py +7 -4
  73. siliconcompiler/schema/namedschema.py +16 -10
  74. siliconcompiler/schema/parameter.py +55 -9
  75. siliconcompiler/schema/parametervalue.py +60 -0
  76. siliconcompiler/schema/safeschema.py +25 -2
  77. siliconcompiler/schema/schema_cfg.py +5 -5
  78. siliconcompiler/schema/utils.py +2 -2
  79. siliconcompiler/schema_obj.py +20 -3
  80. siliconcompiler/tool.py +979 -302
  81. siliconcompiler/tools/bambu/__init__.py +41 -0
  82. siliconcompiler/tools/builtin/concatenate.py +2 -2
  83. siliconcompiler/tools/builtin/minimum.py +2 -1
  84. siliconcompiler/tools/builtin/mux.py +2 -1
  85. siliconcompiler/tools/builtin/nop.py +2 -1
  86. siliconcompiler/tools/builtin/verify.py +2 -1
  87. siliconcompiler/tools/klayout/__init__.py +95 -0
  88. siliconcompiler/tools/openroad/__init__.py +289 -0
  89. siliconcompiler/tools/openroad/scripts/apr/preamble.tcl +3 -0
  90. siliconcompiler/tools/openroad/scripts/apr/sc_detailed_route.tcl +7 -2
  91. siliconcompiler/tools/openroad/scripts/apr/sc_global_route.tcl +8 -4
  92. siliconcompiler/tools/openroad/scripts/apr/sc_init_floorplan.tcl +9 -5
  93. siliconcompiler/tools/openroad/scripts/common/write_images.tcl +5 -1
  94. siliconcompiler/tools/slang/__init__.py +1 -1
  95. siliconcompiler/tools/slang/elaborate.py +2 -1
  96. siliconcompiler/tools/vivado/scripts/sc_run.tcl +1 -1
  97. siliconcompiler/tools/vivado/scripts/sc_syn_fpga.tcl +8 -1
  98. siliconcompiler/tools/vivado/syn_fpga.py +6 -0
  99. siliconcompiler/tools/vivado/vivado.py +35 -2
  100. siliconcompiler/tools/vpr/__init__.py +150 -0
  101. siliconcompiler/tools/yosys/__init__.py +369 -1
  102. siliconcompiler/tools/yosys/scripts/procs.tcl +0 -1
  103. siliconcompiler/toolscripts/_tools.json +5 -10
  104. siliconcompiler/utils/__init__.py +66 -0
  105. siliconcompiler/utils/flowgraph.py +2 -2
  106. siliconcompiler/utils/issue.py +2 -1
  107. siliconcompiler/utils/logging.py +14 -0
  108. siliconcompiler/utils/multiprocessing.py +256 -0
  109. siliconcompiler/utils/showtools.py +10 -0
  110. {siliconcompiler-0.34.2.dist-info → siliconcompiler-0.34.3.dist-info}/METADATA +5 -5
  111. {siliconcompiler-0.34.2.dist-info → siliconcompiler-0.34.3.dist-info}/RECORD +115 -118
  112. {siliconcompiler-0.34.2.dist-info → siliconcompiler-0.34.3.dist-info}/entry_points.txt +3 -0
  113. siliconcompiler/schema/cmdlineschema.py +0 -250
  114. siliconcompiler/toolscripts/rhel8/install-slang.sh +0 -40
  115. siliconcompiler/toolscripts/rhel9/install-slang.sh +0 -40
  116. siliconcompiler/toolscripts/ubuntu20/install-slang.sh +0 -47
  117. siliconcompiler/toolscripts/ubuntu22/install-slang.sh +0 -37
  118. siliconcompiler/toolscripts/ubuntu24/install-slang.sh +0 -37
  119. {siliconcompiler-0.34.2.dist-info → siliconcompiler-0.34.3.dist-info}/WHEEL +0 -0
  120. {siliconcompiler-0.34.2.dist-info → siliconcompiler-0.34.3.dist-info}/licenses/LICENSE +0 -0
  121. {siliconcompiler-0.34.2.dist-info → siliconcompiler-0.34.3.dist-info}/top_level.txt +0 -0
@@ -93,6 +93,15 @@ class NodeListValue:
93
93
 
94
94
  return [self.__base.get(field=field)]
95
95
 
96
+ def gettcl(self):
97
+ """
98
+ Returns the tcl representation for the value
99
+
100
+ Args:
101
+ field (str): name of schema field.
102
+ """
103
+ return NodeType.to_tcl(self.get(), self.type)
104
+
96
105
  def set(self, value, field='value'):
97
106
  """
98
107
  Sets the value in a specific field and ensures it has been normalized.
@@ -154,6 +163,16 @@ class NodeListValue:
154
163
  """
155
164
  return self.__base.fields
156
165
 
166
+ @property
167
+ def has_value(self):
168
+ """
169
+ Returns true if this node has a value.
170
+ """
171
+ if self.__values:
172
+ return True
173
+ else:
174
+ return False
175
+
157
176
  @property
158
177
  def values(self):
159
178
  '''
@@ -265,6 +284,15 @@ class NodeSetValue:
265
284
  return set(vals)
266
285
  return vals
267
286
 
287
+ def gettcl(self):
288
+ """
289
+ Returns the tcl representation for the value
290
+
291
+ Args:
292
+ field (str): name of schema field.
293
+ """
294
+ return NodeType.to_tcl(self.get(ordered=True), [self.__base.type])
295
+
268
296
  def set(self, value, field='value'):
269
297
  value = NodeType.normalize(value, [self.__base.type])
270
298
 
@@ -326,6 +354,16 @@ class NodeSetValue:
326
354
  modified.append(val)
327
355
  return tuple(modified)
328
356
 
357
+ @property
358
+ def has_value(self):
359
+ """
360
+ Returns true if this node has a value.
361
+ """
362
+ if self.__values:
363
+ return True
364
+ else:
365
+ return False
366
+
329
367
  @property
330
368
  def fields(self):
331
369
  """
@@ -434,6 +472,15 @@ class NodeValue:
434
472
  return self.__signature
435
473
  raise ValueError(f"{field} is not a valid field")
436
474
 
475
+ def gettcl(self):
476
+ """
477
+ Returns the tcl representation for the value
478
+
479
+ Args:
480
+ field (str): name of schema field.
481
+ """
482
+ return NodeType.to_tcl(self.get(), self.__type)
483
+
437
484
  def set(self, value, field='value'):
438
485
  """
439
486
  Sets the value in a specific field and ensures it has been normalized.
@@ -459,6 +506,19 @@ class NodeValue:
459
506
  """
460
507
  raise ValueError(f"cannot add to {field} field")
461
508
 
509
+ @property
510
+ def has_value(self):
511
+ """
512
+ Returns true if this node has a value.
513
+ """
514
+ if isinstance(self.__type, (set, tuple, list)):
515
+ return bool(self.__value)
516
+
517
+ if self.__value is not None:
518
+ return True
519
+ else:
520
+ return False
521
+
462
522
  @property
463
523
  def fields(self):
464
524
  """
@@ -4,6 +4,8 @@
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
+ from typing import Dict, Tuple
8
+
7
9
  from .parameter import Parameter
8
10
  from .baseschema import BaseSchema
9
11
 
@@ -15,16 +17,27 @@ class SafeSchema(BaseSchema):
15
17
  '''
16
18
 
17
19
  @staticmethod
18
- def __is_dict_leaf(manifest, keypath, version):
20
+ def __is_dict_leaf(manifest: Dict, keypath: Tuple[str], version: str) -> Parameter:
19
21
  try:
20
22
  return Parameter.from_dict(manifest, keypath, version)
21
23
  except: # noqa E722
22
24
  return None
23
25
 
24
- def _from_dict(self, manifest, keypath, version=None):
26
+ @classmethod
27
+ def _getdict_type(cls) -> str:
28
+ """
29
+ Returns the meta data for getdict
30
+ """
31
+
32
+ return "SafeSchema"
33
+
34
+ def _from_dict(self, manifest: Dict, keypath: Tuple[str], version: str = None) -> None:
25
35
  if not isinstance(manifest, dict):
26
36
  return
27
37
 
38
+ if "__meta__" in manifest:
39
+ del manifest["__meta__"]
40
+
28
41
  for key, data in manifest.items():
29
42
  obj = SafeSchema.__is_dict_leaf(data, keypath + [key], version)
30
43
  if not obj:
@@ -35,3 +48,13 @@ class SafeSchema(BaseSchema):
35
48
  self._BaseSchema__default = obj
36
49
  else:
37
50
  self._BaseSchema__manifest[key] = obj
51
+
52
+ @classmethod
53
+ def from_manifest(cls, filepath: str = None, cfg: Dict = None) -> "SafeSchema":
54
+ if filepath:
55
+ cfg = BaseSchema._read_manifest(filepath)
56
+
57
+ if cfg and "__meta__" in cfg:
58
+ del cfg["__meta__"]
59
+
60
+ return super().from_manifest(filepath=None, cfg=cfg)
@@ -3,7 +3,7 @@
3
3
  from . import EditableSchema, Parameter, Scope, PerNode
4
4
  from .utils import trim
5
5
 
6
- SCHEMA_VERSION = '0.51.4'
6
+ SCHEMA_VERSION = '0.51.5'
7
7
 
8
8
 
9
9
  #############################################################################
@@ -208,8 +208,8 @@ def schema_schematic(cfg):
208
208
  # FPGA
209
209
  ###############################################################################
210
210
  def schema_fpga(cfg):
211
- from siliconcompiler.fpga import FPGASchema
212
- cfg.insert("fpga", FPGASchema())
211
+ from siliconcompiler.fpga import FPGASchemaTmp
212
+ cfg.insert("fpga", FPGASchemaTmp())
213
213
  return cfg
214
214
 
215
215
 
@@ -217,8 +217,8 @@ def schema_fpga(cfg):
217
217
  # PDK
218
218
  ###############################################################################
219
219
  def schema_pdk(cfg):
220
- from siliconcompiler.pdk import PDKSchema
221
- cfg.insert("pdk", "default", PDKSchema(None))
220
+ from siliconcompiler.pdk import PDKSchemaTmp
221
+ cfg.insert("pdk", "default", PDKSchemaTmp())
222
222
  return cfg
223
223
 
224
224
 
@@ -7,7 +7,7 @@
7
7
  import sys
8
8
 
9
9
 
10
- def trim(docstring):
10
+ def trim(docstring: str) -> str:
11
11
  '''
12
12
  Helper function for cleaning up indentation of docstring.
13
13
 
@@ -42,7 +42,7 @@ def trim(docstring):
42
42
  return '\n'.join(trimmed)
43
43
 
44
44
 
45
- def translate_loglevel(level):
45
+ def translate_loglevel(level: str) -> str:
46
46
  if level == "quiet":
47
47
  level = "error"
48
48
  return level.upper()
@@ -7,7 +7,7 @@
7
7
  from siliconcompiler.schema import BaseSchema
8
8
  from siliconcompiler.schema import SafeSchema
9
9
  from siliconcompiler.schema import EditableSchema
10
- from siliconcompiler.schema import CommandLineSchema
10
+ from siliconcompiler.cmdlineschema import CommandLineSchemaTmp
11
11
  from siliconcompiler.schema import Parameter
12
12
 
13
13
  from siliconcompiler.schema.schema_cfg import schema_cfg
@@ -38,8 +38,16 @@ class Schema(BaseSchema):
38
38
 
39
39
  return super()._from_dict(manifest, keypath, version=version)
40
40
 
41
+ @classmethod
42
+ def _getdict_type(cls) -> str:
43
+ """
44
+ Returns the meta data for getdict
45
+ """
41
46
 
42
- class SchemaTmp(Schema, CommandLineSchema):
47
+ return Schema.__name__
48
+
49
+
50
+ class SchemaTmp(Schema, CommandLineSchemaTmp):
43
51
  """Object for storing and accessing configuration values corresponding to
44
52
  the SiliconCompiler schema.
45
53
 
@@ -113,9 +121,18 @@ class SchemaTmp(Schema, CommandLineSchema):
113
121
  EditableSchema(self).insert("history", job, blank)
114
122
  return blank
115
123
 
124
+ @classmethod
125
+ def _getdict_type(cls) -> str:
126
+ """
127
+ Returns the meta data for getdict
128
+ """
129
+
130
+ return SchemaTmp.__name__
131
+
116
132
 
117
133
  ##############################################################################
118
134
  # Main routine
119
135
  if __name__ == "__main__":
120
136
  import json
121
- print(json.dumps(SchemaTmp().getdict(), indent=4, sort_keys=True))
137
+ from siliconcompiler import Schema
138
+ print(json.dumps(Schema().getdict(), indent=4, sort_keys=True))