ESBMC
Efficient SMT-based Context-Bounded Model Checker
Loading...
Searching...
No Matches
array_conv.h
Go to the documentation of this file.
1#ifndef _ESBMC_SOLVERS_SMT_ARRAY_SMT_CONV_H_
2#define _ESBMC_SOLVERS_SMT_ARRAY_SMT_CONV_H_
3
4// Something to abstract the flattening of arrays to QF_BV.
5
6// jmorse: this originally began it's life as a flatten-arrays-to-bitvectors
7// implementation, largely derived from the CBMC implementation, with some
8// adjustments. It then, however, became necessary for struct arrays, because
9// while we can work around structs not being available in SMT, we need this
10// kind of array implementation to handle arrays of arbitrary types.
11//
12// Even more complexity turns up with the "smt-during-symex" facility, in that
13// one must be able to perform a series of array operations and flush them into
14// the SMT solver in a way that is compatible with pushing/popping of
15// constraints.
16//
17// As a result, this particular class is due for some serious maintenance.
18
19#include <functional>
20#include <map>
21#include <set>
23#include <irep2/irep2.h>
24
25static inline bool is_unbounded_array(const smt_sort *s)
26{
27 if (s->id != SMT_SORT_ARRAY)
28 return false;
29
30 // This is either really large, or unbounded, thus leading to a
31 // config.ansi_c.int_width sized domain. Either way, not a normal one.
32 if (s->get_domain_width() > 10)
33 return true;
34
35 return false;
36}
37
38class array_convt;
39
40class array_ast;
41
42class array_ast : public smt_ast
43{
44public:
46 : smt_ast(ctx, _s), symname(""), array_ctx(actx)
47 {
48 }
49
51 array_convt *actx,
53 const smt_sort *_s,
54 std::vector<smt_astt> _a)
55 : smt_ast(ctx, _s),
56 symname(""),
57 array_fields(std::move(_a)),
58 array_ctx(actx)
59 {
60 }
61
62 ~array_ast() override = default;
63
64 smt_astt eq(smt_solver_baset *ctx, smt_astt other) const override;
66 ite(smt_solver_baset *ctx, smt_astt cond, smt_astt falseop) const override;
67 void assign(smt_solver_baset *ctx, smt_astt sym) const override;
71 unsigned int idx,
72 const expr2tc &idx_expr = expr2tc()) const override;
73 smt_astt select(smt_solver_baset *ctx, const expr2tc &idx) const override;
74
76
77 void dump() const override
78 {
79 log_status("name: {}", symname);
80 for (auto const &e : array_fields)
81 e->dump();
82 }
83
84 std::string symname; // Only if this was produced from mk_smt_symbol.
85
86 std::vector<smt_astt> array_fields;
87 unsigned int base_array_id;
88 unsigned int array_update_num;
89
91};
92
93#ifdef NDEBUG
94# define array_downcast(x) static_cast<const array_ast *>(x)
95#else
96static inline const array_ast *array_downcast(const smt_ast *x)
97{
98 const array_ast *a = dynamic_cast<const array_ast *>(x);
99 assert(a);
100 return a;
101}
102#endif
103
105{
106public:
107 struct array_select;
108 struct array_with;
110 typedef std::vector<ast_vect> array_update_vect;
111
113 {
115 unsigned int vec_idx;
116 unsigned int ctx_level;
117 };
119
120 typedef boost::multi_index_container<
122 boost::multi_index::indexed_by<
123 boost::multi_index::hashed_unique<
124 BOOST_MULTI_INDEX_MEMBER(index_map_rect, expr2tc, idx)>,
125 boost::multi_index::ordered_non_unique<
126 BOOST_MULTI_INDEX_MEMBER(index_map_rect, unsigned int, ctx_level),
127 std::greater<unsigned int>>>>
129
131 ~array_convt() = default;
132
133 // Public api
135 const std::string &name,
136 const smt_sort *ms,
137 smt_sortt subtype) override;
138 expr2tc
139 get_array_elem(smt_astt a, uint64_t index, const type2tc &subtype) override;
141 convert_array_of(smt_astt init_val, unsigned long domain_width) override;
142 void add_array_constraints_for_solving() override;
143
144 // Heavy lifters
146 smt_astt init_val,
147 unsigned long domain_width,
148 smt_sortt arr_sort);
151 typedef std::function<smt_astt(const expr2tc &idx)> initial_readert;
155 unsigned int new_array_id();
156 void convert_array_assign(const array_ast *src, smt_astt sym);
158 const array_ast *array,
159 const expr2tc &idx,
160 const smt_sort *ressort);
161 virtual smt_astt mk_store(
162 const array_ast *array,
163 const expr2tc &idx,
165 const smt_sort *ressort);
167
170 const array_ast *true_arr,
171 const array_ast *false_arr,
172 const smt_sort *thesort);
173
174 // Internal funk:
175
178 const array_ast *array,
179 const expr2tc &idx,
180 const smt_sort *ressort);
182 const array_ast *array,
183 const expr2tc &idx,
185 const smt_sort *ressort);
188 const array_ast *true_arr,
189 const array_ast *false_arr,
190 const smt_sort *thesort);
191
192 // Array constraint beating
193
194 void join_array_indexes();
197 unsigned int arr1_id,
198 unsigned int arr2_id,
199 unsigned int arr1_update,
200 unsigned int arr2_update,
201 smt_astt &result,
202 unsigned int start_pos = 0);
204 array_update_vect &data,
205 unsigned int arr,
206 unsigned int idx,
207 const smt_sort *subtype,
208 unsigned int start_point);
210 ast_vect &dest_data,
211 ast_vect &src_data,
212 const index_map_containert &idx_map,
213 const expr2tc &idx,
214 smt_astt val,
215 unsigned int start_point);
217 ast_vect &dest,
218 const ast_vect &true_vals,
219 const ast_vect &false_vals,
220 const index_map_containert &idx_map,
222 unsigned int start_point);
224 ast_vect &dest,
225 unsigned int cur_id,
226 const array_ast *true_arr_ast,
227 const array_ast *false_arr_ast,
228 const index_map_containert &idx_map,
230 smt_sortt subtype,
231 unsigned int start_point);
232
234 ast_vect &vals,
235 unsigned int base_array_id,
236 unsigned int array_update_no,
237 const smt_sort *subtype,
238 unsigned int start_point,
239 smt_astt init_val = nullptr,
240 const initial_readert *reader = nullptr);
242 const ast_vect &vals,
243 const index_map_containert &idx_map,
244 unsigned int start_point);
245 void add_new_indexes();
246 void execute_new_updates();
247 void apply_new_selects();
248
250 {
251 return new array_ast(this, ctx, _s);
252 }
253
254 inline array_ast *new_ast(smt_sortt _s, const std::vector<smt_astt> &_a)
255 {
256 return new array_ast(this, ctx, _s, _a);
257 }
258
259 void push_array_ctx() override;
260 void pop_array_ctx() override;
261
262 // Members
263
264 // Array tracking: each new root array (from fresh_array) gets its own
265 // ID number, which is stored. Then, whenever any operation occurs on it,
266 // we add the index to the set contained in the following object. This
267 // obtains all the tracking data required for CBMC-like array
268 // bitblasting.
269 // Various technical jiggery pokery occurs to scope these indexes.
270
272 {
274 unsigned int ctx_level;
275 };
276
277 typedef boost::multi_index_container<
279 boost::multi_index::indexed_by<
280 boost::multi_index::hashed_unique<
281 BOOST_MULTI_INDEX_MEMBER(idx_record, expr2tc, idx)>,
282 boost::multi_index::ordered_non_unique<
283 BOOST_MULTI_INDEX_MEMBER(idx_record, unsigned int, ctx_level),
284 std::greater<unsigned int>>>>
286 std::vector<idx_record_containert> array_indexes;
287
288 // Self explanatory. Contains bitwidth of subtypes
289 std::vector<smt_sortt> array_subtypes;
290
291 // Array /value/ tracking. For each array (outer vector), we have an inner
292 // vector, each element of which corresponds to each 'with' operation
293 // on an array. Within that is a list of indexes and free value'd
294 // elements: whenever we select an element from an array, we return a
295 // free value, and record it here. Assertions made later will link this
296 // up with real values.
298 {
301 // Mutable because this might be used as a vehicle to read from
302 // array_valuations
303 mutable smt_astt val;
304 unsigned int ctx_level;
305 mutable bool converted;
306 };
308
309 typedef boost::multi_index_container<
311 boost::multi_index::indexed_by<
312 boost::multi_index::ordered_non_unique<
313 BOOST_MULTI_INDEX_MEMBER(
315 unsigned int,
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>>>>
322
323 std::vector<array_select_containert> array_selects;
324
325 // Array equalities -- decomposed into selects when array constraints
326 // are encoded.
327 // Each vector element corresponds to an array, containing a list of
328 // equalities. Each equality has the current update number, the details
329 // of the other array, and the output ast.
331 {
332 unsigned int arr1_id;
333 unsigned int arr2_id;
334
335 unsigned int arr1_update_num;
336 unsigned int arr2_update_num;
337
338 // Mutable to allow the creation of an equality without a symbol, then
339 // reading that from this structure.
341 };
342
343 std::multimap<unsigned int, struct array_equality> array_equalities;
344
345 // Update records: For each array, for each 'with' operation, we record
346 // the index used and the AST representation of the value assigned. We
347 // also store the ID number of the source array, because due to phi's,
348 // we may branch arrays before joining.
349 // We also record ite's here, because they're effectively an array update.
350 // The is_ite boolean indicates whether the following union is a with or
351 // an ite repr. If it's an ite, the two integers represent which two
352 // historical update indexes of the array are operands of the ite.
354 {
355 bool is_ite;
357 union
358 {
359 struct
360 {
363 } w;
364 struct
365 {
366 unsigned int src_array_id_true;
368 unsigned int src_array_id_false;
370 const array_ast *true_arr_ast; // yolo
371 const array_ast *false_arr_ast; // yolo
373 } i;
374 // No construction site fills the whole union, and inserting into
375 // array_updates copies its object representation ([class.copy.ctor]/16),
376 // which would produce an indeterminate value ([basic.indet]/2).
377 } u{};
378 unsigned int ctx_level;
379 unsigned int update_level;
380 mutable bool converted;
381 };
382 typedef struct array_with array_witht;
383
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>>>>
394
395 std::vector<array_update_containert> array_updates;
396
397 inline const array_with &get_array_update(unsigned int id, unsigned int up)
398 {
399 array_update_containert::nth_index<0>::type &updated_idx =
400 array_updates[id].get<0>();
401 auto it = updated_idx.find(up);
402 assert(it != updated_idx.end());
403 return *it;
404 }
405
406 // Map between base array identifiers and the value to initialize it with.
407 // Only applicable to unbounded arrays.
409 {
410 unsigned int array_id;
412 unsigned int ctx_level;
413 };
415
416 typedef boost::multi_index_container<
418 boost::multi_index::indexed_by<
419 boost::multi_index::ordered_unique<
420 BOOST_MULTI_INDEX_MEMBER(array_of_val_rect, unsigned int, array_id),
421 std::greater<unsigned int>>,
422 boost::multi_index::ordered_non_unique<
423 BOOST_MULTI_INDEX_MEMBER(array_of_val_rect, unsigned int, ctx_level),
424 std::greater<unsigned int>>>>
426
428
429 // Map between base array identifiers and the readers that give their
430 // initial values, from set_initial_reader.
431 std::map<unsigned int, initial_readert> initial_readers;
432
433 // Index map, between index expressions, and where the value for that index
434 // actually sits in ast vectors.
435 std::vector<index_map_containert> expr_index_map;
436
437 // Storage of the sets of arrays that other arrays interact with.
439 {
440 unsigned int array_id;
441 unsigned int ctx_level;
442 };
444
445 typedef boost::multi_index_container<
447 boost::multi_index::indexed_by<
448 boost::multi_index::ordered_unique<
449 BOOST_MULTI_INDEX_MEMBER(touched_arrayt, unsigned int, array_id),
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>>>>
455 std::vector<touched_array_sett> array_relations;
456
457 // History of when different array IDs were allocated. For a change,
458 // indexed by the context level.
459 std::vector<unsigned int> num_arrays_history;
460
461 // Finally, for model building, we need all the past array values. Three
462 // vectors, dimensions are arrays id's, historical point, array element,
463 // respectively.
464 // In reverse, these correspond to ast_vect and array_update_vect
465 std::vector<std::vector<std::vector<smt_astt>>> array_valuation;
466
468};
469
470#endif /* _ESBMC_SOLVERS_SMT_ARRAY_SMT_CONV_H_ */
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
~array_convt()=default
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
Definition toml.hpp:6607
Definition smt_ast.h:33
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
Definition smt_sort.h:40
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
Definition toml.hpp:1531
@ 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