opencos-eda 0.2.48__tar.gz → 0.2.50__tar.gz

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 (100) hide show
  1. {opencos_eda-0.2.48/opencos_eda.egg-info → opencos_eda-0.2.50}/PKG-INFO +1 -1
  2. opencos_eda-0.2.50/opencos/__init__.py +6 -0
  3. opencos_eda-0.2.50/opencos/_version.py +19 -0
  4. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/commands/flist.py +8 -7
  5. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/commands/multi.py +14 -15
  6. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/commands/sim.py +5 -0
  7. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/commands/sweep.py +3 -2
  8. opencos_eda-0.2.50/opencos/deps/defaults.py +69 -0
  9. opencos_eda-0.2.50/opencos/deps/deps_commands.py +419 -0
  10. opencos_eda-0.2.50/opencos/deps/deps_file.py +326 -0
  11. opencos_eda-0.2.50/opencos/deps/deps_processor.py +670 -0
  12. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/deps_schema.py +7 -8
  13. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/eda.py +84 -64
  14. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/eda_base.py +585 -316
  15. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/eda_config.py +85 -14
  16. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/eda_config_defaults.yml +36 -4
  17. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/eda_extract_targets.py +22 -14
  18. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/eda_tool_helper.py +33 -7
  19. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/export_helper.py +166 -86
  20. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/export_json_convert.py +31 -23
  21. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/files.py +2 -1
  22. {opencos_eda-0.2.48/opencos → opencos_eda-0.2.50/opencos/hw}/oc_cli.py +9 -4
  23. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/names.py +0 -4
  24. opencos_eda-0.2.50/opencos/peakrdl_cleanup.py +26 -0
  25. opencos_eda-0.2.50/opencos/seed.py +36 -0
  26. opencos_eda-0.2.50/opencos/tests/deps_files/no_deps_here/DEPS.yml +0 -0
  27. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tests/helpers.py +3 -2
  28. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tests/test_deps_helpers.py +35 -32
  29. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tests/test_eda.py +36 -29
  30. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tests/test_eda_elab.py +7 -4
  31. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tests/test_eda_synth.py +1 -1
  32. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tests/test_oc_cli.py +1 -1
  33. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tests/test_tools.py +4 -2
  34. opencos_eda-0.2.50/opencos/tools/__init__.py +0 -0
  35. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tools/iverilog.py +2 -2
  36. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tools/modelsim_ase.py +24 -2
  37. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tools/questa.py +5 -3
  38. opencos_eda-0.2.50/opencos/tools/questa_fse.py +57 -0
  39. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tools/riviera.py +1 -1
  40. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tools/slang.py +9 -3
  41. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tools/surelog.py +1 -1
  42. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tools/verilator.py +26 -1
  43. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tools/vivado.py +34 -27
  44. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tools/yosys.py +4 -3
  45. opencos_eda-0.2.50/opencos/util.py +889 -0
  46. opencos_eda-0.2.50/opencos/utils/__init__.py +0 -0
  47. opencos_eda-0.2.50/opencos/utils/markup_helpers.py +98 -0
  48. opencos_eda-0.2.50/opencos/utils/str_helpers.py +111 -0
  49. opencos_eda-0.2.50/opencos/utils/subprocess_helpers.py +108 -0
  50. {opencos_eda-0.2.48 → opencos_eda-0.2.50/opencos_eda.egg-info}/PKG-INFO +1 -1
  51. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos_eda.egg-info/SOURCES.txt +13 -3
  52. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos_eda.egg-info/entry_points.txt +1 -1
  53. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/pyproject.toml +8 -3
  54. opencos_eda-0.2.48/opencos/__init__.py +0 -4
  55. opencos_eda-0.2.48/opencos/_version.py +0 -16
  56. opencos_eda-0.2.48/opencos/deps_helpers.py +0 -1346
  57. opencos_eda-0.2.48/opencos/peakrdl_cleanup.py +0 -20
  58. opencos_eda-0.2.48/opencos/seed.py +0 -28
  59. opencos_eda-0.2.48/opencos/util.py +0 -831
  60. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/LICENSE +0 -0
  61. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/LICENSE.spdx +0 -0
  62. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/README.md +0 -0
  63. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/_waves_pkg.sv +0 -0
  64. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/commands/__init__.py +0 -0
  65. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/commands/build.py +0 -0
  66. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/commands/elab.py +0 -0
  67. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/commands/export.py +0 -0
  68. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/commands/lec.py +0 -0
  69. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/commands/open.py +0 -0
  70. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/commands/proj.py +0 -0
  71. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/commands/shell.py +0 -0
  72. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/commands/synth.py +0 -0
  73. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/commands/targets.py +0 -0
  74. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/commands/upload.py +0 -0
  75. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/commands/waves.py +0 -0
  76. {opencos_eda-0.2.48/opencos/tests → opencos_eda-0.2.50/opencos/deps}/__init__.py +0 -0
  77. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/eda_config_max_verilator_waivers.yml +0 -0
  78. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/eda_config_reduced.yml +0 -0
  79. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/eda_deps_bash_completion.bash +0 -0
  80. {opencos_eda-0.2.48/opencos/tools → opencos_eda-0.2.50/opencos/hw}/__init__.py +0 -0
  81. {opencos_eda-0.2.48/opencos → opencos_eda-0.2.50/opencos/hw}/pcie.py +0 -0
  82. /opencos_eda-0.2.48/opencos/tests/deps_files/no_deps_here/DEPS.yml → /opencos_eda-0.2.50/opencos/tests/__init__.py +0 -0
  83. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tests/custom_config.yml +0 -0
  84. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tests/deps_files/command_order/DEPS.yml +0 -0
  85. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tests/deps_files/error_msgs/DEPS.yml +0 -0
  86. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tests/deps_files/iverilog_test/DEPS.yml +0 -0
  87. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tests/deps_files/non_sv_reqs/DEPS.yml +0 -0
  88. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tests/deps_files/tags_with_tools/DEPS.yml +0 -0
  89. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tests/deps_files/test_err_fatal/DEPS.yml +0 -0
  90. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tests/test_build.py +0 -0
  91. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tests/test_deps_schema.py +0 -0
  92. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tools/invio.py +0 -0
  93. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tools/invio_helpers.py +0 -0
  94. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tools/invio_yosys.py +0 -0
  95. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tools/slang_yosys.py +0 -0
  96. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos/tools/tabbycad_yosys.py +0 -0
  97. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos_eda.egg-info/dependency_links.txt +0 -0
  98. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos_eda.egg-info/requires.txt +0 -0
  99. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/opencos_eda.egg-info/top_level.txt +0 -0
  100. {opencos_eda-0.2.48 → opencos_eda-0.2.50}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opencos-eda
