opencos-eda 0.2.52__py3-none-any.whl → 0.2.53__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.
Files changed (41) hide show
  1. opencos/commands/__init__.py +2 -0
  2. opencos/commands/build.py +1 -1
  3. opencos/commands/deps_help.py +259 -0
  4. opencos/commands/export.py +1 -1
  5. opencos/commands/flist.py +3 -0
  6. opencos/commands/lec.py +1 -1
  7. opencos/commands/open.py +2 -0
  8. opencos/commands/proj.py +1 -1
  9. opencos/commands/shell.py +1 -1
  10. opencos/commands/sim.py +32 -8
  11. opencos/commands/synth.py +1 -1
  12. opencos/commands/upload.py +3 -0
  13. opencos/commands/waves.py +1 -0
  14. opencos/deps/defaults.py +1 -0
  15. opencos/deps/deps_file.py +30 -4
  16. opencos/deps/deps_processor.py +72 -2
  17. opencos/deps_schema.py +3 -0
  18. opencos/eda.py +50 -26
  19. opencos/eda_base.py +159 -20
  20. opencos/eda_config.py +1 -1
  21. opencos/eda_config_defaults.yml +49 -3
  22. opencos/eda_extract_targets.py +1 -58
  23. opencos/tests/helpers.py +16 -0
  24. opencos/tests/test_eda.py +13 -2
  25. opencos/tests/test_tools.py +159 -132
  26. opencos/tools/cocotb.py +9 -0
  27. opencos/tools/modelsim_ase.py +67 -51
  28. opencos/tools/quartus.py +638 -0
  29. opencos/tools/questa.py +167 -88
  30. opencos/tools/questa_fse.py +10 -0
  31. opencos/tools/riviera.py +1 -0
  32. opencos/tools/vivado.py +3 -3
  33. opencos/util.py +20 -3
  34. opencos/utils/str_helpers.py +85 -0
  35. {opencos_eda-0.2.52.dist-info → opencos_eda-0.2.53.dist-info}/METADATA +1 -1
  36. {opencos_eda-0.2.52.dist-info → opencos_eda-0.2.53.dist-info}/RECORD +41 -39
  37. {opencos_eda-0.2.52.dist-info → opencos_eda-0.2.53.dist-info}/WHEEL +0 -0
  38. {opencos_eda-0.2.52.dist-info → opencos_eda-0.2.53.dist-info}/entry_points.txt +0 -0
  39. {opencos_eda-0.2.52.dist-info → opencos_eda-0.2.53.dist-info}/licenses/LICENSE +0 -0
  40. {opencos_eda-0.2.52.dist-info → opencos_eda-0.2.53.dist-info}/licenses/LICENSE.spdx +0 -0
  41. {opencos_eda-0.2.52.dist-info → opencos_eda-0.2.53.dist-info}/top_level.txt +0 -0
@@ -19,6 +19,7 @@ class ToolModelsimAse(ToolQuesta):
19
19
 
20
20
  _TOOL = 'modelsim_ase' # otherwise it's 'questa' from base class.
21
21
  _EXE = 'vsim'
22
+ use_vopt = False
22
23
 
23
24
  class CommandSimModelsimAse(CommandSim, ToolModelsimAse):
24
25
  '''CommandSimModelsimAse is a command handler for: eda sim --tool=modelsim_ase'''
@@ -44,6 +45,15 @@ class CommandSimModelsimAse(CommandSim, ToolModelsimAse):
44
45
  )
45
46
  )
46
47
 
48
+ def run_in_batch_mode(self) -> bool:
49
+ '''Returns bool if we should run in batch mode (-c) from command line'''
50
+ # TODO(drew): make CommandSimQuesta a parent and inherit this method instead.
51
+ if self.args['test-mode']:
52
+ return True
53
+ if self.args['gui']:
54
+ return False
55
+ return True
56
+
47
57
  # We do override do_it() to avoid using CommandSimQuesta.do_it()
48
58
  def do_it(self):
49
59
  CommandSim.do_it(self)
@@ -111,7 +121,7 @@ class CommandSimModelsimAse(CommandSim, ToolModelsimAse):
111
121
  # This will also set up a compile.
