smt_pop() break if append_steps > 0: for i in range(step+1, step+1+append_steps): print_msg("Appending additional step %d." % i) smt_state(i) smt_assert_antecedent("(not (|%s_is| s%d))" % (topmod, i)) smt_assert_consequent("(|%s_u| s%d)" % (topmod, i)) smt_assert_antecedent("(|%s_h| s%d)" % (topmod, i)) smt_assert_antecedent("(|%s_t| s%d s%d)" % (topmod, i-1, i)) smt_assert_consequent(get_constr_expr(constr_assumes, i)) print_msg("Re-solving with appended steps..") assert smt_check_sat() == "sat" reached_covers = smt.bv2bin(smt.get("(covers_%d s%d)" % (coveridx, step))) assert len(reached_covers) == len(cover_desc) new_cover_mask = [] for i in range(len(reached_covers)): if reached_covers[i] == "0": new_cover_mask.append(cover_mask[i]) continue print_msg("Reached cover statement at %s in step %d." % (cover_desc[i], step)) new_cover_mask.append("0") cover_mask = "".join(new_cover_mask) for i in range(step+1+append_steps):
if append_steps > 0: for i in range(step + 1, step + 1 + append_steps): print_msg("Appending additional step %d." % i) smt.write("(declare-fun s%d () |%s_s|)" % (i, topmod)) smt.write("(assert (not (|%s_is| s%d)))" % (topmod, i)) smt.write("(assert (|%s_u| s%d))" % (topmod, i)) smt.write("(assert (|%s_h| s%d))" % (topmod, i)) smt.write("(assert (|%s_t| s%d s%d))" % (topmod, i - 1, i)) smt.write("(assert %s)" % get_constr_expr(constr_assumes, i)) print_msg("Re-solving with appended steps..") assert smt.check_sat() == "sat" reached_covers = smt.bv2bin( smt.get("(covers_%d s%d)" % (coveridx, step))) assert len(reached_covers) == len(cover_desc) new_cover_mask = [] for i in range(len(reached_covers)): if reached_covers[i] == "0": new_cover_mask.append(cover_mask[i]) continue print_msg("Reached cover statement at %s in step %d." % (cover_desc[i], step)) new_cover_mask.append("0") cover_mask = "".join(new_cover_mask)
smt.write("(assert (|%s_is| s0))" % (topmod)) else: smt.write("(assert (|%s_t| s%d s%d))" % (topmod, step-1, step)) smt.write("(assert (not (|%s_is| s%d)))" % (topmod, step)) while "1" in cover_mask: print_msg("Checking cover reachability in step %d.." % (step)) smt.write("(push 1)") smt.write("(assert (distinct (covers_%d s%d) #b%s))" % (coveridx, step, "0" * len(cover_desc))) if smt.check_sat() == "unsat": smt.write("(pop 1)") break reached_covers = smt.bv2bin(smt.get("(covers_%d s%d)" % (coveridx, step))) assert len(reached_covers) == len(cover_desc) new_cover_mask = [] for i in range(len(reached_covers)): if reached_covers[i] == "0": new_cover_mask.append(cover_mask[i]) continue print_msg("Reached cover statement at %s in step %d." % (cover_desc[i], step)) new_cover_mask.append("0") cover_mask = "".join(new_cover_mask) for i in range(step+1):