siliconcompiler 0.35.1__py3-none-any.whl → 0.35.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 (57) hide show
  1. siliconcompiler/_metadata.py +1 -1
  2. siliconcompiler/apps/sc_install.py +1 -1
  3. siliconcompiler/apps/sc_issue.py +8 -16
  4. siliconcompiler/apps/smake.py +106 -100
  5. siliconcompiler/checklist.py +349 -91
  6. siliconcompiler/design.py +8 -1
  7. siliconcompiler/flowgraph.py +419 -130
  8. siliconcompiler/flows/showflow.py +1 -2
  9. siliconcompiler/library.py +6 -5
  10. siliconcompiler/package/https.py +10 -5
  11. siliconcompiler/project.py +87 -37
  12. siliconcompiler/remote/client.py +17 -6
  13. siliconcompiler/scheduler/scheduler.py +284 -59
  14. siliconcompiler/scheduler/schedulernode.py +154 -102
  15. siliconcompiler/schema/__init__.py +3 -2
  16. siliconcompiler/schema/_metadata.py +1 -1
  17. siliconcompiler/schema/baseschema.py +210 -93
  18. siliconcompiler/schema/namedschema.py +21 -13
  19. siliconcompiler/schema/parameter.py +8 -1
  20. siliconcompiler/schema/safeschema.py +18 -7
  21. siliconcompiler/schema_support/dependencyschema.py +23 -3
  22. siliconcompiler/schema_support/filesetschema.py +10 -4
  23. siliconcompiler/schema_support/option.py +37 -34
  24. siliconcompiler/schema_support/pathschema.py +7 -2
  25. siliconcompiler/schema_support/record.py +5 -4
  26. siliconcompiler/targets/asap7_demo.py +4 -1
  27. siliconcompiler/tool.py +100 -8
  28. siliconcompiler/tools/__init__.py +10 -7
  29. siliconcompiler/tools/bambu/convert.py +19 -0
  30. siliconcompiler/tools/builtin/__init__.py +3 -2
  31. siliconcompiler/tools/builtin/filter.py +108 -0
  32. siliconcompiler/tools/builtin/importfiles.py +154 -0
  33. siliconcompiler/tools/execute/exec_input.py +4 -3
  34. siliconcompiler/tools/gtkwave/show.py +6 -2
  35. siliconcompiler/tools/icarus/compile.py +1 -0
  36. siliconcompiler/tools/klayout/scripts/klayout_show.py +1 -1
  37. siliconcompiler/tools/klayout/show.py +17 -5
  38. siliconcompiler/tools/openroad/screenshot.py +0 -1
  39. siliconcompiler/tools/openroad/scripts/common/screenshot.tcl +1 -1
  40. siliconcompiler/tools/openroad/scripts/common/write_images.tcl +2 -0
  41. siliconcompiler/tools/openroad/show.py +10 -0
  42. siliconcompiler/tools/surfer/show.py +7 -2
  43. siliconcompiler/tools/verilator/compile.py +2 -2
  44. siliconcompiler/tools/yosys/prepareLib.py +7 -2
  45. siliconcompiler/tools/yosys/syn_asic.py +20 -2
  46. siliconcompiler/toolscripts/_tools.json +5 -5
  47. siliconcompiler/toolscripts/rhel9/{install-yosys-wildebeest.sh → install-wildebeest.sh} +5 -5
  48. siliconcompiler/toolscripts/ubuntu22/{install-yosys-wildebeest.sh → install-wildebeest.sh} +5 -5
  49. siliconcompiler/toolscripts/ubuntu24/{install-yosys-wildebeest.sh → install-wildebeest.sh} +5 -5
  50. siliconcompiler/utils/__init__.py +1 -2
  51. siliconcompiler/utils/issue.py +38 -45
  52. {siliconcompiler-0.35.1.dist-info → siliconcompiler-0.35.3.dist-info}/METADATA +4 -4
  53. {siliconcompiler-0.35.1.dist-info → siliconcompiler-0.35.3.dist-info}/RECORD +57 -55
  54. {siliconcompiler-0.35.1.dist-info → siliconcompiler-0.35.3.dist-info}/WHEEL +0 -0
  55. {siliconcompiler-0.35.1.dist-info → siliconcompiler-0.35.3.dist-info}/entry_points.txt +0 -0
  56. {siliconcompiler-0.35.1.dist-info → siliconcompiler-0.35.3.dist-info}/licenses/LICENSE +0 -0
  57. {siliconcompiler-0.35.1.dist-info → siliconcompiler-0.35.3.dist-info}/top_level.txt +0 -0
