mirror of
https://github.com/YosysHQ/sby.git
synced 2025-08-15 17:35:31 +00:00
Rename SbyJob to SbyTask and SbyTask to SbyProc to reduce confusion. Config file tasks now correspond to SbyTasks.
This commit is contained in:
parent
ac9001b22c
commit
7c9e5b026b
10 changed files with 360 additions and 360 deletions
|
@ -18,38 +18,38 @@
|
|||
|
||||
import re, os, getopt
|
||||
from types import SimpleNamespace
|
||||
from sby_core import SbyTask
|
||||
from sby_core import SbyProc
|
||||
|
||||
def run(mode, job, engine_idx, engine):
|
||||
def run(mode, task, engine_idx, engine):
|
||||
random_seed = None
|
||||
|
||||
opts, solver_args = getopt.getopt(engine[1:], "", ["seed="])
|
||||
|
||||
if len(solver_args) == 0:
|
||||
job.error("Missing solver command.")
|
||||
task.error("Missing solver command.")
|
||||
|
||||
for o, a in opts:
|
||||
if o == "--seed":
|
||||
random_seed = a
|
||||
else:
|
||||
job.error("Unexpected BTOR engine options.")
|
||||
task.error("Unexpected BTOR engine options.")
|
||||
|
||||
if solver_args[0] == "btormc":
|
||||
solver_cmd = ""
|
||||
if random_seed:
|
||||
solver_cmd += f"BTORSEED={random_seed} "
|
||||
solver_cmd += job.exe_paths["btormc"] + f""" --stop-first {0 if mode == "cover" else 1} -v 1 -kmax {job.opt_depth - 1}"""
|
||||
if job.opt_skip is not None:
|
||||
solver_cmd += f" -kmin {job.opt_skip}"
|
||||
solver_cmd += task.exe_paths["btormc"] + f""" --stop-first {0 if mode == "cover" else 1} -v 1 -kmax {task.opt_depth - 1}"""
|
||||
if task.opt_skip is not None:
|
||||
solver_cmd += f" -kmin {task.opt_skip}"
|
||||
solver_cmd += " ".join([""] + solver_args[1:])
|
||||
|
||||
elif solver_args[0] == "pono":
|
||||
if random_seed:
|
||||
job.error("Setting the random seed is not available for the pono solver.")
|
||||
solver_cmd = job.exe_paths["pono"] + f" -v 1 -e bmc -k {job.opt_depth - 1}"
|
||||
task.error("Setting the random seed is not available for the pono solver.")
|
||||
solver_cmd = task.exe_paths["pono"] + f" -v 1 -e bmc -k {task.opt_depth - 1}"
|
||||
|
||||
else:
|
||||
job.error(f"Invalid solver command {solver_args[0]}.")
|
||||
task.error(f"Invalid solver command {solver_args[0]}.")
|
||||
|
||||
common_state = SimpleNamespace()
|
||||
common_state.solver_status = None
|
||||
|
@ -59,44 +59,44 @@ def run(mode, job, engine_idx, engine):
|
|||
common_state.assert_fail = False
|
||||
common_state.produced_traces = []
|
||||
common_state.print_traces_max = 5
|
||||
common_state.running_tasks = 0
|
||||
common_state.running_procs = 0
|
||||
|
||||
def print_traces_and_terminate():
|
||||
if mode == "cover":
|
||||
if common_state.assert_fail:
|
||||
task_status = "FAIL"
|
||||
proc_status = "FAIL"
|
||||
elif common_state.expected_cex == 0:
|
||||
task_status = "pass"
|
||||
proc_status = "pass"
|
||||
elif common_state.solver_status == "sat":
|
||||
task_status = "pass"
|
||||
proc_status = "pass"
|
||||
elif common_state.solver_status == "unsat":
|
||||
task_status = "FAIL"
|
||||
proc_status = "FAIL"
|
||||
else:
|
||||
job.error(f"engine_{engine_idx}: Engine terminated without status.")
|
||||
task.error(f"engine_{engine_idx}: Engine terminated without status.")
|
||||
else:
|
||||
if common_state.expected_cex == 0:
|
||||
task_status = "pass"
|
||||
proc_status = "pass"
|
||||
elif common_state.solver_status == "sat":
|
||||
task_status = "FAIL"
|
||||
proc_status = "FAIL"
|
||||
elif common_state.solver_status == "unsat":
|
||||
task_status = "pass"
|
||||
proc_status = "pass"
|
||||
else:
|
||||
job.error(f"engine_{engine_idx}: Engine terminated without status.")
|
||||
task.error(f"engine_{engine_idx}: Engine terminated without status.")
|
||||
|
||||
job.update_status(task_status.upper())
|
||||
job.log(f"engine_{engine_idx}: Status returned by engine: {task_status}")
|
||||
job.summary.append(f"""engine_{engine_idx} ({" ".join(engine)}) returned {task_status}""")
|
||||
task.update_status(proc_status.upper())
|
||||
task.log(f"engine_{engine_idx}: Status returned by engine: {proc_status}")
|
||||
task.summary.append(f"""engine_{engine_idx} ({" ".join(engine)}) returned {proc_status}""")
|
||||
|
||||
if len(common_state.produced_traces) == 0:
|
||||
job.log(f"""engine_{engine_idx}: Engine did not produce a{" counter" if mode != "cover" else "n "}example.""")
|
||||
task.log(f"""engine_{engine_idx}: Engine did not produce a{" counter" if mode != "cover" else "n "}example.""")
|
||||
elif len(common_state.produced_traces) <= common_state.print_traces_max:
|
||||
job.summary.extend(common_state.produced_traces)
|
||||
task.summary.extend(common_state.produced_traces)
|
||||
else:
|
||||
job.summary.extend(common_state.produced_traces[:common_state.print_traces_max])
|
||||
task.summary.extend(common_state.produced_traces[:common_state.print_traces_max])
|
||||
excess_traces = len(common_state.produced_traces) - common_state.print_traces_max
|
||||
job.summary.append(f"""and {excess_traces} further trace{"s" if excess_traces > 1 else ""}""")
|
||||
task.summary.append(f"""and {excess_traces} further trace{"s" if excess_traces > 1 else ""}""")
|
||||
|
||||
job.terminate()
|
||||
task.terminate()
|
||||
|
||||
if mode == "cover":
|
||||
def output_callback2(line):
|
||||
|
@ -112,12 +112,12 @@ def run(mode, job, engine_idx, engine):
|
|||
def exit_callback2(retcode):
|
||||
assert retcode == 0
|
||||
|
||||
vcdpath = f"{job.workdir}/engine_{engine_idx}/trace{suffix}.vcd"
|
||||
vcdpath = f"{task.workdir}/engine_{engine_idx}/trace{suffix}.vcd"
|
||||
if os.path.exists(vcdpath):
|
||||
common_state.produced_traces.append(f"""{"" if mode == "cover" else "counterexample "}trace: {vcdpath}""")
|
||||
|
||||
common_state.running_tasks -= 1
|
||||
if (common_state.running_tasks == 0):
|
||||
common_state.running_procs -= 1
|
||||
if (common_state.running_procs == 0):
|
||||
print_traces_and_terminate()
|
||||
|
||||
return exit_callback2
|
||||
|
@ -131,16 +131,16 @@ def run(mode, job, engine_idx, engine):
|
|||
assert common_state.produced_cex == 0
|
||||
|
||||
else:
|
||||
job.error(f"engine_{engine_idx}: BTOR solver '{solver_args[0]}' is currently not supported in cover mode.")
|
||||
task.error(f"engine_{engine_idx}: BTOR solver '{solver_args[0]}' is currently not supported in cover mode.")
|
||||
|
||||
if (common_state.produced_cex < common_state.expected_cex) and line == "sat":
|
||||
assert common_state.wit_file == None
|
||||
if common_state.expected_cex == 1:
|
||||
common_state.wit_file = open(f"{job.workdir}/engine_{engine_idx}/trace.wit", "w")
|
||||
common_state.wit_file = open(f"{task.workdir}/engine_{engine_idx}/trace.wit", "w")
|
||||
else:
|
||||
common_state.wit_file = open(f"""{job.workdir}/engine_{engine_idx}/trace{common_state.produced_cex}.wit""", "w")
|
||||
common_state.wit_file = open(f"""{task.workdir}/engine_{engine_idx}/trace{common_state.produced_cex}.wit""", "w")
|
||||
if solver_args[0] != "btormc":
|
||||
task.log("Found satisfiability witness.")
|
||||
proc.log("Found satisfiability witness.")
|
||||
|
||||
if common_state.wit_file:
|
||||
print(line, file=common_state.wit_file)
|
||||
|
@ -149,17 +149,17 @@ def run(mode, job, engine_idx, engine):
|
|||
suffix = ""
|
||||
else:
|
||||
suffix = common_state.produced_cex
|
||||
task2 = SbyTask(
|
||||
job,
|
||||
proc2 = SbyProc(
|
||||
task,
|
||||
f"engine_{engine_idx}_{common_state.produced_cex}",
|
||||
job.model("btor"),
|
||||
"cd {dir} ; btorsim -c --vcd engine_{idx}/trace{i}.vcd --hierarchical-symbols --info model/design_btor.info model/design_btor.btor engine_{idx}/trace{i}.wit".format(dir=job.workdir, idx=engine_idx, i=suffix),
|
||||
logfile=open(f"{job.workdir}/engine_{engine_idx}/logfile2.txt", "w")
|
||||
task.model("btor"),
|
||||
"cd {dir} ; btorsim -c --vcd engine_{idx}/trace{i}.vcd --hierarchical-symbols --info model/design_btor.info model/design_btor.btor engine_{idx}/trace{i}.wit".format(dir=task.workdir, idx=engine_idx, i=suffix),
|
||||
logfile=open(f"{task.workdir}/engine_{engine_idx}/logfile2.txt", "w")
|
||||
)
|
||||
task2.output_callback = output_callback2
|
||||
task2.exit_callback = make_exit_callback(suffix)
|
||||
task2.checkretcode = True
|
||||
common_state.running_tasks += 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.wit_file.close()
|
||||
|
@ -188,7 +188,7 @@ def run(mode, job, engine_idx, engine):
|
|||
if line not in ["b0"]:
|
||||
return line
|
||||
|
||||
print(line, file=task.logfile)
|
||||
print(line, file=proc.logfile)
|
||||
|
||||
return None
|
||||
|
||||
|
@ -202,24 +202,24 @@ def run(mode, job, engine_idx, engine):
|
|||
|
||||
if common_state.solver_status == "unsat":
|
||||
if common_state.expected_cex == 1:
|
||||
with open(f"""{job.workdir}/engine_{engine_idx}/trace.wit""", "w") as wit_file:
|
||||
with open(f"""{task.workdir}/engine_{engine_idx}/trace.wit""", "w") as wit_file:
|
||||
print("unsat", file=wit_file)
|
||||
else:
|
||||
for i in range(common_state.produced_cex, common_state.expected_cex):
|
||||
with open(f"{job.workdir}/engine_{engine_idx}/trace{i}.wit", "w") as wit_file:
|
||||
with open(f"{task.workdir}/engine_{engine_idx}/trace{i}.wit", "w") as wit_file:
|
||||
print("unsat", file=wit_file)
|
||||
|
||||
common_state.running_tasks -= 1
|
||||
if (common_state.running_tasks == 0):
|
||||
common_state.running_procs -= 1
|
||||
if (common_state.running_procs == 0):
|
||||
print_traces_and_terminate()
|
||||
|
||||
task = SbyTask(
|
||||
job,
|
||||
f"engine_{engine_idx}", job.model("btor"),
|
||||
f"cd {job.workdir}; {solver_cmd} model/design_btor.btor",
|
||||
logfile=open(f"{job.workdir}/engine_{engine_idx}/logfile.txt", "w")
|
||||
proc = SbyProc(
|
||||
task,
|
||||
f"engine_{engine_idx}", task.model("btor"),
|
||||
f"cd {task.workdir}; {solver_cmd} model/design_btor.btor",
|
||||
logfile=open(f"{task.workdir}/engine_{engine_idx}/logfile.txt", "w")
|
||||
)
|
||||
|
||||
task.output_callback = output_callback
|
||||
task.exit_callback = exit_callback
|
||||
common_state.running_tasks += 1
|
||||
proc.output_callback = output_callback
|
||||
proc.exit_callback = exit_callback
|
||||
common_state.running_procs += 1
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue