opencos-eda 0.3.13__py3-none-any.whl → 0.3.14__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/sim.py CHANGED
@@ -14,6 +14,8 @@ Note that CommandSim is also a base class for opencos.commands.elab.CommandElab.
14
14
  import os
15
15
  import shlex
16
16
 
17
+ from pathlib import Path
18
+
17
19
  from opencos import util, export_helper
18
20
  from opencos.eda_base import CommandDesign, Tool
19
21
  from opencos.utils import status_constants
@@ -84,6 +86,7 @@ class CommandSim(CommandDesign): # pylint: disable=too-many-public-methods
84
86
  error_on_no_files_or_targets = True
85
87
  error_on_missing_top = True
86
88
  tool_config = {} # Children with Tool parent classes will set on Tool constructor.
89
+ library_map_supported = False
87
90
 
88
91
  command_name = 'sim'
89
92
 
@@ -114,6 +117,8 @@ class CommandSim(CommandDesign): # pylint: disable=too-many-public-methods
114
117
  'verilate-args': [],
115
118
  'ext-defines-sv-fname': '',
116
119
  'license-queue': False,
120
+ 'library-map': [],
121
+ 'add-top-library': [],
117
122
  })
118
123
  self.args_help.update({
119
124
  'pre-sim-tcl': (
@@ -168,6 +173,17 @@ class CommandSim(CommandDesign): # pylint: disable=too-many-public-methods
168
173
  'license-queue': (
169
174
  'Set to enable env vars LICENSE_QUEUE=1 which has effects on certain simulators'
170
175
  ),
176
+ 'library-map': (
177
+ 'list arg (can set multiple) with values LibName:Path, only supported'
178
+ ' by certain simulation tools.'
179
+ ' The Path search is relative to the tool exe, one level above the tool exe,'
180
+ ' or can be absolute path.'
181
+ ),
182
+ 'add-top-library': (
183
+ 'Add additional top levels, for example if you added the "unisim" library'
184
+ ' you may need to --add-top-library=unisim.glbl for it to work with Xilinx'
185
+ ' based projects that require "glbl" to be present at simulation $root scope.'
186
+ ),
171
187
 
172
188
  })
173
189
 
@@ -175,6 +191,9 @@ class CommandSim(CommandDesign): # pylint: disable=too-many-public-methods
175
191
  'uvm-version': { 'choices': ['1.2'] },
176
192
  })
177
193
 
194
+ # only used if self.library_map_supported=True:
195
+ self.library_map = {} # lib-name: path-to.lib dict from self.args['library-map']
196
+
178
197
 
179
198
 
