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; }
/* 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; }
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; }
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); }