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/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
- del self.data[key]
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
- info(f'Wrote artifacts JSON: {self.artifacts_json_filepath}')
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, error_code: int = 255, do_exit: bool = True, start: object = None, end: str = '\n'
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:
@@ -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
- '''Warpper for yaml.dump, enforces file extension otherwise warning'''
93
- if filepath.endswith('.yml') or filepath.endswith('.yaml'):
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.50
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=y53bScMokPfpbZfqzpSg9Q08U6GVF_BjW2P0bPiEBE0,20424
6
- opencos/eda_base.py,sha256=h3aeSp0TY5b90r-Hd5dBiRlm2KAhtIsf0aWLJIZ1XfQ,94199
7
- opencos/eda_config.py,sha256=Rnf3PbvlDytg9klQrRcksUizryYwn2pWARYN1KJPj14,11321
8
- opencos/eda_config_defaults.yml,sha256=5EpzyFkEjL7lg3Xrx2M8lvoomkS1lVV18mbhBuym6w8,12607
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=yGjyhQoy06A7d-UocMvRKqYkbyZ-FOoTR7F83XBHBR8,33325
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=gN6nQ4GURhPC8nu8Zuj08s1fmNzuiuaS9vJgtNZyX28,3647
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=senuqSGOc5nVGU5voZNJO4_hzVAK0ELtu0wmRZgwv3k,7463
31
- opencos/commands/sim.py,sha256=6_WiHnh6_xaEi4T-wlOyWxjCPdVcL-bWppPXy3-sIRw,14291
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=dsWwtjpDgH-YsiIjJgqTvteY3OZ48UnEAWc3blV2Fog,7055
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=QvJ1fMyoQOXNbvHjWevkYF2kx0zvbRgFZ3GAPWw8jqk,12997
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=HEjKm86OMcrZznJMiiDFsDBN8FlBf4LR9egGO1pOh5c,5285
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=vgrimIwJ1REFkQuKadWaS-UKcEB3wnumX-xN-91gqiE,1790
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=h5VScZyJYxk2cXDRrTTD47C_yAVHuyXv9_p7UL1o5mk,19486
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=5zn9CeJc6UUuBI1Gk7HD8Y_l4GPa4KcLB7NNYxIQBjY,25648
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=tDaDtV4INEg04Diks1ZXlfOwzyCOGnWqc5aeHnwLoOk,3727
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
- opencos_eda-0.2.50.dist-info/licenses/LICENSE,sha256=HyVuytGSiAUQ6ErWBHTqt1iSGHhLmlC8fO7jTCuR8dU,16725
84
- opencos_eda-0.2.50.dist-info/licenses/LICENSE.spdx,sha256=8gn1610RMP6eFgT3Hm6q9VKXt0RvdTItL_oxMo72jII,189
85
- opencos_eda-0.2.50.dist-info/METADATA,sha256=a7ZzQPyvJ1e5ZYWhIs1Gt39wvoa9PWPi27rJxKiMMd8,604
86
- opencos_eda-0.2.50.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
87
- opencos_eda-0.2.50.dist-info/entry_points.txt,sha256=hi6SZHiGGgLrI3KnBCOXDpYOGXYpw-zWBWe5Di39OCw,167
88
- opencos_eda-0.2.50.dist-info/top_level.txt,sha256=J4JDP-LpRyJqPNeh9bSjx6yrLz2Mk0h6un6YLmtqql4,8
89
- opencos_eda-0.2.50.dist-info/RECORD,,
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,,
@@ -1,5 +1,6 @@
1
1
  [console_scripts]
2
2
  eda = opencos.eda:main_cli
3
+ eda_deps_sanitize = opencos.eda_deps_sanitize:main
3
4
  eda_deps_schema = opencos.deps_schema:main
4
5
  eda_targets = opencos.eda_extract_targets:main
5
6
  oc_cli = opencos.hw.oc_cli:main