180
199
  def process_parameters_get_list(
@@ -425,7 +444,7 @@ class CommandSim(CommandDesign): # pylint: disable=too-many-public-methods
425
444
  cmds2 = self.get_simulate_command_lists()
426
445
  cmds3 = self.get_post_simulate_command_lists()
427
446
  '''
428
- return
447
+ self.update_library_map()
429
448
 
430
449
 
431
450
  def check_logs_for_errors( # pylint: disable=dangerous-default-value,too-many-locals,too-many-branches
@@ -686,3 +705,54 @@ class CommandSim(CommandDesign): # pylint: disable=too-many-public-methods
686
705
 
687
706
  if 'LICENSE_QUEUE' not in os.environ:
688
707
  os.environ['LICENSE_QUEUE'] = '1'
708
+
709
+ def update_library_map(self, base_search_paths: list | None = None) -> None:
710
+ '''
711
+ Returns None, uses self.args['library-map'] to update:
712
+
713
+ - self.library_map (dict)
714
+ - self.args['sim-library']
715
+ '''
716
+ if not self.args['library-map']:
717
+ return
718
+
719
+ if not self.library_map_supported:
720
+ tool = self.config.get('tool', None)
721
+ util.warning(f'Command: sim, --tool={tool}, args for --library-map are not supported:',
722
+ f'{self.args["library-map"]}')
723
+ return
724
+
725
+ for libmap in self.args['library-map']:
726
+ parts = libmap.split(':')
727
+ lib_name = parts[0]
728
+ lib_path = Path(':'.join(parts[1:]))
729
+ lib_abs_path = None
730
+
731
+ if not lib_name or not lib_path:
732
+ util.warning(f'library-map={libmap} could not parse {lib_name=} or {lib_path=}')
733
+ continue
734
+
735
+ if lib_name in self.library_map:
736
+ util.warning(
737
+ f'We have already mapped "{lib_name}" to {self.library_map[lib_name]}'
738
+ )
739
+
740
+ # We have to go looking for lib_path though
741
+ search_files = [lib_path]
742
+ if base_search_paths and isinstance(base_search_paths, list):
743
+ for x in base_search_paths:
744
+ search_files.append(Path(x) / lib_path)
745
+ for x in search_files:
746
+ if x.exists():
747
+ lib_abs_path = x.resolve()
748
+ util.info(f'library-map={libmap} found "{lib_name}" in: {lib_abs_path}')
749
+ break
750
+ util.debug(f'library-map={libmap} searching for "{lib_name}" in: {x}')
751
+
752
+
753
+ if lib_abs_path:
754
+ self.library_map[lib_name] = lib_abs_path
755
+ if lib_name not in self.args['sim-library']:
756
+ self.args['sim-library'].append(lib_name)
757
+ else:
758
+ util.warning(f'library-map={libmap}, for "{lib_name}" could not find {lib_path=}')
@@ -412,7 +412,8 @@ tools:
412
412
  -acdb -acdb_cov sbfectapm
413
413
  simulate-coverage-tcl:
414
414
  - acdb save
415
- - acdb report -db work.acdb -txt -o cov.txt
415
+ - acdb report -i work.acdb -txt -o cov.txt
416
+ - acdb report -i work.acdb -txt -o covg.txt -show covergroups
416
417
 
417
418
 
418
419
  modelsim_ase:
opencos/tools/iverilog.py CHANGED
@@ -70,6 +70,7 @@ class CommandSimIverilog(CommandSim, ToolIverilog):
70
70
  # We do not override CommandSim.do_it()
71
71
  def prepare_compile(self):
72
72
  self.set_tool_defines()
73
+ self.update_library_map()
73
74
 
74
75
  self.iverilog_command_lists = self.get_compile_command_lists()
75
76
  self.iverilog_exec_command_lists = self.get_simulate_command_lists()
@@ -150,6 +150,7 @@ class CommonSimQuesta(CommandSim, ToolQuesta):
150
150
 
151
151
  def prepare_compile(self):
152
152
  self.set_tool_defines()
153
+ self.update_library_map()
153
154
  self.write_vlog_dot_f()
154
155
  self.write_vsim_dot_do(dot_do_to_write='all')
155
156
 
@@ -388,6 +389,10 @@ class CommonSimQuesta(CommandSim, ToolQuesta):
388
389
  + f" -sv_seed {self.args['seed']} {sim_plusargs_str} {vsim_suppress_list_str}" \
389
390
  + f" {voptargs_str} {vsim_ext_args} work.{self.args['top']}"
390
391
 
392
+ # If there are additional top level libs, we wont' add them to the vopt step, add
393
+ # to vsim only (after work.TOP):
394
+ for l in self.args['add-top-library']:
395
+ vsim_one_liner += f' {l}'
391
396
 
392
397
  vsim_one_liner = vsim_one_liner.replace('\n', ' ')
393
398
 
opencos/tools/riviera.py CHANGED
@@ -9,6 +9,8 @@ Contains classes for ToolRiviera, CommandSimRiviera, CommandElabRiviera.
9
9
  import os
10
10
  import subprocess
11
11
 
12
+ from pathlib import Path
13
+
12
14
  from opencos import util
13
15
  from opencos.commands import CommandFList
14
16
  from opencos.files import safe_shutil_which
@@ -65,6 +67,8 @@ class ToolRiviera(ToolQuesta):
65
67
  class CommandSimRiviera(CommonSimQuesta, ToolRiviera):
66
68
  '''CommandSimRiviera is a command handler for: eda sim --tool=riviera'''
67
69
 
70
+ library_map_supported = True
71
+
68
72
  def __init__(self, config: dict):
69
73
  CommonSimQuesta.__init__(self, config=config)
70
74
 
@@ -190,6 +194,9 @@ class CommandSimRiviera(CommonSimQuesta, ToolRiviera):
190
194
  '-dbg'
191
195
  ])
192
196
 
197
+ # Note, in Riviera we have to put sim libs in vsim call (with -L) and in vlog (with -l)
198
+ vlog_dot_f_lines.extend([f'-l {x}' for x in self.args['sim-library']])
199
+
193
200
  for value in self.incdirs:
194
201
  vlog_dot_f_lines += [ f"+incdir+{value}" ]
195
202
 
@@ -278,7 +285,10 @@ class CommandSimRiviera(CommonSimQuesta, ToolRiviera):
278
285
  )
279
286
  )
280
287
 
281
- vsim_libs = ' '.join([f'-l {x}' for x in self.args['sim-library']])
288
+ # Note, in Riviera we have to put sim libs in vsim call (with -L) and in vlog (with -l)
289
+ # we previously updated self.args['sim-library'] with self.update_library_map()
290
+ vmap_lines_str = self.get_vmap_lines_str()
291
+ vsim_libs = ' '.join([f'-L {x}' for x in self.args['sim-library']])
282
292
 
283
293
  vsim_one_liner = (
284
294
  "vsim"
@@ -286,11 +296,16 @@ class CommandSimRiviera(CommonSimQuesta, ToolRiviera):
286
296
  f" {voptargs_str} {vsim_ext_args} {vsim_libs} work.{self.args['top']}"
287
297
  )
288
298
 
299
+
300
+ for l in self.args['add-top-library']:
301
+ vsim_one_liner += f' {l}'
302
+
289
303
  vsim_one_liner = vsim_one_liner.replace('\n', ' ') # needs to be a one-liner
290
304
 
291
305
  vsim_vlogonly_dot_do_lines = [
292
306
  "if {[file exists work]} { vdel -all work; }",
293
307
  "vlib work;",
308
+ vmap_lines_str,
294
309
  "if {[catch {vlog -f vlog.f} result]} {",
295
310
  " echo \"Caught $result \";",
296
311
  " if {[batch_mode]} {",
@@ -306,6 +321,7 @@ class CommandSimRiviera(CommonSimQuesta, ToolRiviera):
306
321
  "if {[file exists work]} { vdel -all work; }",
307
322
  "vlib work;",
308
323
  "set qc 30;",
324
+ vmap_lines_str,
309
325
  "if {[catch {vlog -f vlog.f} result]} {",
310
326
  " echo \"Caught $result \";",
311
327
  " if {[batch_mode]} {",
@@ -327,6 +343,7 @@ class CommandSimRiviera(CommonSimQuesta, ToolRiviera):
327
343
  "if {[file exists work]} { vdel -all work; }",
328
344
  "vlib work;",
329
345
  "set qc 30;",
346
+ vmap_lines_str,
330
347
  "if {[catch {vlog -f vlog.f} result]} {",
331
348
  " echo \"Caught $result \";",
332
349
  " if {[batch_mode]} {",
@@ -407,6 +424,38 @@ class CommandSimRiviera(CommonSimQuesta, ToolRiviera):
407
424
 
408
425
  return ' '.join(vsim_suppress_list)
409
426
 
427
+ def update_library_map(self, base_search_paths: list | None = None) -> None:
428
+ '''Override from sim::CommandSim
429
+
430
+ We add some common places to look relative to the Riviera install paths
431
+ '''
432
+ bsp = []
433
+ if isinstance(base_search_paths, list):
434
+ bsp += base_search_paths
435
+ bsp += [
436
+ Path(self.sim_exe_base_path),
437
+ Path(self.sim_exe_base_path) / '..',
438
+ Path(self.sim_exe_base_path) / '..' / 'vlib',
439
+ ]
440
+ super().update_library_map(base_search_paths=bsp)
441
+
442
+ def get_vmap_lines_str(self) -> str:
443
+ '''Returns an empty str, or single str in the form:
444
+
445
+ vmap -global LibraryName AbsolutePathToDotLibFile
446
+ vmap -global LibraryName2 AbsolutePathToAnotherDotLibFile
447
+ ...
448
+ uses self.args['library-map'], updates self.args['sim-library']
449
+ '''
450
+ if not self.library_map:
451
+ return ''
452
+
453
+ lines = []
454
+ for lib_name, lib_file_path in self.library_map.items():
455
+ lines.append(f'vmap -global {lib_name} {lib_file_path}')
456
+
457
+ return '\n'.join(lines)
458
+
410
459
 
411
460
  class CommandElabRiviera(CommandSimRiviera):
412
461
  '''CommandElabRiviera is a command handler for: eda elab --tool=riviera'''
@@ -147,6 +147,7 @@ class VerilatorSim(CommandSim, ToolVerilator):
147
147
  # We do not override CommandSim.do_it()
148
148
  def prepare_compile(self):
149
149
  self.set_tool_defines()
150
+ self.update_library_map()
150
151
 
151
152
  # If there are C++ files here, then we will run Verilator in --cc mode:
152
153
  if self.files_cpp:
@@ -249,6 +250,10 @@ class VerilatorSim(CommandSim, ToolVerilator):
249
250
  '-top', self.args['top'],
250
251
  ]
251
252
 
253
+ if self.args['add-top-library']:
254
+ util.warning('--add-top-library: currently not supported in eda --tool=verilator:',
255
+ f'{self.args["add-top-library"]}')
256
+
252
257
  if not lint_only:
253
258
  verilate_command_list += [
254
259
  '-o', 'sim.exe',
opencos/tools/vivado.py CHANGED
@@ -39,7 +39,10 @@ class ToolVivado(Tool):
39
39
  })
40
40
  self.args_help.update({
41
41
  'part': 'Device used for commands: synth, build.',
42
- 'add-glbl-v': '(for simulation) add glbl.v to filelist',
42
+ 'add-glbl-v': (
43
+ '(for simulation) add glbl.v to filelist, "glbl" to sim libraries, and "glbl"'
44
+ ' as an additional top level hier.'
45
+ ),
43
46
  })
44
47
 
45
48
 
@@ -124,6 +127,8 @@ class CommandSimVivado(CommandSim, ToolVivado):
124
127
  Note that we attempt to run a generated .tcl script within vivado, that will perform the
125
128
  3-step compile/elaborate/simulate steps'''
126
129
 
130
+ library_map_supported = True
131
+
127
132
  def __init__(self, config: dict):
128
133
  CommandSim.__init__(self, config)
129
134
  ToolVivado.__init__(self, config=self.config)
@@ -139,7 +144,16 @@ class CommandSimVivado(CommandSim, ToolVivado):
139
144
  'gui': 'Run Vivado XSim in GUI mode',
140
145
  'tcl-file': 'name of TCL file to be created for XSim',
141
146
  'fpga': 'FPGA device name, can be used for various Xilinx IP or XCIs',
142
- 'add-glbl-v': 'Use the glbl.v in xvlog for this version of Vivado',
147
+ 'add-glbl-v': (
148
+ 'Use the glbl.v in xvlog, xelab for this version of Vivado. Adds glbl.v to'
149
+ ' filelist(s), and add "glbl" as an additional top level hier to xelab.'
150
+ ),
151
+ 'library-map': (
152
+ 'list arg (can set multiple) with values LibName:Path, for example:'
153
+ ' --library-map=unisim:path/to/custom_lib_name.lib'
154
+ ' The Path search is relative to the tool exe, one level above the tool exe,'
155
+ ' or can be absolute path.'
156
+ )
143
157
  })
