tvt boolector_propt::l_get(literalt a) const { tvt result=tvt(false); std::string literal; BtorExp *boolector_literal; size_t found; if(a.is_true()) return tvt(true); else if(a.is_false()) return tvt(false); literal_cachet::const_iterator cache_result=literal_cache.find(a.var_no()); if(cache_result!=literal_cache.end()) boolector_literal = cache_result->second; else return tvt(tvt::TV_UNKNOWN); literal = boolector_bv_assignment(boolector_ctx, boolector_literal); found=literal.find("1"); if (found!=std::string::npos) result=tvt(true); else result=tvt(false); if (a.sign()) result=!result; return result; }
const bool V3SvrBoolector::getDataValue(const size_t& exp) const { assert (!isNegFormula(exp)); char* const btor_value = boolector_bv_assignment(_Solver, getOriExp(exp)); assert (btor_value); assert (1 == strlen(btor_value)); const bool ret_value = ('1' == btor_value[0]); boolector_free_bv_assignment(_Solver, btor_value); return ret_value; }
// Retrieval Functions const V3BitVecX V3SvrBoolector::getDataValue(const V3NetId& id, const uint32_t& depth) const { BtorExp* const exp = getVerifyData(id, depth); if (!exp) return 0; const uint32_t width = _ntk->getNetWidth(id); assert (width); char* const btor_value = boolector_bv_assignment(_Solver, exp); assert (btor_value); assert (width == strlen(btor_value)); V3BitVecX value(width); for (uint32_t i = 0, j = width - 1; i < width; ++i, --j) { if ('1' == btor_value[j]) value.set1(i); else if ('0' == btor_value[j]) value.set0(i); } boolector_free_bv_assignment(_Solver, btor_value); return value; }
int main (void) { Btor *btor; BtorNode *v1, *v2, *add, *zero, *vars_sgt_zero, *impl; BtorNode *v1_sgt_zero, *v2_sgt_zero, *add_sgt_zero, *formula; char *assignments[10]; int result, i; btor = boolector_new (); boolector_enable_model_gen (btor); v1 = boolector_var (btor, BV2_EXAMPLE_NUM_BITS, NULL); v2 = boolector_var (btor, BV2_EXAMPLE_NUM_BITS, NULL); zero = boolector_zero (btor, BV2_EXAMPLE_NUM_BITS); v1_sgt_zero = boolector_sgt (btor, v1, zero); v2_sgt_zero = boolector_sgt (btor, v2, zero); vars_sgt_zero = boolector_and (btor, v1_sgt_zero, v2_sgt_zero); add = boolector_add (btor, v1, v2); add_sgt_zero = boolector_sgt (btor, add, zero); impl = boolector_implies (btor, vars_sgt_zero, add_sgt_zero); /* We negate the formula and try to show that the negation is unsatisfiable */ formula = boolector_not (btor, impl); /* We assert the formula and call Boolector */ boolector_assert (btor, formula); result = boolector_sat (btor); if (result == BOOLECTOR_SAT) printf ("Instance is satisfiable"); else abort (); /* The formula is not valid, we have found a counter-example. * Now, we are able to obtain assignments to arbitrary expressions */ i = 0; assignments[i++] = boolector_bv_assignment (btor, zero); assignments[i++] = boolector_bv_assignment (btor, v1); assignments[i++] = boolector_bv_assignment (btor, v2); assignments[i++] = boolector_bv_assignment (btor, add); assignments[i++] = boolector_bv_assignment (btor, v1_sgt_zero); assignments[i++] = boolector_bv_assignment (btor, v2_sgt_zero); assignments[i++] = boolector_bv_assignment (btor, vars_sgt_zero); assignments[i++] = boolector_bv_assignment (btor, add_sgt_zero); assignments[i++] = boolector_bv_assignment (btor, impl); assignments[i++] = boolector_bv_assignment (btor, formula); i = 0; printf ("Assignment to 0: %s\n", assignments[i++]); printf ("Assignment to v1: %s\n", assignments[i++]); printf ("Assignment to v2: %s\n", assignments[i++]); printf ("Assignment to v1 + v2: %s\n", assignments[i++]); printf ("Assignment to v1 > 0: %s\n", assignments[i++]); printf ("Assignment to v2 > 0: %s\n", assignments[i++]); printf ("Assignment to v1 > 0 & v2 > 0: %s\n", assignments[i++]); printf ("Assignment to v1 + v2 > 0: %s\n", assignments[i++]); printf ("Assignment to v1 > 0 & v2 > 0 => v1 + v2 > 0: %s\n", assignments[i++]); printf ("Assignment to !(v1 > 0 & v2 > 0 => v1 + v2 > 0): %s\n", assignments[i++]); for (i = 0; i < 10; i++) boolector_free_bv_assignment (btor, assignments[i]); /* cleanup */ boolector_release (btor, zero); boolector_release (btor, v1); boolector_release (btor, v2); boolector_release (btor, add); boolector_release (btor, impl); boolector_release (btor, formula); boolector_release (btor, v1_sgt_zero); boolector_release (btor, v2_sgt_zero); boolector_release (btor, vars_sgt_zero); boolector_release (btor, add_sgt_zero); assert (boolector_get_refs (btor) == 0); boolector_delete (btor); return 0; }