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
siliconcompiler/checklist.py
CHANGED
|
@@ -1,21 +1,247 @@
|
|
|
1
1
|
import re
|
|
2
|
-
|
|
3
2
|
import os.path
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import Tuple, List, Optional, Union, Dict, Iterable
|
|
4
5
|
|
|
5
|
-
from
|
|
6
|
-
|
|
7
|
-
from siliconcompiler.schema import NamedSchema
|
|
8
|
-
from siliconcompiler.schema import EditableSchema, Parameter, Scope, BaseSchema
|
|
6
|
+
from siliconcompiler.schema import NamedSchema, EditableSchema, Parameter, Scope, BaseSchema
|
|
9
7
|
from siliconcompiler.schema.utils import trim
|
|
10
|
-
|
|
11
8
|
from siliconcompiler import NodeStatus, utils
|
|
12
9
|
|
|
13
10
|
|
|
11
|
+
class Criteria(NamedSchema):
|
|
12
|
+
"""
|
|
13
|
+
Schema for defining a single checklist item's criteria.
|
|
14
|
+
|
|
15
|
+
This class holds all the configurable parameters for a specific checklist
|
|
16
|
+
item, such as its description, requirements, validation criteria,
|
|
17
|
+
and associated reports or waivers.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
def __init__(self, name: Optional[str] = None):
|
|
21
|
+
super().__init__()
|
|
22
|
+
self.set_name(name)
|
|
23
|
+
schema_checklist(self)
|
|
24
|
+
|
|
25
|
+
def get_description(self) -> Optional[str]:
|
|
26
|
+
"""
|
|
27
|
+
Retrieves the short, one-line description of the checklist item.
|
|
28
|
+
|
|
29
|
+
Returns:
|
|
30
|
+
Optional[str]: The description string, or None if not set.
|
|
31
|
+
"""
|
|
32
|
+
return self.get('description')
|
|
33
|
+
|
|
34
|
+
def set_description(self, value: Optional[str]) -> None:
|
|
35
|
+
"""
|
|
36
|
+
Sets the short, one-line description for the checklist item.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
value (Optional[str]): The description string to set.
|
|
40
|
+
"""
|
|
41
|
+
self.set('description', value)
|
|
42
|
+
|
|
43
|
+
def get_requirement(self) -> Optional[str]:
|
|
44
|
+
"""
|
|
45
|
+
Retrieves the detailed requirement description for the checklist item.
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
Optional[str]: The requirement description, which can be a
|
|
49
|
+
multi-line string, or None if not set.
|
|
50
|
+
"""
|
|
51
|
+
return self.get('requirement')
|
|
52
|
+
|
|
53
|
+
def set_requirement(self, value: Optional[str]) -> None:
|
|
54
|
+
"""
|
|
55
|
+
Sets the detailed requirement description for the checklist item.
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
value (Optional[str]): The requirement description to set.
|
|
59
|
+
"""
|
|
60
|
+
self.set('requirement', value)
|
|
61
|
+
|
|
62
|
+
def get_dataformat(self) -> Optional[str]:
|
|
63
|
+
"""
|
|
64
|
+
Retrieves the description of acceptable data file formats.
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
Optional[str]: A free-text description of the data format,
|
|
68
|
+
or None if not set.
|
|
69
|
+
"""
|
|
70
|
+
return self.get('dataformat')
|
|
71
|
+
|
|
72
|
+
def set_dataformat(self, value: Optional[str]):
|
|
73
|
+
"""
|
|
74
|
+
Sets the description of acceptable data file formats for signoff.
|
|
75
|
+
|
|
76
|
+
Args:
|
|
77
|
+
value (Optional[str]): A free-text description of the data format.
|
|
78
|
+
"""
|
|
79
|
+
self.set('dataformat', value)
|
|
80
|
+
|
|
81
|
+
def get_rationale(self) -> List[str]:
|
|
82
|
+
"""
|
|
83
|
+
Retrieves the rationale codes or descriptions for the checklist item.
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
List[str]: A list of rationale strings.
|
|
87
|
+
"""
|
|
88
|
+
return self.get('rationale')
|
|
89
|
+
|
|
90
|
+
def add_rationale(self, value: Union[List[str], str], clobber: bool = False) -> None:
|
|
91
|
+
"""
|
|
92
|
+
Adds one or more rationale codes or descriptions to the checklist item.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
value (Union[List[str], str]): A single rationale string or a list of strings.
|
|
96
|
+
clobber (bool): If True, replaces the existing list with the new value.
|
|
97
|
+
If False, appends to the existing list. Defaults to False.
|
|
98
|
+
"""
|
|
99
|
+
if clobber:
|
|
100
|
+
self.set('rationale', value)
|
|
101
|
+
else:
|
|
102
|
+
self.add('rationale', value)
|
|
103
|
+
|
|
104
|
+
def get_criteria(self) -> List[str]:
|
|
105
|
+
"""
|
|
106
|
+
Retrieves the list of signoff criteria.
|
|
107
|
+
|
|
108
|
+
Each criterion is a string in the format 'metric op value'
|
|
109
|
+
(e.g., 'errors == 0').
|
|
110
|
+
|
|
111
|
+
Returns:
|
|
112
|
+
List[str]: A list of criteria strings.
|
|
113
|
+
"""
|
|
114
|
+
return self.get('criteria')
|
|
115
|
+
|
|
116
|
+
def add_criteria(self, value: Union[List[str], str], clobber: bool = False) -> None:
|
|
117
|
+
"""
|
|
118
|
+
Adds one or more signoff criteria to the checklist item.
|
|
119
|
+
|
|
120
|
+
Args:
|
|
121
|
+
value (Union[List[str], str]): A single criterion string or a list of strings.
|
|
122
|
+
clobber (bool): If True, replaces the existing list with the new value.
|
|
123
|
+
If False, appends to the existing list. Defaults to False.
|
|
124
|
+
"""
|
|
125
|
+
if clobber:
|
|
126
|
+
self.set('criteria', value)
|
|
127
|
+
else:
|
|
128
|
+
self.add('criteria', value)
|
|
129
|
+
|
|
130
|
+
def get_task(self) -> List[Tuple[str, str, str]]:
|
|
131
|
+
"""
|
|
132
|
+
Retrieves the flowgraph tasks used to verify this checklist item.
|
|
133
|
+
|
|
134
|
+
Each task is represented as a tuple of (job, step, index).
|
|
135
|
+
|
|
136
|
+
Returns:
|
|
137
|
+
List[Tuple[str, str, str]]: A list of task tuples.
|
|
138
|
+
"""
|
|
139
|
+
return self.get('task')
|
|
140
|
+
|
|
141
|
+
def add_task(self, value: Union[List[Tuple[str, str, str]], Tuple[str, str, str]],
|
|
142
|
+
clobber: bool = False) -> None:
|
|
143
|
+
"""
|
|
144
|
+
Adds one or more flowgraph tasks to verify the checklist item.
|
|
145
|
+
|
|
146
|
+
Args:
|
|
147
|
+
value (Union[List[Tuple], Tuple]): A single task tuple or a list of tuples.
|
|
148
|
+
clobber (bool): If True, replaces the existing list with the new value.
|
|
149
|
+
If False, appends to the existing list. Defaults to False.
|
|
150
|
+
"""
|
|
151
|
+
if clobber:
|
|
152
|
+
self.set('task', value)
|
|
153
|
+
else:
|
|
154
|
+
self.add('task', value)
|
|
155
|
+
|
|
156
|
+
def get_report(self) -> List[str]:
|
|
157
|
+
"""
|
|
158
|
+
Retrieves the list of report filepaths documenting validation.
|
|
159
|
+
|
|
160
|
+
Returns:
|
|
161
|
+
List[str]: A list of filepaths.
|
|
162
|
+
"""
|
|
163
|
+
return self.get('report')
|
|
164
|
+
|
|
165
|
+
def add_report(self, value: Union[List[str], str], clobber: bool = False) -> None:
|
|
166
|
+
"""
|
|
167
|
+
Adds one or more report filepaths to the checklist item.
|
|
168
|
+
|
|
169
|
+
Args:
|
|
170
|
+
value (Union[List[str], str]): A single filepath string or a list of strings.
|
|
171
|
+
clobber (bool): If True, replaces the existing list with the new value.
|
|
172
|
+
If False, appends to the existing list. Defaults to False.
|
|
173
|
+
"""
|
|
174
|
+
if clobber:
|
|
175
|
+
self.set('report', value)
|
|
176
|
+
else:
|
|
177
|
+
self.add('report', value)
|
|
178
|
+
|
|
179
|
+
def get_waiver(self, metric: str) -> List[Union[Path, str]]:
|
|
180
|
+
"""
|
|
181
|
+
Retrieves waiver report files for a specific metric.
|
|
182
|
+
|
|
183
|
+
Args:
|
|
184
|
+
metric (str): The metric for which to retrieve waivers.
|
|
185
|
+
|
|
186
|
+
Returns:
|
|
187
|
+
List[Union[Path, str]]: A list of filepaths for the specified metric's waivers.
|
|
188
|
+
"""
|
|
189
|
+
return self.get('waiver', metric)
|
|
190
|
+
|
|
191
|
+
def add_waiver(self, metric: str, value: Union[List[Union[Path, str]], Union[Path, str]],
|
|
192
|
+
clobber: bool = False) -> None:
|
|
193
|
+
"""
|
|
194
|
+
Adds one or more waiver reports for a specific metric.
|
|
195
|
+
|
|
196
|
+
Args:
|
|
197
|
+
metric (str): The metric to which the waiver applies.
|
|
198
|
+
value (Union[List, Path, str]): A single filepath or a list of filepaths.
|
|
199
|
+
clobber (bool): If True, replaces the existing list with the new value.
|
|
200
|
+
If False, appends to the existing list. Defaults to False.
|
|
201
|
+
"""
|
|
202
|
+
if clobber:
|
|
203
|
+
self.set('waiver', metric, value)
|
|
204
|
+
else:
|
|
205
|
+
self.add('waiver', metric, value)
|
|
206
|
+
|
|
207
|
+
def get_ok(self) -> bool:
|
|
208
|
+
"""
|
|
209
|
+
Retrieves the manual 'ok' status of the checklist item.
|
|
210
|
+
|
|
211
|
+
A value of True indicates a human has reviewed and approved the item.
|
|
212
|
+
|
|
213
|
+
Returns:
|
|
214
|
+
bool: The boolean status, or False if not set.
|
|
215
|
+
"""
|
|
216
|
+
return self.get('ok')
|
|
217
|
+
|
|
218
|
+
def set_ok(self, value: bool) -> None:
|
|
219
|
+
"""
|
|
220
|
+
Sets the manual 'ok' status of the checklist item.
|
|
221
|
+
|
|
222
|
+
Args:
|
|
223
|
+
value (bool): The boolean status to set. True indicates approval.
|
|
224
|
+
"""
|
|
225
|
+
self.set('ok', value)
|
|
226
|
+
|
|
227
|
+
@classmethod
|
|
228
|
+
def _getdict_type(cls) -> str:
|
|
229
|
+
"""
|
|
230
|
+
Internal method to return the type name for dictionary representation.
|
|
231
|
+
"""
|
|
232
|
+
return Criteria.__name__
|
|
233
|
+
|
|
234
|
+
|
|
14
235
|
class Checklist(NamedSchema):
|
|
15
236
|
"""
|
|
16
|
-
A class for managing design
|
|
237
|
+
A class for managing a collection of design checklist items and their verification.
|
|
238
|
+
|
|
239
|
+
This class acts as a container for multiple `Criteria` objects, each
|
|
240
|
+
representing an item in a design checklist (e.g., 'ISO D000'). It provides
|
|
241
|
+
methods to define, access, and automatically verify these items against
|
|
242
|
+
flow results.
|
|
17
243
|
"""
|
|
18
|
-
def __init__(self, name=None):
|
|
244
|
+
def __init__(self, name: Optional[str] = None):
|
|
19
245
|
"""
|
|
20
246
|
Initializes the Checklist object.
|
|
21
247
|
|
|
@@ -24,41 +250,80 @@ class Checklist(NamedSchema):
|
|
|
24
250
|
"""
|
|
25
251
|
super().__init__()
|
|
26
252
|
self.set_name(name)
|
|
253
|
+
EditableSchema(self).insert("default", Criteria())
|
|
27
254
|
|
|
28
|
-
|
|
255
|
+
def make_criteria(self, name: str) -> Criteria:
|
|
256
|
+
"""
|
|
257
|
+
Creates a new, named `Criteria` item within this checklist.
|
|
29
258
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
Check items in a checklist.
|
|
259
|
+
Args:
|
|
260
|
+
name (str): The unique name for the new checklist item.
|
|
33
261
|
|
|
34
|
-
|
|
35
|
-
|
|
262
|
+
Returns:
|
|
263
|
+
Criteria: The newly created `Criteria` object.
|
|
36
264
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
265
|
+
Raises:
|
|
266
|
+
ValueError: If a criteria item with the same name already exists.
|
|
267
|
+
"""
|
|
268
|
+
if name in self.getkeys():
|
|
269
|
+
raise ValueError(f"{name} has already been defined")
|
|
270
|
+
return self.get(name, field="schema")
|
|
42
271
|
|
|
43
|
-
|
|
44
|
-
|
|
272
|
+
def get_criteria(self, name: Optional[str] = None) -> Union[Dict[str, Criteria], Criteria]:
|
|
273
|
+
"""
|
|
274
|
+
Retrieves one or all `Criteria` items from the checklist.
|
|
45
275
|
|
|
46
|
-
|
|
47
|
-
|
|
276
|
+
If a name is provided, it returns the specific `Criteria` object.
|
|
277
|
+
If no name is provided, it returns a dictionary of all `Criteria` objects.
|
|
48
278
|
|
|
49
279
|
Args:
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
verbose (bool): Whether to print passing criteria.
|
|
53
|
-
require_reports (bool): Whether to assert the presence of reports.
|
|
280
|
+
name (Optional[str], optional): The name of the item to retrieve.
|
|
281
|
+
Defaults to None.
|
|
54
282
|
|
|
55
283
|
Returns:
|
|
56
|
-
|
|
284
|
+
Union[Dict[str, Criteria], Criteria]: A single `Criteria` object
|
|
285
|
+
or a dictionary mapping names to `Criteria` objects.
|
|
286
|
+
|
|
287
|
+
Raises:
|
|
288
|
+
ValueError: If a name is provided but is not found in the checklist.
|
|
289
|
+
"""
|
|
290
|
+
if name is None:
|
|
291
|
+
criteria: Dict[str, Criteria] = {}
|
|
292
|
+
for item in self.getkeys():
|
|
293
|
+
criteria[item] = self.get_criteria(item)
|
|
294
|
+
return criteria
|
|
295
|
+
if name not in self.getkeys():
|
|
296
|
+
raise ValueError(f"{name} is not defined")
|
|
297
|
+
return self.get(name, field="schema")
|
|
298
|
+
|
|
299
|
+
def check(self, items: Optional[Iterable[str]] = None,
|
|
300
|
+
check_ok: bool = False,
|
|
301
|
+
require_reports: bool = True) -> bool:
|
|
302
|
+
"""
|
|
303
|
+
Checks the status of items in a checklist against flow results.
|
|
304
|
+
|
|
305
|
+
This method validates checklist items by comparing their defined
|
|
306
|
+
criteria against metrics recorded in the chip's history. For an item
|
|
307
|
+
to pass, all its criteria must be met by the associated tasks,
|
|
308
|
+
considering any waivers.
|
|
309
|
+
|
|
310
|
+
For items with automated checks (linked to a task), this method verifies
|
|
311
|
+
that metric values from the flow run satisfy the criteria (e.g., 'errors == 0').
|
|
312
|
+
It also ensures that corresponding EDA reports were generated.
|
|
313
|
+
|
|
314
|
+
For items without a task, it only checks that a report has been manually added.
|
|
57
315
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
316
|
+
Args:
|
|
317
|
+
items (Optional[Iterable[str]]): A list of item names to check. If None,
|
|
318
|
+
all items in the checklist are checked. Defaults to None.
|
|
319
|
+
check_ok (bool): If True, all checked items must also have their 'ok'
|
|
320
|
+
parameter set to True, indicating manual review. Defaults to False.
|
|
321
|
+
require_reports (bool): If True, asserts that report files exist for
|
|
322
|
+
all automated checks. Defaults to True.
|
|
323
|
+
|
|
324
|
+
Returns:
|
|
325
|
+
bool: True if all specified checks pass, False otherwise.
|
|
326
|
+
"""
|
|
62
327
|
error = False
|
|
63
328
|
|
|
64
329
|
schema_root = self._parent(root=True)
|
|
@@ -73,7 +338,7 @@ class Checklist(NamedSchema):
|
|
|
73
338
|
if items is None:
|
|
74
339
|
items = self.getkeys()
|
|
75
340
|
|
|
76
|
-
#
|
|
341
|
+
# These metrics are recorded by SC internally, so they don't have reports.
|
|
77
342
|
metrics_without_reports = (
|
|
78
343
|
'tasktime',
|
|
79
344
|
'totaltime',
|
|
@@ -88,11 +353,10 @@ class Checklist(NamedSchema):
|
|
|
88
353
|
continue
|
|
89
354
|
|
|
90
355
|
allow_missing_reports = True
|
|
91
|
-
|
|
92
356
|
has_check = False
|
|
357
|
+
item_criteria: Criteria = self.get_criteria(item)
|
|
93
358
|
|
|
94
|
-
|
|
95
|
-
for criteria in all_criteria:
|
|
359
|
+
for criteria in item_criteria.get_criteria():
|
|
96
360
|
m = re.match(r'^(\w+)\s*([\>\=\<]+)\s*([+\-]?\d+(\.\d+)?(e[+\-]?\d+)?)$',
|
|
97
361
|
criteria.strip())
|
|
98
362
|
if not m:
|
|
@@ -104,10 +368,8 @@ class Checklist(NamedSchema):
|
|
|
104
368
|
if metric not in metrics_without_reports:
|
|
105
369
|
allow_missing_reports = False
|
|
106
370
|
|
|
107
|
-
|
|
108
|
-
for job, step, index in tasks:
|
|
371
|
+
for job, step, index in item_criteria.get_task():
|
|
109
372
|
job_data = schema_root.history(job)
|
|
110
|
-
|
|
111
373
|
flow = job_data.get("flowgraph", job_data.get('option', 'flow'), field="schema")
|
|
112
374
|
|
|
113
375
|
if (step, index) not in flow.get_nodes():
|
|
@@ -131,15 +393,14 @@ class Checklist(NamedSchema):
|
|
|
131
393
|
if metric not in job_data.getkeys("metric"):
|
|
132
394
|
if logger:
|
|
133
395
|
logger.error(f"Criteria must use legal metrics only: {criteria}")
|
|
134
|
-
|
|
135
|
-
|
|
396
|
+
error = True
|
|
397
|
+
continue
|
|
136
398
|
|
|
137
399
|
if job_data.get("metric", metric, field='type') == 'int':
|
|
138
400
|
goal = int(m.group(3))
|
|
139
401
|
number_format = 'd'
|
|
140
402
|
else:
|
|
141
403
|
goal = float(m.group(3))
|
|
142
|
-
|
|
143
404
|
if goal == 0.0 or (abs(goal) > 1e-3 and abs(goal) < 1e5):
|
|
144
405
|
number_format = '.3f'
|
|
145
406
|
else:
|
|
@@ -147,10 +408,8 @@ class Checklist(NamedSchema):
|
|
|
147
408
|
|
|
148
409
|
value = job_data.get('metric', metric, step=step, index=index)
|
|
149
410
|
criteria_ok = utils.safecompare(value, op, goal)
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
else:
|
|
153
|
-
waivers = []
|
|
411
|
+
waivers = item_criteria.get_waiver(metric) \
|
|
412
|
+
if metric in item_criteria.getkeys("waiver") else []
|
|
154
413
|
|
|
155
414
|
criteria_str = f'{metric}{op}{goal:{number_format}}'
|
|
156
415
|
compare_str = f'{value:{number_format}}{op}{goal:{number_format}}'
|
|
@@ -164,17 +423,16 @@ class Checklist(NamedSchema):
|
|
|
164
423
|
logger.error(f'{item} criteria {criteria_str} ({compare_str}) unmet '
|
|
165
424
|
f'by {step_desc}.')
|
|
166
425
|
error = True
|
|
167
|
-
elif criteria_ok:
|
|
168
|
-
|
|
169
|
-
logger.info(f'{item} criteria {criteria_str} met by {step_desc}.')
|
|
426
|
+
elif criteria_ok and logger:
|
|
427
|
+
logger.info(f'{item} criteria {criteria_str} met by {step_desc}.')
|
|
170
428
|
|
|
171
|
-
has_reports =
|
|
172
|
-
job_data.valid('tool', tool, 'task', task, 'report', metric) and
|
|
429
|
+
has_reports = (
|
|
430
|
+
job_data.valid('tool', tool, 'task', task, 'report', metric) and
|
|
173
431
|
job_data.get('tool', tool, 'task', task, 'report', metric,
|
|
174
432
|
step=step, index=index)
|
|
433
|
+
)
|
|
175
434
|
|
|
176
435
|
if allow_missing_reports and not has_reports:
|
|
177
|
-
# No reports available and it is allowed
|
|
178
436
|
continue
|
|
179
437
|
|
|
180
438
|
reports = []
|
|
@@ -190,28 +448,23 @@ class Checklist(NamedSchema):
|
|
|
190
448
|
|
|
191
449
|
if require_reports and not reports:
|
|
192
450
|
if logger:
|
|
193
|
-
logger.error(f'No reports generated for metric {metric} in '
|
|
194
|
-
f'{step_desc}')
|
|
451
|
+
logger.error(f'No reports generated for metric {metric} in {step_desc}')
|
|
195
452
|
error = True
|
|
196
453
|
|
|
197
454
|
for report in reports:
|
|
198
455
|
if not report:
|
|
199
456
|
continue
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
self.add(item, 'report', report)
|
|
457
|
+
report_path = os.path.relpath(report, cwd)
|
|
458
|
+
if report_path not in item_criteria.get_report():
|
|
459
|
+
item_criteria.add_report(report_path)
|
|
204
460
|
|
|
205
461
|
if has_check:
|
|
206
|
-
if require_reports and
|
|
207
|
-
not allow_missing_reports and \
|
|
208
|
-
not self.get(item, 'report'):
|
|
209
|
-
# TODO: validate that report exists?
|
|
462
|
+
if require_reports and not allow_missing_reports and not item_criteria.get_report():
|
|
210
463
|
if logger:
|
|
211
464
|
logger.error(f'No report documenting item {item}')
|
|
212
465
|
error = True
|
|
213
466
|
|
|
214
|
-
if check_ok and not
|
|
467
|
+
if check_ok and not item_criteria.get_ok():
|
|
215
468
|
if logger:
|
|
216
469
|
logger.error(f"Item {item} 'ok' field not checked")
|
|
217
470
|
error = True
|
|
@@ -224,15 +477,17 @@ class Checklist(NamedSchema):
|
|
|
224
477
|
@classmethod
|
|
225
478
|
def _getdict_type(cls) -> str:
|
|
226
479
|
"""
|
|
227
|
-
|
|
480
|
+
Internal method to return the type name for dictionary representation.
|
|
228
481
|
"""
|
|
229
|
-
|
|
230
482
|
return Checklist.__name__
|
|
231
483
|
|
|
232
484
|
def _generate_doc(self, doc,
|
|
233
485
|
ref_root: str = "",
|
|
234
486
|
key_offset: Optional[Tuple[str, ...]] = None,
|
|
235
487
|
detailed: bool = True):
|
|
488
|
+
"""
|
|
489
|
+
Internal method to generate documentation for the checklist schema.
|
|
490
|
+
"""
|
|
236
491
|
from .schema.docs.utils import build_section
|
|
237
492
|
settings = build_section('Configuration', f"{ref_root}-config")
|
|
238
493
|
|
|
@@ -254,22 +509,25 @@ class Checklist(NamedSchema):
|
|
|
254
509
|
|
|
255
510
|
|
|
256
511
|
############################################
|
|
257
|
-
# Design Checklist
|
|
512
|
+
# Design Checklist Schema Definition
|
|
258
513
|
############################################
|
|
259
|
-
def schema_checklist(schema):
|
|
514
|
+
def schema_checklist(schema: Criteria):
|
|
260
515
|
"""
|
|
261
|
-
Adds checklist
|
|
516
|
+
Adds standard checklist parameters to a Criteria schema object.
|
|
517
|
+
|
|
518
|
+
This function defines the common set of parameters that make up a checklist
|
|
519
|
+
item, such as 'description', 'criteria', 'report', etc., and adds them to
|
|
520
|
+
the provided schema.
|
|
262
521
|
|
|
263
522
|
Args:
|
|
264
|
-
schema (
|
|
523
|
+
schema (Criteria): The Criteria schema object to modify.
|
|
265
524
|
"""
|
|
266
|
-
|
|
525
|
+
edit = EditableSchema(schema)
|
|
267
526
|
|
|
268
|
-
item = 'default'
|
|
269
527
|
metric = 'default'
|
|
270
528
|
|
|
271
|
-
|
|
272
|
-
|
|
529
|
+
edit.insert(
|
|
530
|
+
'description',
|
|
273
531
|
Parameter(
|
|
274
532
|
'str',
|
|
275
533
|
scope=Scope.GLOBAL,
|
|
@@ -281,8 +539,8 @@ def schema_checklist(schema):
|
|
|
281
539
|
help=trim("""
|
|
282
540
|
A short one line description of the checklist item.""")))
|
|
283
541
|
|
|
284
|
-
|
|
285
|
-
|
|
542
|
+
edit.insert(
|
|
543
|
+
'requirement',
|
|
286
544
|
Parameter(
|
|
287
545
|
'str',
|
|
288
546
|
scope=Scope.GLOBAL,
|
|
@@ -295,8 +553,8 @@ def schema_checklist(schema):
|
|
|
295
553
|
A complete requirement description of the checklist item
|
|
296
554
|
entered as a multi-line string.""")))
|
|
297
555
|
|
|
298
|
-
|
|
299
|
-
|
|
556
|
+
edit.insert(
|
|
557
|
+
'dataformat',
|
|
300
558
|
Parameter(
|
|
301
559
|
'str',
|
|
302
560
|
scope=Scope.GLOBAL,
|
|
@@ -309,8 +567,8 @@ def schema_checklist(schema):
|
|
|
309
567
|
Free text description of the type of data files acceptable as
|
|
310
568
|
checklist signoff validation.""")))
|
|
311
569
|
|
|
312
|
-
|
|
313
|
-
|
|
570
|
+
edit.insert(
|
|
571
|
+
'rationale',
|
|
314
572
|
Parameter(
|
|
315
573
|
'[str]',
|
|
316
574
|
scope=Scope.GLOBAL,
|
|
@@ -324,8 +582,8 @@ def schema_checklist(schema):
|
|
|
324
582
|
unique alphanumeric code used by the standard or a short one line
|
|
325
583
|
or single word description.""")))
|
|
326
584
|
|
|
327
|
-
|
|
328
|
-
|
|
585
|
+
edit.insert(
|
|
586
|
+
'criteria',
|
|
329
587
|
Parameter(
|
|
330
588
|
'[str]',
|
|
331
589
|
scope=Scope.GLOBAL,
|
|
@@ -337,11 +595,11 @@ def schema_checklist(schema):
|
|
|
337
595
|
help=trim("""
|
|
338
596
|
Simple list of signoff criteria for checklist item which
|
|
339
597
|
must all be met for signoff. Each signoff criteria consists of
|
|
340
|
-
a metric, a relational operator, and a value in the form
|
|
598
|
+
a metric, a relational operator, and a value in the form
|
|
341
599
|
'metric op value'.""")))
|
|
342
600
|
|
|
343
|
-
|
|
344
|
-
|
|
601
|
+
edit.insert(
|
|
602
|
+
'task',
|
|
345
603
|
Parameter(
|
|
346
604
|
'[(str,str,str)]',
|
|
347
605
|
scope=Scope.GLOBAL,
|
|
@@ -355,8 +613,8 @@ def schema_checklist(schema):
|
|
|
355
613
|
The parameter should be left empty for manual and for tool
|
|
356
614
|
flows that bypass the SC infrastructure.""")))
|
|
357
615
|
|
|
358
|
-
|
|
359
|
-
|
|
616
|
+
edit.insert(
|
|
617
|
+
'report',
|
|
360
618
|
Parameter(
|
|
361
619
|
'[file]',
|
|
362
620
|
scope=Scope.GLOBAL,
|
|
@@ -369,8 +627,8 @@ def schema_checklist(schema):
|
|
|
369
627
|
Filepath to report(s) of specified type documenting the successful
|
|
370
628
|
validation of the checklist item.""")))
|
|
371
629
|
|
|
372
|
-
|
|
373
|
-
|
|
630
|
+
edit.insert(
|
|
631
|
+
'waiver', metric,
|
|
374
632
|
Parameter(
|
|
375
633
|
'[file]',
|
|
376
634
|
scope=Scope.GLOBAL,
|
|
@@ -383,8 +641,8 @@ def schema_checklist(schema):
|
|
|
383
641
|
Filepath to report(s) documenting waivers for the checklist
|
|
384
642
|
item specified on a per metric basis.""")))
|
|
385
643
|
|
|
386
|
-
|
|
387
|
-
|
|
644
|
+
edit.insert(
|
|
645
|
+
'ok',
|
|
388
646
|
Parameter(
|
|
389
647
|
'bool',
|
|
390
648
|
scope=Scope.GLOBAL,
|
|
@@ -396,4 +654,4 @@ def schema_checklist(schema):
|
|
|
396
654
|
help=trim("""
|
|
397
655
|
Boolean check mark for the checklist item. A value of
|
|
398
656
|
True indicates a human has inspected the all item dictionary
|
|
399
|
-
parameters check out.""")))
|
|
657
|
+
parameters and verified they check out.""")))
|
siliconcompiler/design.py
CHANGED
|
@@ -16,7 +16,7 @@ from siliconcompiler.schema.utils import trim
|
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
###########################################################################
|
|
19
|
-
class Design(
|
|
19
|
+
class Design(DependencySchema, LibrarySchema):
|
|
20
20
|
'''
|
|
21
21
|
Schema for a 'design'.
|
|
22
22
|
|
|
@@ -34,6 +34,11 @@ class Design(LibrarySchema, DependencySchema):
|
|
|
34
34
|
name (str, optional): The name of the design. Defaults to None.
|
|
35
35
|
'''
|
|
36
36
|
super().__init__()
|
|
37
|
+
|
|
38
|
+
# Mark for copy to ensure proper remote processing
|
|
39
|
+
fs_file: Parameter = self.get("fileset", "default", "file", "default", field=None)
|
|
40
|
+
fs_file.set(True, field="copy")
|
|
41
|
+
|
|
37
42
|
self.set_name(name)
|
|
38
43
|
|
|
39
44
|
schema_design(self)
|
|
@@ -860,6 +865,7 @@ def schema_design(schema: Design):
|
|
|
860
865
|
Parameter(
|
|
861
866
|
['dir'],
|
|
862
867
|
scope=Scope.GLOBAL,
|
|
868
|
+
copy=True,
|
|
863
869
|
shorthelp="Include file search paths",
|
|
864
870
|
example=[
|
|
865
871
|
"api: design.set('fileset', 'rtl', 'idir', './rtl')",
|
|
@@ -899,6 +905,7 @@ def schema_design(schema: Design):
|
|
|
899
905
|
Parameter(
|
|
900
906
|
['dir'],
|
|
901
907
|
scope=Scope.GLOBAL,
|
|
908
|
+
copy=True,
|
|
902
909
|
shorthelp="Library search paths",
|
|
903
910
|
example=[
|
|
904
911
|
"api: design.set('fileset', 'rtl', 'libdir', '/usr/lib')"],
|