144
158
 
145
159
  self.sim_libraries = self.tool_config.get('sim-libraries', [])
@@ -165,6 +179,7 @@ class CommandSimVivado(CommandSim, ToolVivado):
165
179
 
166
180
  def prepare_compile(self):
167
181
  self.set_tool_defines()
182
+ self.update_library_map()
168
183
 
169
184
  # Don't use the return values, these will set values in self.vivado_tcl:
170
185
  self.get_compile_command_lists()
@@ -321,11 +336,13 @@ class CommandSimVivado(CommandSim, ToolVivado):
321
336
  command_list += ['-debug', 'wave']
322
337
  if util.args['verbose']:
323
338
  command_list += ['-v', '2']
324
- if self.args['sim-library'] or self.args['add-glbl-v']:
339
+ if self.args['sim-library']:
325
340
  self.sim_libraries += self.args['sim-library'] # Add any command line libraries
326
- for x in self.sim_libraries:
327
- command_list += ['-L', x]
328
- command_list += ['glbl']
341
+ for x in self.sim_libraries:
342
+ command_list += ['-L', x]
343
+ if self.args['add-top-library']:
344
+ command_list += self.args['add-top-library'] # list
345
+
329
346
  command_list += self.args['elab-args']
330
347
 
331
348
  # For Windows compatibility, we have some issues with command/Powershell passing args
