opencos-eda 0.2.48__py3-none-any.whl → 0.2.49__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.
- opencos/__init__.py +4 -2
- opencos/_version.py +10 -7
- opencos/commands/flist.py +8 -7
- opencos/commands/multi.py +13 -14
- opencos/commands/sweep.py +3 -2
- opencos/deps/__init__.py +0 -0
- opencos/deps/defaults.py +69 -0
- opencos/deps/deps_commands.py +419 -0
- opencos/deps/deps_file.py +326 -0
- opencos/deps/deps_processor.py +670 -0
- opencos/deps_schema.py +7 -8
- opencos/eda.py +84 -64
- opencos/eda_base.py +572 -316
- opencos/eda_config.py +80 -14
- opencos/eda_extract_targets.py +22 -14
- opencos/eda_tool_helper.py +33 -7
- opencos/export_helper.py +166 -86
- opencos/export_json_convert.py +31 -23
- opencos/files.py +2 -1
- opencos/hw/__init__.py +0 -0
- opencos/{oc_cli.py → hw/oc_cli.py} +9 -4
- opencos/names.py +0 -4
- opencos/peakrdl_cleanup.py +13 -7
- opencos/seed.py +19 -11
- opencos/tests/helpers.py +3 -2
- opencos/tests/test_deps_helpers.py +35 -32
- opencos/tests/test_eda.py +36 -29
- opencos/tests/test_eda_elab.py +5 -3
- opencos/tests/test_eda_synth.py +1 -1
- opencos/tests/test_oc_cli.py +1 -1
- opencos/tests/test_tools.py +3 -2
- opencos/tools/iverilog.py +2 -2
- opencos/tools/modelsim_ase.py +2 -2
- opencos/tools/riviera.py +1 -1
- opencos/tools/slang.py +1 -1
- opencos/tools/surelog.py +1 -1
- opencos/tools/verilator.py +1 -1
- opencos/tools/vivado.py +1 -1
- opencos/tools/yosys.py +4 -3
- opencos/util.py +374 -468
- opencos/utils/__init__.py +0 -0
- opencos/utils/markup_helpers.py +98 -0
- opencos/utils/str_helpers.py +111 -0
- opencos/utils/subprocess_helpers.py +108 -0
- {opencos_eda-0.2.48.dist-info → opencos_eda-0.2.49.dist-info}/METADATA +1 -1
- opencos_eda-0.2.49.dist-info/RECORD +88 -0
- {opencos_eda-0.2.48.dist-info → opencos_eda-0.2.49.dist-info}/entry_points.txt +1 -1
- opencos/deps_helpers.py +0 -1346
- opencos_eda-0.2.48.dist-info/RECORD +0 -79
- /opencos/{pcie.py → hw/pcie.py} +0 -0
- {opencos_eda-0.2.48.dist-info → opencos_eda-0.2.49.dist-info}/WHEEL +0 -0
- {opencos_eda-0.2.48.dist-info → opencos_eda-0.2.49.dist-info}/licenses/LICENSE +0 -0
- {opencos_eda-0.2.48.dist-info → opencos_eda-0.2.49.dist-info}/licenses/LICENSE.spdx +0 -0
- {opencos_eda-0.2.48.dist-info → opencos_eda-0.2.49.dist-info}/top_level.txt +0 -0
opencos/__init__.py
CHANGED
opencos/_version.py
CHANGED
|
@@ -1,16 +1,19 @@
|
|
|
1
|
+
''' private helper package for `eda --version`'''
|
|
2
|
+
|
|
1
3
|
import sys
|
|
2
4
|
|
|
3
5
|
NAME = 'opencos-eda'
|
|
4
6
|
|
|
5
7
|
# Use standard library metadata module starting Python 3.8
|
|
6
8
|
if sys.version_info >= (3, 8):
|
|
9
|
+
|
|
7
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
|
+
|
|
8
17
|
else:
|
|
9
18
|
# This package only supports >= 3.8, so not doing the importlib_metadata method.
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
try:
|
|
13
|
-
version = metadata.version(NAME)
|
|
14
|
-
except metadata.PackageNotFoundError:
|
|
15
|
-
# Handle case where the package is not installed (e.g., running from source checkout)
|
|
16
|
-
version = "0.0.0"
|
|
19
|
+
VERSION = "unknown" # Or raise an error, or handle differently
|
opencos/commands/flist.py
CHANGED
|
@@ -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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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)
|
opencos/commands/multi.py
CHANGED
|
@@ -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,
|
|
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 =
|
|
114
|
+
deps_markup_file = get_deps_markup_file(path)
|
|
113
115
|
if deps_markup_file:
|
|
114
|
-
data =
|
|
115
|
-
deps_targets =
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
233
|
-
ignore_tools_list =
|
|
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=}")
|
opencos/commands/sweep.py
CHANGED
|
@@ -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 =
|
|
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 =
|
|
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:
|
opencos/deps/__init__.py
ADDED
|
File without changes
|
opencos/deps/defaults.py
ADDED
|
@@ -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
|
+
])
|