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;
}
Example #2
0
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;
}