opencos-eda 0.2.50__py3-none-any.whl → 0.2.52__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/commands/lec.py +7 -4
- opencos/commands/shell.py +11 -8
- opencos/commands/sim.py +38 -22
- opencos/commands/waves.py +12 -2
- opencos/deps/deps_file.py +67 -14
- opencos/eda.py +28 -3
- opencos/eda_base.py +39 -18
- opencos/eda_config.py +1 -0
- opencos/eda_config_defaults.yml +38 -14
- opencos/eda_deps_sanitize.py +73 -0
- opencos/tests/test_tools.py +195 -1
- opencos/tools/cocotb.py +483 -0
- opencos/tools/questa_fse.py +2 -0
- opencos/tools/verilator.py +31 -0
- opencos/tools/yosys.py +21 -5
- opencos/util.py +30 -5
- opencos/utils/markup_helpers.py +31 -2
- opencos/utils/status_constants.py +27 -0
- opencos/utils/vscode_helper.py +47 -0
- opencos/utils/vsim_helper.py +55 -0
- {opencos_eda-0.2.50.dist-info → opencos_eda-0.2.52.dist-info}/METADATA +2 -1
- {opencos_eda-0.2.50.dist-info → opencos_eda-0.2.52.dist-info}/RECORD +27 -22
- {opencos_eda-0.2.50.dist-info → opencos_eda-0.2.52.dist-info}/entry_points.txt +1 -0
- {opencos_eda-0.2.50.dist-info → opencos_eda-0.2.52.dist-info}/WHEEL +0 -0
- {opencos_eda-0.2.50.dist-info → opencos_eda-0.2.52.dist-info}/licenses/LICENSE +0 -0
- {opencos_eda-0.2.50.dist-info → opencos_eda-0.2.52.dist-info}/licenses/LICENSE.spdx +0 -0
- {opencos_eda-0.2.50.dist-info → opencos_eda-0.2.52.dist-info}/top_level.txt +0 -0
opencos/util.py
CHANGED
|
@@ -16,6 +16,8 @@ from enum import Enum
|
|
|
16
16
|
from pathlib import Path
|
|
17
17
|
from importlib import import_module
|
|
18
18
|
|
|
19
|
+
from opencos.utils import status_constants
|
|
20
|
+
|
|
19
21
|
global_exit_allowed = False # pylint: disable=invalid-name
|
|
20
22
|
progname = "UNKNOWN" # pylint: disable=invalid-name
|
|
21
23
|
progname_in_message = True # pylint: disable=invalid-name
|
|
@@ -32,6 +34,8 @@ args = { # pylint: disable=invalid-name
|
|
|
32
34
|
'artifacts-json': True,
|
|
33
35
|
}
|
|
34
36
|
|
|
37
|
+
max_error_code = 0 # pylint: disable=invalid-name
|
|
38
|
+
|
|
35
39
|
class Colors:
|
|
36
40
|
'''Namespace class for color printing help'''
|
|
37
41
|
red = "\x1B[31m"
|
|
@@ -191,17 +195,20 @@ class Artifacts:
|
|
|
191
195
|
return # do nothing if we have no artifacts
|
|
192
196
|
|
|
193
197
|
# Update all file sizes:
|
|
198
|
+
remove_keys = set()
|
|
194
199
|
for key, entry in self.data.items():
|
|
195
200
|
if os.path.isfile(entry['name']):
|
|
196
201
|
entry['size'] = os.path.getsize(entry['name'])
|
|
197
202
|
else:
|
|
198
203
|
# file doesn't exist, remove it from artifacts.
|
|
199
204
|
warning(f'Removing {key} ({entry["name"]}) from artifacts (file does not exist)')
|
|
200
|
-
|
|
205
|
+
remove_keys.add(key)
|
|
206
|
+
for key in remove_keys:
|
|
207
|
+
del self.data[key]
|
|
201
208
|
|
|
202
209
|
with open(self.artifacts_json_filepath, 'w', encoding='utf-8') as f:
|
|
203
210
|
json.dump(self.data, f, indent=4)
|
|
204
|
-
|
|
211
|
+
info(f'Wrote artifacts JSON: {self.artifacts_json_filepath}')
|
|
205
212
|
|
|
206
213
|
|
|
207
214
|
artifacts = Artifacts()
|
|
@@ -217,6 +224,7 @@ class UtilLogger:
|
|
|
217
224
|
# util's argparser: --no-default-log, --logfile=<name>, or --force-logfile=<name>
|
|
218
225
|
default_log_enabled = False
|
|
219
226
|
default_log_filepath = os.path.join('eda.work', 'eda.log')
|
|
227
|
+
enable = True
|
|
220
228
|
|
|
221
229
|
def clear(self) -> None:
|
|
222
230
|
'''Resets internals'''
|
|
@@ -234,6 +242,9 @@ class UtilLogger:
|
|
|
234
242
|
|
|
235
243
|
def start(self, filename: str, force: bool = False) -> None:
|
|
236
244
|
'''Starts (opens) log'''
|
|
245
|
+
if not self.enable:
|
|
246
|
+
self.file = None
|
|
247
|
+
return
|
|
237
248
|
if not filename:
|
|
238
249
|
error('Trying to start a logfile, but filename is missing')
|
|
239
250
|
return
|
|
@@ -414,20 +425,20 @@ def process_tokens(tokens:list) -> (argparse.Namespace, list):
|
|
|
414
425
|
elif parsed.logfile:
|
|
415
426
|
start_log(parsed.logfile, force=False)
|
|
416
427
|
elif parsed.default_log and \
|
|
428
|
+
not parsed.version and \
|
|
417
429
|
not any(x in unparsed for x in ('help', '-h', '--help')) and \
|
|
418
430
|
(parsed.force_logfile is None and parsed.logfile is None):
|
|
419
431
|
# Use a forced logfile in the eda.work/eda.log:
|
|
420
432
|
# avoid this if someone has --help arg not yet parsed.
|
|
433
|
+
# avoid this if someone called --version, b/c that will print and exit.
|
|
421
434
|
start_log(global_log.default_log_filepath, force=True)
|
|
422
435
|
|
|
423
|
-
|
|
424
436
|
parsed_as_dict = vars(parsed)
|
|
425
437
|
for key,value in parsed_as_dict.items():
|
|
426
438
|
key = key.replace('_', '-')
|
|
427
439
|
if value is not None:
|
|
428
440
|
args[key] = value # only update with non-None values to our global 'args' dict
|
|
429
441
|
|
|
430
|
-
|
|
431
442
|
return parsed, unparsed
|
|
432
443
|
|
|
433
444
|
# ********************
|
|
@@ -616,7 +627,9 @@ def warning(*text, start: object = None, end: str = '\n') -> None:
|
|
|
616
627
|
|
|
617
628
|
|
|
618
629
|
def error(
|
|
619
|
-
*text,
|
|
630
|
+
*text,
|
|
631
|
+
error_code: int = status_constants.EDA_DEFAULT_ERROR,
|
|
632
|
+
do_exit: bool = True, start: object = None, end: str = '\n'
|
|
620
633
|
) -> int:
|
|
621
634
|
'''Print error messaging (in red if possible).
|
|
622
635
|
|
|
@@ -629,9 +642,12 @@ def error(
|
|
|
629
642
|
|
|
630
643
|
Note these messages append to global logging. Increments global args['errors'] int.
|
|
631
644
|
'''
|
|
645
|
+
global max_error_code # pylint: disable=global-statement
|
|
646
|
+
|
|
632
647
|
if start is None:
|
|
633
648
|
start = "ERROR: " + (f"[{progname}] " if progname_in_message else "")
|
|
634
649
|
args['errors'] += 1
|
|
650
|
+
max_error_code = max(max_error_code, error_code)
|
|
635
651
|
print_red(f"{start}{' '.join(list(text))}", end=end)
|
|
636
652
|
if do_exit:
|
|
637
653
|
if args['debug']:
|
|
@@ -644,6 +660,15 @@ def error(
|
|
|
644
660
|
return abs(int(error_code))
|
|
645
661
|
|
|
646
662
|
|
|
663
|
+
def get_return_code() -> int:
|
|
664
|
+
'''Checks global max_error_code and args['errors']'''
|
|
665
|
+
if args['errors']:
|
|
666
|
+
if max_error_code == 0:
|
|
667
|
+
return 255
|
|
668
|
+
return max_error_code
|
|
669
|
+
return 0
|
|
670
|
+
|
|
671
|
+
|
|
647
672
|
def exit( # pylint: disable=redefined-builtin
|
|
648
673
|
error_code: int = 0, quiet: bool = False
|
|
649
674
|
) -> int:
|
opencos/utils/markup_helpers.py
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
''' opencos.utils.markup_helpers - function helpers for YAML, TOML reading and writing'''
|
|
2
2
|
|
|
3
|
+
import json
|
|
4
|
+
import os
|
|
3
5
|
import re
|
|
4
6
|
import shutil
|
|
5
7
|
import subprocess
|
|
@@ -89,10 +91,37 @@ def yaml_safe_load(filepath: str, only_root_line_numbers:bool = False) -> dict:
|
|
|
89
91
|
|
|
90
92
|
|
|
91
93
|
def yaml_safe_writer(data: dict, filepath: str) -> None:
|
|
92
|
-
'''
|
|
93
|
-
|
|
94
|
+
'''Wrapper for yaml.dump, enforces file extension otherwise warning'''
|
|
95
|
+
_, ext = os.path.splitext(filepath)
|
|
96
|
+
if ext.lower() in ('.yml', '.yaml'):
|
|
94
97
|
with open(filepath, 'w', encoding='utf-8') as f:
|
|
95
98
|
yaml.dump(data, f, allow_unicode=True,
|
|
96
99
|
default_flow_style=False, sort_keys=False, encoding='utf-8')
|
|
97
100
|
else:
|
|
98
101
|
warning(f'{filepath=} to be written for this extension not implemented.')
|
|
102
|
+
|
|
103
|
+
def json_writer(data: dict, filepath: str) -> None:
|
|
104
|
+
'''Wrapper for json.dump'''
|
|
105
|
+
with open(filepath, 'w', encoding='utf-8') as f:
|
|
106
|
+
json.dump(data, f, indent=4)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def markup_writer(data: dict, filepath: str) -> None:
|
|
110
|
+
'''Wrapper for yaml_safe_writer or json_writer'''
|
|
111
|
+
_, ext = os.path.splitext(filepath)
|
|
112
|
+
if ext.lower in ('.yml', '.yaml'):
|
|
113
|
+
yaml_safe_writer(data, filepath)
|
|
114
|
+
else:
|
|
115
|
+
json_writer(data, filepath)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def markup_dumper(data: dict, as_yaml: bool = False) -> str:
|
|
119
|
+
'''Returns JSON str; if as_yaml=True returns YAML str, from data'''
|
|
120
|
+
if as_yaml:
|
|
121
|
+
return yaml.dump(
|
|
122
|
+
data=data, allow_unicode=True,
|
|
123
|
+
default_flow_style=False, sort_keys=False
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
# else return JSON:
|
|
127
|
+
return str(json.dumps(data, indent=4))
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
'''opencos.utils.status_constants is a module containing known Error return codes
|
|
2
|
+
|
|
3
|
+
(0 pass, > 0 fail) from eda or other opencos executables.
|
|
4
|
+
'''
|
|
5
|
+
|
|
6
|
+
NO_ERROR = 0
|
|
7
|
+
|
|
8
|
+
PYTHON_EXCEPTION = 1
|
|
9
|
+
|
|
10
|
+
EDA_DEPS_FILE_NOT_FOUND = 10
|
|
11
|
+
EDA_DEPS_TARGET_NOT_FOUND = 11
|
|
12
|
+
|
|
13
|
+
EDA_COMMAND_OR_ARGS_ERROR = 20
|
|
14
|
+
EDA_CONFIG_ERROR = 21
|
|
15
|
+
EDA_COMMAND_MISSING_TOP = 22
|
|
16
|
+
|
|
17
|
+
EDA_SIM_LOG_HAS_BAD_STRING = 30
|
|
18
|
+
EDA_SIM_LOG_MISSING_MUST_STRING = 31
|
|
19
|
+
|
|
20
|
+
EDA_SHELL_LOG_HAS_BAD_STRING = 38
|
|
21
|
+
EDA_SHELL_LOG_MISSING_MUST_STRING = 39
|
|
22
|
+
|
|
23
|
+
EDA_EXEC_NONZERO_RETURN_CODE1 = 41
|
|
24
|
+
EDA_EXEC_NONZERO_RETURN_CODE2 = 42
|
|
25
|
+
EDA_EXEC_NONZERO_RETURN_CODE255 = 255
|
|
26
|
+
|
|
27
|
+
EDA_DEFAULT_ERROR = 255
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
'''Because > 1 tools use the exe 'code', I don't want to run
|
|
2
|
+
|
|
3
|
+
`code --list-extensions --show-versionsvsim -version` for every tool that needs
|
|
4
|
+
to check if they exist in VScode land.
|
|
5
|
+
|
|
6
|
+
Instead, eda.py can call this once, and then query if the VScode extension exists when
|
|
7
|
+
running opencos.eda.auto_tool_setup(..)
|
|
8
|
+
'''
|
|
9
|
+
|
|
10
|
+
import shutil
|
|
11
|
+
import subprocess
|
|
12
|
+
|
|
13
|
+
from opencos.util import debug
|
|
14
|
+
|
|
15
|
+
vscode_path = shutil.which('code')
|
|
16
|
+
|
|
17
|
+
INIT_HAS_RUN = False
|
|
18
|
+
EXTENSIONS = {} # dict of {name: version} for VScode extensions of name
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def init() -> None:
|
|
22
|
+
'''Sets INIT_HAS_RUN=True (only runs once) and one of TOOL_IS[tool] = True'''
|
|
23
|
+
global INIT_HAS_RUN # pylint: disable=global-statement
|
|
24
|
+
|
|
25
|
+
if INIT_HAS_RUN:
|
|
26
|
+
return
|
|
27
|
+
|
|
28
|
+
INIT_HAS_RUN = True
|
|
29
|
+
|
|
30
|
+
if not vscode_path:
|
|
31
|
+
return
|
|
32
|
+
|
|
33
|
+
proc = None
|
|
34
|
+
try:
|
|
35
|
+
proc = subprocess.run([vscode_path, '--list-extensions', '--show-versions'],
|
|
36
|
+
capture_output=True, check=False)
|
|
37
|
+
except Exception as e:
|
|
38
|
+
debug(f'vscode --list-extensions --show-versions: exception {e}')
|
|
39
|
+
|
|
40
|
+
if proc is None or proc.returncode != 0:
|
|
41
|
+
return
|
|
42
|
+
|
|
43
|
+
for line in proc.stdout.decode('utf-8', errors='replace').split('\n'):
|
|
44
|
+
if '@' in line:
|
|
45
|
+
parts = line.split('@')
|
|
46
|
+
if parts[0] and parts[1]:
|
|
47
|
+
EXTENSIONS[parts[0]] = parts[1]
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
'''Because so many tools use the exe vsim, I don't want to run `vsim -version` N times for N
|
|
2
|
+
tools each to figure out if it's full-Questa, Modelsim, QuestaFSE, or Riviera.
|
|
3
|
+
|
|
4
|
+
Instead, eda.py can call this once, and then query if this tool exists when running
|
|
5
|
+
opencos.eda.auto_tool_setup(..)
|
|
6
|
+
'''
|
|
7
|
+
|
|
8
|
+
import shutil
|
|
9
|
+
import subprocess
|
|
10
|
+
|
|
11
|
+
from opencos.util import debug
|
|
12
|
+
|
|
13
|
+
vsim_path = shutil.which('vsim')
|
|
14
|
+
|
|
15
|
+
INIT_HAS_RUN = False
|
|
16
|
+
TOOL_IS = {
|
|
17
|
+
'riviera': False,
|
|
18
|
+
'modelsim_ase': False,
|
|
19
|
+
'questa' : False,
|
|
20
|
+
'questa_fse': False
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def init() -> None:
|
|
25
|
+
'''Sets INIT_HAS_RUN=True (only runs once) and one of TOOL_IS[tool] = True'''
|
|
26
|
+
global INIT_HAS_RUN # pylint: disable=global-statement
|
|
27
|
+
|
|
28
|
+
if INIT_HAS_RUN:
|
|
29
|
+
return
|
|
30
|
+
|
|
31
|
+
INIT_HAS_RUN = True
|
|
32
|
+
|
|
33
|
+
if not vsim_path:
|
|
34
|
+
return
|
|
35
|
+
|
|
36
|
+
proc = None
|
|
37
|
+
try:
|
|
38
|
+
proc = subprocess.run([vsim_path, '-version'], capture_output=True, check=False)
|
|
39
|
+
except Exception as e:
|
|
40
|
+
debug(f'vsim -version: exception {e}')
|
|
41
|
+
|
|
42
|
+
if proc is None or proc.returncode != 0:
|
|
43
|
+
return
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
stdout_str_lower = proc.stdout.decode('utf-8', errors='replace').lower()
|
|
47
|
+
|
|
48
|
+
if all(x in stdout_str_lower for x in ('starter', 'modelsim', 'fpga')):
|
|
49
|
+
TOOL_IS['modelsim_ase'] = True
|
|
50
|
+
elif all(x in stdout_str_lower for x in ('starter', 'questa', 'fpga')):
|
|
51
|
+
TOOL_IS['questa_fse'] = True
|
|
52
|
+
elif all(x in stdout_str_lower for x in ('riviera', 'aldec')):
|
|
53
|
+
TOOL_IS['riviera'] = True
|
|
54
|
+
elif 'questa' in stdout_str_lower:
|
|
55
|
+
TOOL_IS['questa'] = True
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: opencos-eda
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.52
|
|
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
|
|
@@ -15,4 +15,5 @@ Requires-Dist: schema>=0.7.7
|
|
|
15
15
|
Requires-Dist: toml>=0.10.2
|
|
16
16
|
Requires-Dist: yamllint>=1.35.1
|
|
17
17
|
Requires-Dist: PySerial>=3.5
|
|
18
|
+
Requires-Dist: cocotb>=2.0.0b1
|
|
18
19
|
Dynamic: license-file
|
|
@@ -2,13 +2,14 @@ opencos/__init__.py,sha256=RwJA9oc1uUlvNX7v5zoqwjnSRNq2NZwRlHqtS-ICJkI,122
|
|
|
2
2
|
opencos/_version.py,sha256=XiHFZjCofkkZvI9befTFKsRt5zLouUo1CIwhW4srWU0,582
|
|
3
3
|
opencos/_waves_pkg.sv,sha256=1lbhQOVGc3t_R8czYjP40hssP0I3FlZOpHTkI7yKFbI,1251
|
|
4
4
|
opencos/deps_schema.py,sha256=pdJpKmfXxCYZsfXTxsnACw-s6Mzk55QH06ZSA5uqPV0,15454
|
|
5
|
-
opencos/eda.py,sha256=
|
|
6
|
-
opencos/eda_base.py,sha256=
|
|
7
|
-
opencos/eda_config.py,sha256=
|
|
8
|
-
opencos/eda_config_defaults.yml,sha256=
|
|
5
|
+
opencos/eda.py,sha256=bK5wX9EUib7UkIR0LcM_kGBjv_eGxjBBYjYkutYLTgI,21501
|
|
6
|
+
opencos/eda_base.py,sha256=q0uKEzAMzLmqb4jMBcGv7rTpdKnfrhnMZo7MyB8YN8Y,95706
|
|
7
|
+
opencos/eda_config.py,sha256=R6tbcuBJWA0vv1s9K_L928EVbjhv-lqDFLZqk_UGe9w,11382
|
|
8
|
+
opencos/eda_config_defaults.yml,sha256=dy5MKm5wbam8aT39frSLbJJm6LPJpoeI7PO_XOpt27A,13147
|
|
9
9
|
opencos/eda_config_max_verilator_waivers.yml,sha256=lTAU4IOEbUWVlPzuer1YYhIyxpPINeA4EJqcRIT-Ymk,840
|
|
10
10
|
opencos/eda_config_reduced.yml,sha256=cQ9jY4J7EvAbeHTiP6bvpDSVJAYiitjLZPSxxLKIEbk,1440
|
|
11
11
|
opencos/eda_deps_bash_completion.bash,sha256=jMkQKY82HBgOnQeMdA1hMrXguRFtB52SMBxUemKovL4,1958
|
|
12
|
+
opencos/eda_deps_sanitize.py,sha256=SQjvrte9Hv9JesRY0wljvbdC6pAmLCikI-Wdzzy-D04,1939
|
|
12
13
|
opencos/eda_extract_targets.py,sha256=dvBjc2qFBJkwlW6Fm-66Y_vlr0VZL1QwfIosMR_bgbY,4814
|
|
13
14
|
opencos/eda_tool_helper.py,sha256=_YgobDLEWW6Fzdr976LxaCDZ4DKRyuMs5CrYQHaTPrU,2558
|
|
14
15
|
opencos/export_helper.py,sha256=ArsM8qxBc08gj9S-UholGU417POfBYb_cHkBQZEfqfI,22046
|
|
@@ -17,27 +18,27 @@ opencos/files.py,sha256=aoq0O2KfISzZb-Vi_q_0TTGBER9xJc--FkVZf0ga7pA,1549
|
|
|
17
18
|
opencos/names.py,sha256=iC37PV7Pz0PicTDg09vbQ9NXAj-5m6RKrWHkkcHB8As,1145
|
|
18
19
|
opencos/peakrdl_cleanup.py,sha256=vHNGtalTrIVP335PhRjPt9RhoccgpK1HJAi-E4M8Kc8,736
|
|
19
20
|
opencos/seed.py,sha256=IL9Yg-r9SLSRseMVWaEHmuw2_DNi_eyut11EafoNTsU,942
|
|
20
|
-
opencos/util.py,sha256=
|
|
21
|
+
opencos/util.py,sha256=L36MM2cqR0xWbs617AJN52JvrTkrgggELHG3Y3s2jPI,34089
|
|
21
22
|
opencos/commands/__init__.py,sha256=DtOA56oWJu68l-_1_7Gdv0N-gtXVB3-p9IhGzAYex8U,1014
|
|
22
23
|
opencos/commands/build.py,sha256=jI5ul53qfwn6X-yfSdSQIcLBhGtzZUk7r_wKBBmKJI0,1425
|
|
23
24
|
opencos/commands/elab.py,sha256=m6Gk03wSzX8UkcmReooK7turF7LpqO0IcdOZwJ8XiyI,1596
|
|
24
25
|
opencos/commands/export.py,sha256=juzxJL5-RpEnU5DmwF0fiG5pUrB2BbUbvCp2OasEd88,3494
|
|
25
26
|
opencos/commands/flist.py,sha256=OUu_ewTDLkZqdW4547iRrwOhT4ghm8oMYHsA63yChvo,8551
|
|
26
|
-
opencos/commands/lec.py,sha256=
|
|
27
|
+
opencos/commands/lec.py,sha256=mIrMKFEZrFYIzvBdffcIyVULx04Cu4-480FB4Y1EiTA,3863
|
|
27
28
|
opencos/commands/multi.py,sha256=dCo4rMIkGT3BtlBhUIAd7r31w8qxeJvybpl4H7DR77o,27225
|
|
28
29
|
opencos/commands/open.py,sha256=unrpGckzg0FE5W3oARq8x0jX7hhV_uM9Oh5FgISHFAg,724
|
|
29
30
|
opencos/commands/proj.py,sha256=MdHTOtQYG93_gT97dWuSyAgUxX2vi9FRhL0dtc-rM98,1096
|
|
30
|
-
opencos/commands/shell.py,sha256=
|
|
31
|
-
opencos/commands/sim.py,sha256=
|
|
31
|
+
opencos/commands/shell.py,sha256=0SNxiNRPD1BO6dK0yxU_iV-8S9UyF4GOWGLL1A_KeVs,7583
|
|
32
|
+
opencos/commands/sim.py,sha256=WPkn_lZqgMPSQTxxT4Qa0qHKMmdHAkt1GXCDw4iD6kI,14723
|
|
32
33
|
opencos/commands/sweep.py,sha256=ni4XFgnFF8HLXtwPhETyLWfvc2kgtm4bcxFcKzUhkf0,9343
|
|
33
34
|
opencos/commands/synth.py,sha256=quB-HWS4LKYTiFBHiYarQi4pMnRmt12wQTZpi14VvlE,4355
|
|
34
35
|
opencos/commands/targets.py,sha256=_jRNhm2Fqj0fmMvTw6Ba39DCsRHf_r_uZCy_R064kpA,1472
|
|
35
36
|
opencos/commands/upload.py,sha256=nlb4nlxrDCQPcabEmH3nP19g4PFILDqFDab4LwJ95Z4,796
|
|
36
|
-
opencos/commands/waves.py,sha256=
|
|
37
|
+
opencos/commands/waves.py,sha256=s8xYyNFBDqUtGdpioVIHWDKE4ZSnY6e1gdZNIm7yXBE,7654
|
|
37
38
|
opencos/deps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
38
39
|
opencos/deps/defaults.py,sha256=4VgTRXf0hSJrj4tMk0t-mmvgEaaQQFDIYrxWrcKfYWk,1241
|
|
39
40
|
opencos/deps/deps_commands.py,sha256=OlqueYFK8U83loasok3xJGzUDpNcj2DPk37332DfmRo,17039
|
|
40
|
-
opencos/deps/deps_file.py,sha256=
|
|
41
|
+
opencos/deps/deps_file.py,sha256=29UkOT-UYw5XYYRK7DySmZkgdTj4wnxVQ5SgZVnrrds,15199
|
|
41
42
|
opencos/deps/deps_processor.py,sha256=NYGBrBAmk7ltrvxsEhv76Kpp76GBRJqeNNY_ckWf5mE,33028
|
|
42
43
|
opencos/hw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
43
44
|
opencos/hw/oc_cli.py,sha256=QBmf05VooB9kQFzgliak7PEvqVLTSEI3v6deV1OZQEs,132252
|
|
@@ -52,7 +53,7 @@ opencos/tests/test_eda.py,sha256=bg7SjSVCJSJ2lk51ddfjuVckMOps6_HU-3tCwAIRO7c,391
|
|
|
52
53
|
opencos/tests/test_eda_elab.py,sha256=VyYiaLLyfJi26FkoN9p_Kb9cMHfY-0u_0Mx1iVpsg-I,2657
|
|
53
54
|
opencos/tests/test_eda_synth.py,sha256=LOM8CKpNyjka_sKS2c00YObOAQeVgpRmuM12Bn-PHqU,5234
|
|
54
55
|
opencos/tests/test_oc_cli.py,sha256=w-F-LjSSWVql3D2WG8tcV4_C52i-hL_2WT3oDpKQn9s,734
|
|
55
|
-
opencos/tests/test_tools.py,sha256=
|
|
56
|
+
opencos/tests/test_tools.py,sha256=1x6zaDhhkkzcKpZjCdWqzYJPzrK_pnqBeUWiuy8cqAg,12128
|
|
56
57
|
opencos/tests/deps_files/command_order/DEPS.yml,sha256=vloOzWZ5qU3yGNFaDlrAJdEzYxK6qf8gfac3zqF-0FI,438
|
|
57
58
|
opencos/tests/deps_files/error_msgs/DEPS.yml,sha256=fYvHouIscOlr8V28bqx9SoxRBpDBLX4AG-AkVXh8qbo,717
|
|
58
59
|
opencos/tests/deps_files/iverilog_test/DEPS.yml,sha256=vDylEuLt642lhRSvOr3F5ziB5lhPSwkaUGN4_mWJw-c,40
|
|
@@ -61,29 +62,33 @@ opencos/tests/deps_files/non_sv_reqs/DEPS.yml,sha256=VZkahO1AKhD9GUV5lK8VwUONEi5
|
|
|
61
62
|
opencos/tests/deps_files/tags_with_tools/DEPS.yml,sha256=-5U1qfJElgpVhmkLEu3lYuvDYva8kDlt6JOdB9jidmc,1377
|
|
62
63
|
opencos/tests/deps_files/test_err_fatal/DEPS.yml,sha256=GnXIUJvshQWR9PlYxX67T53ejf5KhDbtD8sUJB4Rwd0,95
|
|
63
64
|
opencos/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
65
|
+
opencos/tools/cocotb.py,sha256=0AzT2pJWKwepZMT_hlgYYMV_Fr3Qr4gH7BgMDtNuLK0,16614
|
|
64
66
|
opencos/tools/invio.py,sha256=q9E9n6xsozDfar-1rLvJEZbCpPb_bQEy6WKEI3KS3dk,3163
|
|
65
67
|
opencos/tools/invio_helpers.py,sha256=1au4CYmV5aC7DHjaZBNemydH6Eq0i-Yt5L3HyKfQOfY,7638
|
|
66
68
|
opencos/tools/invio_yosys.py,sha256=asSjbdPjBXB76KxNZIhoDRn2DoXKsZEQ1YDX_WBzKiA,6019
|
|
67
69
|
opencos/tools/iverilog.py,sha256=KQV5tiRdM0ZuJOO0q3ZeUmhRyEc-oJggOc6RKIjoH84,6482
|
|
68
70
|
opencos/tools/modelsim_ase.py,sha256=rW5YrzLIhZKdbIT2UM60DGmDEHDK3XMlndpBz906cmA,14229
|
|
69
71
|
opencos/tools/questa.py,sha256=bXH_ajMUBBHNUeWTBNWDp2gGyza2vf8xIC6vz5EWiz8,7619
|
|
70
|
-
opencos/tools/questa_fse.py,sha256=
|
|
72
|
+
opencos/tools/questa_fse.py,sha256=WLNvkD57ggI7lQgxYr6h_xmXenh50J_m8o8amhECmpk,1855
|
|
71
73
|
opencos/tools/riviera.py,sha256=0FKAUvgyUHvJ5z0LOjHV9p3dGF8LI5kj5WLOZXgCDas,10695
|
|
72
74
|
opencos/tools/slang.py,sha256=mFw58vhnCTRR9yaQ2zHPlNB5HKSf3Y078XcaVnpLaAc,7798
|
|
73
75
|
opencos/tools/slang_yosys.py,sha256=3fyLRRdTXhSppNtUhhUl00oG-cT9TyyPTH6JvasS9ZE,9804
|
|
74
76
|
opencos/tools/surelog.py,sha256=dtj3ApAKoQasnGdg42n9DPgeqoJ5nCuurIkIO3G5ZCY,5011
|
|
75
77
|
opencos/tools/tabbycad_yosys.py,sha256=2LePPgYXBVdsy7YcffPIWN-I0B7queLQ_f_pme2SCGw,7803
|
|
76
|
-
opencos/tools/verilator.py,sha256=
|
|
78
|
+
opencos/tools/verilator.py,sha256=dIhrvLH9hHiTV_DWQbMNlAjolKctCbBMO9u9V7yAHuE,21400
|
|
77
79
|
opencos/tools/vivado.py,sha256=roM0MxrHoNIT_DsUiql1vQFlez2ql4qhwAfB-rGH4Qg,40485
|
|
78
|
-
opencos/tools/yosys.py,sha256=
|
|
80
|
+
opencos/tools/yosys.py,sha256=UKWzvc2rSi3J9U2TROqRbmePdBmjskap664giumeRBk,26323
|
|
79
81
|
opencos/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
80
|
-
opencos/utils/markup_helpers.py,sha256=
|
|
82
|
+
opencos/utils/markup_helpers.py,sha256=A8Ev5UJ4EVKjdcF2g85SQbjdPZR4jGpNqCLaBy_4v7Q,4569
|
|
83
|
+
opencos/utils/status_constants.py,sha256=aQui30ohPCEaWNDh2iujJQ_KQa3plry_rk7uDzS3vWk,603
|
|
81
84
|
opencos/utils/str_helpers.py,sha256=DOkwfKJR6aENM3U2BkJ41ELDU5Uj_zyhEfxuaQEcpEY,3352
|
|
82
85
|
opencos/utils/subprocess_helpers.py,sha256=xemAGPey6M0sWY_FElvr-Z0phCfdjaC-znP8FKihPaE,3535
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
opencos_eda-0.2.
|
|
86
|
-
opencos_eda-0.2.
|
|
87
|
-
opencos_eda-0.2.
|
|
88
|
-
opencos_eda-0.2.
|
|
89
|
-
opencos_eda-0.2.
|
|
86
|
+
opencos/utils/vscode_helper.py,sha256=2YPjcDH_vTlwJvcITyMfvx8dLzPSRKzAvFRJz7BaJk8,1332
|
|
87
|
+
opencos/utils/vsim_helper.py,sha256=2voGRZI2iAQ2Pv2ZI5g2why6xpgig-To8im-LVXtuDU,1517
|
|
88
|
+
opencos_eda-0.2.52.dist-info/licenses/LICENSE,sha256=HyVuytGSiAUQ6ErWBHTqt1iSGHhLmlC8fO7jTCuR8dU,16725
|
|
89
|
+
opencos_eda-0.2.52.dist-info/licenses/LICENSE.spdx,sha256=8gn1610RMP6eFgT3Hm6q9VKXt0RvdTItL_oxMo72jII,189
|
|
90
|
+
opencos_eda-0.2.52.dist-info/METADATA,sha256=NLxBxJ0aSl6Vfizn3tZqnskXn6VuWpDSdZQdKb4BGig,635
|
|
91
|
+
opencos_eda-0.2.52.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
92
|
+
opencos_eda-0.2.52.dist-info/entry_points.txt,sha256=6n1T5NwVYDhN5l1h5zmyT197G4pE0SySDreB0QJzJR0,218
|
|
93
|
+
opencos_eda-0.2.52.dist-info/top_level.txt,sha256=J4JDP-LpRyJqPNeh9bSjx6yrLz2Mk0h6un6YLmtqql4,8
|
|
94
|
+
opencos_eda-0.2.52.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|