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.
- opencos/commands/__init__.py +2 -0
- opencos/commands/build.py +1 -1
- opencos/commands/deps_help.py +259 -0
- opencos/commands/export.py +1 -1
- opencos/commands/flist.py +3 -0
- opencos/commands/lec.py +1 -1
- opencos/commands/open.py +2 -0
- opencos/commands/proj.py +1 -1
- opencos/commands/shell.py +1 -1
- opencos/commands/sim.py +32 -8
- opencos/commands/synth.py +1 -1
- opencos/commands/upload.py +3 -0
- opencos/commands/waves.py +1 -0
- opencos/deps/defaults.py +1 -0
- opencos/deps/deps_file.py +30 -4
- opencos/deps/deps_processor.py +72 -2
- opencos/deps_schema.py +3 -0
- opencos/eda.py +50 -26
- opencos/eda_base.py +159 -20
- opencos/eda_config.py +1 -1
- opencos/eda_config_defaults.yml +49 -3
- opencos/eda_extract_targets.py +1 -58
- opencos/tests/helpers.py +16 -0
- opencos/tests/test_eda.py +13 -2
- opencos/tests/test_tools.py +159 -132
- opencos/tools/cocotb.py +9 -0
- opencos/tools/modelsim_ase.py +67 -51
- opencos/tools/quartus.py +638 -0
- opencos/tools/questa.py +167 -88
- opencos/tools/questa_fse.py +10 -0
- opencos/tools/riviera.py +1 -0
- opencos/tools/vivado.py +3 -3
- opencos/util.py +20 -3
- opencos/utils/str_helpers.py +85 -0
- {opencos_eda-0.2.52.dist-info → opencos_eda-0.2.53.dist-info}/METADATA +1 -1
- {opencos_eda-0.2.52.dist-info → opencos_eda-0.2.53.dist-info}/RECORD +41 -39
- {opencos_eda-0.2.52.dist-info → opencos_eda-0.2.53.dist-info}/WHEEL +0 -0
- {opencos_eda-0.2.52.dist-info → opencos_eda-0.2.53.dist-info}/entry_points.txt +0 -0
- {opencos_eda-0.2.52.dist-info → opencos_eda-0.2.53.dist-info}/licenses/LICENSE +0 -0
- {opencos_eda-0.2.52.dist-info → opencos_eda-0.2.53.dist-info}/licenses/LICENSE.spdx +0 -0
- {opencos_eda-0.2.52.dist-info → opencos_eda-0.2.53.dist-info}/top_level.txt +0 -0
opencos/tools/modelsim_ase.py
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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(
|
|
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
|
-
|
|
220
|
-
|
|
221
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
279
|
+
" quit -f -code 18;",
|
|
253
280
|
" }",
|
|
254
281
|
"}",
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
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
|
|
286
|
+
" quit -f -code 0;",
|
|
265
287
|
"}",
|
|
266
288
|
]
|
|
267
289
|
|
|
268
|
-
|
|
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:
|