3
- Version: 0.2.48
3
+ Version: 0.2.50
4
4
  Summary: A simple Python package for wrapping RTL simuliatons and synthesis
5
5
  Author-email: Simon Sabato <simon@cognichip.ai>, Drew Ranck <drew@cognichip.ai>
6
6
  Project-URL: Homepage, https://github.com/cognichip/opencos
@@ -0,0 +1,6 @@
1
+ '''__init__ package for opencos.'''
2
+
3
+ from ._version import VERSION, NAME
4
+
5
+ __version__ = VERSION
6
+ __pyproject_name__ = NAME
@@ -0,0 +1,19 @@
1
+ ''' private helper package for `eda --version`'''
2
+
3
+ import sys
4
+
5
+ NAME = 'opencos-eda'
6
+
7
+ # Use standard library metadata module starting Python 3.8
8
+ if sys.version_info >= (3, 8):
9
+
10
+ from importlib import metadata
11
+ try:
12
+ VERSION = metadata.version(NAME)
13
+ except metadata.PackageNotFoundError:
14
+ # Handle case where the package is not installed (e.g., running from source checkout)
15
+ VERSION = "0.0.0"
16
+
17
+ else:
18
+ # This package only supports >= 3.8, so not doing the importlib_metadata method.
19
+ VERSION = "unknown" # Or raise an error, or handle differently
@@ -9,6 +9,7 @@ import os
9
9
 
10
10
  from opencos import util
