inline static bool is_itoip1_pattern (BtorNode * index, BtorNode * value) { bool res; BtorNode *inc; inc = btor_inc_exp (BTOR_REAL_ADDR_NODE (index)->btor, index); res = inc == value; btor_release_exp (BTOR_REAL_ADDR_NODE (index)->btor, inc); return res; }
BtorNode * boolector_inc (Btor * btor, BtorNode * exp) { BTOR_ABORT_ARG_NULL_BOOLECTOR (btor); BTOR_ABORT_ARG_NULL_BOOLECTOR (exp); BTOR_ABORT_REFS_NOT_POS_BOOLECTOR (exp); exp = btor_pointer_chase_simplified_exp (btor, exp); BTOR_ABORT_ARRAY_BOOLECTOR (exp); btor->external_refs++; return btor_inc_exp (btor, exp); }
/* pattern: lower <= j <= upper && range_cond ? j + 1 : a[j] */ static inline BtorNode * create_pattern_itoip1 (Btor * btor, BtorNode * lower, BtorNode * upper, BtorNode * array, BtorBitVector * offset) { assert (lower); assert (upper); assert (BTOR_REAL_ADDR_NODE (lower)->kind == BTOR_REAL_ADDR_NODE (upper)->kind); assert (BTOR_IS_BV_CONST_NODE (BTOR_REAL_ADDR_NODE (lower)) || BTOR_IS_ADD_NODE (BTOR_REAL_ADDR_NODE (lower))); assert (BTOR_REAL_ADDR_NODE (lower)->sort_id == BTOR_REAL_ADDR_NODE (upper)->sort_id); assert (btor_get_codomain_fun_sort ( &btor->sorts_unique_table, array->sort_id) == BTOR_REAL_ADDR_NODE (lower)->sort_id); assert (offset); BtorNode *res, *param, *ite, *read, *cond, *inc; param = btor_param_exp (btor, btor_get_exp_width (btor, lower), 0); read = btor_read_exp (btor, array, param); cond = create_range (btor, lower, upper, param, offset);; inc = btor_inc_exp (btor, param); ite = btor_cond_exp (btor, cond, inc, read); res = btor_lambda_exp (btor, param, ite); btor_release_exp (btor, param); btor_release_exp (btor, read); btor_release_exp (btor, cond); btor_release_exp (btor, inc); btor_release_exp (btor, ite); return res; }