opencos-eda 0.3.7__py3-none-any.whl → 0.3.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
opencos/tools/riviera.py CHANGED
@@ -11,16 +11,18 @@ import shutil
11
11
  import subprocess
12
12
 
13
13
  from opencos import util
14
- from opencos.tools.modelsim_ase import ToolModelsimAse, CommandSimModelsimAse
14
+ from opencos.tools.questa_common import ToolQuesta, CommonSimQuesta
15
+ from opencos.commands import CommandFList
15
16
  from opencos.utils.str_helpers import sanitize_defines_for_sh
16
17
  from opencos.utils import status_constants
17
18
 
18
- class ToolRiviera(ToolModelsimAse):
19
+ class ToolRiviera(ToolQuesta):
19
20
  '''ToolRiviera used by opencos.eda for --tool=riviera'''
20
21
 
21
22
  _TOOL = 'riviera'
22
23
  _EXE = 'vsim'
23
24
  use_vopt = False
25
+ uvm_versions = set()
24
26
 
25
27
  def get_versions(self) -> str:
26
28
  if self._VERSION:
@@ -40,7 +42,17 @@ class ToolRiviera(ToolModelsimAse):
40
42
  )
41
43
  stdout = version_ret.stdout.decode('utf-8', errors='replace').rstrip()
42
44
 
43
- # Expect:
45
+ # Get the UVM versions in the install directory. Note this may run
46
+ # more than once, so only do this if self.uvm_versions not yet set:
47
+ riviera_path, _ = os.path.split(self.sim_exe_base_path)
48
+ vlib_path = os.path.join(riviera_path, 'vlib')
49
+ if not self.uvm_versions and os.path.isdir(vlib_path):
50
+ for item in os.listdir(vlib_path):
51
+ # uvm-1.1, uvm-1.1d - so don't pick anything > 9 chars (uvm-M.mRr)
52
+ if item.startswith('uvm-') and '1800' not in item and len(item) <= 9:
53
+ self.uvm_versions.add(item[4:])
54
+
55
+ # For Version, expect:
44
56
  # Aldec, Inc. Riviera-PRO version 2025.04.139.9738 built for Linux64 on May 30, 2025
45
57
  left, right = stdout.split('version')
46
58
  if 'Riviera' not in left:
@@ -49,14 +61,20 @@ class ToolRiviera(ToolModelsimAse):
49
61
  return self._VERSION
50
62
 
51
63
 
52
- class CommandSimRiviera(CommandSimModelsimAse, ToolRiviera):
64
+ class CommandSimRiviera(CommonSimQuesta, ToolRiviera):
53
65
  '''CommandSimRiviera is a command handler for: eda sim --tool=riviera'''
54
66
 
55
67
  def __init__(self, config: dict):
56
- CommandSimModelsimAse.__init__(self, config=config)
68
+ CommonSimQuesta.__init__(self, config=config)
69
+
70
+ # This technically inherits ToolQuesta and ToolRiviera, but ToolRiviera will
71
+ # override get_versions(). Just be careful on using issinstance(cls_obj, ToolQuesta),
72
+ # and instead use self._TOOL, or self.args['tool']
57
73
  ToolRiviera.__init__(self, config=self.config)
74
+
58
75
  self.shell_command = os.path.join(self.sim_exe_base_path, 'vsim')
59
- self.starter_edition = True
76
+ self.starter_edition = False
77
+
60
78
  self.args.update({
61
79
  'tool': self._TOOL, # override
62
80
  'gui': False,
@@ -76,6 +94,18 @@ class CommandSimRiviera(CommandSimModelsimAse, ToolRiviera):
76
94
  'bring your own .tcl file to run in Riviera (vsim) for coverage. The default'
77
95
  ' tcl steps are (from tool config in --config-yml): '
78
96
  ) + '; '.join(self.tool_config.get('simulate-coverage-tcl', [])),
97
+ 'uvm': (
98
+ 'Attempts to support UVM. Adds to vlog: -l uvm +incdir+PATH for the PATH to'
99
+ ' uvm_macros.svh for the installed version of Riviera used.'
100
+ ),
101
+ })
102
+
103
+ if self.uvm_versions:
104
+ # set default to latest version:
105
+ self.args['uvm-version'] = sorted(self.uvm_versions)[-1]
106
+
107
+ self.args_kwargs.update({
108
+ 'uvm-version': { 'choices': list(self.uvm_versions) }
79
109
  })
