from sby_core import SbyTask
def run(mode, job, engine_idx, engine):
- assert mode == "bmc"
-
smtbmc_opts = []
nomem_opt = False
syn_opt = False
if syn_opt: model_name += "_syn"
if nomem_opt: model_name += "_nomem"
- task = SbyTask(job, "engine_%d" % engine_idx, job.model(model_name),
- ("cd %s; yosys-smtbmc --noprogress %s -t %d --dump-vcd engine_%d/trace.vcd --dump-vlogtb engine_%d/trace_tb.v " +
- "--dump-smtc engine_%d/trace.smtc model/design_smt2.smt2") %
- (job.workdir, " ".join(smtbmc_opts), job.opt_depth, engine_idx, engine_idx, engine_idx),
- logfile=open("%s/engine_%d/logfile.txt" % (job.workdir, engine_idx), "w"))
+ if mode == "prove":
+ run("prove_basecase", job, engine_idx, engine)
+ run("prove_induction", job, engine_idx, engine)
+ return
+
+ taskname = "engine_%d" % engine_idx
+ trace_prefix = "engine_%d/trace" % engine_idx
+ logfile_prefix = "%s/engine_%d/logfile" % (job.workdir, engine_idx)
+
+ if mode == "prove_basecase":
+ taskname += ".basecase"
+
+ if mode == "prove_induction":
+ taskname += ".induction"
+ trace_prefix += "_induct"
+ logfile_prefix += "_induct"
+ smtbmc_opts.append("-i")
+
+ task = SbyTask(job, taskname, job.model(model_name),
+ ("cd %s; yosys-smtbmc --noprogress %s -t %d --dump-vcd %s.vcd --dump-vlogtb %s_tb.v --dump-smtc %s.smtc model/design_smt2.smt2") %
+ (job.workdir, " ".join(smtbmc_opts), job.opt_depth, trace_prefix, trace_prefix, trace_prefix),
+ logfile=open(logfile_prefix + ".txt", "w"))
+
+ if mode == "prove_basecase":
+ job.basecase_tasks.append(task)
+
+ if mode == "prove_induction":
+ job.induction_tasks.append(task)
task_status = None
def exit_callback(retcode):
assert task_status is not None
- job.status = task_status
- job.log("engine_%d: Status returned by engine: %s" % (engine_idx, task_status))
- job.summary.append("engine_%d (%s) returned %s" % (engine_idx, " ".join(engine), job.status))
+ if mode == "bmc":
+ job.status = task_status
+ job.log("engine_%d: Status returned by engine: %s" % (engine_idx, task_status))
+ job.summary.append("engine_%d (%s) returned %s" % (engine_idx, " ".join(engine), job.status))
+
+ if job.status == "FAIL":
+ job.summary.append("counterexample trace: %s/engine_%d/trace.vcd" % (job.workdir, engine_idx))
+
+ job.terminate()
- if job.status == "FAIL":
- job.summary.append("counterexample trace: %s/engine_%d/trace.vcd" % (job.workdir, engine_idx))
+ elif mode in ["prove_basecase", "prove_induction"]:
+ job.log("engine_%d: Status returned by engine for %s: %s" % (engine_idx, mode.split("_")[1], task_status))
+ job.summary.append("engine_%d (%s) returned %s for %s" % (engine_idx, " ".join(engine), task_status, mode.split("_")[1]))
- job.terminate()
+ if mode == "prove_basecase":
+ for task in job.basecase_tasks:
+ task.terminate()
+
+ if task_status == "PASS":
+ job.basecase_pass = True
+
+ else:
+ job.status = task_status
+ job.summary.append("counterexample trace: %s/engine_%d/trace.vcd" % (job.workdir, engine_idx))
+ job.terminate()
+
+ elif mode == "prove_induction":
+ for task in job.induction_tasks:
+ task.terminate()
+
+ if task_status == "PASS":
+ job.induction_pass = True
+
+ else:
+ assert False
+
+ if job.basecase_pass and job.induction_pass:
+ job.status = "PASS"
+ job.summary.append("successful proof by k-induction.")
+ job.terminate()
+
+ else:
+ assert False
task.output_callback = output_callback
task.exit_callback = exit_callback