1#ifndef _ESBMC_SOLVERS_SMT_ARRAY_SMT_CONV_H_
2#define _ESBMC_SOLVERS_SMT_ARRAY_SMT_CONV_H_
54 std::vector<smt_astt> _a)
94# define array_downcast(x) static_cast<const array_ast *>(x)
120 typedef boost::multi_index_container<
122 boost::multi_index::indexed_by<
123 boost::multi_index::hashed_unique<
125 boost::multi_index::ordered_non_unique<
126 BOOST_MULTI_INDEX_MEMBER(
index_map_rect,
unsigned int, ctx_level),
127 std::greater<unsigned int>>>>
135 const std::string &name,
147 unsigned long domain_width,
197 unsigned int arr1_id,
198 unsigned int arr2_id,
199 unsigned int arr1_update,
200 unsigned int arr2_update,
202 unsigned int start_pos = 0);
208 unsigned int start_point);
215 unsigned int start_point);
222 unsigned int start_point);
231 unsigned int start_point);
235 unsigned int base_array_id,
236 unsigned int array_update_no,
238 unsigned int start_point,
244 unsigned int start_point);
277 typedef boost::multi_index_container<
279 boost::multi_index::indexed_by<
280 boost::multi_index::hashed_unique<
282 boost::multi_index::ordered_non_unique<
283 BOOST_MULTI_INDEX_MEMBER(
idx_record,
unsigned int, ctx_level),
284 std::greater<unsigned int>>>>
309 typedef boost::multi_index_container<
311 boost::multi_index::indexed_by<
312 boost::multi_index::ordered_non_unique<
313 BOOST_MULTI_INDEX_MEMBER(
316 src_array_update_num),
317 std::greater<unsigned int>>,
318 boost::multi_index::ordered_non_unique<
319 BOOST_MULTI_INDEX_MEMBER(
array_selectt,
unsigned int, ctx_level),
320 std::greater<unsigned int>>>>
384 typedef boost::multi_index_container<
386 boost::multi_index::indexed_by<
387 boost::multi_index::ordered_unique<
388 BOOST_MULTI_INDEX_MEMBER(
array_witht,
unsigned int, update_level),
389 std::greater<unsigned int>>,
390 boost::multi_index::ordered_non_unique<
391 BOOST_MULTI_INDEX_MEMBER(
array_witht,
unsigned int, ctx_level),
392 std::greater<unsigned int>>>>
399 array_update_containert::nth_index<0>::type &updated_idx =
401 auto it = updated_idx.find(up);
402 assert(it != updated_idx.end());
416 typedef boost::multi_index_container<
418 boost::multi_index::indexed_by<
419 boost::multi_index::ordered_unique<
421 std::greater<unsigned int>>,
422 boost::multi_index::ordered_non_unique<
424 std::greater<unsigned int>>>>
445 typedef boost::multi_index_container<
447 boost::multi_index::indexed_by<
448 boost::multi_index::ordered_unique<
450 std::greater<unsigned int>>,
451 boost::multi_index::ordered_non_unique<
452 BOOST_MULTI_INDEX_MEMBER(
touched_arrayt,
unsigned int, ctx_level),
453 std::greater<unsigned int>>>>
static bool is_unbounded_array(const smt_sort *s)
Definition array_conv.h:25
static const array_ast * array_downcast(const smt_ast *x)
Definition array_conv.h:96
Definition array_conv.h:43
array_ast(array_convt *actx, smt_solver_baset *ctx, const smt_sort *_s)
Definition array_conv.h:45
smt_astt eq(smt_solver_baset *ctx, smt_astt other) const override
Abstractly produce an equality.
Definition array_conv.cpp:1398
array_ast(array_convt *actx, smt_solver_baset *ctx, const smt_sort *_s, std::vector< smt_astt > _a)
Definition array_conv.h:50
std::vector< smt_astt > array_fields
Definition array_conv.h:86
std::string symname
Definition array_conv.h:84
smt_astt ite(smt_solver_baset *ctx, smt_astt cond, smt_astt falseop) const override
Definition array_conv.cpp:1444
unsigned int array_update_num
Definition array_conv.h:88
void dump() const override
Definition array_conv.h:77
array_convt * array_ctx
Definition array_conv.h:90
smt_astt select(smt_solver_baset *ctx, const expr2tc &idx) const override
Select a value from an array, for both normal arrays and tuple arrays.
Definition array_conv.cpp:1429
smt_astt update(smt_solver_baset *ctx, smt_astt value, unsigned int idx, const expr2tc &idx_expr=expr2tc()) const override
Abstractly produce an "update", i.e., an array 'with' or tuple 'with'.
Definition array_conv.cpp:1416
smt_astt eq_fixedsize(smt_solver_baset *ctx, const array_ast *other) const
void assign(smt_solver_baset *ctx, smt_astt sym) const override
Abstractly produce an assign.
Definition array_conv.cpp:1410
unsigned int base_array_id
Definition array_conv.h:87
~array_ast() override=default
Definition array_conv.h:105
smt_astt encode_array_equality(const array_ast *a1, const array_ast *a2)
Definition array_conv.cpp:460
void collate_array_values(ast_vect &vals, unsigned int base_array_id, unsigned int array_update_no, const smt_sort *subtype, unsigned int start_point, smt_astt init_val=nullptr, const initial_readert *reader=nullptr)
Definition array_conv.cpp:1284
void execute_array_ite(ast_vect &dest, const ast_vect &true_vals, const ast_vect &false_vals, const index_map_containert &idx_map, smt_astt cond, unsigned int start_point)
Definition array_conv.cpp:1215
std::vector< ast_vect > array_update_vect
Definition array_conv.h:110
std::vector< idx_record_containert > array_indexes
Definition array_conv.h:286
void execute_array_trans(array_update_vect &data, unsigned int arr, unsigned int idx, const smt_sort *subtype, unsigned int start_point)
Definition array_conv.cpp:1105
smt_astt mk_bounded_array_equality(const array_ast *a1, const array_ast *a2)
Definition array_conv.cpp:495
void execute_array_joining_ite(ast_vect &dest, unsigned int cur_id, const array_ast *true_arr_ast, const array_ast *false_arr_ast, const index_map_containert &idx_map, smt_astt cond, smt_sortt subtype, unsigned int start_point)
Definition array_conv.cpp:1231
void add_array_equality(unsigned int arr1_id, unsigned int arr2_id, unsigned int arr1_update, unsigned int arr2_update, smt_astt &result, unsigned int start_pos=0)
Definition array_conv.cpp:1079
void set_initial_reader(smt_astt array, initial_readert reader)
Makes reader the source of array's initial value at each index it is accessed at, in place of a free ...
Definition array_conv.cpp:51
smt_solver_baset * ctx
Definition array_conv.h:467
smt_astt mk_select(const array_ast *array, const expr2tc &idx, const smt_sort *ressort)
Definition array_conv.cpp:147
struct array_select array_selectt
Definition array_conv.h:307
unsigned int new_array_id()
Definition array_conv.cpp:56
smt_solver_baset::ast_vec ast_vect
Definition array_conv.h:109
struct index_map_rec index_map_rect
Definition array_conv.h:118
struct touched_array touched_arrayt
Definition array_conv.h:443
std::multimap< unsigned int, struct array_equality > array_equalities
Definition array_conv.h:343
std::map< unsigned int, initial_readert > initial_readers
Definition array_conv.h:431
void push_array_ctx() override
Definition array_conv.cpp:567
std::function< smt_astt(const expr2tc &idx)> initial_readert
Gives the initial value of an array at an index, as a function of that index.
Definition array_conv.h:151
struct array_of_val_rec array_of_val_rect
Definition array_conv.h:414
void add_new_indexes()
Definition array_conv.cpp:794
std::vector< smt_sortt > array_subtypes
Definition array_conv.h:289
void pop_array_ctx() override
Definition array_conv.cpp:596
std::vector< std::vector< std::vector< smt_astt > > > array_valuation
Definition array_conv.h:465
void apply_new_selects()
Definition array_conv.cpp:960
boost::multi_index_container< array_selectt, boost::multi_index::indexed_by< boost::multi_index::ordered_non_unique< BOOST_MULTI_INDEX_MEMBER(array_selectt, unsigned int, src_array_update_num), std::greater< unsigned int > >, boost::multi_index::ordered_non_unique< BOOST_MULTI_INDEX_MEMBER(array_selectt, unsigned int, ctx_level), std::greater< unsigned int > > > > array_select_containert
Definition array_conv.h:321
array_convt(smt_solver_baset *_ctx)
Definition array_conv.cpp:23
boost::multi_index_container< touched_arrayt, boost::multi_index::indexed_by< boost::multi_index::ordered_unique< BOOST_MULTI_INDEX_MEMBER(touched_arrayt, unsigned int, array_id), std::greater< unsigned int > >, boost::multi_index::ordered_non_unique< BOOST_MULTI_INDEX_MEMBER(touched_arrayt, unsigned int, ctx_level), std::greater< unsigned int > > > > touched_array_sett
Definition array_conv.h:454
smt_astt mk_array_symbol(const std::string &name, const smt_sort *ms, smt_sortt subtype) override
Definition array_conv.cpp:99
array_ast * new_ast(smt_sortt _s, const std::vector< smt_astt > &_a)
Definition array_conv.h:254
expr2tc get_array_elem(smt_astt a, uint64_t index, const type2tc &subtype) override
Extract an element from the model of an array, at an explicit index.
Definition array_conv.cpp:509
void execute_array_update(ast_vect &dest_data, ast_vect &src_data, const index_map_containert &idx_map, const expr2tc &idx, smt_astt val, unsigned int start_point)
Definition array_conv.cpp:1173
void join_array_indexes()
Definition array_conv.cpp:678
const array_with & get_array_update(unsigned int id, unsigned int up)
Definition array_conv.h:397
void convert_array_assign(const array_ast *src, smt_astt sym)
Definition array_conv.cpp:28
boost::multi_index_container< array_witht, boost::multi_index::indexed_by< boost::multi_index::ordered_unique< BOOST_MULTI_INDEX_MEMBER(array_witht, unsigned int, update_level), std::greater< unsigned int > >, boost::multi_index::ordered_non_unique< BOOST_MULTI_INDEX_MEMBER(array_witht, unsigned int, ctx_level), std::greater< unsigned int > > > > array_update_containert
Definition array_conv.h:393
virtual smt_astt convert_array_of_wsort(smt_astt init_val, unsigned long domain_width, smt_sortt arr_sort)
Definition array_conv.cpp:427
void add_initial_ackerman_constraints(const ast_vect &vals, const index_map_containert &idx_map, unsigned int start_point)
Definition array_conv.cpp:1368
struct array_with array_witht
Definition array_conv.h:382
boost::multi_index_container< idx_record, boost::multi_index::indexed_by< boost::multi_index::hashed_unique< BOOST_MULTI_INDEX_MEMBER(idx_record, expr2tc, idx)>, boost::multi_index::ordered_non_unique< BOOST_MULTI_INDEX_MEMBER(idx_record, unsigned int, ctx_level), std::greater< unsigned int > > > > idx_record_containert
Definition array_conv.h:285
void add_array_constraints_for_solving() override
Definition array_conv.cpp:558
array_of_val_containert array_of_vals
Definition array_conv.h:427
virtual smt_astt mk_store(const array_ast *array, const expr2tc &idx, smt_astt value, const smt_sort *ressort)
Definition array_conv.cpp:191
smt_astt mk_unbounded_store(const array_ast *array, const expr2tc &idx, smt_astt value, const smt_sort *ressort)
Definition array_conv.cpp:307
std::vector< touched_array_sett > array_relations
Definition array_conv.h:455
std::vector< array_update_containert > array_updates
Definition array_conv.h:395
std::vector< unsigned int > num_arrays_history
Definition array_conv.h:459
boost::multi_index_container< array_of_val_rect, boost::multi_index::indexed_by< boost::multi_index::ordered_unique< BOOST_MULTI_INDEX_MEMBER(array_of_val_rect, unsigned int, array_id), std::greater< unsigned int > >, boost::multi_index::ordered_non_unique< BOOST_MULTI_INDEX_MEMBER(array_of_val_rect, unsigned int, ctx_level), std::greater< unsigned int > > > > array_of_val_containert
Definition array_conv.h:425
std::vector< index_map_containert > expr_index_map
Definition array_conv.h:435
void execute_new_updates()
Definition array_conv.cpp:920
void add_array_equalities()
Definition array_conv.cpp:1016
boost::multi_index_container< index_map_rect, boost::multi_index::indexed_by< boost::multi_index::hashed_unique< BOOST_MULTI_INDEX_MEMBER(index_map_rect, expr2tc, idx)>, boost::multi_index::ordered_non_unique< BOOST_MULTI_INDEX_MEMBER(index_map_rect, unsigned int, ctx_level), std::greater< unsigned int > > > > index_map_containert
Definition array_conv.h:128
std::vector< array_select_containert > array_selects
Definition array_conv.h:323
smt_astt mk_unbounded_select(const array_ast *array, const expr2tc &idx, const smt_sort *ressort)
Definition array_conv.cpp:238
smt_astt convert_array_of(smt_astt init_val, unsigned long domain_width) override
Create an array with a single initializer.
Definition array_conv.cpp:417
smt_astt array_ite(smt_astt cond, const array_ast *true_arr, const array_ast *false_arr, const smt_sort *thesort)
Definition array_conv.cpp:350
smt_astt unbounded_array_ite(smt_astt cond, const array_ast *true_arr, const array_ast *false_arr, const smt_sort *thesort)
Definition array_conv.cpp:377
array_ast * new_ast(smt_sortt _s)
Definition array_conv.h:249
array_iface(bool _b, bool inf)
Definition smt_array.h:14
smt_ast(smt_solver_baset *ctx, smt_sortt s)
Definition smt_solver.h:1270
The base SMT-conversion class/interface.
Definition smt_solver.h:170
std::vector< smt_astt > ast_vec
Shorthand for a vector of smt_ast's.
Definition smt_solver.h:173
smt_sort_kind id
Identifies what /kind/ of sort this is.
Definition smt_sort.h:45
size_t get_domain_width() const
Definition smt_sort.h:102
@ other
Definition converter_compare.cpp:887
pthread_cond_t cond
Definition cuda.h:50
Classes and definitions for non-stringy internal representation.
irep_container< type2t > type2tc
Definition irep2.h:430
irep_container< expr2t > expr2tc
Definition irep2.h:431
#define log_status(fmt,...)
Definition message.h:101
Definition exception.cpp:51
const smt_ast * smt_astt
Definition smt_ast.h:30
@ SMT_SORT_ARRAY
Definition smt_sort.h:16
const smt_sort * smt_sortt
Definition smt_sort.h:37
Definition array_conv.h:331
unsigned int arr2_update_num
Definition array_conv.h:336
unsigned int arr1_update_num
Definition array_conv.h:335
unsigned int arr2_id
Definition array_conv.h:333
smt_astt result
Definition array_conv.h:340
unsigned int arr1_id
Definition array_conv.h:332
Definition array_conv.h:409
unsigned int ctx_level
Definition array_conv.h:412
unsigned int array_id
Definition array_conv.h:410
smt_astt value
Definition array_conv.h:411
Definition array_conv.h:298
smt_astt val
Definition array_conv.h:303
expr2tc idx
Definition array_conv.h:300
unsigned int ctx_level
Definition array_conv.h:304
unsigned int src_array_update_num
Definition array_conv.h:299
bool converted
Definition array_conv.h:305
Definition array_conv.h:354
struct array_convt::array_with::@017320307153136216104165235177111160353160243144::@100371026242251016257344126230227031052023010307 w
unsigned int src_array_update_num
Definition array_conv.h:361
unsigned int update_level
Definition array_conv.h:379
const array_ast * false_arr_ast
Definition array_conv.h:371
smt_astt cond
Definition array_conv.h:372
expr2tc idx
Definition array_conv.h:356
unsigned int src_array_update_false
Definition array_conv.h:369
struct array_convt::array_with::@017320307153136216104165235177111160353160243144::@342350232320053232021342242131054212300326212157 i
union array_convt::array_with::@017320307153136216104165235177111160353160243144 u
bool is_ite
Definition array_conv.h:355
bool converted
Definition array_conv.h:380
smt_astt val
Definition array_conv.h:362
const array_ast * true_arr_ast
Definition array_conv.h:370
unsigned int ctx_level
Definition array_conv.h:378
unsigned int src_array_id_false
Definition array_conv.h:368
unsigned int src_array_id_true
Definition array_conv.h:366
unsigned int src_array_update_true
Definition array_conv.h:367
Definition array_conv.h:272
expr2tc idx
Definition array_conv.h:273
unsigned int ctx_level
Definition array_conv.h:274
Definition array_conv.h:113
unsigned int ctx_level
Definition array_conv.h:116
expr2tc idx
Definition array_conv.h:114
unsigned int vec_idx
Definition array_conv.h:115
Definition array_conv.h:439
unsigned int ctx_level
Definition array_conv.h:441
unsigned int array_id
Definition array_conv.h:440