80
110
 
81
111
  def set_tool_defines(self):
@@ -136,7 +166,9 @@ class CommandSimRiviera(CommandSimModelsimAse, ToolRiviera):
136
166
  return []
137
167
 
138
168
 
139
- def write_vlog_dot_f(self, filename='vlog.f') -> None:
169
+ def write_vlog_dot_f( # pylint: disable=too-many-branches
170
+ self, filename: str = 'vlog.f'
171
+ ) -> None:
140
172
  '''Returns none, creates filename (str) for a vlog.f'''
141
173
  vlog_dot_f_lines = []
142
174
 
@@ -153,6 +185,12 @@ class CommandSimRiviera(CommandSimModelsimAse, ToolRiviera):
153
185
  vlog_dot_f_fname = filename
154
186
  vlog_dot_f_fpath = os.path.join(self.args['work-dir'], vlog_dot_f_fname)
155
187
 
188
+ if self.args['uvm']:
189
+ vlog_dot_f_lines.extend([
190
+ f'-uvmver {self.args["uvm-version"]}',
191
+ '-dbg'
192
+ ])
193
+
156
194
  for value in self.incdirs:
157
195
  vlog_dot_f_lines += [ f"+incdir+{value}" ]
158
196
 
@@ -189,7 +227,7 @@ class CommandSimRiviera(CommandSimModelsimAse, ToolRiviera):
189
227
 
190
228
 
191
229
 
192
- def write_vsim_dot_do( # pylint: disable=too-many-branches
230
+ def write_vsim_dot_do( # pylint: disable=too-many-branches,too-many-locals
193
231
  self, dot_do_to_write: list
194
232
  ) -> None:
195
233
  '''Writes files(s) based on dot_do_to_write(list of str)
@@ -216,19 +254,22 @@ class CommandSimRiviera(CommandSimModelsimAse, ToolRiviera):
216
254
  voptargs_str += self.tool_config.get('simulate-waves-args',
217
255
  '+accb +accr +access +r+w')
218
256
  if self.args['coverage']:
219
- voptargs_str += self.tool_config.get('coverage-args', '')
257
+ voptargs_str += ' ' + self.tool_config.get('coverage-args', '')
258
+
259
+ if self.args['uvm']:
260
+ if all(x not in voptargs_str for x in ('+access +r', '+access +w+r')):
261
+ voptargs_str += ' +access +r'
220
262
 
221
263
  # parameters
222
264
  if self.parameters:
223
265
  voptargs_str += ' ' + ' '.join(self.process_parameters_get_list(arg_prefix='-G'))
224
266
 
225
- # TODO(drew): support self.args['sim_libary', 'elab-args', sim-args'] (3 lists)
226
- # to add to vsim_one_liner.
267
+ vsim_libs = ' '.join([f'-l {x}' for x in self.args['sim-library']])
227
268
 
228
269
  vsim_one_liner = (
229
270
  "vsim"
230
271
  f" -sv_seed {self.args['seed']} {sim_plusargs_str}"
231
- f" {voptargs_str} {vsim_ext_args} work.{self.args['top']}"
272
+ f" {voptargs_str} {vsim_ext_args} {vsim_libs} work.{self.args['top']}"
232
273
  )
233
274
 
234
275
  vsim_one_liner = vsim_one_liner.replace('\n', ' ') # needs to be a one-liner
@@ -355,3 +396,10 @@ class CommandLintRiviera(CommandSimRiviera):
355
396
  super().__init__(config)
356
397
  self.args['stop-after-compile'] = True
357
398
  self.args['stop-after-elaborate'] = True
399
+
400
+ class CommandFListRiviera(CommandFList, ToolRiviera):
401
+ '''CommonFListQuesta is a command handler for: eda flist --tool=riviera'''
402
+
403
+ def __init__(self, config: dict):
404
+ CommandFList.__init__(self, config=config)
405
+ ToolRiviera.__init__(self, config=self.config)
opencos/tools/slang.py CHANGED
@@ -176,6 +176,30 @@ class CommandElabSlang(CommandElab, ToolSlang):
176
176
  def get_post_simulate_command_lists(self, **kwargs) -> list:
177
177
  return []
178
178
 
179
+ def update_tool_warn_err_counts_from_log_lines(
180
+ self, log_lines: list, bad_strings: list, warning_strings: list
181
+ ) -> None:
182
+ '''
183
+ Overriden from Command, we ignore bad_strings/warning_strings and use a custom
184
+ checker.
185
+ '''
186
+ for line in log_lines:
187
+ if not line.startswith('Build failed: '):
188
+ continue
189
+ if not all(x in line for x in ('errors', 'warnings')):
190
+ continue
191
+
192
+ parts = line.strip().split()
193
+ if len(parts) < 6:
194
+ continue
195
+
196
+ errs = parts[2]
197
+ warns = parts[4]
198
+ if errs.isdigit():
199
+ self.tool_error_count += int(errs)
200
+ if warns.isdigit():
201
+ self.tool_warning_count += int(warns)
202
+
179
203
  def _get_slang_command_list_start(self) -> list:
180
204
  command_list = [self.slang_exe]
181
205
 
opencos/tools/surelog.py CHANGED
@@ -147,6 +147,28 @@ class CommandElabSurelog(CommandElab, ToolSurelog):
147
147
  command_lists=self.surelog_command_lists, line_breaks=True
148
148
  )
149
149
 
150
+ def update_tool_warn_err_counts_from_log_lines(
151
+ self, log_lines: list, bad_strings: list, warning_strings: list
152
+ ) -> None:
153
+ '''
154
+ Overriden from Command, we ignore bad_strings/warning_strings and use a custom
155
+ checker.
156
+ '''
157
+ for line in log_lines:
158
+ line = line.strip()
159
+ if line.endswith(' 0'):
160
+ continue
161
+ if line.startswith('[ FATAL] : ') or \
162
+ line.startswith('[ SYNTAX] : ') or \
163
+ line.startswith('[ ERROR] : '):
164
+ parts = line.split()
165
+ if parts[-1].isdigit():
166
+ self.tool_error_count += int(parts[-1])
167
+ if line.startswith('[WARNING] : '):
168
+ parts = line.split()
169
+ if parts[-1].isdigit():
170
+ self.tool_warning_count += int(parts[-1])
171
+
150
172
 
151
173
  class CommandLintSurelog(CommandElabSurelog):
152
174
  '''CommandLintSurelog is a command handler for: eda lint --tool=surelog.'''
@@ -82,7 +82,6 @@ class VerilatorSim(CommandSim, ToolVerilator):
82
82
  'lint-only': False,
83
83
  'cc-mode': False,
84
84
  'verilator-coverage-args': [],
85
- 'uvm': False,
86
85
  'x-assign': '',
87
86
  'x-initial': '',
88
87
  })
@@ -117,9 +116,9 @@ class VerilatorSim(CommandSim, ToolVerilator):
117
116
  ' Also conditinally adds to verilated exe call:'
118
117
  ' +verilator+rand+reset+[0,2] for arg values 0, unique|fast'),
119
118
  'uvm': (
120
- 'Warns on Verilator < 5.042, or missing $UVM_HOME environment var set (or in'
121
- ' .env, $UVM_HOME/uvm_pkg.sv should exist), and will run verilator with args:'
122
- ' -Wno-fatal +define+UVM_NO_DPI'
119
+ 'Enables UVM. Warns on Verilator < 5.042, or missing $UVM_HOME environment'
120
+ ' var set (or in .env, $UVM_HOME/uvm_pkg.sv should exist), and will run verilator'
121
+ ' with args: -Wno-fatal +define+UVM_NO_DPI'
123
122
  ),
124
123
  'verilator-coverage-args': (
125
124
  'Requires --coverage, args to be applied to verilator_coverage, which runs'
@@ -127,6 +126,12 @@ class VerilatorSim(CommandSim, ToolVerilator):
127
126
  ),
128
127
  })
129
128
 
129
+
130
+ self.args_kwargs.update({
131
+ 'x-assign': { 'choices': ['0', '1', 'unique', 'fast'] },
132
+ 'x-initial': { 'choices': ['0', 'unique', 'fast'] },
133
+ })
134
+
130
135
  self.verilate_command_lists = []
131
136
  self.lint_only_command_lists = []
132
137
  self.verilated_exec_command_lists = []
@@ -562,7 +567,8 @@ class VerilatorSim(CommandSim, ToolVerilator):
562
567
  'version > v5.042')
563
568
 
564
569
  if not os.environ.get('UVM_HOME', ''):
565
- util.warning('--uvm set, however env (or .env or --env-file) $UVM_HOME is not set')
570
+ util.warning('--uvm set, however env (or .env or --env-file)',
571
+ '$UVM_HOME is not set')
566
572
 
567
573
  uvm_pkg_found = self._verilator_support_uvm_pkg_fpath(add_if_found=add_uvm_pkg_if_found)
568
574
  if warnings and not uvm_pkg_found:
opencos/tools/vivado.py CHANGED
@@ -225,6 +225,8 @@ class CommandSimVivado(CommandSim, ToolVivado):
225
225
 
226
226
  if self.tool_config.get('elab-waves-args', ''):
227
227
  command_list += self.tool_config.get('elab-waves-args', '').split()
228
+ if self.args['uvm']:
229
+ command_list.extend(['-L', 'uvm'])
228
230
  elif self.args['gui'] and self.args['waves']:
229
231
  command_list += ['-debug', 'all']
230
232
  elif self.args['gui']:
@@ -305,6 +307,8 @@ class CommandSimVivado(CommandSim, ToolVivado):
305
307
  command_list[0] += ".bat"
306
308
  if typ == 'sv':
307
309
  command_list.append('-sv')
310
+ if self.args['uvm']:
311
+ command_list.extend(['-L', 'uvm'])
308
312
  command_list += self.tool_config.get('compile-args', '').split()
309
313
  if util.args['verbose']:
310
314
  command_list += ['-v', '2']
opencos/util.py CHANGED
@@ -901,7 +901,8 @@ def exit( # pylint: disable=redefined-builtin
901
901
  elif args['warnings']:
902
902
  info_color = Colors.yellow
903
903
  info(
904
- f"{start}Exiting with {args['warnings']} warnings, {args['errors']} errors",
904
+ f"{start}Exiting with {Colors.bold}{args['warnings']} warnings{info_color},",
905
+ f"{Colors.bold}{args['errors']} errors",
905
906
  color=info_color
906
907
  )
907
908
  sys.exit(error_code)
@@ -132,11 +132,11 @@ def get_terminal_columns():
132
132
 
133
133
  Returns:
134
134
  int: The number of columns in the terminal, or a default value (e.g., 80)
135
- if the terminal size cannot be determined.
135
+ if the terminal size cannot be determined. Min value of 40 is returned.
136
136
  """
137
137
  try:
138
138
  size = os.get_terminal_size()
139
- return size.columns
139
+ return max(40, size.columns)
140
140
  except OSError:
141
141
  # Handle cases where the terminal size cannot be determined (e.g., not in a TTY)
142
142
  return 80 # Default to 80 columns
@@ -166,13 +166,13 @@ def pretty_list_columns_manual(data: list, num_columns: int = 4, auto_columns: b
166
166
  max_line_len = 0
167
167
  for x in max_lengths:
168
168
  max_line_len += x + _spacing
169
- if max_line_len > window_cols:
169
+ if max_line_len >= window_cols:
170
170
  # subtract a column (already >= 2):
171
171
  ret_lines.extend(
172
172
  pretty_list_columns_manual(data=data, num_columns=num_columns-1, auto_columns=True)
173
173
  )
174
174
  return ret_lines
175
- if max_line_len + max_item_len + _spacing <= window_cols:
175
+ if max_line_len + max_item_len + _spacing < window_cols:
176
176
  # add 1 more column if we're guaranteed to have room.
177
177
  ret_lines.extend(
178
178
  pretty_list_columns_manual(data=data, num_columns=num_columns+1, auto_columns=True)
@@ -18,6 +18,12 @@ TOOL_IS = {
18
18
  'questa_fse': False
19
19
  }
20
20
 
21
+ def found() -> str:
22
+ '''Returns the found tool, or blank str'''
23
+ for k,v in TOOL_IS.items():
24
+ if k and v:
25
+ return k
26
+ return ''
21
27
 
22
28
  def init() -> None:
23
29
  '''Sets INIT_HAS_RUN=True (only runs once) and one of TOOL_IS[tool] = True'''
@@ -41,13 +47,14 @@ def init() -> None:
41
47
  if proc is None or proc.returncode != 0:
42
48
  return
43
49
 
44
-
45
50
  stdout_str_lower = proc.stdout.decode('utf-8', errors='replace').lower()
46
51
 
47
52
  if all(x in stdout_str_lower for x in ('starter', 'modelsim', 'fpga')):
48
53
  TOOL_IS['modelsim_ase'] = True
49
54
  elif all(x in stdout_str_lower for x in ('starter', 'questa', 'fpga')):
50
55
  TOOL_IS['questa_fse'] = True
56
+ elif all(x in stdout_str_lower for x in ('questa', 'fpga')):
57
+ TOOL_IS['questa_fe'] = True
51
58
  elif all(x in stdout_str_lower for x in ('riviera', 'aldec')):
52
59
  TOOL_IS['riviera'] = True
53
60
  elif 'questa' in stdout_str_lower:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opencos-eda
3
- Version: 0.3.7
3
+ Version: 0.3.9
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
@@ -20,6 +20,7 @@ Requires-Dist: supports_color>=0.2.0
20
20
  Provides-Extra: dev
21
21
  Requires-Dist: pylint>=3.0.0; extra == "dev"
22
22
  Requires-Dist: pytest>=8.3.5; extra == "dev"
23
+ Requires-Dist: twine>=6.1.0; extra == "dev"
23
24
  Provides-Extra: cocotb
24
25
  Requires-Dist: cocotb>=2.0; extra == "cocotb"
25
26
  Requires-Dist: pytest>=8.3.5; extra == "cocotb"
@@ -2,10 +2,10 @@ 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=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
5
+ opencos/eda.py,sha256=VzuRw2m-LB8mR4nNOcIlZe7GxgGPuussC7pVGq8qHJs,26990
6
+ opencos/eda_base.py,sha256=J_al8-oQS5HCTJyiNSFVaNosESPctLWNpKG7FVGJXks,117815
7
+ opencos/eda_config.py,sha256=d7gMx9ZJTcnUwVhqUkQtY4PI3UGD0ZvH8D_GXvc5Erc,14199
8
+ opencos/eda_config_defaults.yml,sha256=uLbCDG9m7zEg8DCCL2ZDFgiVO09K1ObQs02__Q4RDhk,17093
9
9
  opencos/eda_config_max_verilator_waivers.yml,sha256=lTAU4IOEbUWVlPzuer1YYhIyxpPINeA4EJqcRIT-Ymk,840
10
10
  opencos/eda_config_reduced.yml,sha256=cQ9jY4J7EvAbeHTiP6bvpDSVJAYiitjLZPSxxLKIEbk,1440
11
11
  opencos/eda_deps_bash_completion.bash,sha256=jMkQKY82HBgOnQeMdA1hMrXguRFtB52SMBxUemKovL4,1958
@@ -18,7 +18,7 @@ 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=7KR8cxjdLYoQIAMbEpbBHjYqMThbMWo1HKt33zfocn0,44395
21
+ opencos/util.py,sha256=rJnXWOy_5vlb_qC1O5LmeOwJaJZrV46ZM9tYAcQKqAw,44453
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
@@ -31,7 +31,7 @@ opencos/commands/multi.py,sha256=kC21JYJU5E-rP0v690YsgR2rV9WikoeUTwGC4gzYK3M,275
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=JkrlVHqzFAzAMCEjJ_fzRxDqbFt-DzWunzCUapUaJBw,21870
34
+ opencos/commands/sim.py,sha256=a8fsf_Yw5igGiLhJGszlsKxTuQndfrFdStexmA4gwgE,24142
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
@@ -55,7 +55,7 @@ opencos/tests/test_eda.py,sha256=n76XUSfaPNnTZeS8u5z6f9MHKPJIls4o-S4ftlGxuNg,377
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=6uGZQaR7znpfjOuhRiLTLY0XdDiGFSTruOEDphsZfDg,13749
58
+ opencos/tests/test_tools.py,sha256=xzxlHSgqZNN9urxzNfQU4vjexmxRF6bsKvXijU35z78,15046
59
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
@@ -68,30 +68,32 @@ 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
71
- opencos/tools/iverilog.py,sha256=3IQIZVDioChKEJIVVJki-q7NlvBg0k3n61oM7ltG9c8,6551
72
- opencos/tools/modelsim_ase.py,sha256=Jt-6N3BZZyu25fT1ehFQLRUTVvrcCo4e2Gl7UtsQcuk,17834
71
+ opencos/tools/iverilog.py,sha256=PH_mvFU3LbMAPNskxMi1tD4DsMWRcsy27V_M0La9TNY,6558
72
+ opencos/tools/modelsim_ase.py,sha256=2QYxaHNsDghnimvIJmkpo_M6w2oZyiyvmak0a5jh4cM,2620
73
73
  opencos/tools/quartus.py,sha256=_TfmPSYpbhmDLw7Dur-rRP0iGwv9hhQ6E5G-XLiYPEM,30486
74
- opencos/tools/questa.py,sha256=nHImM0Wydcf4YHGibHmQAwmqKHmMxKZUqY-E-vz1o8M,9827
75
- opencos/tools/questa_fse.py,sha256=hytkeuGg4qImj7rStV1i2kxkz9B0KFheGtcadxmpYAo,2550
76
- opencos/tools/riviera.py,sha256=_-vsN7TD6WdW4PVsSJaEhJls3RgXGRowhY_QV1hdFqE,13678
77
- opencos/tools/slang.py,sha256=S_vODMT5Zl5vi9FMGHfahp5B0oMNyDIRJXtRAldVCwY,8625
74
+ opencos/tools/questa.py,sha256=oPZUM_OeDhIef0x1HicKUwLwxi0t31Jf1fekNh3IM9Y,2423
75
+ opencos/tools/questa_common.py,sha256=vRHA0vlK_KA7V999ThIQ66mL562pDsANcG0w29ceLCM,18936
76
+ opencos/tools/questa_fe.py,sha256=fRyi0-WFzp1RN7TGSZ7VTk4LFmxHkpy8BMKE3CxTmMg,2524
77
+ opencos/tools/questa_fse.py,sha256=cH9vxpwa1pi0A9hVPWc_IqYMByaviYlccxQOTpZBC1A,2486
78
+ opencos/tools/riviera.py,sha256=eidlIkggqOHGyrm4ldzfDCO6D-nVnEa6mT5en-rjSK0,15684
79
+ opencos/tools/slang.py,sha256=nDB9eK_DNAgewsXP4Sc1wh_bQiOr5q3-3ccpTbdWr1Y,9423
78
80
  opencos/tools/slang_yosys.py,sha256=MKh13eAmLJDkynZiezyT8E2gI4CKnXipzgFCZppaMXo,10230
79
- opencos/tools/surelog.py,sha256=S2RAZJyjdISm_tRvAhXbla7_z_tJfotZih5f9Y3m7DQ,5648
81
+ opencos/tools/surelog.py,sha256=uqUOpDq9Vs8Inj4m3nlMbag47LrJB4QHUIRes7dFbQY,6520
80
82
  opencos/tools/tabbycad_yosys.py,sha256=2LePPgYXBVdsy7YcffPIWN-I0B7queLQ_f_pme2SCGw,7803
81
- opencos/tools/verilator.py,sha256=mUNGZZB0P8NiF_zJW4wJHRQvwyiV_YwYNo3H_GYDFFc,24736
82
- opencos/tools/vivado.py,sha256=I9yVFK5wnFl1268l8WCk5Xh8wZBlSCODVTg4qStVF8c,41475
83
+ opencos/tools/verilator.py,sha256=oIZpqiawohf21JZ_ib0NSAbVpVMYCwPswQ315Y6nU7g,24941
84
+ opencos/tools/vivado.py,sha256=k_7sc9cv69BIkIxnbQKNFjLubS_O-p7HvTH_SkiZDMQ,41643
83
85
  opencos/tools/yosys.py,sha256=2h88u0NA_vqLgZG9I78gIy6nQuWxyT6mirDlyjTHn9w,28290
84
86
  opencos/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
85
87
  opencos/utils/markup_helpers.py,sha256=A8Ev5UJ4EVKjdcF2g85SQbjdPZR4jGpNqCLaBy_4v7Q,4569
86
88
  opencos/utils/status_constants.py,sha256=na6YsqlsCwIYzTXWE14dPadUYRNTrOS6YTXHCer2NbA,635
87
- opencos/utils/str_helpers.py,sha256=-hR7MAQLOoY2lIfqtxNtnzb3apeJPkh8shEGFzkwQfs,6637
89
+ opencos/utils/str_helpers.py,sha256=mCByhIyZLwDJuyeT70YShepgkkikY0pf7k6_xS93dGg,6675
88
90
  opencos/utils/subprocess_helpers.py,sha256=nmRUe5sPyXomzKEvEQU5231U_vilj8TuXNXLipwqLTM,6579
89
91
  opencos/utils/vscode_helper.py,sha256=9nHyMUIL-gzfW-qLH06sgaCnVK-YTOtu6pusitNNhL8,1363
90
- opencos/utils/vsim_helper.py,sha256=1johPOGbjbMgnCDSTpgsQcSuAquiqq1Y2MBxS6WY6b4,1552
91
- opencos_eda-0.3.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,,
92
+ opencos/utils/vsim_helper.py,sha256=tunDMI8EVeWlnheRUtWUPh4qTr9CpKtv9NqbMBcIv28,1806
93
+ opencos_eda-0.3.9.dist-info/licenses/LICENSE,sha256=HyVuytGSiAUQ6ErWBHTqt1iSGHhLmlC8fO7jTCuR8dU,16725
94
+ opencos_eda-0.3.9.dist-info/licenses/LICENSE.spdx,sha256=8gn1610RMP6eFgT3Hm6q9VKXt0RvdTItL_oxMo72jII,189
95
+ opencos_eda-0.3.9.dist-info/METADATA,sha256=EUww5O4Rxx7oknCVGRHElcYkmAd2jLcpVdwSuFgBkQs,1208
96
+ opencos_eda-0.3.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
97
+ opencos_eda-0.3.9.dist-info/entry_points.txt,sha256=6n1T5NwVYDhN5l1h5zmyT197G4pE0SySDreB0QJzJR0,218
98
+ opencos_eda-0.3.9.dist-info/top_level.txt,sha256=J4JDP-LpRyJqPNeh9bSjx6yrLz2Mk0h6un6YLmtqql4,8
99
+ opencos_eda-0.3.9.dist-info/RECORD,,