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.
- siliconcompiler/_metadata.py +1 -1
- siliconcompiler/apps/sc_install.py +1 -1
- siliconcompiler/apps/sc_issue.py +8 -16
- siliconcompiler/apps/smake.py +106 -100
- siliconcompiler/checklist.py +349 -91
- siliconcompiler/design.py +8 -1
- siliconcompiler/flowgraph.py +419 -130
- siliconcompiler/flows/showflow.py +1 -2
- siliconcompiler/library.py +6 -5
- siliconcompiler/package/https.py +10 -5
- siliconcompiler/project.py +87 -37
- siliconcompiler/remote/client.py +17 -6
- siliconcompiler/scheduler/scheduler.py +284 -59
- siliconcompiler/scheduler/schedulernode.py +154 -102
- siliconcompiler/schema/__init__.py +3 -2
- siliconcompiler/schema/_metadata.py +1 -1
- siliconcompiler/schema/baseschema.py +210 -93
- siliconcompiler/schema/namedschema.py +21 -13
- siliconcompiler/schema/parameter.py +8 -1
- siliconcompiler/schema/safeschema.py +18 -7
- siliconcompiler/schema_support/dependencyschema.py +23 -3
- siliconcompiler/schema_support/filesetschema.py +10 -4
- siliconcompiler/schema_support/option.py +37 -34
- siliconcompiler/schema_support/pathschema.py +7 -2
- siliconcompiler/schema_support/record.py +5 -4
- siliconcompiler/targets/asap7_demo.py +4 -1
- siliconcompiler/tool.py +100 -8
- siliconcompiler/tools/__init__.py +10 -7
- siliconcompiler/tools/bambu/convert.py +19 -0
- siliconcompiler/tools/builtin/__init__.py +3 -2
- siliconcompiler/tools/builtin/filter.py +108 -0
- siliconcompiler/tools/builtin/importfiles.py +154 -0
- siliconcompiler/tools/execute/exec_input.py +4 -3
- siliconcompiler/tools/gtkwave/show.py +6 -2
- siliconcompiler/tools/icarus/compile.py +1 -0
- siliconcompiler/tools/klayout/scripts/klayout_show.py +1 -1
- siliconcompiler/tools/klayout/show.py +17 -5
- siliconcompiler/tools/openroad/screenshot.py +0 -1
- siliconcompiler/tools/openroad/scripts/common/screenshot.tcl +1 -1
- siliconcompiler/tools/openroad/scripts/common/write_images.tcl +2 -0
- siliconcompiler/tools/openroad/show.py +10 -0
- siliconcompiler/tools/surfer/show.py +7 -2
- siliconcompiler/tools/verilator/compile.py +2 -2
- siliconcompiler/tools/yosys/prepareLib.py +7 -2
- siliconcompiler/tools/yosys/syn_asic.py +20 -2
- siliconcompiler/toolscripts/_tools.json +5 -5
- siliconcompiler/toolscripts/rhel9/{install-yosys-wildebeest.sh → install-wildebeest.sh} +5 -5
- siliconcompiler/toolscripts/ubuntu22/{install-yosys-wildebeest.sh → install-wildebeest.sh} +5 -5
- siliconcompiler/toolscripts/ubuntu24/{install-yosys-wildebeest.sh → install-wildebeest.sh} +5 -5
- siliconcompiler/utils/__init__.py +1 -2
- siliconcompiler/utils/issue.py +38 -45
- {siliconcompiler-0.35.1.dist-info → siliconcompiler-0.35.3.dist-info}/METADATA +4 -4
- {siliconcompiler-0.35.1.dist-info → siliconcompiler-0.35.3.dist-info}/RECORD +57 -55
- {siliconcompiler-0.35.1.dist-info → siliconcompiler-0.35.3.dist-info}/WHEEL +0 -0
- {siliconcompiler-0.35.1.dist-info → siliconcompiler-0.35.3.dist-info}/entry_points.txt +0 -0
- {siliconcompiler-0.35.1.dist-info → siliconcompiler-0.35.3.dist-info}/licenses/LICENSE +0 -0
- {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
|
|
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
|
-
|
|
67
|
-
|
|
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
|
|
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
|
|
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],
|
|
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],
|
|
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],
|
|
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
|
|
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
|
-
|
|
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,
|
|
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)
|