opencos-eda 0.2.34__tar.gz → 0.2.35__tar.gz

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.
Files changed (81) hide show
  1. {opencos_eda-0.2.34/opencos_eda.egg-info → opencos_eda-0.2.35}/PKG-INFO +1 -1
  2. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/deps_helpers.py +12 -7
  3. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/eda_config_defaults.yml +0 -1
  4. opencos_eda-0.2.35/opencos/eda_extract_deps_keys.py +117 -0
  5. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tools/verilator.py +5 -2
  6. {opencos_eda-0.2.34 → opencos_eda-0.2.35/opencos_eda.egg-info}/PKG-INFO +1 -1
  7. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/pyproject.toml +1 -1
  8. opencos_eda-0.2.34/opencos/eda_extract_deps_keys.py +0 -81
  9. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/LICENSE +0 -0
  10. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/LICENSE.spdx +0 -0
  11. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/README.md +0 -0
  12. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/__init__.py +0 -0
  13. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/_version.py +0 -0
  14. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/_waves_pkg.sv +0 -0
  15. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/commands/__init__.py +0 -0
  16. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/commands/build.py +0 -0
  17. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/commands/elab.py +0 -0
  18. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/commands/export.py +0 -0
  19. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/commands/flist.py +0 -0
  20. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/commands/multi.py +0 -0
  21. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/commands/open.py +0 -0
  22. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/commands/proj.py +0 -0
  23. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/commands/sim.py +0 -0
  24. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/commands/sweep.py +0 -0
  25. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/commands/synth.py +0 -0
  26. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/commands/upload.py +0 -0
  27. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/commands/waves.py +0 -0
  28. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/deps_schema.py +0 -0
  29. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/eda.py +0 -0
  30. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/eda_base.py +0 -0
  31. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/eda_config.py +0 -0
  32. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/eda_config_max_verilator_waivers.yml +0 -0
  33. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/eda_config_reduced.yml +0 -0
  34. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/eda_deps_bash_completion.bash +0 -0
  35. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/eda_tool_helper.py +0 -0
  36. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/export_helper.py +0 -0
  37. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/export_json_convert.py +0 -0
  38. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/files.py +0 -0
  39. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/names.py +0 -0
  40. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/oc_cli.py +0 -0
  41. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/pcie.py +0 -0
  42. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/peakrdl_cleanup.py +0 -0
  43. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/seed.py +0 -0
  44. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tests/__init__.py +0 -0
  45. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tests/custom_config.yml +0 -0
  46. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tests/deps_files/command_order/DEPS.yml +0 -0
  47. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tests/deps_files/error_msgs/DEPS.yml +0 -0
  48. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tests/deps_files/iverilog_test/DEPS.yml +0 -0
  49. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tests/deps_files/no_deps_here/DEPS.yml +0 -0
  50. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tests/deps_files/non_sv_reqs/DEPS.yml +0 -0
  51. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tests/deps_files/tags_with_tools/DEPS.yml +0 -0
  52. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tests/deps_files/test_err_fatal/DEPS.yml +0 -0
  53. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tests/helpers.py +0 -0
  54. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tests/test_build.py +0 -0
  55. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tests/test_deps_helpers.py +0 -0
  56. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tests/test_deps_schema.py +0 -0
  57. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tests/test_eda.py +0 -0
  58. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tests/test_eda_elab.py +0 -0
  59. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tests/test_eda_synth.py +0 -0
  60. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tests/test_oc_cli.py +0 -0
  61. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tests/test_tools.py +0 -0
  62. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tools/__init__.py +0 -0
  63. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tools/invio.py +0 -0
  64. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tools/invio_helpers.py +0 -0
  65. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tools/invio_yosys.py +0 -0
  66. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tools/iverilog.py +0 -0
  67. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tools/modelsim_ase.py +0 -0
  68. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tools/questa.py +0 -0
  69. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tools/slang.py +0 -0
  70. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tools/slang_yosys.py +0 -0
  71. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tools/surelog.py +0 -0
  72. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tools/tabbycad_yosys.py +0 -0
  73. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tools/vivado.py +0 -0
  74. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/tools/yosys.py +0 -0
  75. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos/util.py +0 -0
  76. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos_eda.egg-info/SOURCES.txt +0 -0
  77. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos_eda.egg-info/dependency_links.txt +0 -0
  78. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos_eda.egg-info/entry_points.txt +0 -0
  79. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos_eda.egg-info/requires.txt +0 -0
  80. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/opencos_eda.egg-info/top_level.txt +0 -0
  81. {opencos_eda-0.2.34 → opencos_eda-0.2.35}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opencos-eda