11
11
  from opencos.eda_base import CommandDesign
12
+ from opencos.utils.str_helpers import strip_all_quotes
12
13
 
13
14
  class CommandFList(CommandDesign):
14
15
  '''Base class command handler for: eda flist ...'''
@@ -140,14 +141,14 @@ class CommandFList(CommandDesign):
140
141
  if self.args['emit-non-sources']:
141
142
  if self.files_non_source:
142
143
  print('## reqs (non-source files that are dependencies):', file=fo)
143
- prefix = util.strip_all_quotes(self.args['prefix-non-sources'])
144
+ prefix = strip_all_quotes(self.args['prefix-non-sources'])
144
145
  for f in self.files_non_source:
145
146
  if self.args['emit-rel-path']:
146
147
  f = os.path.relpath(f)
147
148
  print('## ' + prefix + pq1 + f + pq2, file=fo)
148
149
 
149
150
  if self.args['emit-define']:
150
- prefix = util.strip_all_quotes(self.args['prefix-define'])
151
+ prefix = strip_all_quotes(self.args['prefix-define'])
151
152
  for d, value in self.defines.items():
152
153
  if value is None:
153
154
  newline = prefix + d
@@ -176,31 +177,31 @@ class CommandFList(CommandDesign):
176
177
  print(newline, file=fo)
177
178
 
178
179
  if self.args['emit-incdir']:
179
- prefix = util.strip_all_quotes(self.args['prefix-incdir'])
180
+ prefix = strip_all_quotes(self.args['prefix-incdir'])
180
181
  for i in self.incdirs:
181
182
  if self.args['emit-rel-path']:
182
183
  i = os.path.relpath(i)
183
184
  print(prefix + pq1 + i + pq2, file=fo)
184
185
  if self.args['emit-v']:
185
- prefix = util.strip_all_quotes(self.args['prefix-v'])
186
+ prefix = strip_all_quotes(self.args['prefix-v'])
186
187
  for f in self.files_v:
187
188
  if self.args['emit-rel-path']:
188
189
  f = os.path.relpath(f)
189
190
  print(prefix + pq1 + f + pq2, file=fo)
190
191
  if self.args['emit-sv']:
191
- prefix = util.strip_all_quotes(self.args['prefix-sv'])
192
+ prefix = strip_all_quotes(self.args['prefix-sv'])
192
193
  for f in self.files_sv:
193
194
  if self.args['emit-rel-path']:
194
195
  f = os.path.relpath(f)
195
196
  print(prefix + pq1 + f + pq2, file=fo)
196
197
  if self.args['emit-vhd']:
197
- prefix = util.strip_all_quotes(self.args['prefix-vhd'])
198
+ prefix = strip_all_quotes(self.args['prefix-vhd'])
198
199
  for f in self.files_vhd:
199
200
  if self.args['emit-rel-path']:
200
201
  f = os.path.relpath(f)
201
202
  print(prefix + pq1 + f + pq2, file=fo)
202
203
  if self.args['emit-cpp']:
203
- prefix = util.strip_all_quotes(self.args['prefix-cpp'])
204
+ prefix = strip_all_quotes(self.args['prefix-cpp'])
204
205
  for f in self.files_cpp:
205
206
  if self.args['emit-rel-path']:
206
207
  f = os.path.relpath(f)
@@ -9,10 +9,12 @@ import os
9
9
  import shutil
10
10
  from pathlib import Path
11
11
 
12
- from opencos import util, eda_base, deps_helpers, eda_config, export_helper, \
12
+ from opencos import util, eda_base, eda_config, export_helper, \
13
13
  eda_tool_helper
14
- from opencos.deps_helpers import get_deps_markup_file, deps_markup_safe_load
15
14
  from opencos.eda_base import CommandParallel, get_eda_exec
15
+ from opencos.deps.deps_file import get_deps_markup_file, deps_markup_safe_load, \
16
+ deps_data_get_all_targets, deps_list_target_sanitize
17
+ from opencos.utils.str_helpers import fnmatch_or_re, dep_str2list
16
18
 
17
19
  class CommandMulti(CommandParallel):