@@ -447,6 +464,10 @@ class CommandSimVivado(CommandSim, ToolVivado):
447
464
  command_list += self.tool_config.get('compile-args', '').split()
448
465
  if util.args['verbose']:
449
466
  command_list += ['-v', '2']
467
+
468
+ # If there were any external .lib files from --library-map args, add those now:
469
+ command_list.extend(self._get_xvlog_library_map_list())
470
+
450
471
  for value in self.incdirs:
451
472
  command_list.append('-i')
452
473
  command_list.append(Path(value).as_posix())
@@ -491,13 +512,28 @@ class CommandSimVivado(CommandSim, ToolVivado):
491
512
  glbl_v = self.vivado_base_path.replace(
492
513
  'bin', os.path.join('data', 'verilog', 'src', 'glbl.v')
493
514
  )
494
- if any(x.endswith('glbl.v') for x in self.files_v):
515
+ if any(x and os.path.split(x)[1] == 'glbl.v' for x in self.files_v):
495
516
  util.warning(f'--add-glbl-v: Not adding {glbl_v=} b/c glbl.v already in',
496
517
  f'{self.files_v=}')
497
518
  elif not os.path.exists(glbl_v):
498
519
  self.error(f"Could not find file {glbl_v=}")
499
520
  else:
500
521
  self.files_v.insert(0, glbl_v)