3
- Version: 0.2.34
3
+ Version: 0.2.35
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
@@ -261,7 +261,8 @@ def get_all_targets(
261
261
  base_path: str = os.getcwd(),
262
262
  filter_str: str = '',
263
263
  filter_using_multi: str = '',
264
- error_on_empty_return: bool = True
264
+ error_on_empty_return: bool = True,
265
+ lstrip_path: bool = True
265
266
  ) -> list:
266
267
  '''Returns a list of [dir/target, ... ] using relpath from base_path
267
268
 
@@ -273,6 +274,8 @@ def get_all_targets(
273
274
  To all targets from dirs.
274
275
  '''
275
276
 
277
+ _path_lprefix = str(Path('.')) + os.path.sep
278
+
276
279
  if filter_using_multi:
277
280
  targets = []
278
281
  orig_dir = os.path.abspath(os.getcwd())
@@ -295,9 +298,10 @@ def get_all_targets(
295
298
  this_dir, leaf_target = os.path.split(target)
296
299
  if fnmatch_or_re(pattern=filter_str,
297
300
  string=leaf_target):
298
- targets.add(
299
- os.path.join(os.path.relpath(this_dir, start=base_path), leaf_target)
300
- )
301
+ t = os.path.join(os.path.relpath(this_dir, start=base_path), leaf_target)
302
+ if lstrip_path:
303
+ t = t.removeprefix(_path_lprefix)
304
+ targets.add(t)
301
305
  targets = list(targets)
302
306
  if not targets and error_on_empty_return:
303
307
  error(f'get_all_targets: {base_path=} {filter_using_multi=} returned no targets')
@@ -314,9 +318,10 @@ def get_all_targets(
314
318
  for leaf_target in deps_data_get_all_targets(data):
315
319
  if not filter_str or fnmatch_or_re(pattern=filter_str,
316
320
  string=leaf_target):
317
- targets.add(
318
- os.path.join(os.path.relpath(this_dir, start=base_path), leaf_target)
319
- )
321
+ t = os.path.join(os.path.relpath(this_dir, start=base_path), leaf_target)
322
+ if lstrip_path:
323
+ t = t.removeprefix(_path_lprefix)
324
+ targets.add(t)
320
325
 
321
326
  if not targets and error_on_empty_return:
322
327
  error(f'get_all_targets: {base_path=} {dirs=} {filter_str=} returned no targets')
@@ -144,7 +144,6 @@ tools:
144
144
 
145
145
  coverage-args: |
146
146
  --annotate logs/annotated
147
- --annotate-min 1
148
147
  coverage.dat
149
148
 
150
149
  # If you want to set your own run-time plusarg on all verilator exe's for --waves,
@@ -0,0 +1,117 @@
1
+ #!/usr/bin/env python3
2
+
3
+ '''
4
+ Helper pymodule used by eda_deps_bash_completion.bash, extracts valid
5
+ targets from DEPS files
6
+ '''
7
+
8
+ import sys
9
+ import os
10
+ from pathlib import Path
11
+ import json
12
+
13
+ import yaml
14
+ import toml
15
+
16
+ from opencos.deps_helpers import get_all_targets
17
+
18
+ PATH_LPREFIX = str(Path('.')) + os.path.sep
19
+
20
+
21
+ def get_terminal_columns():
22
+ """
23
+ Retrieves the number of columns (width) of the terminal window.
24
+
25
+ Returns:
26
+ int: The number of columns in the terminal, or a default value (e.g., 80)
27
+ if the terminal size cannot be determined.
28
+ """
29
+ try:
30
+ size = os.get_terminal_size()
31
+ return size.columns
32
+ except OSError:
33
+ # Handle cases where the terminal size cannot be determined (e.g., not in a TTY)
34
+ return 80 # Default to 80 columns
35
+ else:
36
+ return 80
37
+
38
+
39
+ def print_columns_manual(data: list, num_columns: int = 4, auto_columns: bool = True) -> None:
40
+ """Prints a list of strings in columns, manually aligning them."""
41
+ if not data:
42
+ print()
43
+ return
44
+
45
+ _spacing = 2
46
+
47
+ # Calculate maximum width for each column
48
+ max_lengths = [0] * num_columns
49
+ max_item_len = 0
50
+ for i, item in enumerate(data):
51
+ col_index = i % num_columns
52
+ max_lengths[col_index] = max(max_lengths[col_index], len(item))
53
+ max_item_len = max(max_item_len, len(item))
54
+
55
+ if auto_columns and num_columns > 1:
56
+ window_cols = get_terminal_columns()
57
+ max_line_len = 0
58
+ for x in max_lengths:
59
+ max_line_len += x + _spacing
60
+ if max_line_len > window_cols:
61
+ # subtract a column (already >= 2):
62
+ return print_columns_manual(data=data, num_columns=num_columns-1, auto_columns=True)
63
+ if max_line_len + max_item_len + _spacing < window_cols:
64
+ # add 1 more column if we're guaranteed to have room.
65
+ return print_columns_manual(data=data, num_columns=num_columns+1, auto_columns=True)
66
+ # else continue
67
+
68
+ # Print data in columns
69
+ for i, item in enumerate(data):
70
+ col_index = i % num_columns
71
+ print(item.ljust(max_lengths[col_index] + _spacing), end="") # Add padding
72
+ if col_index == num_columns - 1 or i == len(data) - 1:
73
+ print() # New line at the end of a row or end of data
74
+
75
+
76
+ def run(partial_path: str = '', base_path=str(Path('.'))) -> None:
77
+ '''Returns None, prints DEPS keys into pretty columns, using arg
78
+
79
+ partial_path as a string filter for target completions.
80
+ '''
81
+ partial_target = ''
82
+ if not partial_path or partial_path == str(Path('.')):
83
+ partial_path = PATH_LPREFIX
84
+ if not os.path.exists(partial_path):
85
+ partial_path, partial_target = os.path.split(partial_path)
86
+ if not partial_path:
87
+ partial_path = PATH_LPREFIX
88
+
89
+ try:
90
+ keys = get_all_targets(
91
+ dirs=[partial_path],
92
+ base_path=base_path,
93
+ filter_str=partial_target,
94
+ error_on_empty_return=False,
95
+ lstrip_path=True
96
+ )
97
+ except:
98
+ keys = []
99
+
100
+ print_columns_manual(data=keys, num_columns=4, auto_columns=True)
101
+
102
+
103
+ def main() -> None:
104
+ '''Returns None, prints DEPS keys into pretty columns, uses sys.argv[1] for args:
105
+
106
+ sys.args[1] -- optional partial path for target completions
107
+ '''
108
+
109
+ if len(sys.argv) > 1:
110
+ partial_path = sys.argv[1]
111
+ else:
112
+ partial_path = PATH_LPREFIX
113
+ run(partial_path)
114
+
115
+
116
+ if __name__ == "__main__":
117
+ main()
@@ -78,6 +78,7 @@ class VerilatorSim(CommandSim, ToolVerilator):
78
78
  'dump-vcd': False,
79
79
  'lint-only': False,
80
80
  'cc-mode': False,
81
+ 'verilator-coverage-args': [],
81
82
  })
82
83
 
83
84
  self.args_help.update({
@@ -303,9 +304,11 @@ class VerilatorSim(CommandSim, ToolVerilator):
303
304
  verilated_post_exec_coverage_command_list = [self.verilator_coverage_exe]
304
305
  config_coverage_args = self.tool_config.get(
305
306
  'coverage-args',
306
- '--annotate logs/annotated --annotate-min 1 coverage.dat').split()
307
+ '--annotate logs/annotated coverage.dat').split()
308
+
309
+ verilated_post_exec_coverage_command_list += \
310
+ config_coverage_args + self.args['verilator-coverage-args']
307
311
 
308
- verilated_post_exec_coverage_command_list += config_coverage_args
309
312
 
310
313
  return [ util.ShellCommandList(verilated_post_exec_coverage_command_list,
311
314
  tee_fpath='coverage.log') ] # single entry list
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opencos-eda
3
- Version: 0.2.34
3
+ Version: 0.2.35
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
@@ -2,7 +2,7 @@
2
2
 
3
3
  [project]
4
4
  name = "opencos-eda"
5
- version = "0.2.34"
5
+ version = "0.2.35"
6
6
  dependencies = [
7
7
  # opencos/eda.py dependencies
8
8
  "mergedeep >= 1.3.4",
@@ -1,81 +0,0 @@
1
- #!/usr/bin/env python3
2
-
3
- '''
4
- Helper pymodule used by eda_deps_bash_completion.bash, extracts valid
5
- targets from DEPS files
6
- '''
7
-
8
- import sys
9
- import os
10
- import json
11
-
12
- import yaml
13
- import toml
14
-
15
- from opencos.deps_helpers import get_deps_markup_file
16
-
17
- def get_markup_table_keys(partial_path='./') -> list:
18
- '''Returns a list of root level keys for DEPS.[yml|yaml|toml|json]
19
-
20
- Does not include DEFAULTS.
21
- '''
22
- partial_target = ''
23
- if not partial_path or partial_path == '.':
24
- partial_path = './'
25
-
26
- if not os.path.exists(partial_path):
27
- partial_path, partial_target = os.path.split(partial_path)
28
- if not partial_path:
29
- partial_path = './'
30
-
31
- filepath = get_deps_markup_file(base_path=partial_path)
32
- if not filepath:
33
- # Couldn't find a DEPS file, let bash completion handle it (with -W words or -G glob)
34
- return []
35
-
36
- data = {}
37
- _, file_ext = os.path.splitext(filepath)
38
- try:
39
- if file_ext in ['', '.yml', 'yaml']:
40
- with open(filepath, 'r', encoding='utf-8') as f:
41
- data = yaml.safe_load(f)
42
- elif file_ext == '.toml':
43
- data = toml.load(filepath)
44
- elif file_ext == '.json':
45
- with open(filepath, 'r', encoding='utf-8') as f:
46
- data = json.load(f)
47
- except Exception: # pylint: disable=broad-exception-caught
48
- return []
49
-
50
- if not isinstance(data, dict):
51
- # We found a DEPS file, but it wasn't a table/dict so we can't return root keys
52
- return []
53
-
54
- # Try to resolve path/to/target/partial_target_
55
- # -- prepend path information to found targets in path/to/target/DEPS
56
- prepend = ''
57
- if partial_path and partial_path != './':
58
- prepend = partial_path
59
- if not partial_path.endswith('/'):
60
- prepend += '/'
61
-
62
- # Return the list of keys w/ prepended path information, and don't include
63
- # uppercase strings like 'DEFAULTS' or 'METADATA'
64
- return [
65
- prepend + x for x in list(data.keys()) if x.startswith(partial_target) and not x.isupper()
66
- ]
67
-
68
-
69
- def main() -> None:
70
- '''Returns None, prints DEPS keys space separated, uses sys.argv for a single
71
- partial path arg (DEPS file to examine)'''
72
-
73
- if len(sys.argv) > 1:
74
- partial_path = sys.argv[1]
75
- else:
76
- partial_path = './'
77
- keys = get_markup_table_keys(partial_path)
78
- print(" ".join(keys))
79
-
80
- if __name__ == "__main__":
81
- main()
File without changes
File without changes
File without changes
File without changes