112
122
  vsim_command_list = [
113
123
  self.sim_exe,
114
- '' if self.args['gui'] else '-c',
124
+ '-c' if self.run_in_batch_mode() else '',
115
125
  '-do', 'vsim_vlogonly.do', '-logfile', 'sim.log',
116
126
  ]
117
127
  return [vsim_command_list]
@@ -120,7 +130,7 @@ class CommandSimModelsimAse(CommandSim, ToolModelsimAse):
120
130
  # This will also set up a compile, for vlog + vsim (0 time)
121
131
  vsim_command_list = [
122
132
  self.sim_exe,
123
- '' if self.args['gui'] else '-c',
133
+ '-c' if self.run_in_batch_mode() else '',
124
134
  '-do', 'vsim_lintonly.do', '-logfile', 'sim.log',
125
135
  ]
126
136
  return [vsim_command_list]
@@ -129,7 +139,7 @@ class CommandSimModelsimAse(CommandSim, ToolModelsimAse):
129
139
  # This will also set up a compile, for vlog + vsim (with run -a)
130
140
  vsim_command_list = [
131
141
  self.sim_exe,
132
- '' if self.args['gui'] else '-c',
142
+ '-c' if self.run_in_batch_mode() else '',
133
143
  '-do', 'vsim.do', '-logfile', 'sim.log',
134
144
  ]
135
145
  return [vsim_command_list]
@@ -193,7 +203,9 @@ class CommandSimModelsimAse(CommandSim, ToolModelsimAse):
193
203
  with open(vlog_dot_f_fpath, 'w', encoding='utf-8') as f:
194
204
  f.writelines(line + "\n" for line in vlog_dot_f_lines)
195
205
 
196
- def write_vsim_dot_do(self, dot_do_to_write: list) -> None:
206
+ def write_vsim_dot_do( # pylint: disable=too-many-locals
207
+ self, dot_do_to_write: list
208
+ ) -> None:
197
209
  '''Writes files(s) based on dot_do_to_write(list of str)
198
210
 
199
211
  list arg values can be empty (all) or have items 'all', 'sim', 'lint', 'vlog'.'''
@@ -216,27 +228,28 @@ class CommandSimModelsimAse(CommandSim, ToolModelsimAse):
216
228
  # TODO(drew): support self.args['sim_libary', 'elab-args', sim-args'] (3 lists)
217
229
  # to add to vsim_one_liner.
218
230
 
219
- vsim_one_liner = "vsim -onfinish stop" \
220
- + f" -sv_seed {self.args['seed']} {sim_plusargs_str} {vsim_suppress_list_str}" \
221
- + f" {voptargs_str} work.{self.args['top']}"
231
+ vopt_one_liner = ""
232
+ if self.use_vopt:
233
+ vopt_one_liner = (
234
+ f"vopt {voptargs_str} work.{self.args['top']} -o opt__{self.args['top']}"
235
+ )
236
+ vopt_one_liner = vopt_one_liner.replace('\n', ' ') # needs to be a one-liner
237
+ # vopt doesn't need -voptargs=(value) like vsim does, simply use (value).
238
+ vopt_one_liner = vopt_one_liner.replace('-voptargs=', '')
222
239
 
223
- vsim_one_liner = vsim_one_liner.replace('\n', ' ') # needs to be a one-liner
240
+ vsim_one_liner = "vsim -onfinish stop" \
241
+ + f" -sv_seed {self.args['seed']} {sim_plusargs_str} {vsim_suppress_list_str}" \
242
+ + f" opt__{self.args['top']}"
243
+ else:
244
+ # vopt doesn't exist, use single vsim call after vlog call:
245
+ vsim_one_liner = "vsim -onfinish stop" \
246
+ + f" -sv_seed {self.args['seed']} {sim_plusargs_str} {vsim_suppress_list_str}" \
247
+ + f" {voptargs_str} work.{self.args['top']}"
224
248
 
225
- vsim_vlogonly_dot_do_lines = [
226
- "if {[file exists work]} { vdel -all work; }",
227
- "vlib work;",
228
- "if {[catch {vlog -f vlog.f} result]} {",
229
- " echo \"Caught $result \";",
230
- " if {[batch_mode]} {",
231
- " quit -f -code 20;",
232
- " }",
233
- "}",
234
- "if {[batch_mode]} {",
235
- " quit -f -code 0;",
236
- "}",
237
- ]
238
249
 