18
20
  '''eda.py command handler for: eda multi <command> <args,targets,target-globs,...>'''
@@ -109,17 +111,17 @@ class CommandMulti(CommandParallel):
109
111
  if self.path_hidden_or_work_dir(path):
110
112
  continue
111
113
 
112
- deps_markup_file = deps_helpers.get_deps_markup_file(path)
114
+ deps_markup_file = get_deps_markup_file(path)
113
115
  if deps_markup_file:
114
- data = deps_helpers.deps_markup_safe_load(deps_markup_file)
115
- deps_targets = deps_helpers.deps_data_get_all_targets(data)
116
+ data = deps_markup_safe_load(deps_markup_file)
117
+ deps_targets = deps_data_get_all_targets(data)
116
118
  rel_path = os.path.relpath(path)
117
119
 
118
120
  debug(f'in {rel_path=} looking for {target_pattern=} in {deps_targets=}')
119
121
 
120
122
  for t in deps_targets:
121
123
  if target_pattern_needs_lookup:
122
- matched = deps_helpers.fnmatch_or_re(pattern=target_pattern, string=t)
124
+ matched = fnmatch_or_re(pattern=target_pattern, string=t)
123
125
  else:
124
126
  matched = t == target_pattern
125
127
  if matched:
@@ -176,14 +178,11 @@ class CommandMulti(CommandParallel):
176
178
  all_multi_tools = self.multi_which_tools(command)
177
179
 
178
180
  deps_file = get_deps_markup_file(base_path)
179
- data = None
181
+ data = {}
180
182
  if self.config['deps_markup_supported'] and deps_file:
181
183
  data = deps_markup_safe_load(deps_file)
182
184
 
183
- if data is None:
184
- data = {}
185
-
186
- deps_targets = deps_helpers.deps_data_get_all_targets(data)
185
+ deps_targets = deps_data_get_all_targets(data)
187
186
  deps_file_defaults = data.get('DEFAULTS', {})
188
187
 
189
188
  # Loop through all the targets in DEPS.yml, skipping DEFAULTS
@@ -196,7 +195,7 @@ class CommandMulti(CommandParallel):
196
195
  # Since we support a few schema flavors for a target (our
197
196
  # 'target_node' key in a DEPS.yml file) santize the entry
198
197
  # so it's a {} with a 'deps' key:
199
- entry_sanitized = deps_helpers.deps_list_target_sanitize(
198
+ entry_sanitized = deps_list_target_sanitize(
200
199
  entry, target_node=target_node, deps_file=deps_file
201
200
  )
202
201
 
@@ -229,8 +228,8 @@ class CommandMulti(CommandParallel):
229
228
 
230
229
  commands = x.get('commands', [])
231
230
  tools = x.get('tools', [])
232
- ignore_commands_list = deps_helpers.dep_str2list(commands)
233
- ignore_tools_list = deps_helpers.dep_str2list(tools)
231
+ ignore_commands_list = dep_str2list(commands)
232
+ ignore_tools_list = dep_str2list(tools)
234
233
 
235
234
  debug(f"{ignore_tools_list=}, {ignore_commands_list=} {target_node=}")
236
235
  debug(f"{command=} --> {all_multi_tools=}")
@@ -591,7 +590,7 @@ class CommandToolsMulti(CommandMulti):
591
590
  def multi_which_tools(self, command):
592
591
  '''Overrides CommandMulti.multi_which_tool(command), return a list of all
593
592
  possible tools that can run this command'''
594
- if self.tools is None or len(self.tools) == 0:
593
+ if self.tools is None or not self.tools:
595
594
  # wasn't set via arg --tools, so use all if possible for this command.
596
595
  which_tools = self.all_handler_commands.get(command, [])
597
596
  else:
@@ -177,6 +177,11 @@ class CommandSim(CommandDesign):
177
177
  filename=log_fname, bad_strings=bad_strings, must_strings=must_strings,
178
178
  use_bad_strings=use_bad_strings, use_must_strings=use_must_strings
179
179
  )
180
+ if log_fname:
181
+ self.artifacts_add(
182
+ name=os.path.join(self.args['work-dir'], log_fname),
183
+ typ='text', description='Simulator stdout/stderr log file'
184
+ )
180
185
 
