Esempio n. 1
0
static BtorNode *
parse_read (BtorBTORParser * parser, int len)
{
  BtorNode *array, *idx, *res;
  int idxlen;

  if (parse_space (parser))
    return 0;

  if (!(array = parse_array_exp (parser, len)))
    return 0;

  if (parse_space (parser))
    {
RELEASE_ARRAY_AND_RETURN_ERROR:
      btor_release_exp (parser->btor, array);
      return 0;
    }

  idxlen = btor_get_index_exp_len (parser->btor, array);
  if (!(idx = parse_exp (parser, idxlen, 0)))
    goto RELEASE_ARRAY_AND_RETURN_ERROR;

  res = btor_read_exp (parser->btor, array, idx);
  btor_release_exp (parser->btor, idx);
  btor_release_exp (parser->btor, array);

  return res;
}
Esempio n. 2
0
/* pattern: lower <= j <= upper && range_cond ? j : a[j] */
static inline BtorNode *
create_pattern_itoi (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;

  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);;
  ite = btor_cond_exp (btor, cond, param, 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, ite);

  return res;
}
Esempio n. 3
0
static inline BtorNode *
create_pattern_cpy (Btor * btor,
                    BtorNode * lower,
                    BtorNode * upper,
                    BtorNode * src_array,
                    BtorNode * dst_array,
                    BtorNode * src_addr,
                    BtorNode * dst_addr,
                    BtorBitVector * offset)
{
  assert (!BTOR_IS_INVERTED_NODE (lower));
  assert (!BTOR_IS_INVERTED_NODE (upper));
  assert (BTOR_IS_ADD_NODE (lower));
  assert (BTOR_IS_ADD_NODE (upper));

  BtorNode *res, *param, *ite, *read, *cond, *read_src, *add, *sub;

  param = btor_param_exp (btor, btor_get_exp_width (btor, lower), 0);
  read = btor_read_exp (btor, dst_array, param);
  cond = create_range (btor, lower, upper, param, offset);

  sub = btor_sub_exp (btor, param, dst_addr);
  add = btor_add_exp (btor, src_addr, sub);
  read_src = btor_read_exp (btor, src_array, add);
  ite = btor_cond_exp (btor, cond, read_src, 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, sub);
  btor_release_exp (btor, add);
  btor_release_exp (btor, read_src);
  btor_release_exp (btor, ite);
  return res;
}
Esempio n. 4
0
BtorNode *
boolector_read (Btor * btor, BtorNode * e_array, BtorNode * e_index)
{
  BTOR_ABORT_ARG_NULL_BOOLECTOR (btor);
  BTOR_ABORT_ARG_NULL_BOOLECTOR (e_array);
  BTOR_ABORT_ARG_NULL_BOOLECTOR (e_index);
  BTOR_ABORT_REFS_NOT_POS_BOOLECTOR (e_array);
  BTOR_ABORT_REFS_NOT_POS_BOOLECTOR (e_index);
  e_array = btor_pointer_chase_simplified_exp (btor, e_array);
  e_index = btor_pointer_chase_simplified_exp (btor, e_index);
  BTOR_ABORT_BV_BOLECTOR (e_array);
  BTOR_ABORT_ARRAY_BOOLECTOR (e_index);
  BTOR_ABORT_BOOLECTOR (e_array->index_len != BTOR_REAL_ADDR_NODE (e_index)->len,
			"index bit-width of 'e_array' and bit-width of 'e_index' must not be unequal");
  btor->external_refs++;
  return btor_read_exp (btor, e_array, e_index);
}