void boolector_free_array_assignment (Btor * btor, char **indices, char **values, int size) { int i; BTOR_ABORT_ARG_NULL_BOOLECTOR (btor); BTOR_ABORT_BOOLECTOR (size < 0, "negative size"); if (size) { BTOR_ABORT_ARG_NULL_BOOLECTOR (indices); BTOR_ABORT_ARG_NULL_BOOLECTOR (values); } else { BTOR_ABORT_BOOLECTOR (indices, "non zero 'indices' but 'size == 0'"); BTOR_ABORT_BOOLECTOR (values, "non zero 'values' but 'size == 0'"); } for (i = 0; i < size; i++) boolector_free_bv_assignment (btor, indices[i]); btor_free (btor->mm, indices, size * sizeof *indices); for (i = 0; i < size; i++) boolector_free_bv_assignment (btor, values[i]); btor_free (btor->mm, values, size * sizeof *values); }
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; }