mirror of https://github.com/YosysHQ/yosys.git
Add yosys-smtbmc support for btor witness
Signed-off-by: Clifford Wolf <clifford@clifford.at>
This commit is contained in:
parent
47a5dfdaa4
commit
0b9bb852c6
|
@ -32,8 +32,7 @@ cexfile = None
|
||||||
aimfile = None
|
aimfile = None
|
||||||
aiwfile = None
|
aiwfile = None
|
||||||
aigheader = True
|
aigheader = True
|
||||||
btorfile = None
|
btorwitfile = None
|
||||||
witfile = None
|
|
||||||
vlogtbfile = None
|
vlogtbfile = None
|
||||||
vlogtbtop = None
|
vlogtbtop = None
|
||||||
inconstr = list()
|
inconstr = list()
|
||||||
|
@ -94,9 +93,8 @@ yosys-smtbmc [options] <yosys_smt2_output>
|
||||||
the AIGER witness file does not include the status and
|
the AIGER witness file does not include the status and
|
||||||
properties lines.
|
properties lines.
|
||||||
|
|
||||||
--btorwit <prefix>
|
--btorwit <btor_witness_filename>
|
||||||
--btorwit <btor_filename>:<witness_filename>
|
read a BTOR witness.
|
||||||
read a BTOR file and a BTOR witness for that BTOR file.
|
|
||||||
|
|
||||||
--noinfo
|
--noinfo
|
||||||
only run the core proof, do not collect and print any
|
only run the core proof, do not collect and print any
|
||||||
|
@ -196,11 +194,7 @@ for o, a in opts:
|
||||||
elif o == "--aig-noheader":
|
elif o == "--aig-noheader":
|
||||||
aigheader = False
|
aigheader = False
|
||||||
elif o == "--btorwit":
|
elif o == "--btorwit":
|
||||||
if ":" in a:
|
btorwitfile = a
|
||||||
btorfile, witfile = a.split(":")
|
|
||||||
else:
|
|
||||||
btorfile = a + ".btor"
|
|
||||||
witfile = a + ".wit"
|
|
||||||
elif o == "--dump-vcd":
|
elif o == "--dump-vcd":
|
||||||
vcdfile = a
|
vcdfile = a
|
||||||
elif o == "--dump-vlogtb":
|
elif o == "--dump-vlogtb":
|
||||||
|
@ -587,11 +581,102 @@ if aimfile is not None:
|
||||||
num_steps = max(num_steps, step+1)
|
num_steps = max(num_steps, step+1)
|
||||||
step += 1
|
step += 1
|
||||||
|
|
||||||
if btorfile is not None:
|
if btorwitfile is not None:
|
||||||
print("The --btorwit feature is not implemented yet")
|
with open(btorwitfile, "r") as f:
|
||||||
smt.write("(exit)")
|
step = None
|
||||||
smt.wait()
|
suffix = None
|
||||||
sys.exit(1)
|
altsuffix = None
|
||||||
|
header_okay = False
|
||||||
|
|
||||||
|
for line in f:
|
||||||
|
line = line.strip()
|
||||||
|
|
||||||
|
if line == "sat":
|
||||||
|
header_okay = True
|
||||||
|
continue
|
||||||
|
|
||||||
|
if not header_okay:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if line == "" or line[0] == "b" or line[0] == "j":
|
||||||
|
continue
|
||||||
|
|
||||||
|
if line == ".":
|
||||||
|
break
|
||||||
|
|
||||||
|
if line[0] == '#' or line[0] == '@':
|
||||||
|
step = int(line[1:])
|
||||||
|
suffix = line
|
||||||
|
altsuffix = suffix
|
||||||
|
if suffix[0] == "@":
|
||||||
|
altsuffix = "#" + suffix[1:]
|
||||||
|
else:
|
||||||
|
altsuffix = "@" + suffix[1:]
|
||||||
|
continue
|
||||||
|
|
||||||
|
line = line.split()
|
||||||
|
|
||||||
|
if len(line) == 0:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if line[-1].endswith(suffix):
|
||||||
|
line[-1] = line[-1][0:len(line[-1]) - len(suffix)]
|
||||||
|
|
||||||
|
if line[-1].endswith(altsuffix):
|
||||||
|
line[-1] = line[-1][0:len(line[-1]) - len(altsuffix)]
|
||||||
|
|
||||||
|
if line[-1][0] == "$":
|
||||||
|
continue
|
||||||
|
|
||||||
|
# BV assignments
|
||||||
|
if len(line) == 3 and line[1][0] != "[":
|
||||||
|
value = line[1]
|
||||||
|
name = line[2]
|
||||||
|
|
||||||
|
path = smt.get_path(topmod, name)
|
||||||
|
|
||||||
|
if not smt.net_exists(topmod, path):
|
||||||
|
continue
|
||||||
|
|
||||||
|
width = smt.net_width(topmod, path)
|
||||||
|
|
||||||
|
if width == 1:
|
||||||
|
assert value in ["0", "1"]
|
||||||
|
value = "true" if value == "1" else "false"
|
||||||
|
else:
|
||||||
|
value = "#b" + value
|
||||||
|
|
||||||
|
smtexpr = "(= [%s] %s)" % (name, value)
|
||||||
|
constr_assumes[step].append((btorwitfile, smtexpr))
|
||||||
|
|
||||||
|
# Array assignments
|
||||||
|
if len(line) == 4 and line[1][0] == "[":
|
||||||
|
index = line[1]
|
||||||
|
value = line[2]
|
||||||
|
name = line[3]
|
||||||
|
|
||||||
|
path = smt.get_path(topmod, name)
|
||||||
|
|
||||||
|
if not smt.mem_exists(topmod, path):
|
||||||
|
continue
|
||||||
|
|
||||||
|
meminfo = smt.mem_info(topmod, path)
|
||||||
|
|
||||||
|
if meminfo[1] == 1:
|
||||||
|
assert value in ["0", "1"]
|
||||||
|
value = "true" if value == "1" else "false"
|
||||||
|
else:
|
||||||
|
value = "#b" + value
|
||||||
|
|
||||||
|
assert index[0] == "["
|
||||||
|
assert index[-1] == "]"
|
||||||
|
index = "#b" + index[1:-1]
|
||||||
|
|
||||||
|
smtexpr = "(= (select [%s] %s) %s)" % (name, index, value)
|
||||||
|
constr_assumes[step].append((btorwitfile, smtexpr))
|
||||||
|
|
||||||
|
skip_steps = step
|
||||||
|
num_steps = step+1
|
||||||
|
|
||||||
def write_vcd_trace(steps_start, steps_stop, index):
|
def write_vcd_trace(steps_start, steps_stop, index):
|
||||||
filename = vcdfile.replace("%", index)
|
filename = vcdfile.replace("%", index)
|
||||||
|
|
Loading…
Reference in New Issue