@@ -7,7 +7,7 @@
7
7
  from typing import Dict, Tuple, Optional, Union, List, Set
8
8
 
9
9
  from .parameter import Parameter
10
- from .baseschema import BaseSchema
10
+ from .baseschema import BaseSchema, LazyLoad
11
11
 
12
12
 
13
13
  class SafeSchema(BaseSchema):
@@ -35,7 +35,8 @@ class SafeSchema(BaseSchema):
35
35
 
36
36
  def _from_dict(self, manifest: Dict,
37
37
  keypath: Union[List[str], Tuple[str, ...]],
38
- version: Optional[Tuple[int, ...]] = None) \
38
+ version: Optional[Tuple[int, ...]] = None,
39
+ lazyload: LazyLoad = LazyLoad.OFF) \
39
40
  -> Tuple[Set[Tuple[str, ...]], Set[Tuple[str, ...]]]:
40
41
  if not isinstance(manifest, dict):
41
42
  return set(), set()
@@ -43,11 +44,13 @@ class SafeSchema(BaseSchema):
43
44
  if "__meta__" in manifest:
44
45
  del manifest["__meta__"]
45
46
 
47
+ lazyload = LazyLoad.OFF
48
+
46
49
  for key, data in manifest.items():
47
50
  obj = SafeSchema.__is_dict_leaf(data, list(keypath) + [key], version)
48
51
  if not obj:
49
52
  obj = SafeSchema()
50
- obj._from_dict(data, list(keypath) + [key], version)
53
+ obj._from_dict(data, list(keypath) + [key], version=version, lazyload=lazyload)
51
54
 
52
55
  if key == "default":
53
56
  self._BaseSchema__default = obj
@@ -59,11 +62,19 @@ class SafeSchema(BaseSchema):
59
62
  @classmethod
60
63
  def from_manifest(cls,
61
64
  filepath: Union[None, str] = None,
62
- cfg: Union[None, Dict] = None) -> "SafeSchema":
65
+ cfg: Union[None, Dict] = None,
66
+ lazyload: bool = False) -> "SafeSchema":
63
67
  if filepath:
64
68
  cfg = BaseSchema._read_manifest(filepath)
65
69
 
66
- if cfg and "__meta__" in cfg:
67
- del cfg["__meta__"]
70
+ def rm_meta(manifest):
71
+ if not isinstance(manifest, dict):
72
+ return
73
+ if manifest and "__meta__" in manifest:
74
+ del manifest["__meta__"]
75
+ for section in manifest.values():
76
+ rm_meta(section)
77
+
78
+ rm_meta(cfg)
68
79
 
69
- return super().from_manifest(filepath=None, cfg=cfg)
80
+ return super().from_manifest(filepath=None, cfg=cfg, lazyload=False)
@@ -2,11 +2,13 @@ import os.path
2
2
 
3
3
  from typing import Dict, Union, Tuple, List, Optional, Set
4
4
 
5
- from siliconcompiler.schema.baseschema import BaseSchema
5
+ from siliconcompiler.schema.baseschema import BaseSchema, LazyLoad
6
6
  from siliconcompiler.schema.editableschema import EditableSchema
7
7
  from siliconcompiler.schema.parameter import Parameter, Scope
8
8
  from siliconcompiler.schema.namedschema import NamedSchema
9
9
 
10
+ from siliconcompiler.schema_support.pathschema import PathSchemaBase
11
+
10
12
 
11
13
  class DependencySchema(BaseSchema):
12
14
  '''
@@ -31,7 +33,8 @@ class DependencySchema(BaseSchema):
31
33
 
32
34
  def _from_dict(self, manifest: Dict,
33
35
  keypath: Union[List[str], Tuple[str, ...]],
34
- version: Optional[Tuple[int, ...]] = None) \
36
+ version: Optional[Tuple[int, ...]] = None,
37
+ lazyload: LazyLoad = LazyLoad.ON) \
35
38
  -> Tuple[Set[Tuple[str, ...]], Set[Tuple[str, ...]]]:
36
39
  '''
37
40
  Internal helper to load schema from a dictionary manifest.
@@ -48,7 +51,7 @@ class DependencySchema(BaseSchema):
48
51
  The result of the parent class's _from_dict method.
49
52
  '''
50
53
  self.set("deps", False, field="lock")
51
- ret = super()._from_dict(manifest, keypath, version)
54
+ ret = super()._from_dict(manifest, keypath, version=version, lazyload=lazyload)
52
55
  self.set("deps", True, field="lock")
53
56
  return ret
54
57
 
@@ -289,3 +292,20 @@ class DependencySchema(BaseSchema):
289
292
  def _reset_deps(self) -> None:
290
293
  '''Resets the internal dependency dictionary.'''
291
294
  self.__deps = {}
295
+
296
+ def check_filepaths(self, ignore_keys: Optional[List[Tuple[str, ...]]] = None) -> bool:
297
+ '''
298
+ Verifies that paths to all files in manifest are valid.
299
+
300
+ Args:
301
+ ignore_keys (list of keypaths): list of keypaths to ignore while checking
302
+
303
+ Returns:
304
+ True if all file paths are valid, otherwise False.
305
+ '''
306
+ error = False
307
+ for obj in [self, *self.get_dep()]:
308
+ if not isinstance(obj, PathSchemaBase):
309
+ continue
310
+ error |= not PathSchemaBase.check_filepaths(obj, ignore_keys=ignore_keys)
311
+ return not error
@@ -1,6 +1,8 @@
1
1
  import contextlib
2
2
 
3
- from typing import List, Tuple, Optional, Union, Iterable
3
+ from pathlib import Path
4
+
5
+ from typing import List, Tuple, Optional, Union, Iterable, Set
4
6
 
5
7
  from siliconcompiler import utils
6
8
 
@@ -43,7 +45,8 @@ class FileSetSchema(PathSchema):
43
45
 
44
46
  ###############################################
45
47
  def add_file(self,
46
- filename: str,
48
+ filename: Union[List[Union[Path, str]], Set[Union[Path, str]],
49
+ Tuple[Union[Path, str], ...], Path, str],
47
50
  fileset: Optional[str] = None,
48
51
  filetype: Optional[str] = None,
49
52
  clobber: bool = False,
@@ -62,7 +65,8 @@ class FileSetSchema(PathSchema):
62
65
  * etc.
63
66
 
64
67
  Args:
65
- filename (Path or list[Path]): File path or list of paths to add.
68
+ filename (Path, str, or collection): File path (Path or str), or a collection
69
+ (list, tuple, set) of file paths to add.
66
70
  fileset (str): Logical group to associate the file with.
67
71
  filetype (str, optional): Type of the file (e.g., 'verilog', 'sdc').
68
72
  clobber (bool, optional): If True, clears the list before adding the
@@ -89,7 +93,9 @@ class FileSetSchema(PathSchema):
89
93
  raise ValueError("fileset key must be a string")
90
94
 
91
95
  # handle list inputs
92
- if isinstance(filename, (list, tuple)):
96
+ if isinstance(filename, (list, set, tuple)):
97
+ if isinstance(filename, set):
98
+ filename = sorted(filename)
93
99
  params = []
94
100
  for item in filename:
95
101
  params.extend(
@@ -1,4 +1,4 @@
1
- from typing import Union, List, Tuple, Callable
1
+ from typing import Union, List, Tuple, Callable, Dict, Optional
2
2
 
3
3
  from siliconcompiler.schema import BaseSchema, EditableSchema, Parameter, Scope, PerNode
4
4
  from siliconcompiler.schema.utils import trim
@@ -189,7 +189,7 @@ class SchedulerSchema(BaseSchema):
189
189
  Maximum number of threads for each task in a job. If not set this will default
190
190
  to the number of cpu cores available."""))
191
191
 
192
- def get_name(self, step: str = None, index: str = None) -> str:
192
+ def get_name(self, step: Optional[str] = None, index: Optional[str] = None) -> str:
193
193
  """Gets the scheduler platform name.
194
194
 
195
195
  Args:
@@ -201,7 +201,7 @@ class SchedulerSchema(BaseSchema):
201
201
  """
202
202
  return self.get('name', step=step, index=index)
203
203
 
204
- def set_name(self, value: str, step: str = None, index: str = None):
204
+ def set_name(self, value: str, step: Optional[str] = None, index: Optional[str] = None):
205
205
  """Sets the scheduler platform name.
206
206
 
207
207
  Args:
@@ -211,7 +211,7 @@ class SchedulerSchema(BaseSchema):
211
211
  """
212
212
  self.set('name', value, step=step, index=index)
213
213
 
214
- def get_cores(self, step: str = None, index: str = None) -> int:
214
+ def get_cores(self, step: Optional[str] = None, index: Optional[str] = None) -> int:
215
215
  """Gets the number of CPU cores required for the job.
216
216
 
217
217
  Args:
@@ -223,7 +223,7 @@ class SchedulerSchema(BaseSchema):
223
223
  """
224
224
  return self.get('cores', step=step, index=index)
225
225
 
226
- def set_cores(self, value: int, step: str = None, index: str = None):
226
+ def set_cores(self, value: int, step: Optional[str] = None, index: Optional[str] = None):
227
227
  """Sets the number of CPU cores required for the job.
228
228
 
229
229
  Args:
@@ -233,7 +233,7 @@ class SchedulerSchema(BaseSchema):
233
233
  """
234
234
  self.set('cores', value, step=step, index=index)
235
235
 
236
- def get_memory(self, step: str = None, index: str = None) -> int:
236
+ def get_memory(self, step: Optional[str] = None, index: Optional[str] = None) -> int:
237
237
  """Gets the memory required for the job in megabytes.
238
238
 
239
239
  Args:
@@ -245,7 +245,7 @@ class SchedulerSchema(BaseSchema):
245
245
  """
246
246
  return self.get('memory', step=step, index=index)
247
247
 
248
- def set_memory(self, value: int, step: str = None, index: str = None):
248
+ def set_memory(self, value: int, step: Optional[str] = None, index: Optional[str] = None):
249
249
  """Sets the memory required for the job in megabytes.
250
250
 
251
251
  Args:
@@ -255,7 +255,7 @@ class SchedulerSchema(BaseSchema):
255
255
  """
256
256
  self.set('memory', value, step=step, index=index)
257
257
 
258
- def get_queue(self, step: str = None, index: str = None) -> str:
258
+ def get_queue(self, step: Optional[str] = None, index: Optional[str] = None) -> str:
259
259
  """Gets the scheduler queue (or partition) for the job.
260
260
 
261
261
  Args:
@@ -267,7 +267,7 @@ class SchedulerSchema(BaseSchema):
267
267
  """
268
268
  return self.get('queue', step=step, index=index)
269
269
 
270
- def set_queue(self, value: str, step: str = None, index: str = None):
270
+ def set_queue(self, value: str, step: Optional[str] = None, index: Optional[str] = None):
271
271
  """Sets the scheduler queue (or partition) for the job.
272
272
 
273
273
  Args:
@@ -277,7 +277,7 @@ class SchedulerSchema(BaseSchema):
277
277
  """
278
278
  self.set('queue', value, step=step, index=index)
279
279
 
280
- def get_defer(self, step: str = None, index: str = None) -> str:
280
+ def get_defer(self, step: Optional[str] = None, index: Optional[str] = None) -> str:
281
281
  """Gets the deferred start time for the job.
282
282
 
283
283
  Args:
@@ -289,7 +289,7 @@ class SchedulerSchema(BaseSchema):
289
289
  """
290
290
  return self.get('defer', step=step, index=index)
291
291
 
292
- def set_defer(self, value: str, step: str = None, index: str = None):
292
+ def set_defer(self, value: str, step: Optional[str] = None, index: Optional[str] = None):
293
293
  """Sets the deferred start time for the job.
294
294
 
295
295
  Args:
@@ -299,7 +299,7 @@ class SchedulerSchema(BaseSchema):
299
299
  """
300
300
  self.set('defer', value, step=step, index=index)
301
301
 
302
- def get_options(self, step: str = None, index: str = None) -> List[str]:
302
+ def get_options(self, step: Optional[str] = None, index: Optional[str] = None) -> List[str]:
303
303
  """Gets the advanced pass-through options for the scheduler.
304
304
 
305
305
  Args:
@@ -311,7 +311,8 @@ class SchedulerSchema(BaseSchema):
311
311
  """
312
312
  return self.get('options', step=step, index=index)
313
313
 
314
- def add_options(self, value: Union[List[str], str], step: str = None, index: str = None,
314
+ def add_options(self, value: Union[List[str], str],
315
+ step: Optional[str] = None, index: Optional[str] = None,
315
316
  clobber: bool = False):
316
317
  """Adds or sets advanced pass-through options for the scheduler.
317
318
 
@@ -327,7 +328,7 @@ class SchedulerSchema(BaseSchema):
327
328
  else:
328
329
  self.add('options', value, step=step, index=index)
329
330
 
330
- def get_msgevent(self, step: str = None, index: str = None) -> List[str]:
331
+ def get_msgevent(self, step: Optional[str] = None, index: Optional[str] = None) -> List[str]:
331
332
  """Gets the event triggers for sending messages.
332
333
 
333
334
  Args:
@@ -339,7 +340,8 @@ class SchedulerSchema(BaseSchema):
339
340
  """
340
341
  return self.get('msgevent', step=step, index=index)
341
342
 
342
- def add_msgevent(self, value: Union[List[str], str], step: str = None, index: str = None,
343
+ def add_msgevent(self, value: Union[List[str], str],
344
+ step: Optional[str] = None, index: Optional[str] = None,
343
345
  clobber: bool = False):
344
346
  """Adds or sets the event triggers for sending messages.
345
347
 
@@ -355,7 +357,7 @@ class SchedulerSchema(BaseSchema):
355
357
  else:
356
358
  self.add('msgevent', value, step=step, index=index)
357
359
 
358
- def get_msgcontact(self, step: str = None, index: str = None) -> List[str]:
360
+ def get_msgcontact(self, step: Optional[str] = None, index: Optional[str] = None) -> List[str]:
359
361
  """Gets the contact list for scheduler event messages.
360
362
 
361
363
  Args:
@@ -367,7 +369,8 @@ class SchedulerSchema(BaseSchema):
367
369
  """
368
370
  return self.get('msgcontact', step=step, index=index)
369
371
 
370
- def add_msgcontact(self, value: Union[List[str], str], step: str = None, index: str = None,
372
+ def add_msgcontact(self, value: Union[List[str], str],
373
+ step: Optional[str] = None, index: Optional[str] = None,
371
374
  clobber: bool = False):
372
375
  """Adds or sets the contact list for scheduler event messages.
373
376
 
@@ -428,7 +431,7 @@ class OptionSchema(BaseSchema):
428
431
  """Initializes the options schema and defines all its parameters."""
429
432
  super().__init__()
430
433
 
431
- self.__callbacks = {}
434
+ self.__callbacks: Dict[str, Callable] = {}
432
435
 
433
436
  # Initialize schema
434
437
  schema = EditableSchema(self)
@@ -890,7 +893,7 @@ class OptionSchema(BaseSchema):
890
893
  """
891
894
  self.set('cachedir', value)
892
895
 
893
- def get_nice(self, step: str = None, index: str = None) -> int:
896
+ def get_nice(self, step: Optional[str] = None, index: Optional[str] = None) -> int:
894
897
  """Gets the tool scheduling priority (nice level).
895
898
 
896
899
  Args:
@@ -902,7 +905,7 @@ class OptionSchema(BaseSchema):
902
905
  """
903
906
  return self.get('nice', step=step, index=index)
904
907
 
905
- def set_nice(self, value: int, step: str = None, index: str = None):
908
+ def set_nice(self, value: int, step: Optional[str] = None, index: Optional[str] = None):
906
909
  """Sets the tool scheduling priority (nice level).
907
910
 
908
911
  Args:
@@ -928,7 +931,7 @@ class OptionSchema(BaseSchema):
928
931
  """
929
932
  self.set('flow', value)
930
933
 
931
- def get_optmode(self, step: str = None, index: str = None) -> int:
934
+ def get_optmode(self, step: Optional[str] = None, index: Optional[str] = None) -> int:
932
935
  """Gets the optimization mode.
933
936
 
934
937
  Args:
@@ -940,7 +943,7 @@ class OptionSchema(BaseSchema):
940
943
  """
941
944
  return self.get('optmode', step=step, index=index)
942
945
 
943
- def set_optmode(self, value: int, step: str = None, index: str = None):
946
+ def set_optmode(self, value: int, step: Optional[str] = None, index: Optional[str] = None):
944
947
  """Sets the optimization mode.
945
948
 
946
949
  Args:
@@ -1047,7 +1050,7 @@ class OptionSchema(BaseSchema):
1047
1050
  else:
1048
1051
  self.add('prune', value)
1049
1052
 
1050
- def get_breakpoint(self, step: str = None, index: str = None) -> bool:
1053
+ def get_breakpoint(self, step: Optional[str] = None, index: Optional[str] = None) -> bool:
1051
1054
  """Checks if a breakpoint is set on a specific step.
1052
1055
 
1053
1056
  Args:
@@ -1059,7 +1062,7 @@ class OptionSchema(BaseSchema):
1059
1062
  """
1060
1063
  return self.get('breakpoint', step=step, index=index)
1061
1064
 
1062
- def set_breakpoint(self, value: bool, step: str = None, index: str = None):
1065
+ def set_breakpoint(self, value: bool, step: Optional[str] = None, index: Optional[str] = None):
1063
1066
  """Sets a breakpoint on a specific step.
1064
1067
 
1065
1068
  Args:
@@ -1117,7 +1120,7 @@ class OptionSchema(BaseSchema):
1117
1120
  """
1118
1121
  self.set('nodisplay', value)
1119
1122
 
1120
- def get_quiet(self, step: str = None, index: str = None) -> bool:
1123
+ def get_quiet(self, step: Optional[str] = None, index: Optional[str] = None) -> bool:
1121
1124
  """Gets the quiet execution flag for a step.
1122
1125
 
1123
1126
  Args:
@@ -1129,7 +1132,7 @@ class OptionSchema(BaseSchema):
1129
1132
  """
1130
1133
  return self.get('quiet', step=step, index=index)
1131
1134
 
1132
- def set_quiet(self, value: bool, step: str = None, index: str = None):
1135
+ def set_quiet(self, value: bool, step: Optional[str] = None, index: Optional[str] = None):
1133
1136
  """Sets the quiet execution flag for a step.
1134
1137
 
1135
1138
  Args:
@@ -1155,7 +1158,7 @@ class OptionSchema(BaseSchema):
1155
1158
  """
1156
1159
  self.set('jobincr', value)
1157
1160
 
1158
- def get_novercheck(self, step: str = None, index: str = None) -> bool:
1161
+ def get_novercheck(self, step: Optional[str] = None, index: Optional[str] = None) -> bool:
1159
1162
  """Gets the version checking disable flag for a step.
1160
1163
 
1161
1164
  Args:
@@ -1167,7 +1170,7 @@ class OptionSchema(BaseSchema):
1167
1170
  """
1168
1171
  return self.get('novercheck', step=step, index=index)
1169
1172
 
1170
- def set_novercheck(self, value: bool, step: str = None, index: str = None):
1173
+ def set_novercheck(self, value: bool, step: Optional[str] = None, index: Optional[str] = None):
1171
1174
  """Sets the version checking disable flag for a step.
1172
1175
 
1173
1176
  Args:
@@ -1177,7 +1180,7 @@ class OptionSchema(BaseSchema):
1177
1180
  """
1178
1181
  self.set('novercheck', value, step=step, index=index)
1179
1182
 
1180
- def get_track(self, step: str = None, index: str = None) -> bool:
1183
+ def get_track(self, step: Optional[str] = None, index: Optional[str] = None) -> bool:
1181
1184
  """Gets the provenance tracking flag for a step.
1182
1185
 
1183
1186
  Args:
@@ -1189,7 +1192,7 @@ class OptionSchema(BaseSchema):
1189
1192
  """
1190
1193
  return self.get('track', step=step, index=index)
1191
1194
 
1192
- def set_track(self, value: bool, step: str = None, index: str = None):
1195
+ def set_track(self, value: bool, step: Optional[str] = None, index: Optional[str] = None):
1193
1196
  """Sets the provenance tracking flag for a step.
1194
1197
 
1195
1198
  Args:
@@ -1199,7 +1202,7 @@ class OptionSchema(BaseSchema):
1199
1202
  """
1200
1203
  self.set('track', value, step=step, index=index)
1201
1204
 
1202
- def get_continue(self, step: str = None, index: str = None) -> bool:
1205
+ def get_continue(self, step: Optional[str] = None, index: Optional[str] = None) -> bool:
1203
1206
  """Gets the continue-on-error flag for a step.
1204
1207
 
1205
1208
  Args:
@@ -1211,7 +1214,7 @@ class OptionSchema(BaseSchema):
1211
1214
  """
1212
1215
  return self.get('continue', step=step, index=index)
1213
1216
 
1214
- def set_continue(self, value: bool, step: str = None, index: str = None):
1217
+ def set_continue(self, value: bool, step: Optional[str] = None, index: Optional[str] = None):
1215
1218
  """Sets the continue-on-error flag for a step.
1216
1219
 
1217
1220
  Args:
@@ -1221,7 +1224,7 @@ class OptionSchema(BaseSchema):
1221
1224
  """
1222
1225
  self.set('continue', value, step=step, index=index)
1223
1226
 
1224
- def get_timeout(self, step: str = None, index: str = None) -> float:
1227
+ def get_timeout(self, step: Optional[str] = None, index: Optional[str] = None) -> float:
1225
1228
  """Gets the timeout value for a step in seconds.
1226
1229
 
1227
1230
  Args:
@@ -1233,7 +1236,7 @@ class OptionSchema(BaseSchema):
1233
1236
  """
1234
1237
  return self.get('timeout', step=step, index=index)
1235
1238
 
1236
- def set_timeout(self, value: float, step: str = None, index: str = None):
1239
+ def set_timeout(self, value: float, step: Optional[str] = None, index: Optional[str] = None):
1237
1240
  """Sets the timeout value for a step in seconds.
1238
1241
 
1239
1242
  Args:
@@ -392,7 +392,8 @@ class PathSchema(PathSchemaBase):
392
392
  resolver = Resolver.find_resolver(path)
393
393
  return resolver(name, schema._parent(root=True), path, tag).get_path()
394
394
 
395
- def _find_files_dataroot_resolvers(self) -> Dict[str, Union[str, Callable]]:
395
+ def _find_files_dataroot_resolvers(self, resolvers: bool = False) \
396
+ -> Dict[str, Union[str, Callable]]:
396
397
  """
397
398
  Returns a dictionary of path resolvers data directory handling for find_files
398
399
 
@@ -410,7 +411,11 @@ class PathSchema(PathSchemaBase):
410
411
  path = BaseSchema.get(schema, "dataroot", dataroot, "path")
411
412
  tag = BaseSchema.get(schema, "dataroot", dataroot, "tag")
412
413
  resolver = Resolver.find_resolver(path)
413
- resolver_map[dataroot] = resolver(dataroot, schema_root, path, tag).get_path
414
+ resolver_obj = resolver(dataroot, schema_root, path, tag)
415
+ if resolvers:
416
+ resolver_map[dataroot] = resolver_obj
417
+ else:
418
+ resolver_map[dataroot] = resolver_obj.get_path
414
419
  return resolver_map
415
420
 
416
421
  @contextlib.contextmanager
@@ -12,7 +12,7 @@ from typing import Dict, Union, List, Optional, Set, Tuple
12
12
  from datetime import datetime, timezone
13
13
  from enum import Enum
14
14
 
15
- from siliconcompiler.schema import BaseSchema
15
+ from siliconcompiler.schema import BaseSchema, LazyLoad
16
16
  from siliconcompiler.schema import EditableSchema, Parameter, PerNode, Scope
17
17
  from siliconcompiler.schema.utils import trim
18
18
 
@@ -53,7 +53,8 @@ class RecordSchema(BaseSchema):
53
53
 
54
54
  def _from_dict(self, manifest: Dict,
55
55
  keypath: Union[List[str], Tuple[str, ...]],
56
- version: Optional[Tuple[int, ...]] = None) \
56
+ version: Optional[Tuple[int, ...]] = None,
57
+ lazyload: LazyLoad = LazyLoad.ON) \
57
58
  -> Tuple[Set[Tuple[str, ...]], Set[Tuple[str, ...]]]:
58
59
  """
59
60
  Constructs a schema from a dictionary.
@@ -66,10 +67,10 @@ class RecordSchema(BaseSchema):
66
67
  Returns:
67
68
  dict: The constructed dictionary.
68
69
  """
69
- ret = super()._from_dict(manifest, keypath, version)
70
+ ret = super()._from_dict(manifest, keypath, version=version, lazyload=lazyload)
70
71
 
71
72
  # Correct for change specification
72
- if version and version < (0, 50, 4):
73
+ if not lazyload.is_enforced and version and version < (0, 50, 4):
73
74
  for timekey in RecordTime:
74
75
  start_param = self.get(timekey.value, field=None)
75
76
  for value, step, index in start_param.getvalues():
@@ -3,7 +3,9 @@ from siliconcompiler import ASIC
3
3
  from siliconcompiler.flows import asicflow, synflow
4
4
 
5
5
  from lambdapdk.asap7.libs.asap7sc7p5t import ASAP7SC7p5RVT, ASAP7SC7p5SLVT, ASAP7SC7p5LVT
6
- from lambdapdk.asap7.libs.fakeram7 import FakeRAM7Lambdalib_SinglePort, FakeRAM7Lambdalib_DoublePort
6
+ from lambdapdk.asap7.libs.fakeram7 import FakeRAM7Lambdalib_SinglePort, \
7
+ FakeRAM7Lambdalib_DoublePort, \
8
+ FakeRAM7Lambdalib_TrueDoublePort
7
9
  from lambdapdk.asap7.libs.fakeio7 import FakeIO7Lambdalib_IO
8
10
 
9
11
 
@@ -101,4 +103,5 @@ def asap7_demo(
101
103
  # for demonstration and academic purposes.
102
104
  FakeRAM7Lambdalib_SinglePort.alias(project)
103
105
  FakeRAM7Lambdalib_DoublePort.alias(project)
106
+ FakeRAM7Lambdalib_TrueDoublePort.alias(project)
104
107
  FakeIO7Lambdalib_IO.alias(project)