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/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
- voptargs_str = ""
182
- if self.args['gui'] or self.args['waves'] or self.args['coverage']:
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)
@@ -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': ('Include waveforms, if possible for Verilator by applying'
88
- ' simulation runtime arg +trace. User will need SV code to interpret the'
89
- 'plusarg and apply $dumpfile("dump.fst").'),
90
- 'dump-vcd': ('If using --waves, apply simulation runtime arg +trace=vcd. User'
91
- ' will need SV code to interpret the plusarg and apply'
92
- ' $dumpfile("dump.vcd").'),
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._add_verilator_waves_files()
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
- else:
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 _add_verilator_waves_files(self) -> None:
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 bround a .cpp file and verilator not
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
- found_dumpfile = False
365
- for fname in self.files_v + self.files_sv:
366
- if found_dumpfile:
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(tokens: list) -> (argparse.Namespace, list):
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, and expand all parsed.input_file (list) tokens first,
458
- # for now put dot-f file contents in front of of tokens, do this in a separate custom
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
- ' args/defines/incdirs/files/targets'))
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
- for filepath in parsed.input_file:
482
- tokens2[0:0] = read_tokens_from_dot_f(filepath)
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'Skipping nested -f/--input-file(s) {parsed.input_file}')
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.
@@ -14,7 +14,7 @@ from opencos.util import debug
14
14
 
15
15
  vscode_path = shutil.which('code')
16
16
 
17
- INIT_HAS_RUN = False
17
+ INIT_HAS_RUN = False # pylint: disable=invalid-name
18
18
  EXTENSIONS = {} # dict of {name: version} for VScode extensions of name
19
19
 
20
20
 
@@ -10,7 +10,7 @@ import subprocess
10
10
 
11
11
  from opencos.util import debug
12
12
 
13
- INIT_HAS_RUN = False
13
+ INIT_HAS_RUN = False # pylint: disable=invalid-name
14
14
  TOOL_IS = {
15
15
  'riviera': False,
16
16
  'modelsim_ase': False,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opencos-eda
3
- Version: 0.2.57
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=XiHFZjCofkkZvI9befTFKsRt5zLouUo1CIwhW4srWU0,582
3
- opencos/_waves_pkg.sv,sha256=1lbhQOVGc3t_R8czYjP40hssP0I3FlZOpHTkI7yKFbI,1251
4
- opencos/deps_schema.py,sha256=02pSLBEvWK147lUwE8DRojYgE6HReZBBKP_pzVRow1c,16533
5
- opencos/eda.py,sha256=VSyL0CIUDmPhy-41HphGwR5MJGsKc_dG__gPQWY4Lfo,23290
6
- opencos/eda_base.py,sha256=mCkSCGO__Jfjf27-TSOo7IRppL66-aY3kJVK3RBFjXw,105899
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=Xu-Lbe8Dmf89wGIQLPbRu02XbuegyoMcb-abeF5zYNI,16020
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=9VGc54Rm-snEwbKEbToQRGoeGg8wqBeWpTJBagEbjw0,37770
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=hvjrvg7AbEotuQze6-yz3DOYRMtagkvJ-6TFNJQTwrs,1441
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=dpTcrtPjIt6TOw-i8LUWhb4ismFAE1QK-dNAHC1jxME,3510
27
- opencos/commands/flist.py,sha256=uFjNxrXvigQKzG2v8sooz_3iVaTHBKkm-NDYXo9ktAE,9068
28
- opencos/commands/lec.py,sha256=hrTPp-D8KAj9Ho5Kzp-vwfLLTAsMvXz3eZlOHiDL6uM,4049
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=vCsZle3oUJ8xmIFuepgAD6G-YGl35xtTIcTeiVDshNo,1112
33
- opencos/commands/shell.py,sha256=dFXXtvsDs3Khme41du8LhKdV3qRosxjTfju6SJbOSKM,7599
34
- opencos/commands/sim.py,sha256=HIyKT3avB844Z5RWidvck1ZhVa5MfS7PTjCactZO3o4,19226
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=tuxWmxMNmE9hveWXGNfKDelzxi_wK7ZL7V2LiZV6Ypg,4371
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=7ETOnG08HERKcJUjynnrKZV1sQQVUsW-zKlwoCN1VkI,1298
42
- opencos/deps/deps_commands.py,sha256=OlqueYFK8U83loasok3xJGzUDpNcj2DPk37332DfmRo,17039
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=yYgb1W3bxu3xx1ga6mbq97eTGaPNLwNJ0IJWYPpfCD0,10047
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=f9GJXvzcdE3SGkKJ7q-YBTgRagZcIzeRa6nMVCCiEvI,7848
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=cdxfLCUZq0nNelCQiplZXkeF4eyzmyJlZJFDSo77qeI,39464
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=vloOzWZ5qU3yGNFaDlrAJdEzYxK6qf8gfac3zqF-0FI,438
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=zIgJwm3f_EoiRSsFr0XWQ5BV1XZr1zAjmIQ4n2TVKjM,17313
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=qhDiXnXeglqcZTN244fVcuC5r-Q9wMo0jAtJF5_Ndro,11820
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=ZrmcJ-lt3wXdHRfLMangU0CepGf-GFsp5w0NmdF8Be8,21361
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=2YPjcDH_vTlwJvcITyMfvx8dLzPSRKzAvFRJz7BaJk8,1332
90
- opencos/utils/vsim_helper.py,sha256=zAnKed56x9jiSxJFsyxGRfJ16xgpIWkq4pWqXcoaumE,1520
91
- opencos_eda-0.2.57.dist-info/licenses/LICENSE,sha256=HyVuytGSiAUQ6ErWBHTqt1iSGHhLmlC8fO7jTCuR8dU,16725
92
- opencos_eda-0.2.57.dist-info/licenses/LICENSE.spdx,sha256=8gn1610RMP6eFgT3Hm6q9VKXt0RvdTItL_oxMo72jII,189
93
- opencos_eda-0.2.57.dist-info/METADATA,sha256=T77O2iSSb2l8RsEbLIVeIl8F8rw8jVC02T3HhyKWQuk,631
94
- opencos_eda-0.2.57.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
95
- opencos_eda-0.2.57.dist-info/entry_points.txt,sha256=6n1T5NwVYDhN5l1h5zmyT197G4pE0SySDreB0QJzJR0,218
96
- opencos_eda-0.2.57.dist-info/top_level.txt,sha256=J4JDP-LpRyJqPNeh9bSjx6yrLz2Mk0h6un6YLmtqql4,8
97
- opencos_eda-0.2.57.dist-info/RECORD,,
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,,