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/commands/flist.py +2 -2
- opencos/commands/multi.py +4 -3
- opencos/commands/sim.py +28 -9
- opencos/deps/deps_processor.py +13 -2
- opencos/eda.py +23 -20
- opencos/eda_base.py +224 -90
- opencos/eda_config.py +2 -1
- opencos/eda_config_defaults.yml +5 -1
- opencos/export_helper.py +89 -31
- opencos/files.py +3 -1
- opencos/tests/deps_files/command_order/DEPS.yml +13 -0
- opencos/tests/helpers.py +32 -22
- opencos/tests/test_eda.py +1 -1
- opencos/tests/test_tools.py +9 -3
- opencos/tools/cocotb.py +94 -21
- opencos/tools/verilator.py +6 -4
- opencos/tools/yosys.py +3 -3
- opencos/util.py +100 -55
- opencos/utils/subprocess_helpers.py +23 -6
- {opencos_eda-0.3.5.dist-info → opencos_eda-0.3.7.dist-info}/METADATA +5 -2
- {opencos_eda-0.3.5.dist-info → opencos_eda-0.3.7.dist-info}/RECORD +26 -26
- {opencos_eda-0.3.5.dist-info → opencos_eda-0.3.7.dist-info}/WHEEL +0 -0
- {opencos_eda-0.3.5.dist-info → opencos_eda-0.3.7.dist-info}/entry_points.txt +0 -0
- {opencos_eda-0.3.5.dist-info → opencos_eda-0.3.7.dist-info}/licenses/LICENSE +0 -0
- {opencos_eda-0.3.5.dist-info → opencos_eda-0.3.7.dist-info}/licenses/LICENSE.spdx +0 -0
- {opencos_eda-0.3.5.dist-info → opencos_eda-0.3.7.dist-info}/top_level.txt +0 -0
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
|
-
|
|
51
|
-
|
|
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|
|
|
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
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
|
|
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
|
-
|
|
419
|
-
|
|
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)
|
|
532
|
-
# for now put dot-f file contents in front of of tokens, do this first
|
|
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|
|
|
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(
|
|
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(
|
|
766
|
+
print(Colors.color_text(text, color=Colors.green), end=end, flush=True)
|
|
742
767
|
print_post(text, end)
|
|
743
768
|
|
|
744
|
-
def
|
|
745
|
-
'''Print text as
|
|
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(
|
|
772
|
+
print(Colors.color_text(text, color=Colors.yellow), end=end, flush=True)
|
|
748
773
|
print_post(text, end)
|
|
749
774
|
|
|
750
|
-
def
|
|
751
|
-
'''Print text as
|
|
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(
|
|
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(
|
|
767
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
124
|
+
tee_fpath_f.write(line)
|
|
109
125
|
if global_log.file:
|
|
110
|
-
|
|
111
|
-
|
|
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.
|
|
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=
|
|
6
|
-
opencos/eda_base.py,sha256=
|
|
7
|
-
opencos/eda_config.py,sha256=
|
|
8
|
-
opencos/eda_config_defaults.yml,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
59
|
-
opencos/tests/deps_files/command_order/DEPS.yml,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
92
|
-
opencos_eda-0.3.
|
|
93
|
-
opencos_eda-0.3.
|
|
94
|
-
opencos_eda-0.3.
|
|
95
|
-
opencos_eda-0.3.
|
|
96
|
-
opencos_eda-0.3.
|
|
97
|
-
opencos_eda-0.3.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|