cprover
Loading...
Searching...
No Matches
boolbv.cpp
Go to the documentation of this file.
1/*******************************************************************\
2
3Module:
4
5Author: Daniel Kroening, kroening@kroening.com
6
7\*******************************************************************/
8
9#include "boolbv.h"
10
11#include <algorithm>
12
13#include <util/arith_tools.h>
14#include <util/bitvector_expr.h>
16#include <util/byte_operators.h>
17#include <util/config.h>
18#include <util/floatbv_expr.h>
19#include <util/magic.h>
20#include <util/mp_arith.h>
21#include <util/replace_expr.h>
22#include <util/simplify_expr.h>
23#include <util/std_expr.h>
24#include <util/string2int.h>
26
28
30{
31 const bool little_endian =
33 return endianness_map(type, little_endian);
34}
35
39const bvt &
41{
42 // check cache first
43 std::pair<bv_cachet::iterator, bool> cache_result=
44 bv_cache.insert(std::make_pair(expr, bvt()));
45
46 // get a reference to the cache entry
47 auto &cache_entry = cache_result.first->second;
48
49 if(!cache_result.second)
50 {
51 // Found in cache
52 return cache_entry;
53 }
54
55 // Iterators into hash_maps do not remain valid when inserting
56 // more elements recursively. C++11 ยง23.2.5/13
57 // However, the _reference_ to the entry does!
58 cache_entry = convert_bitvector(expr);
59
61 !expected_width || cache_entry.size() == *expected_width,
62 "bitvector width shall match the indicated expected width",
65
66 // check
67 for(const auto &literal : cache_entry)
68 {
69 if(freeze_all && !literal.is_constant())
70 prop.set_frozen(literal);
71
73 literal.var_no() != literalt::unused_var_no(),
74 "variable number must be different from the unused variable number",
77 }
78
79 return cache_entry;
80}
81
85{
86 ignoring(expr);
87
88 // try to make it free bits
89 std::size_t width=boolbv_width(expr.type());
90 return prop.new_variables(width);
91}
92
99{
100 if(expr.type().id()==ID_bool)
101 return {convert(expr)};
102
103 if(expr.id()==ID_index)
104 return convert_index(to_index_expr(expr));
105 else if(expr.id()==ID_constraint_select_one)
107 else if(expr.id()==ID_member)
108 return convert_member(to_member_expr(expr));
109 else if(expr.id()==ID_with)
110 return convert_with(to_with_expr(expr));
111 else if(expr.id()==ID_update)
112 return convert_update(to_update_expr(expr));
113 else if(expr.id()==ID_case)
114 return convert_case(expr);
115 else if(expr.id()==ID_cond)
116 return convert_cond(to_cond_expr(expr));
117 else if(expr.id()==ID_if)
118 return convert_if(to_if_expr(expr));
119 else if(expr.id()==ID_constant)
121 else if(expr.id()==ID_typecast)
123 else if(expr.id()==ID_symbol)
124 return convert_symbol(to_symbol_expr(expr));
125 else if(expr.id()==ID_bv_literals)
126 return convert_bv_literals(expr);
127 else if(expr.id()==ID_plus || expr.id()==ID_minus ||
128 expr.id()=="no-overflow-plus" ||
129 expr.id()=="no-overflow-minus")
130 return convert_add_sub(expr);
131 else if(expr.id() == ID_mult)
132 return convert_mult(to_mult_expr(expr));
133 else if(expr.id()==ID_div)
134 return convert_div(to_div_expr(expr));
135 else if(expr.id()==ID_mod)
136 return convert_mod(to_mod_expr(expr));
137 else if(expr.id()==ID_shl || expr.id()==ID_ashr || expr.id()==ID_lshr ||
138 expr.id()==ID_rol || expr.id()==ID_ror)
139 return convert_shift(to_shift_expr(expr));
140 else if(
141 expr.id() == ID_floatbv_plus || expr.id() == ID_floatbv_minus ||
142 expr.id() == ID_floatbv_mult || expr.id() == ID_floatbv_div)
143 {
145 }
146 else if(expr.id() == ID_floatbv_mod)
148 else if(expr.id() == ID_floatbv_rem)
150 else if(expr.id()==ID_floatbv_typecast)
152 else if(expr.id()==ID_concatenation)
154 else if(expr.id()==ID_replication)
156 else if(expr.id()==ID_extractbits)
158 else if(expr.id()==ID_bitnot || expr.id()==ID_bitand ||
159 expr.id()==ID_bitor || expr.id()==ID_bitxor ||
160 expr.id()==ID_bitxnor || expr.id()==ID_bitnor ||
161 expr.id()==ID_bitnand)
162 return convert_bitwise(expr);
163 else if(expr.id() == ID_unary_minus)
165 else if(expr.id()==ID_unary_plus)
166 {
167 return convert_bitvector(to_unary_plus_expr(expr).op());
168 }
169 else if(expr.id()==ID_abs)
170 return convert_abs(to_abs_expr(expr));
171 else if(expr.id() == ID_bswap)
172 return convert_bswap(to_bswap_expr(expr));
173 else if(expr.id()==ID_byte_extract_little_endian ||
174 expr.id()==ID_byte_extract_big_endian)
176 else if(expr.id()==ID_byte_update_little_endian ||
177 expr.id()==ID_byte_update_big_endian)
179 else if(expr.id()==ID_nondet_symbol ||
180 expr.id()=="quant_symbol")
181 return convert_symbol(expr);
182 else if(expr.id()==ID_struct)
183 return convert_struct(to_struct_expr(expr));
184 else if(expr.id()==ID_union)
185 return convert_union(to_union_expr(expr));
186 else if(expr.id() == ID_empty_union)
188 else if(expr.id()==ID_string_constant)
189 return convert_bitvector(
191 else if(expr.id()==ID_array)
192 return convert_array(expr);
193 else if(expr.id()==ID_vector)
194 return convert_vector(to_vector_expr(expr));
195 else if(expr.id()==ID_complex)
196 return convert_complex(to_complex_expr(expr));
197 else if(expr.id()==ID_complex_real)
199 else if(expr.id()==ID_complex_imag)
201 else if(expr.id() == ID_array_comprehension)
203 else if(expr.id()==ID_array_of)
205 else if(expr.id()==ID_let)
206 return convert_let(to_let_expr(expr));
207 else if(expr.id()==ID_function_application)
210 else if(expr.id()==ID_reduction_or || expr.id()==ID_reduction_and ||
211 expr.id()==ID_reduction_nor || expr.id()==ID_reduction_nand ||
212 expr.id()==ID_reduction_xor || expr.id()==ID_reduction_xnor)
214 else if(expr.id()==ID_not)
215 return convert_not(to_not_expr(expr));
216 else if(expr.id()==ID_power)
217 return convert_power(to_binary_expr(expr));
218 else if(expr.id() == ID_popcount)
219 return convert_bv(simplify_expr(to_popcount_expr(expr).lower(), ns));
220 else if(expr.id() == ID_count_leading_zeros)
221 {
222 return convert_bv(
224 }
225 else if(expr.id() == ID_count_trailing_zeros)
226 {
227 return convert_bv(
229 }
230 else if(expr.id() == ID_bitreverse)
232
233 return conversion_failed(expr);
234}
235
237{
238 std::size_t width=boolbv_width(expr.type());
239
240 if(width==0)
241 return conversion_failed(expr);
242
243 const exprt &array_size = expr.type().size();
244
245 const auto size = numeric_cast<mp_integer>(array_size);
246
247 if(!size.has_value())
248 return conversion_failed(expr);
249
250 typet counter_type = expr.arg().type();
251
252 bvt bv;
253 bv.resize(width);
254
255 for(mp_integer i = 0; i < *size; ++i)
256 {
257 exprt counter=from_integer(i, counter_type);
258
259 exprt body = expr.body();
260 replace_expr(expr.arg(), counter, body);
261
262 const bvt &tmp = convert_bv(body);
263
264 INVARIANT(
265 *size * tmp.size() == width,
266 "total bitvector width shall equal the number of operands times the size "
267 "per operand");
268
269 std::size_t offset = numeric_cast_v<std::size_t>(i * tmp.size());
270
271 for(std::size_t j=0; j<tmp.size(); j++)
272 bv[offset+j]=tmp[j];
273 }
274
275 return bv;
276}
277
279{
280 std::size_t width=boolbv_width(expr.type());
281
282 if(width==0)
283 return conversion_failed(expr);
284
285 bvt bv;
286 bv.resize(width);
287
288 const irept::subt &bv_sub=expr.find(ID_bv).get_sub();
289
290 if(bv_sub.size()!=width)
291 throw "bv_literals with wrong size";
292
293 for(std::size_t i=0; i<width; i++)
294 bv[i].set(unsafe_string2unsigned(id2string(bv_sub[i].id())));
295
296 return bv;
297}
298
300{
301 const typet &type=expr.type();
302 std::size_t width=boolbv_width(type);
303
304 const irep_idt &identifier = expr.get(ID_identifier);
305 CHECK_RETURN(!identifier.empty());
306
307 bvt bv = map.get_literals(identifier, type, width);
308
310 std::all_of(
311 bv.begin(),
312 bv.end(),
313 [this](const literalt &l) {
314 return l.var_no() < prop.no_variables() || l.is_constant();
315 }),
316 "variable number of non-constant literals should be within bounds",
317 id2string(identifier));
318
319 return bv;
320}
321
322
324 const function_application_exprt &expr)
325{
326 // record
327 functions.record(expr);
328
329 // make it free bits
330 return prop.new_variables(boolbv_width(expr.type()));
331}
332
333
335{
336 PRECONDITION(expr.type().id() == ID_bool);
337
338 if(expr.id()==ID_typecast)
340 else if(expr.id()==ID_equal)
341 return convert_equality(to_equal_expr(expr));
342 else if(expr.id()==ID_verilog_case_equality ||
343 expr.id()==ID_verilog_case_inequality)
345 else if(expr.id()==ID_notequal)
346 {
347 const auto &notequal_expr = to_notequal_expr(expr);
348 return !convert_equality(
349 equal_exprt(notequal_expr.lhs(), notequal_expr.rhs()));
350 }
351 else if(expr.id()==ID_ieee_float_equal ||
352 expr.id()==ID_ieee_float_notequal)
353 {
355 }
356 else if(expr.id()==ID_le || expr.id()==ID_ge ||
357 expr.id()==ID_lt || expr.id()==ID_gt)
358 {
360 }
361 else if(expr.id()==ID_extractbit)
363 else if(expr.id()==ID_forall)
365 else if(expr.id()==ID_exists)
367 else if(expr.id()==ID_let)
368 {
369 bvt bv=convert_let(to_let_expr(expr));
370
371 DATA_INVARIANT(bv.size()==1,
372 "convert_let must return 1-bit vector for boolean let");
373
374 return bv[0];
375 }
376 else if(expr.id()==ID_index)
377 {
379 CHECK_RETURN(bv.size() == 1);
380 return bv[0];
381 }
382 else if(expr.id()==ID_member)
383 {
385 CHECK_RETURN(bv.size() == 1);
386 return bv[0];
387 }
388 else if(expr.id()==ID_case)
389 {
390 bvt bv=convert_case(expr);
391 CHECK_RETURN(bv.size() == 1);
392 return bv[0];
393 }
394 else if(expr.id()==ID_cond)
395 {
396 bvt bv = convert_cond(to_cond_expr(expr));
397 CHECK_RETURN(bv.size() == 1);
398 return bv[0];
399 }
400 else if(expr.id()==ID_sign)
401 {
402 const auto &op = to_sign_expr(expr).op();
403 const bvt &bv = convert_bv(op);
404 CHECK_RETURN(!bv.empty());
405 const irep_idt type_id = op.type().id();
406 if(type_id == ID_signedbv || type_id == ID_fixedbv || type_id == ID_floatbv)
407 return bv[bv.size()-1];
408 if(type_id == ID_unsignedbv)
409 return const_literal(false);
410 }
411 else if(expr.id()==ID_reduction_or || expr.id()==ID_reduction_and ||
412 expr.id()==ID_reduction_nor || expr.id()==ID_reduction_nand ||
413 expr.id()==ID_reduction_xor || expr.id()==ID_reduction_xnor)
414 return convert_reduction(to_unary_expr(expr));
415 else if(expr.id()==ID_onehot || expr.id()==ID_onehot0)
416 return convert_onehot(to_unary_expr(expr));
417 else if(
418 expr.id() == ID_overflow_plus || expr.id() == ID_overflow_mult ||
419 expr.id() == ID_overflow_minus || expr.id() == ID_overflow_shl ||
420 expr.id() == ID_overflow_unary_minus)
421 {
422 return convert_overflow(expr);
423 }
424 else if(expr.id()==ID_isnan)
425 {
426 const auto &op = to_unary_expr(expr).op();
427 const bvt &bv = convert_bv(op);
428
429 if(op.type().id() == ID_floatbv)
430 {
431 float_utilst float_utils(prop, to_floatbv_type(op.type()));
432 return float_utils.is_NaN(bv);
433 }
434 else if(op.type().id() == ID_fixedbv)
435 return const_literal(false);
436 }
437 else if(expr.id()==ID_isfinite)
438 {
439 const auto &op = to_unary_expr(expr).op();
440 const bvt &bv = convert_bv(op);
441
442 if(op.type().id() == ID_floatbv)
443 {
444 float_utilst float_utils(prop, to_floatbv_type(op.type()));
445 return prop.land(
446 !float_utils.is_infinity(bv),
447 !float_utils.is_NaN(bv));
448 }
449 else if(op.id() == ID_fixedbv)
450 return const_literal(true);
451 }
452 else if(expr.id()==ID_isinf)
453 {
454 const auto &op = to_unary_expr(expr).op();
455 const bvt &bv = convert_bv(op);
456
457 if(op.type().id() == ID_floatbv)
458 {
459 float_utilst float_utils(prop, to_floatbv_type(op.type()));
460 return float_utils.is_infinity(bv);
461 }
462 else if(op.type().id() == ID_fixedbv)
463 return const_literal(false);
464 }
465 else if(expr.id()==ID_isnormal)
466 {
467 const auto &op = to_unary_expr(expr).op();
468
469 if(op.type().id() == ID_floatbv)
470 {
471 const bvt &bv = convert_bv(op);
472 float_utilst float_utils(prop, to_floatbv_type(op.type()));
473 return float_utils.is_normal(bv);
474 }
475 else if(op.type().id() == ID_fixedbv)
476 return const_literal(true);
477 }
478 else if(expr.id() == ID_function_application)
479 {
481 return prop.new_variable();
482 }
483
484 return SUB::convert_rest(expr);
485}
486
488{
490 return true;
491
492 const typet &type = expr.lhs().type();
493
494 if(
495 expr.lhs().id() == ID_symbol && type == expr.rhs().type() &&
496 type.id() != ID_bool)
497 {
498 // see if it is an unbounded array
499 if(is_unbounded_array(type))
500 return true;
501
502 const bvt &bv1=convert_bv(expr.rhs());
503
504 const irep_idt &identifier=
506
507 map.set_literals(identifier, type, bv1);
508
509 if(freeze_all)
510 set_frozen(bv1);
511
512 return false;
513 }
514
515 return true;
516}
517
518void boolbvt::set_to(const exprt &expr, bool value)
519{
520 PRECONDITION(expr.type().id() == ID_bool);
521
522 const auto equal_expr = expr_try_dynamic_cast<equal_exprt>(expr);
523 if(value && equal_expr && !boolbv_set_equality_to_true(*equal_expr))
524 return;
525 SUB::set_to(expr, value);
526}
527
528exprt boolbvt::make_bv_expr(const typet &type, const bvt &bv)
529{
530 exprt dest(ID_bv_literals, type);
531 irept::subt &bv_sub=dest.add(ID_bv).get_sub();
532 bv_sub.resize(bv.size());
533
534 for(std::size_t i=0; i<bv.size(); i++)
535 bv_sub[i].id(std::to_string(bv[i].get()));
536 return dest;
537}
538
540{
541 const std::size_t width = boolbv_width(type);
542 PRECONDITION(width != 0);
543 bvt bv = prop.new_variables(width);
544 return make_bv_expr(type, bv);
545}
546
547bool boolbvt::is_unbounded_array(const typet &type) const
548{
549 if(type.id()!=ID_array)
550 return false;
551
553 return true;
554
555 const std::size_t size = boolbv_width(type);
556 if(size == 0)
557 return true;
558
560 if(size > MAX_FLATTENED_ARRAY_SIZE)
561 return true;
562
563 return false;
564}
565
567{
568 // to ensure freshness of the new identifiers
570
572 result.reserve(binding.variables().size());
573
574 for(const auto &binding : binding.variables())
575 {
576 const auto &old_identifier = binding.get_identifier();
577
578 // produce a new identifier
579 const irep_idt new_identifier =
580 "boolbvt::scope::" + std::to_string(scope_counter) +
581 "::" + id2string(old_identifier);
582
583 result.emplace_back(new_identifier, binding.type());
584 }
585
586 return result;
587}
588
589void boolbvt::print_assignment(std::ostream &out) const
590{
592 map.show(out);
593}
594
596{
597 const struct_typet::componentst &components = src.components();
598 offset_mapt dest;
599 dest.reserve(components.size());
600 std::size_t offset = 0;
601 for(const auto &comp : components)
602 {
603 dest.push_back(offset);
604 offset += boolbv_width(comp.type());
605 }
606 return dest;
607}
constant_exprt from_integer(const mp_integer &int_value, const typet &type)
API to expression classes for bitvectors.
const replication_exprt & to_replication_expr(const exprt &expr)
Cast an exprt to a replication_exprt.
const shift_exprt & to_shift_expr(const exprt &expr)
Cast an exprt to a shift_exprt.
const popcount_exprt & to_popcount_expr(const exprt &expr)
Cast an exprt to a popcount_exprt.
const extractbits_exprt & to_extractbits_expr(const exprt &expr)
Cast an exprt to an extractbits_exprt.
const bswap_exprt & to_bswap_expr(const exprt &expr)
Cast an exprt to a bswap_exprt.
const count_leading_zeros_exprt & to_count_leading_zeros_expr(const exprt &expr)
Cast an exprt to a count_leading_zeros_exprt.
const bitreverse_exprt & to_bitreverse_expr(const exprt &expr)
Cast an exprt to a bitreverse_exprt.
const extractbit_exprt & to_extractbit_expr(const exprt &expr)
Cast an exprt to an extractbit_exprt.
const concatenation_exprt & to_concatenation_expr(const exprt &expr)
Cast an exprt to a concatenation_exprt.
const count_trailing_zeros_exprt & to_count_trailing_zeros_expr(const exprt &expr)
Cast an exprt to a count_trailing_zeros_exprt.
Pre-defined bitvector types.
const floatbv_typet & to_floatbv_type(const typet &type)
Cast a typet to a floatbv_typet.
Expression classes for byte-level operators.
const byte_update_exprt & to_byte_update_expr(const exprt &expr)
const byte_extract_exprt & to_byte_extract_expr(const exprt &expr)
Expression to define a mapping from an argument (index) to elements.
Definition std_expr.h:3182
const array_typet & type() const
Definition std_expr.h:3196
const symbol_exprt & arg() const
Definition std_expr.h:3206
const exprt & body() const
Definition std_expr.h:3220
const exprt & size() const
Definition std_types.h:790
const namespacet & ns
Definition arrays.h:56
exprt & lhs()
Definition std_expr.h:580
exprt & rhs()
Definition std_expr.h:590
A base class for variable bindings (quantifiers, let, lambda)
Definition std_expr.h:2900
variablest & variables()
Definition std_expr.h:2921
std::vector< symbol_exprt > variablest
Definition std_expr.h:2902
void set_literals(const irep_idt &identifier, const typet &type, const bvt &literals)
void show(std::ostream &out) const
const bvt & get_literals(const irep_idt &identifier, const typet &type, std::size_t width)
virtual bvt convert_bv_literals(const exprt &expr)
Definition boolbv.cpp:278
virtual bvt convert_with(const with_exprt &expr)
virtual bvt convert_array(const exprt &expr)
Flatten array.
virtual literalt convert_bv_rel(const binary_relation_exprt &)
Flatten <, >, <= and >= expressions.
bv_cachet bv_cache
Definition boolbv.h:132
virtual literalt convert_onehot(const unary_exprt &expr)
virtual bvt convert_index(const exprt &array, const mp_integer &index)
index operator with constant index
std::size_t scope_counter
Definition boolbv.h:281
virtual bvt convert_constraint_select_one(const exprt &expr)
virtual exprt make_free_bv_expr(const typet &type)
Definition boolbv.cpp:539
virtual bvt convert_complex_imag(const complex_imag_exprt &expr)
virtual literalt convert_reduction(const unary_exprt &expr)
virtual literalt convert_ieee_float_rel(const binary_relation_exprt &)
virtual bvt convert_complex_real(const complex_real_exprt &expr)
virtual bvt convert_complex(const complex_exprt &expr)
virtual bvt convert_let(const let_exprt &)
virtual bvt convert_byte_extract(const byte_extract_exprt &expr)
offset_mapt build_offset_map(const struct_typet &src)
Definition boolbv.cpp:595
virtual bvt convert_bitvector(const exprt &expr)
Converts an expression into its gate-level representation and returns a vector of literals correspond...
Definition boolbv.cpp:98
binding_exprt::variablest fresh_binding(const binding_exprt &)
create new, unique variables for the given binding
Definition boolbv.cpp:566
virtual literalt convert_typecast(const typecast_exprt &expr)
conversion from bitvector types to boolean
virtual bvt convert_bswap(const bswap_exprt &expr)
bool is_unbounded_array(const typet &type) const override
Definition boolbv.cpp:547
virtual const bvt & convert_bv(const exprt &expr, const optionalt< std::size_t > expected_width=nullopt)
Convert expression to vector of literalts, using an internal cache to speed up conversion if availabl...
Definition boolbv.cpp:40
virtual bvt convert_mod(const mod_exprt &expr)
virtual bvt convert_add_sub(const exprt &expr)
virtual bvt convert_constant(const constant_exprt &expr)
virtual literalt convert_quantifier(const quantifier_exprt &expr)
virtual bool boolbv_set_equality_to_true(const equal_exprt &expr)
Definition boolbv.cpp:487
virtual bvt convert_mult(const mult_exprt &expr)
virtual bvt convert_member(const member_exprt &expr)
virtual literalt convert_verilog_case_equality(const binary_relation_exprt &expr)
virtual bvt convert_function_application(const function_application_exprt &expr)
Definition boolbv.cpp:323
virtual bvt convert_cond(const cond_exprt &)
virtual bvt convert_empty_union(const empty_union_exprt &expr)
virtual bvt convert_if(const if_exprt &expr)
Definition boolbv_if.cpp:12
virtual bvt convert_union(const union_exprt &expr)
void set_to(const exprt &expr, bool value) override
For a Boolean expression expr, add the constraint 'expr' if value is true, otherwise add 'not expr'.
Definition boolbv.cpp:518
virtual bvt convert_byte_update(const byte_update_exprt &expr)
virtual literalt convert_extractbit(const extractbit_exprt &expr)
unbounded_arrayt unbounded_array
Definition boolbv.h:85
exprt get(const exprt &expr) const override
Return expr with variables replaced by values from satisfying assignment if available.
virtual bvt convert_floatbv_op(const ieee_float_op_exprt &)
void print_assignment(std::ostream &out) const override
Print satisfying assignment to out.
Definition boolbv.cpp:589
virtual bvt convert_not(const not_exprt &expr)
virtual bvt convert_extractbits(const extractbits_exprt &expr)
virtual bvt convert_shift(const binary_exprt &expr)
virtual bvt convert_update(const update_exprt &)
virtual bvt convert_unary_minus(const unary_minus_exprt &expr)
virtual bvt convert_div(const div_exprt &expr)
virtual bvt convert_array_of(const array_of_exprt &expr)
Flatten arrays constructed from a single element.
virtual bvt convert_floatbv_mod_rem(const binary_exprt &)
virtual bvt convert_bitwise(const exprt &expr)
virtual bvt convert_array_comprehension(const array_comprehension_exprt &)
Definition boolbv.cpp:236
virtual bvt convert_bv_reduction(const unary_exprt &expr)
virtual literalt convert_equality(const equal_exprt &expr)
functionst functions
Definition boolbv.h:117
bvt conversion_failed(const exprt &expr)
Print that the expression of x has failed conversion, then return a vector of x's width.
Definition boolbv.cpp:84
virtual bvt convert_vector(const vector_exprt &expr)
virtual endianness_mapt endianness_map(const typet &type, bool little_endian) const
Definition boolbv.h:105
virtual std::size_t boolbv_width(const typet &type) const
Definition boolbv.h:99
virtual bvt convert_case(const exprt &expr)
virtual exprt make_bv_expr(const typet &type, const bvt &bv)
Definition boolbv.cpp:528
virtual bvt convert_symbol(const exprt &expr)
Definition boolbv.cpp:299
virtual literalt convert_overflow(const exprt &expr)
virtual bvt convert_floatbv_typecast(const floatbv_typecast_exprt &expr)
virtual bvt convert_power(const binary_exprt &expr)
virtual bvt convert_bv_typecast(const typecast_exprt &expr)
virtual bvt convert_concatenation(const concatenation_exprt &expr)
virtual bvt convert_struct(const struct_exprt &expr)
virtual bvt convert_bitreverse(const bitreverse_exprt &expr)
virtual bvt convert_replication(const replication_exprt &expr)
literalt convert_rest(const exprt &expr) override
Definition boolbv.cpp:334
std::vector< std::size_t > offset_mapt
Definition boolbv.h:274
virtual bvt convert_abs(const abs_exprt &expr)
boolbv_mapt map
Definition boolbv.h:120
struct configt::ansi_ct ansi_c
virtual void print_assignment(std::ostream &out) const =0
Print satisfying assignment to out.
virtual void set_to(const exprt &expr, bool value)=0
For a Boolean expression expr, add the constraint 'expr' if value is true, otherwise add 'not expr'.
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition dstring.h:37
bool empty() const
Definition dstring.h:88
Maps a big-endian offset to a little-endian offset.
Equality.
Definition std_expr.h:1225
Base class for all expressions.
Definition expr.h:54
const source_locationt & find_source_location() const
Get a source_locationt from the expression or from its operands (non-recursively).
Definition expr.cpp:165
typet & type()
Return the type of the expression.
Definition expr.h:82
literalt is_NaN(const bvt &)
literalt is_infinity(const bvt &)
literalt is_normal(const bvt &)
Application of (mathematical) function.
void record(const function_application_exprt &function_application)
Definition functions.cpp:15
const irept & find(const irep_idt &name) const
Definition irep.cpp:106
const irep_idt & get(const irep_idt &name) const
Definition irep.cpp:45
subt & get_sub()
Definition irep.h:456
const irep_idt & id() const
Definition irep.h:396
irept & add(const irep_idt &name)
Definition irep.cpp:116
static var_not unused_var_no()
Definition literal.h:176
void set_frozen(literalt)
virtual void ignoring(const exprt &expr)
literalt convert(const exprt &expr) override
Convert a Boolean expression and return the corresponding literal.
virtual literalt convert_rest(const exprt &expr)
virtual literalt land(literalt a, literalt b)=0
virtual void set_frozen(literalt)
Definition prop.h:113
virtual bvt new_variables(std::size_t width)
generates a bitvector of given width with new variables
Definition prop.cpp:20
virtual literalt new_variable()=0
Structure type, corresponds to C style structs.
Definition std_types.h:231
const componentst & components() const
Definition std_types.h:147
std::vector< componentt > componentst
Definition std_types.h:140
const irep_idt & get_identifier() const
Definition std_expr.h:109
The type of an expression, extends irept.
Definition type.h:29
const exprt & op() const
Definition std_expr.h:293
configt config
Definition config.cpp:25
API to expression classes for floating-point arithmetic.
const ieee_float_op_exprt & to_ieee_float_op_expr(const exprt &expr)
Cast an exprt to an ieee_float_op_exprt.
const floatbv_typecast_exprt & to_floatbv_typecast_expr(const exprt &expr)
Cast an exprt to a floatbv_typecast_exprt.
const std::string & id2string(const irep_idt &d)
Definition irep.h:47
std::vector< literalt > bvt
Definition literal.h:201
literalt const_literal(bool value)
Definition literal.h:188
Magic numbers used throughout the codebase.
const std::size_t MAX_FLATTENED_ARRAY_SIZE
Definition magic.h:11
const quantifier_exprt & to_quantifier_expr(const exprt &expr)
Cast an exprt to a quantifier_exprt.
const function_application_exprt & to_function_application_expr(const exprt &expr)
Cast an exprt to a function_application_exprt.
nonstd::optional< T > optionalt
Definition optional.h:35
bool replace_expr(const exprt &what, const exprt &by, exprt &dest)
exprt simplify_expr(exprt src, const namespacet &ns)
BigInt mp_integer
Definition smt_terms.h:12
#define CHECK_RETURN(CONDITION)
Definition invariant.h:495
#define DATA_INVARIANT(CONDITION, REASON)
This condition should be used to document that assumptions that are made on goto_functions,...
Definition invariant.h:510
#define PRECONDITION(CONDITION)
Definition invariant.h:463
#define INVARIANT_WITH_DIAGNOSTICS(CONDITION, REASON,...)
Same as invariant, with one or more diagnostics attached Diagnostics can be of any type that has a sp...
Definition invariant.h:437
#define INVARIANT(CONDITION, REASON)
This macro uses the wrapper function 'invariant_violated_string'.
Definition invariant.h:423
API to expression classes.
const struct_exprt & to_struct_expr(const exprt &expr)
Cast an exprt to a struct_exprt.
Definition std_expr.h:1745
const array_of_exprt & to_array_of_expr(const exprt &expr)
Cast an exprt to an array_of_exprt.
Definition std_expr.h:1456
const binary_relation_exprt & to_binary_relation_expr(const exprt &expr)
Cast an exprt to a binary_relation_exprt.
Definition std_expr.h:807
const unary_plus_exprt & to_unary_plus_expr(const exprt &expr)
Cast an exprt to a unary_plus_exprt.
Definition std_expr.h:464
const index_exprt & to_index_expr(const exprt &expr)
Cast an exprt to an index_exprt.
Definition std_expr.h:1391
const mod_exprt & to_mod_expr(const exprt &expr)
Cast an exprt to a mod_exprt.
Definition std_expr.h:1160
const mult_exprt & to_mult_expr(const exprt &expr)
Cast an exprt to a mult_exprt.
Definition std_expr.h:1044
const array_comprehension_exprt & to_array_comprehension_expr(const exprt &expr)
Cast an exprt to a array_comprehension_exprt.
Definition std_expr.h:3249
const array_exprt & to_array_expr(const exprt &expr)
Cast an exprt to an array_exprt.
Definition std_expr.h:1506
const cond_exprt & to_cond_expr(const exprt &expr)
Cast an exprt to a cond_exprt.
Definition std_expr.h:3156
const typecast_exprt & to_typecast_expr(const exprt &expr)
Cast an exprt to a typecast_exprt.
Definition std_expr.h:1954
const div_exprt & to_div_expr(const exprt &expr)
Cast an exprt to a div_exprt.
Definition std_expr.h:1113
const vector_exprt & to_vector_expr(const exprt &expr)
Cast an exprt to an vector_exprt.
Definition std_expr.h:1595
const binary_exprt & to_binary_expr(const exprt &expr)
Cast an exprt to a binary_exprt.
Definition std_expr.h:627
const notequal_exprt & to_notequal_expr(const exprt &expr)
Cast an exprt to an notequal_exprt.
Definition std_expr.h:1308
const unary_exprt & to_unary_expr(const exprt &expr)
Cast an exprt to a unary_exprt.
Definition std_expr.h:328
const let_exprt & to_let_expr(const exprt &expr)
Cast an exprt to a let_exprt.
Definition std_expr.h:3097
const abs_exprt & to_abs_expr(const exprt &expr)
Cast an exprt to a abs_exprt.
Definition std_expr.h:370
const if_exprt & to_if_expr(const exprt &expr)
Cast an exprt to an if_exprt.
Definition std_expr.h:2291
const member_exprt & to_member_expr(const exprt &expr)
Cast an exprt to a member_exprt.
Definition std_expr.h:2751
const empty_union_exprt & to_empty_union_expr(const exprt &expr)
Cast an exprt to an empty_union_exprt.
Definition std_expr.h:1703
const complex_imag_exprt & to_complex_imag_expr(const exprt &expr)
Cast an exprt to a complex_imag_exprt.
Definition std_expr.h:1900
const union_exprt & to_union_expr(const exprt &expr)
Cast an exprt to a union_exprt.
Definition std_expr.h:1657
const complex_real_exprt & to_complex_real_expr(const exprt &expr)
Cast an exprt to a complex_real_exprt.
Definition std_expr.h:1855
const constant_exprt & to_constant_expr(const exprt &expr)
Cast an exprt to a constant_exprt.
Definition std_expr.h:2840
const not_exprt & to_not_expr(const exprt &expr)
Cast an exprt to an not_exprt.
Definition std_expr.h:2206
const symbol_exprt & to_symbol_expr(const exprt &expr)
Cast an exprt to a symbol_exprt.
Definition std_expr.h:189
const with_exprt & to_with_expr(const exprt &expr)
Cast an exprt to a with_exprt.
Definition std_expr.h:2374
const complex_exprt & to_complex_expr(const exprt &expr)
Cast an exprt to a complex_exprt.
Definition std_expr.h:1810
const update_exprt & to_update_expr(const exprt &expr)
Cast an exprt to an update_exprt.
Definition std_expr.h:2561
const unary_minus_exprt & to_unary_minus_expr(const exprt &expr)
Cast an exprt to a unary_minus_exprt.
Definition std_expr.h:420
const equal_exprt & to_equal_expr(const exprt &expr)
Cast an exprt to an equal_exprt.
Definition std_expr.h:1265
const sign_exprt & to_sign_expr(const exprt &expr)
Cast an exprt to a sign_exprt.
Definition std_expr.h:531
unsigned unsafe_string2unsigned(const std::string &str, int base)
const string_constantt & to_string_constant(const exprt &expr)
endiannesst endianness
Definition config.h:177