opencos-eda 0.3.5__py3-none-any.whl → 0.3.7__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
@@ -32,6 +32,7 @@ env_files_loaded = set() # pylint: disable=invalid-name
32
32
 
33
33
  args = { # pylint: disable=invalid-name
34
34
  'color' : bool(supportsColor.stdout),
35
+ 'emoji' : bool(getattr(supportsColor.stdout, 'level', 0) >= 2),
35
36
  'quiet' : False,
36
37
  'verbose' : False,
37
38
  'debug' : False,
@@ -44,16 +45,25 @@ args = { # pylint: disable=invalid-name
44
45
  max_error_code = 0 # pylint: disable=invalid-name
45
46
 
46
47
  class Colors:
47
- '''Namespace class for color printing help'''
48
+ '''Namespace class for color printing help
49
+
50
+ Avoid calling these directly, other than perhapas calling info(*txt, color=Colors.red)
51
+ with 'color' set. It is preferred for outside callers to use one of the print_<color>(..)
52
+ functions, or one of info|warning|error|debug
53
+ '''
48
54
  red = "\x1B[31m"
49
55
  green = "\x1B[32m"
50
- orange = "\x1B[33m"
51
- yellow = "\x1B[39m"
56
+ yellow = "\x1B[33m" # This looks orange, but it's techincally yellow
57
+ cyan = "\x1b[36m"
58
+ foreground = "\x1B[39m"
59
+ bold = "\x1B[1m"
60
+ byellow = "\x1B[1m\x1B[33m"
61
+ bcyan = "\x1B[1m\x1b[36m"
52
62
  normal = "\x1B[0m"
53
63
 
54
64
  @staticmethod
55
65
  def color_text(text: str, color: str) -> str:
56
- '''Wraps 'text' (str) with color (one of red|green|orange|yellow) prefix and
66
+ '''Wraps 'text' (str) with color (one of red|green|yellow|foreground) prefix and
57
67
 
58
68
  color (normal) suffix. Disables color prefix/suffix wrapping if args['color']=False
59
69
  '''
@@ -61,29 +71,21 @@ class Colors:
61
71
  return color + text + "\x1B[0m" # (normal)
62
72
  return text
63
73
 
64
- def red_text(text: str) -> str:
65
- '''Wraps text for printing as red, disabled if global args['color']=False'''
66
- if args['color']:
67
- return Colors.red + text + Colors.normal
68
- return text
69
-
70
- def green_text(text: str) -> str:
71
- '''Wraps text for printing as green, disabled if global args['color']=False'''
72
- if args['color']:
73
- return Colors.green + text + Colors.normal
74
- return text
75
-
76
- def orange_text(text: str) -> str:
77
- '''Wraps text for printing as orange, disabled if global args['color']=False'''
78
- if args['color']:
79
- return Colors.orange + text + Colors.normal
80
- return text
81
-
82
- def yellow_text(text: str) -> str:
83
- '''Wraps text for printing as yellow, disabled if global args['color']=False'''
84
- if args['color']:
85
- return Colors.yellow + text + Colors.normal
86
- return text
74
+ def disable(self) -> None:
75
+ '''Clears all color str in class Colors, to prevent print() methods that use
76
+ util.Colors from printing color'''
77
+ for x in dir(self):
78
+ if not callable(getattr(self, x, None)) and isinstance(x, str) and \
79
+ not x.startswith('_'):
80
+ setattr(self, x, '')
81
+
82
+
83
+ def safe_emoji(emoji: str, default: str = '') -> str:
84
+ '''Returns emoji character if args['emoji'] is True'''
85
+ if args['emoji']:
86
+ return emoji
87
+ return default
88
+
87
89
 
88
90
  class ArtifactTypes(Enum):
89
91
  '''Types that are allow-listed for artifacts.add* methods. If you don't use one of
@@ -343,7 +345,7 @@ def get_argparse_bool_action_kwargs() -> dict:
343
345
  def get_argparser() -> argparse.ArgumentParser:
344
346
  '''Returns the opencos.util ArgumentParser'''
345
347
  parser = argparse.ArgumentParser(
346
- prog='opencos common options', add_help=False, allow_abbrev=False
348
+ prog=f'{safe_emoji("🔎 ")}opencos common options', add_help=False, allow_abbrev=False
347
349
  )
348
350
  # We set allow_abbrev=False so --force-logfile won't try to attempt parsing shorter similarly
349
351
  # named args like --force, we want those to go to unparsed list.
@@ -355,6 +357,8 @@ def get_argparser() -> argparse.ArgumentParser:
355
357
  parser.add_argument('--version', default=False, action='store_true')
356
358
  parser.add_argument('--color', **bool_action_kwargs, default=bool(supportsColor.stdout),
357
359
  help='Use shell colors for info/warning/error messaging')
360
+ parser.add_argument('--emoji', **bool_action_kwargs, default=args['emoji'],
361
+ help=f'Support emojis in terminal{safe_emoji(" 💪")}')
358
362
  parser.add_argument('--quiet', **bool_action_kwargs, default=args['quiet'],
359
363
  help='Do not display info messaging')
360
364
  parser.add_argument('--verbose', **bool_action_kwargs, default=args['verbose'],
@@ -410,13 +414,26 @@ def get_argparser_short_help(parser: object = None) -> str:
410
414
  '''Returns short help for our ArgumentParser'''
411
415
  if not parser:
412
416
  parser = get_argparser()
413
- full_lines = strip_ansi_color(parser.format_help()).split('\n')
417
+
418
+ if not args['color']:
419
+ # Since python3.14 doesn't care about our custom color settings,
420
+ # need to remove any ANSI colors from argparse help formatter:
421
+ full_lines = strip_ansi_color(parser.format_help()).split('\n')
422
+ else:
423
+ full_lines = parser.format_help().split('\n')
424
+
414
425
  lineno = 0
415
426
  for lineno, line in enumerate(full_lines):
427
+ # Again, strip any ANSI colors when searching for starting text:
428
+ # - options:
429
+ # - optional arguments:
430
+ if args['color']:
431
+ line = strip_ansi_color(line)
416
432
  if any(line.startswith(x) for x in ('options:', 'optional arguments:')):
417
433
  break
418
- # skip the line that says 'options:', repalce with the progname:
419
- return f'{parser.prog}:\n' + '\n'.join(full_lines[lineno + 1:])
434
+
435
+ # skip the line that says 'options:', replace with the progname:
436
+ return f'{Colors.cyan}{parser.prog}:{Colors.normal}\n' + '\n'.join(full_lines[lineno + 1:])
420
437
 
421
438
 
422
439
  def process_token(arg: list) -> bool:
@@ -528,13 +545,14 @@ def process_tokens( # pylint: disable=too-many-branches
528
545
  global debug_level # pylint: disable=global-statement
529
546
  debug_level = 0
530
547
 
531
- # Deal with --debug, --debug-level, --env-file, -f/--input-file(s) tokens first,
532
- # for now put dot-f file contents in front of of tokens, do this first in a
533
- # separate custom argparser:
548
+ # Deal with --version, --debug, --debug-level, --env-file, -f/--input-file(s)
549
+ # tokens first, for now put dot-f file contents in front of of tokens, do this first
550
+ # in a separate custom argparser:
534
551
  bool_action_kwargs = get_argparse_bool_action_kwargs()
535
552
  parser = argparse.ArgumentParser(
536
553
  prog='opencos -f/--input-file', add_help=False, allow_abbrev=False
537
554
  )
555
+ parser.add_argument('--version', default=False, action='store_true')
538
556
  parser.add_argument('--debug', **bool_action_kwargs,
539
557
  help='Display additional debug messaging level 1 or higher')
540
558
  parser.add_argument('--debug-level', type=int, default=0,
@@ -555,6 +573,10 @@ def process_tokens( # pylint: disable=too-many-branches
555
573
  except argparse.ArgumentError:
556
574
  error(f'util -f/--input-file, problem attempting to parse_known_args for: {tokens}')
557
575
 
576
+ if parsed.version:
577
+ # Stop processing, return nothing, caller can print version and exit.
578
+ return parsed, []
579
+
558
580
  process_debug_args(parsed=parsed)
559
581
  debug(f'util.process_tokens: {parsed=} {unparsed=} from: {tokens}')
560
582
 
@@ -594,6 +616,9 @@ def process_tokens( # pylint: disable=too-many-branches
594
616
  warning(f'python error, nested -f/--input-file(s) {parsed.input_file} should',
595
617
  'have already been resolved')
596
618
 
619
+ if not parsed.color:
620
+ Colors.disable(Colors) # strip strings in Colors class
621
+
597
622
  # clear existing artifacts dicts (mostly for pytests repeatedly calling eda.main),
598
623
  # set artifacts.enabled based on args['artifacts-json']
599
624
  artifacts.reset(enable=parsed.artifacts_json)
@@ -724,7 +749,7 @@ def print_post(text: str, end: str) -> None:
724
749
 
725
750
 
726
751
  def print_color(text: str, color: str, end: str = '\n') -> None:
727
- '''Note that color(str) must be one of Colors.[red|green|orange|yellow|normal]'''
752
+ '''Note that color(str) must be one of Colors.[red|green|yellow|normal]'''
728
753
  print_pre()
729
754
  print(Colors.color_text(text, color), end=end, flush=True)
730
755
  print_post(text, end)
@@ -732,25 +757,25 @@ def print_color(text: str, color: str, end: str = '\n') -> None:
732
757
  def print_red(text: str, end: str = '\n') -> None:
733
758
  '''Print text as red, goes back to normal color'''
734
759
  print_pre()
735
- print(red_text(text), end=end, flush=True)
760
+ print(Colors.color_text(text, color=Colors.red), end=end, flush=True)
736
761
  print_post(text, end)
737
762
 
738
763
  def print_green(text: str, end: str = '\n') -> None:
739
764
  '''Print text as green, goes back to normal color'''
740
765
  print_pre()
741
- print(green_text(text), end=end, flush=True)
766
+ print(Colors.color_text(text, color=Colors.green), end=end, flush=True)
742
767
  print_post(text, end)
743
768
 
744
- def print_orange(text: str, end: str = '\n') -> None:
745
- '''Print text as orange, goes back to normal color'''
769
+ def print_yellow(text: str, end: str = '\n') -> None:
770
+ '''Print text as yellow, goes back to normal color'''
746
771
  print_pre()
747
- print(orange_text(text), end=end, flush=True)
772
+ print(Colors.color_text(text, color=Colors.yellow), end=end, flush=True)
748
773
  print_post(text, end)
749
774
 
750
- def print_yellow(text: str, end: str = '\n') -> None:
751
- '''Print text as yellow, goes back to normal color'''
775
+ def print_foreground_color(text: str, end: str = '\n') -> None:
776
+ '''Print text as foreground color, goes back to normal color'''
752
777
  print_pre()
753
- print(yellow_text(text), end=end, flush=True)
778
+ print(Colors.color_text(text, color=Colors.foreground), end=end, flush=True)
754
779
  print_post(text, end)
755
780
 
756
781
 
@@ -763,8 +788,11 @@ def set_debug_level(level) -> None:
763
788
  info(f"Set debug level to {debug_level}")
764
789
 
765
790
 
766
- def debug(*text, level: int = 1, start: object = None, end: str = '\n') -> None:
767
- '''Print debug messaging (in yellow if possible). If args['debug'] is false, prints nothing.
791
+ def debug(
792
+ *text, level: int = 1, start: object = None, end: str = '\n', color=Colors.foreground
793
+ ) -> None:
794
+ '''Print debug messaging (in foreground color if possible). If args['debug'] is false,
795
+ prints nothing.
768
796
 
769
797
  *text: (positional str args) to be printed
770
798
  level: (int) debug level to decide if printed or not.
@@ -777,10 +805,10 @@ def debug(*text, level: int = 1, start: object = None, end: str = '\n') -> None:
777
805
  start = "DEBUG: " + (f"[{progname}] " if progname_in_message else "")
778
806
  if args['debug'] and \
779
807
  (((level==1) and args['verbose']) or (debug_level >= level)):
780
- print_yellow(f"{start}{' '.join(list(text))}", end=end)
808
+ print_color(f"{start}{' '.join(list(text))}", color=color, end=end)
781
809
 
782
810
 
783
- def info(*text, start: object = None, end='\n') -> None:
811
+ def info(*text, start: object = None, end='\n', color=Colors.green) -> None:
784
812
  '''Print information messaging (in green if possible). If args['quiet'], prints nothing.
785
813
 
786
814
  *text: (positional str args) to be printed
@@ -792,10 +820,10 @@ def info(*text, start: object = None, end='\n') -> None:
792
820
  if start is None:
793
821
  start = "INFO: " + (f"[{progname}] " if progname_in_message else "")
794
822
  if not args['quiet']:
795
- print_green(f"{start}{' '.join(list(text))}", end=end)
823
+ print_color(f"{start}{' '.join(list(text))}", color=color, end=end)
796
824
 
797
825
  def warning(*text, start: object = None, end: str = '\n') -> None:
798
- '''Print warning messaging (in orange if possible).
826
+ '''Print warning messaging (in yellow if possible).
799
827
 
800
828
  *text: (positional str args) to be printed
801
829
  start: (optional str) prefix to message; if None: chooses default start str
@@ -806,7 +834,7 @@ def warning(*text, start: object = None, end: str = '\n') -> None:
806
834
  if start is None:
807
835
  start = "WARNING: " + (f"[{progname}] " if progname_in_message else "")
808
836
  args['warnings'] += 1
809
- print_orange(f"{start}{' '.join(list(text))}", end=end)
837
+ print_yellow(f"{start}{' '.join(list(text))}", end=end)
810
838
 
811
839
 
812
840
  def error(
@@ -828,7 +856,10 @@ def error(
828
856
  global max_error_code # pylint: disable=global-statement
829
857
 
830
858
  if start is None:
831
- start = "ERROR: " + (f"[{progname}] " if progname_in_message else "")
859
+ start = f"{Colors.bold}ERROR:{Colors.normal}{Colors.red} "
860
+ if progname_in_message:
861
+ start += f"[{progname}] "
862
+ start += safe_emoji("❌ ")
832
863
  args['errors'] += 1
833
864
  max_error_code = max(max_error_code, error_code)
834
865
  print_red(f"{start}{' '.join(list(text))}", end=end)
@@ -862,7 +893,17 @@ def exit( # pylint: disable=redefined-builtin
862
893
 
863
894
  if global_exit_allowed:
864
895
  if not quiet:
865
- info(f"Exiting with {args['warnings']} warnings, {args['errors']} errors")
896
+ info_color = Colors.green
897
+ start = safe_emoji('🔚 ')
898
+ if args['errors']:
899
+ info_color = Colors.red
900
+ start = safe_emoji('❗ ')
901
+ elif args['warnings']:
902
+ info_color = Colors.yellow
903
+ info(
904
+ f"{start}Exiting with {args['warnings']} warnings, {args['errors']} errors",
905
+ color=info_color
906
+ )
866
907
  sys.exit(error_code)
867
908
 
868
909
  if error_code is None:
@@ -998,14 +1039,18 @@ def import_class_from_string(full_class_name: str) -> None:
998
1039
  class ShellCommandList(list):
999
1040
  '''Wrapper around a list, of str that we'll run as a subprocess command
1000
1041
 
1001
- included member var for tee_path, to save a log from this subprocess commands list
1042
+ included member vars for:
1043
+ - tee_path, to save a log from this subprocess commands list
1044
+ - work_dir - in case we want to run this from non-default location.
1002
1045
  '''
1003
- def __init__(self, obj: object = None, tee_fpath: str = ''):
1046
+ def __init__(self, obj: object = None, tee_fpath: str = '', work_dir: str = ''):
1004
1047
  super().__init__(obj)
1005
- for k in ['tee_fpath']:
1048
+ for k in ('tee_fpath', 'work_dir'):
1006
1049
  setattr(self, k, getattr(obj, k, None))
1007
1050
  if tee_fpath:
1008
1051
  self.tee_fpath = tee_fpath
1052
+ if work_dir:
1053
+ self.work_dir = work_dir
1009
1054
 
1010
1055
 
1011
1056
  def write_shell_command_file(
@@ -6,7 +6,9 @@ import subprocess
6
6
  import sys
7
7
 
8
8
  import psutil
9
+ from opencos import util
9
10
  from opencos.util import debug, error, info, warning, progname, global_log
11
+ from opencos.utils.str_helpers import strip_ansi_color
10
12
 
11
13
  IS_WINDOWS = sys.platform.startswith('win')
12
14
 
@@ -68,7 +70,7 @@ def subprocess_run_background( # pylint: disable=too-many-branches
68
70
 
69
71
  proc_kwargs = {'shell': shell,
70
72
  'stdout': subprocess.PIPE,
71
- 'stderr': subprocess.STDOUT,
73
+ 'stderr': subprocess.STDOUT
72
74
  }
73
75
  if work_dir:
74
76
  proc_kwargs['cwd'] = work_dir
@@ -101,14 +103,29 @@ def subprocess_run_background( # pylint: disable=too-many-branches
101
103
  error(f'Unable to open file "{tee_fpath}" for writing, {e}')
102
104
 
103
105
  for line in iter(proc.stdout.readline, b''):
104
- line = line.rstrip().decode("utf-8", errors="replace")
106
+ line = line.decode("utf-8", errors="replace") # leave \n intact
107
+
108
+ # Since we don't control what the subprocess command did, if it
109
+ # thinks we support color, but user ran with --no-color, we need to strip ANSI colors:
110
+ if not util.args['color']:
111
+ line = strip_ansi_color(line)
112
+
113
+ # Print the line with color, if --color:
105
114
  if not background:
106
- print(line)
115
+ print(line, end='')
116
+
117
+ # for all logs, and the returned stdout str, if we haven't stripped color yet,
118
+ # we need to now, before writing to tee_fpath_f, or to global_log:
119
+ if util.args['color']:
120
+ line = strip_ansi_color(line)
121
+ line = line.replace('\r', '') # remove CR
122
+
107
123
  if tee_fpath_f:
108
- tee_fpath_f.write(line + '\n')
124
+ tee_fpath_f.write(line)
109
125
  if global_log.file:
110
- global_log.write(line, '\n')
111
- stdout += line + '\n'
126
+ # directly write to file handle, avoid util.UtilLogger.write(line, end='')
127
+ global_log.file.write(line)
128
+ stdout += line
112
129
 
113
130
  proc.communicate()
114
131
  remove_completed_parent_pid(proc.pid)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opencos-eda
3
- Version: 0.3.5
3
+ Version: 0.3.7
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
@@ -16,11 +16,14 @@ Requires-Dist: schema>=0.7.7
16
16
  Requires-Dist: toml>=0.10.2
17
17
  Requires-Dist: yamllint>=1.35.1
18
18
  Requires-Dist: PySerial>=3.5
19
- Requires-Dist: cocotb>=2.0
20
19
  Requires-Dist: supports_color>=0.2.0
21
20
  Provides-Extra: dev
22
21
  Requires-Dist: pylint>=3.0.0; extra == "dev"
23
22
  Requires-Dist: pytest>=8.3.5; extra == "dev"
23
+ Provides-Extra: cocotb
24
+ Requires-Dist: cocotb>=2.0; extra == "cocotb"
25
+ Requires-Dist: pytest>=8.3.5; extra == "cocotb"
26
+ Requires-Dist: coverage>=7.6.1; extra == "cocotb"
24
27
  Provides-Extra: docs
25
28
  Requires-Dist: mkdocs; extra == "docs"
26
29
  Requires-Dist: mkdocs-material; extra == "docs"
@@ -2,36 +2,36 @@ opencos/__init__.py,sha256=RwJA9oc1uUlvNX7v5zoqwjnSRNq2NZwRlHqtS-ICJkI,122
2
2
  opencos/_version.py,sha256=KaWIjS0c08g-C0fgYY1kXwSPqhOFxaq5pYEeoZhOR_I,617
3
3
  opencos/_waves_pkg.sv,sha256=TL5YT9lT-fn2FD54MbVVZROmZ7vtW3ScA_rM2eRzKmU,2068
4
4
  opencos/deps_schema.py,sha256=fx1_IJhsDYkUciwwCPTXHP6ftFjTsPVjO4xg12twIjw,17384
5
- opencos/eda.py,sha256=m_Jq1Iht0I7dSN4ceI4c4QZCkKjW85ewvoLfCaOo7-s,23315
6
- opencos/eda_base.py,sha256=PK89dJMmTHAqvfrxkVXkYZlvyk4er2AVDJ5FMVHry6A,109724
7
- opencos/eda_config.py,sha256=afimZEfvVitWS-k3IsR7fwzIz5dHWKfiJp5qHzzBF6c,14110
8
- opencos/eda_config_defaults.yml,sha256=2IX9i7VCwgXHKzsjcEGdLJ6SqxiQqXbVIupYNhjHIes,16263
5
+ opencos/eda.py,sha256=tmDF1TZAa_i3CSWdc92GL1iYM86Fz1p_wdsfy88aPco,23933
6
+ opencos/eda_base.py,sha256=wdjfm79q7jlXgbn1PTRe-4Ewe9h2itJRuZ7zsk_SdGQ,115259
7
+ opencos/eda_config.py,sha256=cKAUKguoFEvFgvi2c36Osf6W767Y4KYjoagflqVhUSw,14168
8
+ opencos/eda_config_defaults.yml,sha256=tbu7hyfPM0AetW0CTMu4J3umGMpHLn5bs5bkWDyFM3w,16260
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
12
  opencos/eda_deps_sanitize.py,sha256=SQjvrte9Hv9JesRY0wljvbdC6pAmLCikI-Wdzzy-D04,1939
13
13
  opencos/eda_extract_targets.py,sha256=POlxZfqf2dNH2nc1CEw5B_53vSHAicSTkpU9_-2_6Zw,2851
14
14
  opencos/eda_tool_helper.py,sha256=Xm6nr9XweCjueWFLkrH5U3nK96JGeeh86f2GCPhwY-o,3108
15
- opencos/export_helper.py,sha256=5BnrkhiieJBgYKAryhXD7HSGtrgvXQpZ8B5ltdrhbRY,22649
15
+ opencos/export_helper.py,sha256=zDkvsUS6FVrpXl1UTy53QG3CuhYp5FFplI9rRzAE2g8,25395
16
16
  opencos/export_json_convert.py,sha256=tSIMbLFtc_Fo66EhFovMii1v_qJYyFZJrPNnoPdW7L0,4182
17
- opencos/files.py,sha256=AQOnsrvoc0r76LiFrkoMbwOGdUO1FpBiFY_jyyI_ve8,1566
17
+ opencos/files.py,sha256=4fomXM5vyA5FUAImSeAjrPchQPysPSD07c_TLYg5cd8,1617
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=PGkc0JYKsx2sKiuoCmL3rLdEFyXeM6xY3r42Q-8KUJw,42454
21
+ opencos/util.py,sha256=7KR8cxjdLYoQIAMbEpbBHjYqMThbMWo1HKt33zfocn0,44395
22
22
  opencos/commands/__init__.py,sha256=oOOQmn5_jHAMSOfA3swJJ7mdoyHsJA0lJwKPTudlTns,1125
23
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
26
  opencos/commands/export.py,sha256=OhqVLVGN9Ch46NmBmZZo0CxIzhf3BsyX_8qA60SPNHw,3556
27
- opencos/commands/flist.py,sha256=B2c9RS1LrMHLaY-NySB2W0oHkjd4wGS5rQJTYULGNk0,9110
27
+ opencos/commands/flist.py,sha256=u66Xy5U5Xgk3LZ-GdCDUcwwA2U2LyZF3FpB9qWiIZMQ,9110
28
28
  opencos/commands/lec.py,sha256=7uziNSeGhZrDEbfS4dt3qVp-z2122hx2kqPH15PqIgQ,4091
29
29
  opencos/commands/lint.py,sha256=piPb0l0zE3sAtNJkFQ-oNpuHxnaV_RNXkXtEj_9mwGs,1594
30
- opencos/commands/multi.py,sha256=ZkG1b_qhhxXw-Lm2S4J-i576Ai5iJA09UEIDj94FOVM,27430
30
+ opencos/commands/multi.py,sha256=kC21JYJU5E-rP0v690YsgR2rV9WikoeUTwGC4gzYK3M,27519
31
31
  opencos/commands/open.py,sha256=XckvKUNwvc5KHbYGV-eQ2i0WG4X-yckroDaMC610MB4,804
32
32
  opencos/commands/proj.py,sha256=cExW9ZZkw6nkpVyNfeQzJADzmPtbYgBgWml82tqO6jY,1158
33
33
  opencos/commands/shell.py,sha256=upHpFs8Gdtzi-boVXwsC-QzEsnvtoZNMAu4oN10kdxw,7801
34
- opencos/commands/sim.py,sha256=NQJbjfGEgt4zHtOQn5HnaCiBnaDyEkpoDJvnAR4TOxE,21166
34
+ opencos/commands/sim.py,sha256=JkrlVHqzFAzAMCEjJ_fzRxDqbFt-DzWunzCUapUaJBw,21870
35
35
  opencos/commands/sweep.py,sha256=ni4XFgnFF8HLXtwPhETyLWfvc2kgtm4bcxFcKzUhkf0,9343
36
36
  opencos/commands/synth.py,sha256=m4ZwqHgOF5We0XP94F7TQli11WCPlkzhamI4fDfFR1o,4573
37
37
  opencos/commands/targets.py,sha256=_jRNhm2Fqj0fmMvTw6Ba39DCsRHf_r_uZCy_R064kpA,1472
@@ -41,22 +41,22 @@ opencos/deps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
41
  opencos/deps/defaults.py,sha256=Z6mIVJEV0zQ9rC-HkQFMBFAkixjqKS1TATPSc27wOeA,1502
42
42
  opencos/deps/deps_commands.py,sha256=q4JfSfzRO2nM2zdNT4enCy33FokEytZYQJn1HJ6osJk,16606
43
43
  opencos/deps/deps_file.py,sha256=YQ5ftYvppRTqUto22r-XDH6-bcMO7cA-WiJ7QzPjljY,17103
44
- opencos/deps/deps_processor.py,sha256=5eGE__Isssm6JDnVxI2hM1_ljS968K-24eUWGDEr_vs,42303
44
+ opencos/deps/deps_processor.py,sha256=WvG7p4wo_gNjkS2pxySgDmkomioooctJTxMlmP42kfk,42827
45
45
  opencos/hw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
46
  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=77ljULYa-DhnC9VgT_R1wic_GdgeqsAJdkOXDt1KjDo,13839
50
+ opencos/tests/helpers.py,sha256=jembDJkhbpz-oK_aby2LO_ivaMkLtlSkM6g2xdydB3Y,14230
51
51
  opencos/tests/test_build.py,sha256=FQAxOpLVQShAHD_L5rqJctPeSAoqoOCNFI0RXflLuY0,387
52
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=8X6kej5-uPv2l0xeWOhitCE640XZtiGLwzCktra_Ehg,37784
54
+ opencos/tests/test_eda.py,sha256=n76XUSfaPNnTZeS8u5z6f9MHKPJIls4o-S4ftlGxuNg,37767
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
- opencos/tests/test_tools.py,sha256=JFjwq8YJPxaALbIEZUA-1VR8O_N-zmmM4ueboFEYA4Y,13589
59
- opencos/tests/deps_files/command_order/DEPS.yml,sha256=PSzBBJDSU8ccCy3Ls5j_ws_vepmUkTIgWjaMjBhNbSg,806
58
+ opencos/tests/test_tools.py,sha256=6uGZQaR7znpfjOuhRiLTLY0XdDiGFSTruOEDphsZfDg,13749
59
+ opencos/tests/deps_files/command_order/DEPS.yml,sha256=jFce1gErT8XJpovYJj7t7X6Lu-Up_4yNRj9L8wOCAbI,1046
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
@@ -64,7 +64,7 @@ opencos/tests/deps_files/non_sv_reqs/DEPS.yml,sha256=VZkahO1AKhD9GUV5lK8VwUONEi5
64
64
  opencos/tests/deps_files/tags_with_tools/DEPS.yml,sha256=-5U1qfJElgpVhmkLEu3lYuvDYva8kDlt6JOdB9jidmc,1377
65
65
  opencos/tests/deps_files/test_err_fatal/DEPS.yml,sha256=GnXIUJvshQWR9PlYxX67T53ejf5KhDbtD8sUJB4Rwd0,95
66
66
  opencos/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
67
- opencos/tools/cocotb.py,sha256=hlBR6M4k_amOOWa7cZDuw9fTGJtJha1jSpGgyJN8Iis,17734
67
+ opencos/tools/cocotb.py,sha256=bR97Mb87D0HPdoV82rLT7oszPLmdIPzYU1IEBaGnuXg,20544
68
68
  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
@@ -78,20 +78,20 @@ opencos/tools/slang.py,sha256=S_vODMT5Zl5vi9FMGHfahp5B0oMNyDIRJXtRAldVCwY,8625
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=42SLAuqP2TmAE8pPgcLZBcXaALlvgc7z7v48FFvnCyo,24654
81
+ opencos/tools/verilator.py,sha256=mUNGZZB0P8NiF_zJW4wJHRQvwyiV_YwYNo3H_GYDFFc,24736
82
82
  opencos/tools/vivado.py,sha256=I9yVFK5wnFl1268l8WCk5Xh8wZBlSCODVTg4qStVF8c,41475
83
- opencos/tools/yosys.py,sha256=t3Au8gdwTepIKCPCXHpRXEdtmORQK8xqNvF6baIa7DM,28260
83
+ opencos/tools/yosys.py,sha256=2h88u0NA_vqLgZG9I78gIy6nQuWxyT6mirDlyjTHn9w,28290
84
84
  opencos/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
85
85
  opencos/utils/markup_helpers.py,sha256=A8Ev5UJ4EVKjdcF2g85SQbjdPZR4jGpNqCLaBy_4v7Q,4569
86
86
  opencos/utils/status_constants.py,sha256=na6YsqlsCwIYzTXWE14dPadUYRNTrOS6YTXHCer2NbA,635
87
87
  opencos/utils/str_helpers.py,sha256=-hR7MAQLOoY2lIfqtxNtnzb3apeJPkh8shEGFzkwQfs,6637
88
- opencos/utils/subprocess_helpers.py,sha256=idWc-sy_XJaxIl06tt_QjThYWoLL_Wmy7aLCpEo9y3c,5829
88
+ opencos/utils/subprocess_helpers.py,sha256=nmRUe5sPyXomzKEvEQU5231U_vilj8TuXNXLipwqLTM,6579
89
89
  opencos/utils/vscode_helper.py,sha256=9nHyMUIL-gzfW-qLH06sgaCnVK-YTOtu6pusitNNhL8,1363
90
90
  opencos/utils/vsim_helper.py,sha256=1johPOGbjbMgnCDSTpgsQcSuAquiqq1Y2MBxS6WY6b4,1552
91
- opencos_eda-0.3.5.dist-info/licenses/LICENSE,sha256=HyVuytGSiAUQ6ErWBHTqt1iSGHhLmlC8fO7jTCuR8dU,16725
92
- opencos_eda-0.3.5.dist-info/licenses/LICENSE.spdx,sha256=8gn1610RMP6eFgT3Hm6q9VKXt0RvdTItL_oxMo72jII,189
93
- opencos_eda-0.3.5.dist-info/METADATA,sha256=1H76gr0Vw6Cz16Kf3sbAQR2pMjBzxGLAHbdm2oSNEvI,1024
94
- opencos_eda-0.3.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
95
- opencos_eda-0.3.5.dist-info/entry_points.txt,sha256=6n1T5NwVYDhN5l1h5zmyT197G4pE0SySDreB0QJzJR0,218
96
- opencos_eda-0.3.5.dist-info/top_level.txt,sha256=J4JDP-LpRyJqPNeh9bSjx6yrLz2Mk0h6un6YLmtqql4,8
97
- opencos_eda-0.3.5.dist-info/RECORD,,
91
+ opencos_eda-0.3.7.dist-info/licenses/LICENSE,sha256=HyVuytGSiAUQ6ErWBHTqt1iSGHhLmlC8fO7jTCuR8dU,16725
92
+ opencos_eda-0.3.7.dist-info/licenses/LICENSE.spdx,sha256=8gn1610RMP6eFgT3Hm6q9VKXt0RvdTItL_oxMo72jII,189
93
+ opencos_eda-0.3.7.dist-info/METADATA,sha256=BzLaVDTvMpHFvXBhH7S6ZQJhtfYDoUh_cvR8jGux0fI,1164
94
+ opencos_eda-0.3.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
95
+ opencos_eda-0.3.7.dist-info/entry_points.txt,sha256=6n1T5NwVYDhN5l1h5zmyT197G4pE0SySDreB0QJzJR0,218
96
+ opencos_eda-0.3.7.dist-info/top_level.txt,sha256=J4JDP-LpRyJqPNeh9bSjx6yrLz2Mk0h6un6YLmtqql4,8
97
+ opencos_eda-0.3.7.dist-info/RECORD,,