mirror of
https://github.com/YosysHQ/sby.git
synced 2025-04-05 14:04:07 +00:00
Add vcd option to make VCD writing optional
This commit is contained in:
parent
17c3961a2b
commit
168d667b6d
|
@ -146,6 +146,9 @@ options are:
|
||||||
| | | wait for all engines to return and check for |
|
| | | wait for all engines to return and check for |
|
||||||
| | | consistency. Values: ``on``, ``off``. Default: ``off`` |
|
| | | consistency. Values: ``on``, ``off``. Default: ``off`` |
|
||||||
+------------------+------------+---------------------------------------------------------+
|
+------------------+------------+---------------------------------------------------------+
|
||||||
|
| ``vcd`` | All | Write VCD traces for counter-example or cover traces. |
|
||||||
|
| | | Values: ``on``, ``off``. Default: ``on`` |
|
||||||
|
+------------------+------------+---------------------------------------------------------+
|
||||||
| ``aigsmt`` | All | Which SMT2 solver to use for converting AIGER witnesses |
|
| ``aigsmt`` | All | Which SMT2 solver to use for converting AIGER witnesses |
|
||||||
| | | to counter example traces. Use ``none`` to disable |
|
| | | to counter example traces. Use ``none`` to disable |
|
||||||
| | | conversion of AIGER witnesses. Default: ``yices`` |
|
| | | conversion of AIGER witnesses. Default: ``yices`` |
|
||||||
|
|
|
@ -986,6 +986,8 @@ class SbyTask(SbyConfig):
|
||||||
self.handle_bool_option("wait", False)
|
self.handle_bool_option("wait", False)
|
||||||
self.handle_int_option("timeout", None)
|
self.handle_int_option("timeout", None)
|
||||||
|
|
||||||
|
self.handle_bool_option("vcd", True)
|
||||||
|
|
||||||
self.handle_str_option("smtc", None)
|
self.handle_str_option("smtc", None)
|
||||||
self.handle_int_option("skip", None)
|
self.handle_int_option("skip", None)
|
||||||
self.handle_str_option("tbtop", None)
|
self.handle_str_option("tbtop", None)
|
||||||
|
|
|
@ -89,15 +89,20 @@ def run(mode, task, engine_idx, engine):
|
||||||
task.terminate()
|
task.terminate()
|
||||||
|
|
||||||
if proc_status == "FAIL" and task.opt_aigsmt != "none":
|
if proc_status == "FAIL" and task.opt_aigsmt != "none":
|
||||||
|
trace_prefix = f"engine_{engine_idx}/trace"
|
||||||
|
dump_flags = f"--dump-vcd {trace_prefix}.vcd " if task.opt_vcd else ""
|
||||||
|
dump_flags += f"--dump-yw {trace_prefix}.yw --dump-vlogtb {trace_prefix}_tb.v --dump-smtc {trace_prefix}.smtc"
|
||||||
|
|
||||||
proc2 = SbyProc(
|
proc2 = SbyProc(
|
||||||
task,
|
task,
|
||||||
f"engine_{engine_idx}",
|
f"engine_{engine_idx}",
|
||||||
task.model("smt2"),
|
task.model("smt2"),
|
||||||
("cd {}; {} -s {}{} --noprogress --append {} --dump-vcd engine_{i}/trace.vcd --dump-vlogtb engine_{i}/trace_tb.v " +
|
("cd {}; {} -s {}{} --noprogress --append {} {dump_flags} --aig model/design_aiger.aim:engine_{i}/trace.aiw --aig-noheader model/design_smt2.smt2").format
|
||||||
"--dump-smtc engine_{i}/trace.smtc --aig model/design_aiger.aim:engine_{i}/trace.aiw --aig-noheader model/design_smt2.smt2").format
|
|
||||||
(task.workdir, task.exe_paths["smtbmc"], task.opt_aigsmt,
|
(task.workdir, task.exe_paths["smtbmc"], task.opt_aigsmt,
|
||||||
"" if task.opt_tbtop is None else f" --vlogtb-top {task.opt_tbtop}",
|
"" if task.opt_tbtop is None else f" --vlogtb-top {task.opt_tbtop}",
|
||||||
task.opt_append, i=engine_idx),
|
task.opt_append,
|
||||||
|
dump_flags=dump_flags,
|
||||||
|
i=engine_idx),
|
||||||
logfile=open(f"{task.workdir}/engine_{engine_idx}/logfile2.txt", "w")
|
logfile=open(f"{task.workdir}/engine_{engine_idx}/logfile2.txt", "w")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -105,15 +105,19 @@ def run(mode, task, engine_idx, engine):
|
||||||
|
|
||||||
if proc_status == "FAIL" and task.opt_aigsmt != "none":
|
if proc_status == "FAIL" and task.opt_aigsmt != "none":
|
||||||
if produced_cex:
|
if produced_cex:
|
||||||
|
trace_prefix = f"engine_{engine_idx}/trace"
|
||||||
|
dump_flags = f"--dump-vcd {trace_prefix}.vcd " if task.opt_vcd else ""
|
||||||
|
dump_flags += f"--dump-yw {trace_prefix}.yw --dump-vlogtb {trace_prefix}_tb.v --dump-smtc {trace_prefix}.smtc"
|
||||||
|
|
||||||
if mode == "live":
|
if mode == "live":
|
||||||
proc2 = SbyProc(
|
proc2 = SbyProc(
|
||||||
task,
|
task,
|
||||||
f"engine_{engine_idx}",
|
f"engine_{engine_idx}",
|
||||||
task.model("smt2"),
|
task.model("smt2"),
|
||||||
("cd {}; {} -g -s {}{} --noprogress --dump-vcd engine_{i}/trace.vcd --dump-vlogtb engine_{i}/trace_tb.v " +
|
("cd {}; {} -g -s {}{} --noprogress {dump_flags} --aig model/design_aiger.aim:engine_{i}/trace.aiw model/design_smt2.smt2").format
|
||||||
"--dump-smtc engine_{i}/trace.smtc --dump-yw engine_{i}/trace.yw --aig model/design_aiger.aim:engine_{i}/trace.aiw model/design_smt2.smt2").format
|
|
||||||
(task.workdir, task.exe_paths["smtbmc"], task.opt_aigsmt,
|
(task.workdir, task.exe_paths["smtbmc"], task.opt_aigsmt,
|
||||||
"" if task.opt_tbtop is None else f" --vlogtb-top {task.opt_tbtop}",
|
"" if task.opt_tbtop is None else f" --vlogtb-top {task.opt_tbtop}",
|
||||||
|
dump_flags=dump_flags,
|
||||||
i=engine_idx),
|
i=engine_idx),
|
||||||
logfile=open(f"{task.workdir}/engine_{engine_idx}/logfile2.txt", "w")
|
logfile=open(f"{task.workdir}/engine_{engine_idx}/logfile2.txt", "w")
|
||||||
)
|
)
|
||||||
|
@ -122,11 +126,12 @@ def run(mode, task, engine_idx, engine):
|
||||||
task,
|
task,
|
||||||
f"engine_{engine_idx}",
|
f"engine_{engine_idx}",
|
||||||
task.model("smt2"),
|
task.model("smt2"),
|
||||||
("cd {}; {} -s {}{} --noprogress --append {} --dump-vcd engine_{i}/trace.vcd --dump-vlogtb engine_{i}/trace_tb.v " +
|
("cd {}; {} -s {}{} --noprogress --append {} {dump_flags} --aig model/design_aiger.aim:engine_{i}/trace.aiw model/design_smt2.smt2").format
|
||||||
"--dump-smtc engine_{i}/trace.smtc --dump-yw engine_{i}/trace.yw --aig model/design_aiger.aim:engine_{i}/trace.aiw model/design_smt2.smt2").format
|
|
||||||
(task.workdir, task.exe_paths["smtbmc"], task.opt_aigsmt,
|
(task.workdir, task.exe_paths["smtbmc"], task.opt_aigsmt,
|
||||||
"" if task.opt_tbtop is None else f" --vlogtb-top {task.opt_tbtop}",
|
"" if task.opt_tbtop is None else f" --vlogtb-top {task.opt_tbtop}",
|
||||||
task.opt_append, i=engine_idx),
|
task.opt_append,
|
||||||
|
dump_flags=dump_flags,
|
||||||
|
i=engine_idx),
|
||||||
logfile=open(f"{task.workdir}/engine_{engine_idx}/logfile2.txt", "w")
|
logfile=open(f"{task.workdir}/engine_{engine_idx}/logfile2.txt", "w")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -152,17 +152,20 @@ def run(mode, task, engine_idx, engine):
|
||||||
suffix = ""
|
suffix = ""
|
||||||
else:
|
else:
|
||||||
suffix = common_state.produced_cex
|
suffix = common_state.produced_cex
|
||||||
proc2 = SbyProc(
|
|
||||||
task,
|
if mode == "cover" or task.opt_vcd:
|
||||||
f"engine_{engine_idx}_{common_state.produced_cex}",
|
# TODO cover runs btorsim not only for trace generation, can we run it without VCD generation in that case?
|
||||||
task.model("btor"),
|
proc2 = SbyProc(
|
||||||
"cd {dir} ; btorsim -c --vcd engine_{idx}/trace{i}.vcd --hierarchical-symbols --info model/design_btor{s}.info model/design_btor{s}.btor engine_{idx}/trace{i}.wit".format(dir=task.workdir, idx=engine_idx, i=suffix, s='_single' if solver_args[0] == 'pono' else ''),
|
task,
|
||||||
logfile=open(f"{task.workdir}/engine_{engine_idx}/logfile2.txt", "w")
|
f"engine_{engine_idx}_{common_state.produced_cex}",
|
||||||
)
|
task.model("btor"),
|
||||||
proc2.output_callback = output_callback2
|
"cd {dir} ; btorsim -c --vcd engine_{idx}/trace{i}.vcd --hierarchical-symbols --info model/design_btor{s}.info model/design_btor{s}.btor engine_{idx}/trace{i}.wit".format(dir=task.workdir, idx=engine_idx, i=suffix, s='_single' if solver_args[0] == 'pono' else ''),
|
||||||
proc2.exit_callback = make_exit_callback(suffix)
|
logfile=open(f"{task.workdir}/engine_{engine_idx}/logfile2.txt", "w")
|
||||||
proc2.checkretcode = True
|
)
|
||||||
common_state.running_procs += 1
|
proc2.output_callback = output_callback2
|
||||||
|
proc2.exit_callback = make_exit_callback(suffix)
|
||||||
|
proc2.checkretcode = True
|
||||||
|
common_state.running_procs += 1
|
||||||
|
|
||||||
common_state.produced_cex += 1
|
common_state.produced_cex += 1
|
||||||
common_state.wit_file.close()
|
common_state.wit_file.close()
|
||||||
|
|
|
@ -148,11 +148,13 @@ def run(mode, task, engine_idx, engine):
|
||||||
t_opt = "{}".format(task.opt_depth)
|
t_opt = "{}".format(task.opt_depth)
|
||||||
|
|
||||||
random_seed = f"--info \"(set-option :random-seed {random_seed})\"" if random_seed else ""
|
random_seed = f"--info \"(set-option :random-seed {random_seed})\"" if random_seed else ""
|
||||||
|
dump_flags = f"--dump-vcd {trace_prefix}.vcd " if task.opt_vcd else ""
|
||||||
|
dump_flags += f"--dump-yw {trace_prefix}.yw --dump-vlogtb {trace_prefix}_tb.v --dump-smtc {trace_prefix}.smtc"
|
||||||
proc = SbyProc(
|
proc = SbyProc(
|
||||||
task,
|
task,
|
||||||
procname,
|
procname,
|
||||||
task.model(model_name),
|
task.model(model_name),
|
||||||
f"""cd {task.workdir}; {task.exe_paths["smtbmc"]} {" ".join(smtbmc_opts)} -t {t_opt} {random_seed} --append {task.opt_append} --dump-vcd {trace_prefix}.vcd --dump-yw {trace_prefix}.yw --dump-vlogtb {trace_prefix}_tb.v --dump-smtc {trace_prefix}.smtc model/design_{model_name}.smt2""",
|
f"""cd {task.workdir}; {task.exe_paths["smtbmc"]} {" ".join(smtbmc_opts)} -t {t_opt} {random_seed} --append {task.opt_append} {dump_flags} model/design_{model_name}.smt2""",
|
||||||
logfile=open(logfile_prefix + ".txt", "w"),
|
logfile=open(logfile_prefix + ".txt", "w"),
|
||||||
logstderr=(not progress)
|
logstderr=(not progress)
|
||||||
)
|
)
|
||||||
|
|
37
tests/unsorted/no_vcd.sby
Normal file
37
tests/unsorted/no_vcd.sby
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
[tasks]
|
||||||
|
smtbmc mode_bmc
|
||||||
|
btor_bmc engine_btor mode_bmc
|
||||||
|
btor_cover engine_btor mode_cover
|
||||||
|
abc mode_bmc
|
||||||
|
aiger engine_aiger mode_prove
|
||||||
|
|
||||||
|
[options]
|
||||||
|
mode_bmc: mode bmc
|
||||||
|
mode_prove: mode prove
|
||||||
|
mode_cover: mode cover
|
||||||
|
vcd off
|
||||||
|
~mode_cover: expect fail
|
||||||
|
|
||||||
|
[engines]
|
||||||
|
smtbmc: smtbmc
|
||||||
|
engine_btor: btor btormc
|
||||||
|
abc: abc bmc3
|
||||||
|
aiger: aiger suprove
|
||||||
|
|
||||||
|
[script]
|
||||||
|
read_verilog -formal no_vcd.sv
|
||||||
|
prep -top top
|
||||||
|
|
||||||
|
[file no_vcd.sv]
|
||||||
|
module top(input clk, input force);
|
||||||
|
|
||||||
|
reg [4:0] counter = 0;
|
||||||
|
|
||||||
|
always @(posedge clk) begin
|
||||||
|
if (!counter[4] || force)
|
||||||
|
counter <= counter + 1;
|
||||||
|
assert (counter < 10);
|
||||||
|
cover (counter == 4);
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
Loading…
Reference in a new issue