522
+ # add to self.args['add-top-library']
523
+ if 'glbl' not in self.args['add-top-library']:
524
+ self.args['add-top-library'].append('glbl')
525
+
526
+ def _get_xvlog_library_map_list(self) -> list:
527
+ '''Returns list of lines used in vlog step for --library-map args
528
+
529
+ Note that Vivado does not do library name re-mapping, the name comes
530
+ from the .lib file internals.
531
+ '''
532
+
533
+ lines = []
534
+ for _, lib_file_path in self.library_map.items():
535
+ lines.append(f'-libmap {lib_file_path}')
536
+ return lines
501
537
 
502
538
 
503
539
  def artifacts_add(self, name: str, typ: str, description: str) -> None:
opencos/tools/yosys.py CHANGED
@@ -22,7 +22,7 @@ def get_commands_to_run_scriptfiles(
22
22
 
23
23
  list of yoysys script(s)'''
24
24
 
25
- if script_fnames_list:
25
+ if not script_fnames_list:
26
26
  return []
27
27
 
28
28
  yosys_cmdlists = []
@@ -142,7 +142,12 @@ class CommonSynthYosys(CommandSynth, ToolYosys):
142
142
  'yosys-scriptfile': (
143
143
  'Instead of using a built-in flow from eda, use your own scripts that are called'
144
144
  ' via: yosys --scriptfile <this-arg>. You can set multiple args for multiple'
145
- ' scriptfile (appends)'
145
+ ' scriptfile (appends). NOTE: the default for eda is to run in a work-dir such as'
146
+ ' ./eda.work/<target>.synth/, which means you may want to use absolute paths for'
147
+ ' source files (.sv, etc) in your custom scriptfile, or use ../.. to get back to '
148
+ ' the current directory. If you want to run in place and avoid'
149
+ ' ./eda.work/<target>.synth/ you can use arg --work-dir=. or to run in place from'
150
+ ' the DEPS target directory, use --work-dir-use-target-dir'
146
151
  ),
147
152
  'sta-scriptfile': (
148
153
  'Instead of using a built-in flow from eda, use your own script that is called'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opencos-eda
3
- Version: 0.3.13
3
+ Version: 0.3.14
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
@@ -5,7 +5,7 @@ opencos/deps_schema.py,sha256=wKRMuFzOIapwpCPFGvWGM8Mcwdh9yngHOiDRMmvUaIg,17394
5
5
  opencos/eda.py,sha256=2vJLMYMW9muWieNaOJz-U5EIVchmVyhTfmEcnZwQtvg,37382
6
6
  opencos/eda_base.py,sha256=-nguHrrYVb8a853HEMfFrOoXlsEEeRnDdFR66nTwX0s,124332
7
7
  opencos/eda_config.py,sha256=EPW0rhnbrpfV9h0OtKrp7By19FcEyDXT2-ud7y4jbRU,17266
8
- opencos/eda_config_defaults.yml,sha256=xRJWps4On748MAFIfOIvLNOv5cyON7xAeaW5XquJSp0,21534
8
+ opencos/eda_config_defaults.yml,sha256=0rq6DNw2U0OjuoZPmYVDgPwu_WoaGUQmaNE3l7sP4wA,21601
9
9
  opencos/eda_config_reduced.yml,sha256=BOKGfe-OmVIF0SKhTTglPIzfAoGuCZ8n-f2KpoLF8dk,883
10
10
  opencos/eda_deps_bash_completion.bash,sha256=o1yZvGUQSbN-AYq95sDTzMFw7gNHCUSlv9tASEHnACA,2763
11
11
  opencos/eda_deps_sanitize.py,sha256=SQjvrte9Hv9JesRY0wljvbdC6pAmLCikI-Wdzzy-D04,1939
@@ -30,7 +30,7 @@ opencos/commands/multi.py,sha256=urm-IDllnMZWScH7e6Pg4ukHGHILBd4NbPlPmHU3vsw,276
30
30
  opencos/commands/open.py,sha256=XckvKUNwvc5KHbYGV-eQ2i0WG4X-yckroDaMC610MB4,804
31
31
  opencos/commands/proj.py,sha256=cExW9ZZkw6nkpVyNfeQzJADzmPtbYgBgWml82tqO6jY,1158
32
32
  opencos/commands/shell.py,sha256=upHpFs8Gdtzi-boVXwsC-QzEsnvtoZNMAu4oN10kdxw,7801
33
- opencos/commands/sim.py,sha256=ifdSpOVmxMWkQ65-9lhwMNZM4F3MXokjJJBm4puyVX4,28573
33
+ opencos/commands/sim.py,sha256=mpy1vOEeAfMfGmc_Q1ukWddgAmkXzShdVGKKdMLjvXs,31548
34
34
  opencos/commands/sweep.py,sha256=62XmDHT-prdxJNy-6MbK6wEGJm1YC9caOaJapoekQ8s,9325
35
35
  opencos/commands/synth.py,sha256=Qs6FP9Ge_gp9TH3EFzVXKFlrrqrMwIbr38VYVlZvmeA,4557
36
36
  opencos/commands/targets.py,sha256=_jRNhm2Fqj0fmMvTw6Ba39DCsRHf_r_uZCy_R064kpA,1472
@@ -61,21 +61,21 @@ opencos/tools/cocotb.py,sha256=mkhdbBbkOcPPct1TZcKH6wPPT7pjzRH_6wCNH2qgXOM,19660
61
61
  opencos/tools/invio.py,sha256=pxrS5oaNTcEv-ToXdhFBJZF5XhTmZnJz9CQ8NnLoty8,3155
62
62
  opencos/tools/invio_helpers.py,sha256=86WOGmSf4m_lEqBtK3DLjWqI0jnqAWzBEBRYfBUGiSY,8804
63
63
  opencos/tools/invio_yosys.py,sha256=zPVX5Bv-mR4zaUZiH0QqGF4Vbm_LXAf75mDW6ywse5c,6026
64
- opencos/tools/iverilog.py,sha256=7R4wL1udfn0WdckPDsYM75GgYW9DeCfPUQEOe-8SGVM,6755
64
+ opencos/tools/iverilog.py,sha256=aehXQV22U7MIaH8XuEI9ApWztsez0NaW960_Z01oZWc,6789
65
65
  opencos/tools/modelsim_ase.py,sha256=NEzAXJtiVWkKb3N-O3PYxSnnFmrq8LNrqjxFNBwzfKI,2254
66
66
  opencos/tools/quartus.py,sha256=gtswIhpnHjUTmw5g1BRxhjB6tofXEsx-I6IySjwyF94,32303
67
67
  opencos/tools/questa.py,sha256=QP0JCt8rWf0-snncNP0_Pi6oRY6_Z9Hwix1IYlRdGEc,2057
68
- opencos/tools/questa_common.py,sha256=oVytNlwLK-W6yUYqOwlWjPrDd0kWJV4-FnWgppkSX8k,21647
68
+ opencos/tools/questa_common.py,sha256=4K5OoFlCCZcPTQDW8pYvMDJm3WpIJ6yxLnx5akRtIuU,21897
69
69
  opencos/tools/questa_fe.py,sha256=yYNlUnA2pQ8-gELLajnvJgqg6ZXb6F26YRmyvrlNFOA,2155
70
70
  opencos/tools/questa_fse.py,sha256=CjOAn1Ik-3Hd-vyUH_WyTTJxH2yPfhNEfXbedCir7J4,2116
71
- opencos/tools/riviera.py,sha256=LgLartBXWwJIoI4zRFL7X2wk6hu2wa0CIJCNBZOGxUc,17509
71
+ opencos/tools/riviera.py,sha256=kRBG1ypS7TH1bA0_Hw7-q5sH7xS7X__rizUgAJgCfgg,19269
72
72
  opencos/tools/slang.py,sha256=MxRwu4laSbv7oa3lO-BKg4McL7KAckSA003sL-9sY3U,9682
73
73
  opencos/tools/slang_yosys.py,sha256=z8gUcNSGDl5S6Ufxdx54WWe5v73w0UydErBKFWBR6ZI,10154
74
74
  opencos/tools/surelog.py,sha256=QaXS1EWI2b1TqBoekpXndoHxS6t2e8SD-I2Ryi-gHGs,6666
75
75
  opencos/tools/tabbycad_yosys.py,sha256=J4RgfuzYLiBK1U8odXiovXZhgkcDFPlbxt73SppksVA,7657
76
- opencos/tools/verilator.py,sha256=cx4q1WrterA5Kcn8bt8ukqthS0030swGOFOsoMRBYvw,25131
77
- opencos/tools/vivado.py,sha256=c8iHVK76de_25iOqN-PJ7O6n1lRopvO_XCM0HZV3c04,48702
78
- opencos/tools/yosys.py,sha256=DZyqAnrHT-6Wv6TlIwzuv4qw7HZs4vOXPpxZzErRsnY,28292
76
+ opencos/tools/verilator.py,sha256=uxJs5VpE6pHIR3c5bJbQbjSoymIqNOG861ix2IR_c3Y,25363
77
+ opencos/tools/vivado.py,sha256=BHnfJ-TqUYwdKFC1zHJ3x6xkLOgn2xdQbxySbBEWFYk,50149
78
+ opencos/tools/yosys.py,sha256=8r3pxNod-ntWAHrDDL0HCT9mCkZ6qcNnOtLnIpOTi9g,28807
79
79
  opencos/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
80
  opencos/utils/dict_helpers.py,sha256=xCdfE8SE-D6hNu5dG_d46A2g6au6h1h7SFpzYmeyRtA,810
81
81
  opencos/utils/markup_helpers.py,sha256=F_Emh2kT2gETYf7C-Jy5yJjsiHiPUtBpQzONsCka6Eo,4604
@@ -84,10 +84,10 @@ opencos/utils/str_helpers.py,sha256=ctl0Zh0h0JW7OlReeSdGxB9wODQYzmMO-9-h55rSRv0,
84
84
  opencos/utils/subprocess_helpers.py,sha256=Wqqs8FKm3XIjmD9GUYM-HWVJH7TxWJJA37A07J4fQ4w,6619
85
85
  opencos/utils/vscode_helper.py,sha256=8epyEeYfXONwiSoc5KZjUfKc8vgLryct8yckJYie88U,1398
86
86
  opencos/utils/vsim_helper.py,sha256=-TJK4Dh8LZ4DCM8GrS9Wka4HE_WMGG_aKwTZtKBrEOE,2994
87
- opencos_eda-0.3.13.dist-info/licenses/LICENSE,sha256=HyVuytGSiAUQ6ErWBHTqt1iSGHhLmlC8fO7jTCuR8dU,16725
88
- opencos_eda-0.3.13.dist-info/licenses/LICENSE.spdx,sha256=8gn1610RMP6eFgT3Hm6q9VKXt0RvdTItL_oxMo72jII,189
89
- opencos_eda-0.3.13.dist-info/METADATA,sha256=ryUfx_mmUFaZcwGr8lXFXrkY2whYhLB-HcQCfKSMtn8,1165
90
- opencos_eda-0.3.13.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
91
- opencos_eda-0.3.13.dist-info/entry_points.txt,sha256=QOlMZnQeqqwOzIaeKBcY_WlMR3idmOAEbGFh2dXlqJw,290
92
- opencos_eda-0.3.13.dist-info/top_level.txt,sha256=J4JDP-LpRyJqPNeh9bSjx6yrLz2Mk0h6un6YLmtqql4,8
93
- opencos_eda-0.3.13.dist-info/RECORD,,
87
+ opencos_eda-0.3.14.dist-info/licenses/LICENSE,sha256=HyVuytGSiAUQ6ErWBHTqt1iSGHhLmlC8fO7jTCuR8dU,16725
88
+ opencos_eda-0.3.14.dist-info/licenses/LICENSE.spdx,sha256=8gn1610RMP6eFgT3Hm6q9VKXt0RvdTItL_oxMo72jII,189
89
+ opencos_eda-0.3.14.dist-info/METADATA,sha256=2oqD3XW6Dlmwk9LQhx_-F7Z20ZI7AlQ3GW7v3wWarjQ,1165
90
+ opencos_eda-0.3.14.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
91
+ opencos_eda-0.3.14.dist-info/entry_points.txt,sha256=QOlMZnQeqqwOzIaeKBcY_WlMR3idmOAEbGFh2dXlqJw,290
92
+ opencos_eda-0.3.14.dist-info/top_level.txt,sha256=J4JDP-LpRyJqPNeh9bSjx6yrLz2Mk0h6un6YLmtqql4,8
93
+ opencos_eda-0.3.14.dist-info/RECORD,,