181
186
  def do_export(self) -> None:
182
187
  '''CommandSim helper for handling args --export*
@@ -8,6 +8,7 @@ import re
8
8
 
9
9
  from opencos import util
10
10
  from opencos.eda_base import CommandDesign, CommandParallel, get_eda_exec, which_tool
11
+ from opencos.utils.str_helpers import strip_outer_quotes
11
12
 
12
13
  class CommandSweep(CommandDesign, CommandParallel):
13
14
  '''Command handler for: eda sweep ...'''
@@ -77,7 +78,7 @@ class CommandSweep(CommandDesign, CommandParallel):
77
78
 
78
79
  for sweep_arg_value in self.args['sweep']:
79
80
  # Deal with --sweep= args we already parsed, but haven't expanded yet.
80
- sweep_arg_value = util.strip_outer_quotes(sweep_arg_value)
81
+ sweep_arg_value = strip_outer_quotes(sweep_arg_value)
81
82
  sweep_axis_list_entry = self._process_sweep_arg(sweep_arg_value=sweep_arg_value)
82
83
  if sweep_axis_list_entry:
83
84
  sweep_axis_list.append(sweep_axis_list_entry)
@@ -136,7 +137,7 @@ class CommandSweep(CommandDesign, CommandParallel):
136
137
  Return value is {} or {'lhs': str, 'operator': str (+ or =), 'values': list}
137
138
  '''
138
139
 
139
- sweep_arg_value = util.strip_outer_quotes(sweep_arg_value)
140
+ sweep_arg_value = strip_outer_quotes(sweep_arg_value)
140
141
 
141
142
  util.debug(f'{sweep_arg_value=}')
142
143
  # Try to match a sweep range expansion:
@@ -0,0 +1,69 @@
1
+ ''' opencos.deps.defaults -- pymodule for defaults referenced by other modules here'''
2
+
3
+
4
+ DEPS_FILE_EXTS = set([
5
+ '.yml', '.yaml', '.toml', '.json',
6
+ # Treat no extension DEPS as YAML.
7
+ ''
8
+ ])
9
+
10
+ ROOT_TABLE_KEYS_NOT_TARGETS = set([
11
+ "DEFAULTS",
12
+ "METADATA",
13
+ ])
14
+
15
+ KNOWN_EDA_COMMANDS = set([
16
+ "sim",
17
+ "elab",
18
+ "synth",
19
+ "flist",
20
+ "proj",
21
+ "multi",
22
+ "tools-multi",
23
+ "sweep",
24
+ "build",
25
+ "waves",
26
+ "upload",
27
+ "open",
28
+ "export",
29
+ ])
30
+
31
+ SUPPORTED_TARGET_TABLE_KEYS = set([
32
+ 'args',
33
+ 'defines',
34
+ 'incdirs',
35
+ 'top',
36
+ 'deps',
37
+ 'reqs',
38
+ 'multi',
39
+ 'tags',
40
+ 'commands'] + list(KNOWN_EDA_COMMANDS))
41
+
42
+ SUPPORTED_DEP_KEYS_BY_TYPE = {
43
+ dict: set(['commands']),
44
+ str: set(['*']),
45
+ }
46
+
47
+ SUPPORTED_TAG_KEYS = set([
48
+ 'with-tools',
49
+ 'with-args',
50
+ 'args',
51
+ 'deps',
52
+ 'reqs',
53
+ 'defines',
54
+ 'incdirs',
55
+ 'replace-config-tools',
56
+ 'additive-config-tools',
57
+ ])
58
+
59
+ SUPPORTED_COMMAND_KEYS = set([
60
+ 'shell',
61
+ 'work-dir-add-srcs', 'work-dir-add-sources',
62
+ 'peakrdl',
63
+ 'run-from-work-dir', # default True
64
+ 'filepath-subst-target-dir', # default True
65
+ 'dirpath-subst-target-dir', # default False
66
+ 'var-subst-args',
67
+ 'var-subst-os-env',
68
+ 'tee',
69
+ ])