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
@@ -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 typing import Tuple, Optional
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 checklists and their verification.
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
- schema_checklist(self)
255
+ def make_criteria(self, name: str) -> Criteria:
256
+ """
257
+ Creates a new, named `Criteria` item within this checklist.
29
258
 
30
- def check(self, items=None, check_ok=False, require_reports=True):
31
- '''
32
- Check items in a checklist.
259
+ Args:
260
+ name (str): The unique name for the new checklist item.
33
261
 
34
- Checks the status of items in a checklist for the standard provided. If
35
- a specific list of items is unspecified, all items are checked.
262
+ Returns:
263
+ Criteria: The newly created `Criteria` object.
36
264
 
37
- All items have an associated 'task' parameter, which indicates which
38
- tasks can be used to automatically validate the item. For an item to be
39
- checked, all tasks must satisfy the item's criteria, unless waivers are
40
- provided. In addition, that task must have generated EDA report files
41
- for each metric in the criteria.
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
- For items without an associated task, the only requirement is that at
44
- least one report has been added to that item.
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
- When 'check_ok' is True, every item must also have its 'ok' parameter
47
- set to True, indicating that a human has reviewed the item.
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
- items (list of str): Items to check from standard.
51
- check_ok (bool): Whether to check item 'ok' parameter.
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
- Status of item check.
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
- Examples:
59
- >>> status = check.check_checklist('d000')
60
- Returns status.
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
- # these tasks are recorded by SC so there are no reports
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
- all_criteria = self.get(item, 'criteria')
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
- tasks = self.get(item, 'task')
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
- error = True
135
- continue
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
- if metric in self.getkeys(item, 'waiver'):
151
- waivers = self.get(item, 'waiver', metric)
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
- if logger:
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
- report = os.path.relpath(report, cwd)
202
- if report not in self.get(item, 'report'):
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 self.get(item, 'ok'):
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
- Returns the meta data for getdict
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 schema parameters to the given schema.
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 (EditableSchema): The schema to modify.
523
+ schema (Criteria): The Criteria schema object to modify.
265
524
  """
266
- schema = EditableSchema(schema)
525
+ edit = EditableSchema(schema)
267
526
 
268
- item = 'default'
269
527
  metric = 'default'
270
528
 
271
- schema.insert(
272
- item, 'description',
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
- schema.insert(
285
- item, 'requirement',
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
- schema.insert(
299
- item, 'dataformat',
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
- schema.insert(
313
- item, 'rationale',
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
- schema.insert(
328
- item, 'criteria',
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
- schema.insert(
344
- item, 'task',
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
- schema.insert(
359
- item, 'report',
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
- schema.insert(
373
- item, 'waiver', metric,
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
- schema.insert(
387
- item, 'ok',
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(LibrarySchema, DependencySchema):
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')"],