239
- vsim_lintonly_dot_do_lines = [
250
+ vsim_one_liner = vsim_one_liner.replace('\n', ' ')
251
+
252
+ vlog_do_lines = [
240
253
  "if {[file exists work]} { vdel -all work; }",
241
254
  "vlib work;",
242
255
  "quietly set qc 30;",
@@ -246,44 +259,35 @@ class CommandSimModelsimAse(CommandSim, ToolModelsimAse):
246
259
  " quit -f -code 20;",
247
260
  " }",
248
261
  "}",
262
+ ]
263
+
264
+ vopt_do_lines = []
265
+ if self.use_vopt:
266
+ vopt_do_lines = [
267
+ "if {[catch { " + vopt_one_liner + " } result] } {",
268
+ " echo \"Caught $result\";",
269
+ " if {[batch_mode]} {",
270
+ " quit -f -code 19;",
271
+ " }",
272
+ "}",
273
+ ]
274
+
275
+ vsim_do_lines = [
249
276
  "if {[catch { " + vsim_one_liner + " } result] } {",
250
277
  " echo \"Caught $result\";",
251
278
  " if {[batch_mode]} {",
252
- " quit -f -code 19;",
279
+ " quit -f -code 18;",
253
280
  " }",
254
281
  "}",
255
- "set TestStatus [coverage attribute -name SEED -name TESTSTATUS];",
256
- "if {[regexp \"TESTSTATUS += 0\" $TestStatus]} {",
257
- " quietly set qc 0;",
258
- "} elseif {[regexp \"TESTSTATUS += 1\" $TestStatus]} {",
259
- " quietly set qc 0;",
260
- "} else {",
261
- " quietly set qc 2;",
262
- "}",
282
+ ]
283
+
284
+ vsim_vlogonly_dot_do_lines = vlog_do_lines + [
263
285
  "if {[batch_mode]} {",
264
- " quit -f -code $qc;",
286
+ " quit -f -code 0;",
265
287
  "}",
266
288
  ]
267
289
 
268
- vsim_dot_do_lines = [
269
- "if {[file exists work]} { vdel -all work; }",
270
- "vlib work;",
271
- "quietly set qc 30;",
272
- "if {[catch {vlog -f vlog.f} result]} {",
273
- " echo \"Caught $result \";",
274
- " if {[batch_mode]} {",
275
- " quit -f -code 20;",
276
- " }",
277
- "}",
278
- "if {[catch { " + vsim_one_liner + " } result] } {",
279
- " echo \"Caught $result\";",
280
- " if {[batch_mode]} {",
281
- " quit -f -code 19;",
282
- " }",
283
- "}",
284
- "onbreak { resume; };",
285
- "catch {log -r *};",
286
- "run -a;",
290
+ final_check_teststatus_do_lines = [
287
291
  "set TestStatus [coverage attribute -name SEED -name TESTSTATUS];",
288
292
  "if {[regexp \"TESTSTATUS += 0\" $TestStatus]} {",
289
293
  " quietly set qc 0;",
@@ -297,6 +301,18 @@ class CommandSimModelsimAse(CommandSim, ToolModelsimAse):
297
301
  "}",
298
302
  ]
299
303
 
304
+ # final vlog/vopt/vsim lint-only .do command (want to make sure it can completely
305
+ # build for 'elab' style eda job), runs for 0ns, logs nothing for a waveform, quits
306
+ vsim_lintonly_dot_do_lines = vlog_do_lines + vopt_do_lines + vsim_do_lines \
307
+ + final_check_teststatus_do_lines
308
+
309
+ # final vlog/opt/vsim full simulation .do command.
310
+ vsim_dot_do_lines = vlog_do_lines + vopt_do_lines + vsim_do_lines + [
311
+ "onbreak { resume; };",
312
+ "catch {log -r *};",
313
+ "run -a;",
314
+ ] + final_check_teststatus_do_lines
315
+
300
316
  write_all = len(dot_do_to_write) == 0 or 'all' in dot_do_to_write
301
317
  if write_all or 'sim' in dot_do_to_write:
302
318
  with open(vsim_dot_do_fpath, 'w', encoding='utf-8') as f: