opencos-eda 0.2.57__py3-none-any.whl → 0.3.0__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/_version.py +6 -3
- opencos/_waves_pkg.sv +34 -2
- opencos/commands/build.py +1 -0
- opencos/commands/export.py +1 -0
- opencos/commands/flist.py +1 -0
- opencos/commands/lec.py +1 -0
- opencos/commands/proj.py +1 -0
- opencos/commands/shell.py +4 -0
- opencos/commands/sim.py +47 -1
- opencos/commands/synth.py +4 -0
- opencos/deps/defaults.py +15 -7
- opencos/deps/deps_commands.py +84 -74
- opencos/deps_schema.py +3 -0
- opencos/eda.py +2 -1
- opencos/eda_base.py +61 -16
- opencos/eda_config_defaults.yml +2 -1
- opencos/tests/deps_files/command_order/DEPS.yml +11 -0
- opencos/tests/helpers.py +48 -19
- opencos/tests/test_deps_helpers.py +37 -25
- opencos/tests/test_eda.py +26 -60
- opencos/tools/modelsim_ase.py +17 -9
- opencos/tools/riviera.py +31 -6
- opencos/tools/verilator.py +28 -38
- opencos/util.py +63 -12
- opencos/utils/vscode_helper.py +1 -1
- opencos/utils/vsim_helper.py +1 -1
- {opencos_eda-0.2.57.dist-info → opencos_eda-0.3.0.dist-info}/METADATA +2 -1
- {opencos_eda-0.2.57.dist-info → opencos_eda-0.3.0.dist-info}/RECORD +33 -33
- {opencos_eda-0.2.57.dist-info → opencos_eda-0.3.0.dist-info}/WHEEL +0 -0
- {opencos_eda-0.2.57.dist-info → opencos_eda-0.3.0.dist-info}/entry_points.txt +0 -0
- {opencos_eda-0.2.57.dist-info → opencos_eda-0.3.0.dist-info}/licenses/LICENSE +0 -0
- {opencos_eda-0.2.57.dist-info → opencos_eda-0.3.0.dist-info}/licenses/LICENSE.spdx +0 -0
- {opencos_eda-0.2.57.dist-info → opencos_eda-0.3.0.dist-info}/top_level.txt +0 -0
opencos/tools/riviera.py
CHANGED
|
@@ -59,6 +59,17 @@ class CommandSimRiviera(CommandSimModelsimAse, ToolRiviera):
|
|
|
59
59
|
self.args.update({
|
|
60
60
|
'tool': self._TOOL, # override
|
|
61
61
|
'gui': False,
|
|
62
|
+
'waves-fst': True,
|
|
63
|
+
'waves-vcd': False,
|
|
64
|
+
})
|
|
65
|
+
self.args_help.update({
|
|
66
|
+
'waves-fst': (
|
|
67
|
+
'(Default True) If using --waves, apply simulation runtime arg +trace.'
|
|
68
|
+
' Note that if you do not have SV code using $dumpfile, eda will add'
|
|
69
|
+
' _waves_pkg.sv to handle this for you with +trace runtime plusarg.'
|
|
70
|
+
),
|
|
71
|
+
'waves-vcd': 'If using --waves, apply simulation runtime arg +trace=vcd',
|
|
72
|
+
'waves': 'Save a .asdb offline wavefile, can be used with --waves-fst or --waves-vcd',
|
|
62
73
|
})
|
|
63
74
|
|
|
64
75
|
def set_tool_defines(self):
|
|
@@ -76,6 +87,9 @@ class CommandSimRiviera(CommandSimModelsimAse, ToolRiviera):
|
|
|
76
87
|
|
|
77
88
|
def compile(self):
|
|
78
89
|
'''Override for CommandSimModelsimAse.compile() so we can set our own must_strings'''
|
|
90
|
+
|
|
91
|
+
self.add_waves_pkg_file()
|
|
92
|
+
|
|
79
93
|
if self.args['stop-before-compile']:
|
|
80
94
|
# don't run anything, save everyting we've already run in _prep_compile()
|
|
81
95
|
return
|
|
@@ -126,7 +140,8 @@ class CommandSimRiviera(CommandSimModelsimAse, ToolRiviera):
|
|
|
126
140
|
'-sv -input_ports net').split()
|
|
127
141
|
|
|
128
142
|
# Add waivers from config.tool.riviera, convert to warning:
|
|
129
|
-
for waiver in self.tool_config.get('compile-waivers', [])
|
|
143
|
+
for waiver in self.tool_config.get('compile-waivers', []) + \
|
|
144
|
+
self.args['compile-waivers']:
|
|
130
145
|
vlog_dot_f_lines += [f'-err {waiver} W1']
|
|
131
146
|
|
|
132
147
|
vlog_dot_f_fname = filename
|
|
@@ -167,6 +182,7 @@ class CommandSimRiviera(CommandSimModelsimAse, ToolRiviera):
|
|
|
167
182
|
f.writelines(line + "\n" for line in vlog_dot_f_lines)
|
|
168
183
|
|
|
169
184
|
|
|
185
|
+
|
|
170
186
|
def write_vsim_dot_do(self, dot_do_to_write: list) -> None:
|
|
171
187
|
'''Writes files(s) based on dot_do_to_write(list of str)
|
|
172
188
|
|
|
@@ -177,9 +193,18 @@ class CommandSimRiviera(CommandSimModelsimAse, ToolRiviera):
|
|
|
177
193
|
vsim_vlogonly_dot_do_fpath = os.path.join(self.args['work-dir'], 'vsim_vlogonly.do')
|
|
178
194
|
|
|
179
195
|
sim_plusargs_str = self._get_sim_plusargs_str()
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
if self.args['
|
|
196
|
+
vsim_ext_args = ' '.join(self.args.get('sim-args', []))
|
|
197
|
+
|
|
198
|
+
if self.args['waves'] and '+trace' not in sim_plusargs_str:
|
|
199
|
+
if self.args.get('waves-vcd', False):
|
|
200
|
+
sim_plusargs_str += ' +trace=vcd'
|
|
201
|
+
elif self.args.get('waves-fst', False):
|
|
202
|
+
sim_plusargs_str += ' +trace'
|
|
203
|
+
|
|
204
|
+
voptargs_str = self.tool_config.get('elab-args', '')
|
|
205
|
+
voptargs_str += ' '.join(self.args.get('elab-args', []))
|
|
206
|
+
if self.args['gui'] or self.args['waves'] or self.args['coverage']: # \
|
|
207
|
+
#or self.args['waves-asdb']:
|
|
183
208
|
voptargs_str += self.tool_config.get('simulate-waves-args',
|
|
184
209
|
'+accb +accr +access +r+w')
|
|
185
210
|
if self.args['coverage']:
|
|
@@ -195,7 +220,7 @@ class CommandSimRiviera(CommandSimModelsimAse, ToolRiviera):
|
|
|
195
220
|
vsim_one_liner = (
|
|
196
221
|
"vsim"
|
|
197
222
|
f" -sv_seed {self.args['seed']} {sim_plusargs_str}"
|
|
198
|
-
f" {voptargs_str} work.{self.args['top']}"
|
|
223
|
+
f" {voptargs_str} {vsim_ext_args} work.{self.args['top']}"
|
|
199
224
|
)
|
|
200
225
|
|
|
201
226
|
vsim_one_liner = vsim_one_liner.replace('\n', ' ') # needs to be a one-liner
|
|
@@ -294,7 +319,7 @@ class CommandSimRiviera(CommandSimModelsimAse, ToolRiviera):
|
|
|
294
319
|
for waiver in self.tool_config.get(
|
|
295
320
|
'simulate-waivers', [
|
|
296
321
|
#defaults: none
|
|
297
|
-
]):
|
|
322
|
+
]) + self.args['sim-waivers']:
|
|
298
323
|
vsim_suppress_list += ['-filter', str(waiver)]
|
|
299
324
|
|
|
300
325
|
return ' '.join(vsim_suppress_list)
|
opencos/tools/verilator.py
CHANGED
|
@@ -76,6 +76,8 @@ class VerilatorSim(CommandSim, ToolVerilator):
|
|
|
76
76
|
'gui': False,
|
|
77
77
|
'tcl-file': None,
|
|
78
78
|
'dump-vcd': False,
|
|
79
|
+
'waves-fst': True,
|
|
80
|
+
'waves-vcd': False,
|
|
79
81
|
'lint-only': False,
|
|
80
82
|
'cc-mode': False,
|
|
81
83
|
'verilator-coverage-args': [],
|
|
@@ -84,12 +86,22 @@ class VerilatorSim(CommandSim, ToolVerilator):
|
|
|
84
86
|
})
|
|
85
87
|
|
|
86
88
|
self.args_help.update({
|
|
87
|
-
'waves':
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
89
|
+
'waves': (
|
|
90
|
+
'Include waveforms, if possible for Verilator by applying'
|
|
91
|
+
' simulation runtime arg +trace. User will need SV code to interpret the'
|
|
92
|
+
' plusarg and apply $dumpfile("dump.fst").'
|
|
93
|
+
),
|
|
94
|
+
'waves-fst': (
|
|
95
|
+
'(Default True) If using --waves, apply simulation runtime arg +trace.'
|
|
96
|
+
' Note that if you do not have SV code using $dumpfile, eda will add'
|
|
97
|
+
' _waves_pkg.sv to handle this for you with +trace runtime plusarg.'
|
|
98
|
+
),
|
|
99
|
+
'waves-vcd': (
|
|
100
|
+
'If using --waves, apply simulation runtime arg +trace=vcd. User'
|
|
101
|
+
' will need SV code to interpret the plusarg and apply'
|
|
102
|
+
' $dumpfile("dump.vcd").'
|
|
103
|
+
),
|
|
104
|
+
'dump-vcd': 'Same as --waves-vcd',
|
|
93
105
|
'lint-only': 'Run verilator with --lint-only, instead of --binary',
|
|
94
106
|
'gui': 'Not supported for Verilator',
|
|
95
107
|
'cc-mode': 'Run verilator with --cc, requires a sim_main.cpp or similar sources',
|
|
@@ -124,7 +136,7 @@ class VerilatorSim(CommandSim, ToolVerilator):
|
|
|
124
136
|
if self.files_cpp:
|
|
125
137
|
self.args['cc-mode'] = True
|
|
126
138
|
|
|
127
|
-
self.
|
|
139
|
+
self.add_waves_pkg_file()
|
|
128
140
|
|
|
129
141
|
# Each of these should be a list of util.ShellCommandList()
|
|
130
142
|
self.verilate_command_lists = self.get_compile_command_lists()
|
|
@@ -300,9 +312,10 @@ class VerilatorSim(CommandSim, ToolVerilator):
|
|
|
300
312
|
# Built-in support for eda args --waves and/or --dump-vcd to become runtime
|
|
301
313
|
# plusargs +trace or +trace=vcd, if +trace or +trace= was not already in our
|
|
302
314
|
# plusargs.
|
|
303
|
-
if self.args.get('dump-vcd', False)
|
|
315
|
+
if self.args.get('dump-vcd', False) or \
|
|
316
|
+
self.args.get('waves-vcd', False):
|
|
304
317
|
sim_plusargs.append('+trace=vcd')
|
|
305
|
-
|
|
318
|
+
elif self.args.get('waves-fst', False):
|
|
306
319
|
sim_plusargs.append('+trace')
|
|
307
320
|
|
|
308
321
|
verilated_exec_command_list += config_sim_args + sim_plusargs + self.args['sim-args']
|
|
@@ -351,40 +364,17 @@ class VerilatorSim(CommandSim, ToolVerilator):
|
|
|
351
364
|
|
|
352
365
|
return []
|
|
353
366
|
|
|
354
|
-
def
|
|
367
|
+
def add_waves_pkg_file(self) -> None:
|
|
355
368
|
'''If --waves present, and the user is missing any $dumpfile(), then adds a pre-written
|
|
356
369
|
SystemVerilog package to their source code.
|
|
357
370
|
'''
|
|
358
|
-
if not self.args['waves']:
|
|
359
|
-
return
|
|
360
371
|
if self.args['cc-mode']:
|
|
361
|
-
# We won't do this if the user
|
|
372
|
+
# We won't do this if the user brought a .cpp file and verilator not
|
|
362
373
|
# called with --binary.
|
|
363
374
|
return
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
break
|
|
368
|
-
with open(fname, encoding='utf-8') as f:
|
|
369
|
-
for line in f.readlines():
|
|
370
|
-
if '$dumpfile' in line:
|
|
371
|
-
found_dumpfile = True
|
|
372
|
-
break
|
|
373
|
-
if not found_dumpfile:
|
|
374
|
-
thispath = os.path.dirname(__file__)
|
|
375
|
-
file_to_add = os.path.join(thispath, '..', '_waves_pkg.sv')
|
|
376
|
-
util.info(f'--waves arg present, no $dumpfile found, adding SV file: {file_to_add}')
|
|
377
|
-
self.add_file(file_to_add)
|
|
378
|
-
|
|
379
|
-
# register .vcd or .fst artifacts:
|
|
380
|
-
util.artifacts.add_extension(
|
|
381
|
-
search_paths=self.args['work-dir'], file_extension='fst',
|
|
382
|
-
typ='waveform', description='Simulation Waveform FST (Fast Signal Trace) file'
|
|
383
|
-
)
|
|
384
|
-
util.artifacts.add_extension(
|
|
385
|
-
search_paths=self.args['work-dir'], file_extension='vcd',
|
|
386
|
-
typ='waveform', description='Simulation Waveform VCD (Value Change Dump) file'
|
|
387
|
-
)
|
|
375
|
+
|
|
376
|
+
super().add_waves_pkg_file() # call from CommandSim
|
|
377
|
+
|
|
388
378
|
|
|
389
379
|
|
|
390
380
|
def _get_start_verilator_command_list(self, lint_only: bool = False) -> list:
|
|
@@ -415,7 +405,7 @@ class VerilatorSim(CommandSim, ToolVerilator):
|
|
|
415
405
|
[ #defaults:
|
|
416
406
|
'CASEINCOMPLETE',
|
|
417
407
|
'TIMESCALEMOD', # If one file has `timescale, then they all must
|
|
418
|
-
]):
|
|
408
|
+
]) + self.args['compile-waivers']:
|
|
419
409
|
ret.append(f'-Wno-{waiver}')
|
|
420
410
|
return ret
|
|
421
411
|
|
opencos/util.py
CHANGED
|
@@ -17,6 +17,7 @@ import traceback
|
|
|
17
17
|
from enum import Enum
|
|
18
18
|
from pathlib import Path
|
|
19
19
|
from importlib import import_module
|
|
20
|
+
from dotenv import load_dotenv
|
|
20
21
|
|
|
21
22
|
from opencos.utils import status_constants
|
|
22
23
|
|
|
@@ -24,6 +25,8 @@ global_exit_allowed = False # pylint: disable=invalid-name
|
|
|
24
25
|
progname = "UNKNOWN" # pylint: disable=invalid-name
|
|
25
26
|
progname_in_message = True # pylint: disable=invalid-name
|
|
26
27
|
debug_level = 0 # pylint: disable=invalid-name
|
|
28
|
+
dot_f_files_expanded = set() # pylint: disable=invalid-name
|
|
29
|
+
env_files_loaded = set() # pylint: disable=invalid-name
|
|
27
30
|
|
|
28
31
|
args = { # pylint: disable=invalid-name
|
|
29
32
|
'color' : False,
|
|
@@ -213,6 +216,7 @@ class Artifacts:
|
|
|
213
216
|
for key in remove_keys:
|
|
214
217
|
del self.data[key]
|
|
215
218
|
|
|
219
|
+
safe_mkdir_for_file(self.artifacts_json_filepath)
|
|
216
220
|
with open(self.artifacts_json_filepath, 'w', encoding='utf-8') as f:
|
|
217
221
|
json.dump(self.data, f, indent=4)
|
|
218
222
|
info(f'Wrote artifacts JSON: {self.artifacts_json_filepath}')
|
|
@@ -376,6 +380,9 @@ def get_argparser() -> argparse.ArgumentParser:
|
|
|
376
380
|
help=(
|
|
377
381
|
'Input .f file to be expanded as eda'
|
|
378
382
|
' args/defines/incdirs/files/targets'))
|
|
383
|
+
parser.add_argument('--env-file', default=[], action='append',
|
|
384
|
+
help='dotenv file(s) to pass ENV vars, (default: .env, loaded last)'
|
|
385
|
+
)
|
|
379
386
|
return parser
|
|
380
387
|
|
|
381
388
|
|
|
@@ -420,19 +427,36 @@ def process_token(arg: list) -> bool:
|
|
|
420
427
|
return False
|
|
421
428
|
|
|
422
429
|
|
|
430
|
+
def load_env_file(env_file: str) -> None:
|
|
431
|
+
'''Handles .env file (from util CLI args --env-file)'''
|
|
432
|
+
if os.path.isfile(env_file):
|
|
433
|
+
load_dotenv(env_file)
|
|
434
|
+
env_files_loaded.add(os.path.abspath(env_file))
|
|
435
|
+
else:
|
|
436
|
+
warning(f'--env-file {env_file} does not exist and is not loaded.')
|
|
437
|
+
|
|
423
438
|
def read_tokens_from_dot_f(filepath: str) -> list:
|
|
424
|
-
'''Returns list of tokens from a .f file'''
|
|
439
|
+
'''Returns list of tokens from a .f file, with ENV vars expanded'''
|
|
440
|
+
|
|
441
|
+
# Let's defer 'info' printing out what input files were opened until after
|
|
442
|
+
# args['quiet'] and debug is resolved (which may be in these .f files)
|
|
425
443
|
debug(f"Opening -f / --input-file '{filepath}' for contents")
|
|
426
444
|
if not os.path.isfile(filepath):
|
|
427
445
|
error(f'-f (or --input-file): {filepath} does not exist',
|
|
428
446
|
error_code=status_constants.EDA_GENERAL_FILE_NOT_FOUND)
|
|
429
447
|
return []
|
|
448
|
+
if os.path.abspath(filepath) in dot_f_files_expanded:
|
|
449
|
+
error(f'-f (or --input-file): {filepath} has already been expanded',
|
|
450
|
+
'cannot traverse again (duplicate arg or nested .f files)')
|
|
451
|
+
dot_f_files_expanded.add(os.path.abspath(filepath))
|
|
430
452
|
tokens = []
|
|
431
453
|
with open(filepath, encoding='utf-8') as f:
|
|
432
454
|
for line in f:
|
|
455
|
+
line = os.path.expandvars(line.strip())
|
|
433
456
|
tokens.extend(line.split())
|
|
434
457
|
return tokens
|
|
435
458
|
|
|
459
|
+
|
|
436
460
|
def process_debug_args(parsed: argparse.Namespace) -> None:
|
|
437
461
|
'''Sets global debug_level based on parsed args'''
|
|
438
462
|
global debug_level # pylint: disable=global-statement
|
|
@@ -446,7 +470,9 @@ def process_debug_args(parsed: argparse.Namespace) -> None:
|
|
|
446
470
|
debug_level = 0
|
|
447
471
|
|
|
448
472
|
|
|
449
|
-
def process_tokens(
|
|
473
|
+
def process_tokens( # pylint: disable=too-many-branches
|
|
474
|
+
tokens: list
|
|
475
|
+
) -> (argparse.Namespace, list):
|
|
450
476
|
'''Processes tokens (unparsed args list) on util's ArgumentParser
|
|
451
477
|
|
|
452
478
|
Returns tuple of (parsed Namespace, unparsed args list)
|
|
@@ -454,9 +480,9 @@ def process_tokens(tokens: list) -> (argparse.Namespace, list):
|
|
|
454
480
|
global debug_level # pylint: disable=global-statement
|
|
455
481
|
debug_level = 0
|
|
456
482
|
|
|
457
|
-
# Deal with --debug, --debug-level,
|
|
458
|
-
# for now put dot-f file contents in front of of tokens, do this in a
|
|
459
|
-
# argparser
|
|
483
|
+
# Deal with --debug, --debug-level, --env-file, -f/--input-file(s) tokens first,
|
|
484
|
+
# for now put dot-f file contents in front of of tokens, do this first in a
|
|
485
|
+
# separate custom argparser:
|
|
460
486
|
bool_action_kwargs = get_argparse_bool_action_kwargs()
|
|
461
487
|
parser = argparse.ArgumentParser(
|
|
462
488
|
prog='opencos -f/--input-file', add_help=False, allow_abbrev=False
|
|
@@ -465,10 +491,14 @@ def process_tokens(tokens: list) -> (argparse.Namespace, list):
|
|
|
465
491
|
help='Display additional debug messaging level 1 or higher')
|
|
466
492
|
parser.add_argument('--debug-level', type=int, default=0,
|
|
467
493
|
help='Set debug level messaging (default: 0)')
|
|
494
|
+
parser.add_argument('--env-file', default=[], action='append',
|
|
495
|
+
help='dotenv file(s) to pass ENV vars, (default: .env, loaded last)'
|
|
496
|
+
)
|
|
468
497
|
parser.add_argument('-f', '--input-file', default=[], action='append',
|
|
469
498
|
help=(
|
|
470
|
-
'Input .f file to be expanded as eda'
|
|
471
|
-
'
|
|
499
|
+
'Input .f file to be expanded as eda args, defines, incdirs,'
|
|
500
|
+
' files, or targets.'
|
|
501
|
+
))
|
|
472
502
|
try:
|
|
473
503
|
parsed, unparsed = parser.parse_known_args(tokens + [''])
|
|
474
504
|
tokens2 = list(filter(None, unparsed))
|
|
@@ -478,8 +508,23 @@ def process_tokens(tokens: list) -> (argparse.Namespace, list):
|
|
|
478
508
|
process_debug_args(parsed=parsed)
|
|
479
509
|
debug(f'util.process_tokens: {parsed=} {unparsed=} from: {tokens}')
|
|
480
510
|
|
|
481
|
-
|
|
482
|
-
|
|
511
|
+
if os.path.isfile(str(Path('.env'))):
|
|
512
|
+
parsed.env_file.append('.env')
|
|
513
|
+
if parsed.env_file:
|
|
514
|
+
for env_file in parsed.env_file:
|
|
515
|
+
load_env_file(env_file)
|
|
516
|
+
|
|
517
|
+
if parsed.input_file:
|
|
518
|
+
dotf_tokens = []
|
|
519
|
+
for filepath in parsed.input_file:
|
|
520
|
+
dotf_tokens.extend(read_tokens_from_dot_f(filepath))
|
|
521
|
+
|
|
522
|
+
# put the .f files before the unparsed args.
|
|
523
|
+
tokens2 = dotf_tokens + tokens2
|
|
524
|
+
|
|
525
|
+
# recurse until we've resolved nested .f files.
|
|
526
|
+
return process_tokens(tokens=tokens2)
|
|
527
|
+
|
|
483
528
|
|
|
484
529
|
# Continue with all normal parsing beyond --debug and -f/--input-file,
|
|
485
530
|
# Note that we re-parse everything in case there was --debug or --debug-level in
|
|
@@ -494,7 +539,8 @@ def process_tokens(tokens: list) -> (argparse.Namespace, list):
|
|
|
494
539
|
process_debug_args(parsed=parsed)
|
|
495
540
|
|
|
496
541
|
if parsed.input_file:
|
|
497
|
-
warning(f'
|
|
542
|
+
warning(f'python error, nested -f/--input-file(s) {parsed.input_file} should',
|
|
543
|
+
'have already been resolved')
|
|
498
544
|
|
|
499
545
|
# clear existing artifacts dicts (mostly for pytests repeatedly calling eda.main),
|
|
500
546
|
# set artifacts.enabled based on args['artifacts-json']
|
|
@@ -519,6 +565,11 @@ def process_tokens(tokens: list) -> (argparse.Namespace, list):
|
|
|
519
565
|
if key in args and value is not None:
|
|
520
566
|
args[key] = value # only update with non-None values to our global 'args' dict
|
|
521
567
|
|
|
568
|
+
for filepath in env_files_loaded:
|
|
569
|
+
info(f"Loaded --env-file '{os.path.relpath(filepath)}'")
|
|
570
|
+
for filepath in dot_f_files_expanded:
|
|
571
|
+
info(f"Processed -f / --input-file '{os.path.relpath(filepath)}' for contents")
|
|
572
|
+
|
|
522
573
|
return parsed, unparsed
|
|
523
574
|
|
|
524
575
|
# ********************
|
|
@@ -776,8 +827,8 @@ def getcwd():
|
|
|
776
827
|
error(f"Unable to getcwd(), did it get deleted from under us? Exception: {e}")
|
|
777
828
|
return None
|
|
778
829
|
|
|
779
|
-
_OC_ROOT = None
|
|
780
|
-
_OC_ROOT_SET = False
|
|
830
|
+
_OC_ROOT = None # pylint: disable=invalid-name
|
|
831
|
+
_OC_ROOT_SET = False # pylint: disable=invalid-name
|
|
781
832
|
|
|
782
833
|
def get_oc_root(error_on_fail: bool = False) -> None:
|
|
783
834
|
'''Returns a str or False for the root directory of *this* repo.
|
opencos/utils/vscode_helper.py
CHANGED
opencos/utils/vsim_helper.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: opencos-eda
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0
|
|
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
|
|
@@ -11,6 +11,7 @@ Requires-Dist: mergedeep>=1.3.4
|
|
|
11
11
|
Requires-Dist: peakrdl>=1.1.0
|
|
12
12
|
Requires-Dist: pyyaml>=6.0.2
|
|
13
13
|
Requires-Dist: pytest>=8.3.5
|
|
14
|
+
Requires-Dist: python-dotenv>=1.0.1
|
|
14
15
|
Requires-Dist: schema>=0.7.7
|
|
15
16
|
Requires-Dist: toml>=0.10.2
|
|
16
17
|
Requires-Dist: yamllint>=1.35.1
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
opencos/__init__.py,sha256=RwJA9oc1uUlvNX7v5zoqwjnSRNq2NZwRlHqtS-ICJkI,122
|
|
2
|
-
opencos/_version.py,sha256=
|
|
3
|
-
opencos/_waves_pkg.sv,sha256=
|
|
4
|
-
opencos/deps_schema.py,sha256=
|
|
5
|
-
opencos/eda.py,sha256=
|
|
6
|
-
opencos/eda_base.py,sha256=
|
|
2
|
+
opencos/_version.py,sha256=KaWIjS0c08g-C0fgYY1kXwSPqhOFxaq5pYEeoZhOR_I,617
|
|
3
|
+
opencos/_waves_pkg.sv,sha256=TL5YT9lT-fn2FD54MbVVZROmZ7vtW3ScA_rM2eRzKmU,2068
|
|
4
|
+
opencos/deps_schema.py,sha256=VUdXuq43mKfM-U4x7DSA28-MH1Xqxre6V7Ttw2DeOqI,16762
|
|
5
|
+
opencos/eda.py,sha256=91E-EsyZS-uRadApP-h2onW6rpvLBnrpJoT_9tRtsS8,23322
|
|
6
|
+
opencos/eda_base.py,sha256=oJ8ISAN6IykQfun8eVNuzjggQ5RvIKeWwQ85Wv4ww_4,107887
|
|
7
7
|
opencos/eda_config.py,sha256=z3yQOPGBX7-yKp6BdQYfJ9eOJf-Jctl-mwCDj3vj2BI,12712
|
|
8
|
-
opencos/eda_config_defaults.yml,sha256=
|
|
8
|
+
opencos/eda_config_defaults.yml,sha256=u1kzmclo5nElsn2BHOIYHk9_djbL0rUts4CLWYJbuc8,16036
|
|
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
|
|
@@ -18,28 +18,28 @@ opencos/files.py,sha256=aoq0O2KfISzZb-Vi_q_0TTGBER9xJc--FkVZf0ga7pA,1549
|
|
|
18
18
|
opencos/names.py,sha256=Y2aJ5wgpbNIJ-_P5xUXnHMv_h-zMOX2Rt6iLuduqC1Q,1213
|
|
19
19
|
opencos/peakrdl_cleanup.py,sha256=vHNGtalTrIVP335PhRjPt9RhoccgpK1HJAi-E4M8Kc8,736
|
|
20
20
|
opencos/seed.py,sha256=IL9Yg-r9SLSRseMVWaEHmuw2_DNi_eyut11EafoNTsU,942
|
|
21
|
-
opencos/util.py,sha256=
|
|
21
|
+
opencos/util.py,sha256=KK5_lSKSf8O6Wp-CtQ9bTg-izBEPkuxGh_N64DJhE-0,40038
|
|
22
22
|
opencos/commands/__init__.py,sha256=oOOQmn5_jHAMSOfA3swJJ7mdoyHsJA0lJwKPTudlTns,1125
|
|
23
|
-
opencos/commands/build.py,sha256=
|
|
23
|
+
opencos/commands/build.py,sha256=mvJYxk5J15k0Cr8R7oIdIIdsEtWV3gE-LnPweVwtSDo,1487
|
|
24
24
|
opencos/commands/deps_help.py,sha256=WDrU7H9sypzDAxe_CHqhW5B_scbQMzBEdf-v-Jcfd5Q,10682
|
|
25
25
|
opencos/commands/elab.py,sha256=m6Gk03wSzX8UkcmReooK7turF7LpqO0IcdOZwJ8XiyI,1596
|
|
26
|
-
opencos/commands/export.py,sha256=
|
|
27
|
-
opencos/commands/flist.py,sha256=
|
|
28
|
-
opencos/commands/lec.py,sha256=
|
|
26
|
+
opencos/commands/export.py,sha256=OhqVLVGN9Ch46NmBmZZo0CxIzhf3BsyX_8qA60SPNHw,3556
|
|
27
|
+
opencos/commands/flist.py,sha256=B2c9RS1LrMHLaY-NySB2W0oHkjd4wGS5rQJTYULGNk0,9110
|
|
28
|
+
opencos/commands/lec.py,sha256=7uziNSeGhZrDEbfS4dt3qVp-z2122hx2kqPH15PqIgQ,4091
|
|
29
29
|
opencos/commands/lint.py,sha256=piPb0l0zE3sAtNJkFQ-oNpuHxnaV_RNXkXtEj_9mwGs,1594
|
|
30
30
|
opencos/commands/multi.py,sha256=ZkG1b_qhhxXw-Lm2S4J-i576Ai5iJA09UEIDj94FOVM,27430
|
|
31
31
|
opencos/commands/open.py,sha256=XckvKUNwvc5KHbYGV-eQ2i0WG4X-yckroDaMC610MB4,804
|
|
32
|
-
opencos/commands/proj.py,sha256=
|
|
33
|
-
opencos/commands/shell.py,sha256=
|
|
34
|
-
opencos/commands/sim.py,sha256=
|
|
32
|
+
opencos/commands/proj.py,sha256=cExW9ZZkw6nkpVyNfeQzJADzmPtbYgBgWml82tqO6jY,1158
|
|
33
|
+
opencos/commands/shell.py,sha256=upHpFs8Gdtzi-boVXwsC-QzEsnvtoZNMAu4oN10kdxw,7801
|
|
34
|
+
opencos/commands/sim.py,sha256=NQJbjfGEgt4zHtOQn5HnaCiBnaDyEkpoDJvnAR4TOxE,21166
|
|
35
35
|
opencos/commands/sweep.py,sha256=ni4XFgnFF8HLXtwPhETyLWfvc2kgtm4bcxFcKzUhkf0,9343
|
|
36
|
-
opencos/commands/synth.py,sha256=
|
|
36
|
+
opencos/commands/synth.py,sha256=m4ZwqHgOF5We0XP94F7TQli11WCPlkzhamI4fDfFR1o,4573
|
|
37
37
|
opencos/commands/targets.py,sha256=_jRNhm2Fqj0fmMvTw6Ba39DCsRHf_r_uZCy_R064kpA,1472
|
|
38
38
|
opencos/commands/upload.py,sha256=oyImgcEFGxDkdeY9EYyX2R6fTOmN-lTs-HYxAZqXUUo,871
|
|
39
39
|
opencos/commands/waves.py,sha256=nrp3ALwfJujZns44tgCgia_dEedQyKe0T3fuws8h39U,7697
|
|
40
40
|
opencos/deps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
41
|
-
opencos/deps/defaults.py,sha256=
|
|
42
|
-
opencos/deps/deps_commands.py,sha256=
|
|
41
|
+
opencos/deps/defaults.py,sha256=NXh3V4oInrBVlDw64B2OCI77wzdn1NtaD64srhBnmZU,1486
|
|
42
|
+
opencos/deps/deps_commands.py,sha256=q4JfSfzRO2nM2zdNT4enCy33FokEytZYQJn1HJ6osJk,16606
|
|
43
43
|
opencos/deps/deps_file.py,sha256=nVZWrq6PVhWig1yMNpy8w_7LQJ1rgb7Js0N1ngoqLio,16306
|
|
44
44
|
opencos/deps/deps_processor.py,sha256=i8R6lNSVc_ybTnC16qmGevB3Y-pkcbxkZaT04HTLE8Y,37890
|
|
45
45
|
opencos/hw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -47,16 +47,16 @@ opencos/hw/oc_cli.py,sha256=U1JGlshLZhtd0LgndZFBZVltAj_HemdhbjO_Zo8ZuVM,132252
|
|
|
47
47
|
opencos/hw/pcie.py,sha256=VUJljaZJYgScAAx5yn7F6GoA8K9eTcw24otYZbkMpYs,3035
|
|
48
48
|
opencos/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
49
49
|
opencos/tests/custom_config.yml,sha256=TRoVM9ZFKPOA_8JmlpzaMhnGO1txmaD14N_8P1oqzew,257
|
|
50
|
-
opencos/tests/helpers.py,sha256=
|
|
50
|
+
opencos/tests/helpers.py,sha256=9KHSZ1JMmo2nUbJYiRehmNqd1mNQ29XbzReu_tHkxjk,11234
|
|
51
51
|
opencos/tests/test_build.py,sha256=FQAxOpLVQShAHD_L5rqJctPeSAoqoOCNFI0RXflLuY0,387
|
|
52
|
-
opencos/tests/test_deps_helpers.py,sha256=
|
|
52
|
+
opencos/tests/test_deps_helpers.py,sha256=uQZxleh6aKO-mZQhagHh5xLIBbpQ8dav7-5D0eemq_g,8164
|
|
53
53
|
opencos/tests/test_deps_schema.py,sha256=T3P9KjaMyKsk8b7snNVvNSsom2hIJcg6Z9apYiXoH9Y,941
|
|
54
|
-
opencos/tests/test_eda.py,sha256=
|
|
54
|
+
opencos/tests/test_eda.py,sha256=fkJvBiwPczs3Yl3zwl_1Upx-siJsGDrjEVipzpiw8vc,37880
|
|
55
55
|
opencos/tests/test_eda_elab.py,sha256=AjU4WMYtFoHpNe1Z4yWWpxDKy4V_hAjL5rl3jqphZrk,3179
|
|
56
56
|
opencos/tests/test_eda_synth.py,sha256=BtBrNVJ9C-LJt3K0wNNS5ukEVrET16AbRXl2IzxudJ8,5744
|
|
57
57
|
opencos/tests/test_oc_cli.py,sha256=w-F-LjSSWVql3D2WG8tcV4_C52i-hL_2WT3oDpKQn9s,734
|
|
58
58
|
opencos/tests/test_tools.py,sha256=-WMpDZexAgko0FAcfiuASqSKNNL0Mr1ztag05808Upc,13735
|
|
59
|
-
opencos/tests/deps_files/command_order/DEPS.yml,sha256=
|
|
59
|
+
opencos/tests/deps_files/command_order/DEPS.yml,sha256=PSzBBJDSU8ccCy3Ls5j_ws_vepmUkTIgWjaMjBhNbSg,806
|
|
60
60
|
opencos/tests/deps_files/error_msgs/DEPS.yml,sha256=fYvHouIscOlr8V28bqx9SoxRBpDBLX4AG-AkVXh8qbo,717
|
|
61
61
|
opencos/tests/deps_files/iverilog_test/DEPS.yml,sha256=vDylEuLt642lhRSvOr3F5ziB5lhPSwkaUGN4_mWJw-c,40
|
|
62
62
|
opencos/tests/deps_files/no_deps_here/DEPS.yml,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -69,16 +69,16 @@ opencos/tools/invio.py,sha256=S2ChWr8xMZHSOOhX2hGKQhMmtQY2potVQjc-lsMg73o,3299
|
|
|
69
69
|
opencos/tools/invio_helpers.py,sha256=86WOGmSf4m_lEqBtK3DLjWqI0jnqAWzBEBRYfBUGiSY,8804
|
|
70
70
|
opencos/tools/invio_yosys.py,sha256=CszGeTdE1ilnMmWPLW77BrtobbsGb1CKXqot0hGimFU,5996
|
|
71
71
|
opencos/tools/iverilog.py,sha256=8dK4z8ktbNYS9cW5QQPm586WoE-pSmOAVJfXajw-Sbg,6420
|
|
72
|
-
opencos/tools/modelsim_ase.py,sha256=
|
|
72
|
+
opencos/tools/modelsim_ase.py,sha256=Jt-6N3BZZyu25fT1ehFQLRUTVvrcCo4e2Gl7UtsQcuk,17834
|
|
73
73
|
opencos/tools/quartus.py,sha256=_TfmPSYpbhmDLw7Dur-rRP0iGwv9hhQ6E5G-XLiYPEM,30486
|
|
74
74
|
opencos/tools/questa.py,sha256=nHImM0Wydcf4YHGibHmQAwmqKHmMxKZUqY-E-vz1o8M,9827
|
|
75
75
|
opencos/tools/questa_fse.py,sha256=hytkeuGg4qImj7rStV1i2kxkz9B0KFheGtcadxmpYAo,2550
|
|
76
|
-
opencos/tools/riviera.py,sha256=
|
|
76
|
+
opencos/tools/riviera.py,sha256=FAumXIt9u4JXwR5BHe-0APX3K0Lg3RT2lWQ-GNGL3vA,13016
|
|
77
77
|
opencos/tools/slang.py,sha256=UpsFeExup2awARxxxADD9f923Hw6ubiSEq2tKtJbS1c,8305
|
|
78
78
|
opencos/tools/slang_yosys.py,sha256=MKh13eAmLJDkynZiezyT8E2gI4CKnXipzgFCZppaMXo,10230
|
|
79
79
|
opencos/tools/surelog.py,sha256=S2RAZJyjdISm_tRvAhXbla7_z_tJfotZih5f9Y3m7DQ,5648
|
|
80
80
|
opencos/tools/tabbycad_yosys.py,sha256=2LePPgYXBVdsy7YcffPIWN-I0B7queLQ_f_pme2SCGw,7803
|
|
81
|
-
opencos/tools/verilator.py,sha256=
|
|
81
|
+
opencos/tools/verilator.py,sha256=nVYF9F-VAHmT0uqmHpYZIvvZ2GjFIVW5zKpYBAWW8rI,20810
|
|
82
82
|
opencos/tools/vivado.py,sha256=GQdPd1mp02it_uyhMqpFfJgh0AKIMn-20BhHNEDp5HY,41398
|
|
83
83
|
opencos/tools/yosys.py,sha256=t3Au8gdwTepIKCPCXHpRXEdtmORQK8xqNvF6baIa7DM,28260
|
|
84
84
|
opencos/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -86,12 +86,12 @@ opencos/utils/markup_helpers.py,sha256=A8Ev5UJ4EVKjdcF2g85SQbjdPZR4jGpNqCLaBy_4v
|
|
|
86
86
|
opencos/utils/status_constants.py,sha256=na6YsqlsCwIYzTXWE14dPadUYRNTrOS6YTXHCer2NbA,635
|
|
87
87
|
opencos/utils/str_helpers.py,sha256=726ScK5-v7QkBi-zqESKZLsOl2_ya4vVJ5ZhxJqmBFo,6440
|
|
88
88
|
opencos/utils/subprocess_helpers.py,sha256=xemAGPey6M0sWY_FElvr-Z0phCfdjaC-znP8FKihPaE,3535
|
|
89
|
-
opencos/utils/vscode_helper.py,sha256=
|
|
90
|
-
opencos/utils/vsim_helper.py,sha256=
|
|
91
|
-
opencos_eda-0.
|
|
92
|
-
opencos_eda-0.
|
|
93
|
-
opencos_eda-0.
|
|
94
|
-
opencos_eda-0.
|
|
95
|
-
opencos_eda-0.
|
|
96
|
-
opencos_eda-0.
|
|
97
|
-
opencos_eda-0.
|
|
89
|
+
opencos/utils/vscode_helper.py,sha256=9nHyMUIL-gzfW-qLH06sgaCnVK-YTOtu6pusitNNhL8,1363
|
|
90
|
+
opencos/utils/vsim_helper.py,sha256=1johPOGbjbMgnCDSTpgsQcSuAquiqq1Y2MBxS6WY6b4,1552
|
|
91
|
+
opencos_eda-0.3.0.dist-info/licenses/LICENSE,sha256=HyVuytGSiAUQ6ErWBHTqt1iSGHhLmlC8fO7jTCuR8dU,16725
|
|
92
|
+
opencos_eda-0.3.0.dist-info/licenses/LICENSE.spdx,sha256=8gn1610RMP6eFgT3Hm6q9VKXt0RvdTItL_oxMo72jII,189
|
|
93
|
+
opencos_eda-0.3.0.dist-info/METADATA,sha256=KFNlElAF1mTMOenvOMpVfD5MRlIj1shxNBUiFGTuTQM,666
|
|
94
|
+
opencos_eda-0.3.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
95
|
+
opencos_eda-0.3.0.dist-info/entry_points.txt,sha256=6n1T5NwVYDhN5l1h5zmyT197G4pE0SySDreB0QJzJR0,218
|
|
96
|
+
opencos_eda-0.3.0.dist-info/top_level.txt,sha256=J4JDP-LpRyJqPNeh9bSjx6yrLz2Mk0h6un6YLmtqql4,8
|
|
97
|
+
opencos_eda-0.3.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|