CBMC
boolbv.cpp
Go to the documentation of this file.
1 /*******************************************************************\
2 
3 Module:
4 
5 Author: Daniel Kroening, kroening@kroening.com
6 
7 \*******************************************************************/
8 
9 #include "boolbv.h"
10 
11 #include <util/arith_tools.h>
12 #include <util/bitvector_expr.h>
13 #include <util/bitvector_types.h>
14 #include <util/byte_operators.h>
15 #include <util/config.h>
16 #include <util/floatbv_expr.h>
17 #include <util/magic.h>
18 #include <util/mp_arith.h>
19 #include <util/simplify_expr.h>
20 #include <util/std_expr.h>
21 #include <util/string_constant.h>
22 
24 
25 #include "literal_vector_expr.h"
26 
27 #include <algorithm>
28 
30 {
31  const bool little_endian =
33  return endianness_map(type, little_endian);
34 }
35 
40  const exprt &expr,
41  std::optional<std::size_t> expected_width)
42 {
43  // check cache first
44  std::pair<bv_cachet::iterator, bool> cache_result=
45  bv_cache.insert(std::make_pair(expr, bvt()));
46 
47  // get a reference to the cache entry
48  auto &cache_entry = cache_result.first->second;
49 
50  if(!cache_result.second)
51  {
52  // Found in cache
53  return cache_entry;
54  }
55 
56  // Iterators into hash_maps do not remain valid when inserting
57  // more elements recursively. C++11 ยง23.2.5/13
58  // However, the _reference_ to the entry does!
59  cache_entry = convert_bitvector(expr);
60 
62  !expected_width || cache_entry.size() == *expected_width,
63  "bitvector width shall match the indicated expected width",
64  expr.find_source_location(),
66 
67  // check
68  for(const auto &literal : cache_entry)
69  {
70  if(freeze_all && !literal.is_constant())
71  prop.set_frozen(literal);
72 
74  literal.var_no() != literalt::unused_var_no(),
75  "variable number must be different from the unused variable number",
76  expr.find_source_location(),
78  }
79 
80  return cache_entry;
81 }
82 
84 {
85  if(expr.type().id() == ID_bool)
86  return prop_conv_solvert::handle(expr);
87  auto bv = convert_bv(expr);
88  set_frozen(bv); // for incremental usage
89  return literal_vector_exprt{bv, expr.type()};
90 }
91 
95 {
96  ignoring(expr);
97 
98  // try to make it free bits
99  std::size_t width=boolbv_width(expr.type());
100  return prop.new_variables(width);
101 }
102 
109 {
110  if(expr.is_boolean())
111  return {convert(expr)};
112 
113  if(expr.id()==ID_index)
114  return convert_index(to_index_expr(expr));
115  else if(expr.id()==ID_constraint_select_one)
116  return convert_constraint_select_one(expr);
117  else if(expr.id()==ID_member)
118  return convert_member(to_member_expr(expr));
119  else if(expr.id()==ID_with)
120  return convert_with(to_with_expr(expr));
121  else if(expr.id()==ID_update)
122  return convert_update(to_update_expr(expr));
123  else if(expr.id() == ID_update_bit)
125  else if(expr.id()==ID_case)
126  return convert_case(expr);
127  else if(expr.id()==ID_cond)
128  return convert_cond(to_cond_expr(expr));
129  else if(expr.id()==ID_if)
130  return convert_if(to_if_expr(expr));
131  else if(expr.is_constant())
132  return convert_constant(to_constant_expr(expr));
133  else if(expr.id()==ID_typecast)
135  else if(expr.id()==ID_symbol)
136  return convert_symbol(to_symbol_expr(expr));
137  else if(expr.id()==ID_plus || expr.id()==ID_minus ||
138  expr.id()=="no-overflow-plus" ||
139  expr.id()=="no-overflow-minus")
140  return convert_add_sub(expr);
141  else if(expr.id() == ID_mult)
142  return convert_mult(to_mult_expr(expr));
143  else if(expr.id()==ID_div)
144  return convert_div(to_div_expr(expr));
145  else if(expr.id()==ID_mod)
146  return convert_mod(to_mod_expr(expr));
147  else if(expr.id()==ID_shl || expr.id()==ID_ashr || expr.id()==ID_lshr ||
148  expr.id()==ID_rol || expr.id()==ID_ror)
149  return convert_shift(to_shift_expr(expr));
150  else if(
151  expr.id() == ID_floatbv_plus || expr.id() == ID_floatbv_minus ||
152  expr.id() == ID_floatbv_mult || expr.id() == ID_floatbv_div)
153  {
155  }
156  else if(expr.id() == ID_floatbv_mod)
158  else if(expr.id() == ID_floatbv_rem)
160  else if(expr.id()==ID_floatbv_typecast)
162  else if(expr.id()==ID_concatenation)
164  else if(expr.id()==ID_replication)
166  else if(expr.id()==ID_extractbits)
168  else if(expr.id() == ID_zero_extend)
169  return convert_bitvector(to_zero_extend_expr(expr).lower());
170  else if(expr.id()==ID_bitnot || expr.id()==ID_bitand ||
171  expr.id()==ID_bitor || expr.id()==ID_bitxor ||
172  expr.id()==ID_bitxnor || expr.id()==ID_bitnor ||
173  expr.id()==ID_bitnand)
174  return convert_bitwise(expr);
175  else if(expr.id() == ID_unary_minus)
177  else if(expr.id()==ID_unary_plus)
178  {
179  return convert_bitvector(to_unary_plus_expr(expr).op());
180  }
181  else if(expr.id()==ID_abs)
182  return convert_abs(to_abs_expr(expr));
183  else if(expr.id() == ID_bswap)
184  return convert_bswap(to_bswap_expr(expr));
185  else if(expr.id()==ID_byte_extract_little_endian ||
186  expr.id()==ID_byte_extract_big_endian)
188  else if(expr.id()==ID_byte_update_little_endian ||
189  expr.id()==ID_byte_update_big_endian)
191  else if(expr.id()==ID_nondet_symbol ||
192  expr.id()=="quant_symbol")
193  return convert_symbol(expr);
194  else if(expr.id()==ID_struct)
195  return convert_struct(to_struct_expr(expr));
196  else if(expr.id()==ID_union)
197  return convert_union(to_union_expr(expr));
198  else if(expr.id() == ID_empty_union)
200  else if(expr.id()==ID_string_constant)
201  return convert_bitvector(
203  else if(expr.id() == ID_named_term)
204  {
205  const auto &named_term_expr = to_named_term_expr(expr);
206  set_to_true(equal_exprt(named_term_expr.symbol(), named_term_expr.value()));
207  return convert_symbol(named_term_expr.symbol());
208  }
209  else if(expr.id()==ID_array)
210  return convert_array(expr);
211  else if(expr.id()==ID_complex)
212  return convert_complex(to_complex_expr(expr));
213  else if(expr.id()==ID_complex_real)
215  else if(expr.id()==ID_complex_imag)
217  else if(expr.id() == ID_array_comprehension)
219  else if(expr.id()==ID_array_of)
220  return convert_array_of(to_array_of_expr(expr));
221  else if(expr.id()==ID_let)
222  return convert_let(to_let_expr(expr));
223  else if(expr.id()==ID_function_application)
226  else if(expr.id()==ID_reduction_or || expr.id()==ID_reduction_and ||
227  expr.id()==ID_reduction_nor || expr.id()==ID_reduction_nand ||
228  expr.id()==ID_reduction_xor || expr.id()==ID_reduction_xnor)
229  return convert_bv_reduction(to_unary_expr(expr));
230  else if(expr.id()==ID_not)
231  return convert_not(to_not_expr(expr));
232  else if(expr.id()==ID_power)
233  return convert_power(to_binary_expr(expr));
234  else if(expr.id() == ID_popcount)
235  return convert_bv(simplify_expr(to_popcount_expr(expr).lower(), ns));
236  else if(expr.id() == ID_count_leading_zeros)
237  {
238  return convert_bv(
240  }
241  else if(expr.id() == ID_count_trailing_zeros)
242  {
243  return convert_bv(
245  }
246  else if(expr.id() == ID_bitreverse)
248  else if(expr.id() == ID_saturating_minus || expr.id() == ID_saturating_plus)
250  else if(
251  const auto overflow_with_result =
252  expr_try_dynamic_cast<overflow_result_exprt>(expr))
253  {
254  return convert_overflow_result(*overflow_with_result);
255  }
256  else if(expr.id() == ID_find_first_set)
257  return convert_bv(simplify_expr(to_find_first_set_expr(expr).lower(), ns));
258  else if(expr.id() == ID_literal_vector)
259  return to_literal_vector_expr(expr).bv();
260 
261  return conversion_failed(expr);
262 }
263 
265 {
266  std::size_t width=boolbv_width(expr.type());
267 
268  const exprt &array_size = expr.type().size();
269 
270  const auto size = numeric_cast_v<mp_integer>(to_constant_expr(array_size));
271 
272  typet counter_type = expr.arg().type();
273 
274  bvt bv;
275  bv.resize(width);
276 
277  for(mp_integer i = 0; i < size; ++i)
278  {
279  exprt counter=from_integer(i, counter_type);
280 
281  exprt body = expr.instantiate({counter});
282 
283  const bvt &tmp = convert_bv(body);
284 
285  INVARIANT(
286  size * tmp.size() == width,
287  "total bitvector width shall equal the number of operands times the size "
288  "per operand");
289 
290  std::size_t offset = numeric_cast_v<std::size_t>(i * tmp.size());
291 
292  for(std::size_t j=0; j<tmp.size(); j++)
293  bv[offset+j]=tmp[j];
294  }
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.is_boolean());
337 
338  if(expr.id()==ID_typecast)
339  return convert_typecast(to_typecast_expr(expr));
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  {
378  bvt bv=convert_index(to_index_expr(expr));
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  const auto binary_overflow =
419  expr_try_dynamic_cast<binary_overflow_exprt>(expr))
420  {
421  return convert_binary_overflow(*binary_overflow);
422  }
423  else if(
424  const auto unary_overflow =
425  expr_try_dynamic_cast<unary_overflow_exprt>(expr))
426  {
427  return convert_unary_overflow(*unary_overflow);
428  }
429  else if(expr.id()==ID_isnan)
430  {
431  const auto &op = to_unary_expr(expr).op();
432  const bvt &bv = convert_bv(op);
433 
434  if(op.type().id() == ID_floatbv)
435  {
436  float_utilst float_utils(prop, to_floatbv_type(op.type()));
437  return float_utils.is_NaN(bv);
438  }
439  else if(op.type().id() == ID_fixedbv)
440  return const_literal(false);
441  }
442  else if(expr.id()==ID_isfinite)
443  {
444  const auto &op = to_unary_expr(expr).op();
445  const bvt &bv = convert_bv(op);
446 
447  if(op.type().id() == ID_floatbv)
448  {
449  float_utilst float_utils(prop, to_floatbv_type(op.type()));
450  return prop.land(
451  !float_utils.is_infinity(bv),
452  !float_utils.is_NaN(bv));
453  }
454  else if(op.id() == ID_fixedbv)
455  return const_literal(true);
456  }
457  else if(expr.id()==ID_isinf)
458  {
459  const auto &op = to_unary_expr(expr).op();
460  const bvt &bv = convert_bv(op);
461 
462  if(op.type().id() == ID_floatbv)
463  {
464  float_utilst float_utils(prop, to_floatbv_type(op.type()));
465  return float_utils.is_infinity(bv);
466  }
467  else if(op.type().id() == ID_fixedbv)
468  return const_literal(false);
469  }
470  else if(expr.id()==ID_isnormal)
471  {
472  const auto &op = to_unary_expr(expr).op();
473 
474  if(op.type().id() == ID_floatbv)
475  {
476  const bvt &bv = convert_bv(op);
477  float_utilst float_utils(prop, to_floatbv_type(op.type()));
478  return float_utils.is_normal(bv);
479  }
480  else if(op.type().id() == ID_fixedbv)
481  return const_literal(true);
482  }
483  else if(expr.id() == ID_function_application)
484  {
486  return prop.new_variable();
487  }
488 
489  return SUB::convert_rest(expr);
490 }
491 
493 {
495  return true;
496 
497  const typet &type = expr.lhs().type();
498 
499  if(
500  expr.lhs().id() == ID_symbol && type == expr.rhs().type() &&
501  type.id() != ID_bool)
502  {
503  // see if it is an unbounded array
504  if(is_unbounded_array(type))
505  return true;
506 
507  const bvt &bv1=convert_bv(expr.rhs());
508 
509  const irep_idt &identifier=
511 
512  map.set_literals(identifier, type, bv1);
513 
514  if(freeze_all)
515  set_frozen(bv1);
516 
517  return false;
518  }
519 
520  return true;
521 }
522 
523 void boolbvt::set_to(const exprt &expr, bool value)
524 {
525  PRECONDITION(expr.is_boolean());
526 
527  const auto equal_expr = expr_try_dynamic_cast<equal_exprt>(expr);
528  if(value && equal_expr && !boolbv_set_equality_to_true(*equal_expr))
529  return;
530  SUB::set_to(expr, value);
531 }
532 
533 bool boolbvt::is_unbounded_array(const typet &type) const
534 {
535  if(type.id()!=ID_array)
536  return false;
537 
539  return true;
540 
541  const auto &size_opt = bv_width.get_width_opt(type);
542  if(!size_opt.has_value())
543  return true;
544 
546  if(*size_opt > MAX_FLATTENED_ARRAY_SIZE)
547  return true;
548 
549  return false;
550 }
551 
553 {
554  // to ensure freshness of the new identifiers
555  scope_counter++;
556 
558  result.reserve(binding.variables().size());
559 
560  for(const auto &binding : binding.variables())
561  {
562  const auto &old_identifier = binding.get_identifier();
563 
564  // produce a new identifier
565  const irep_idt new_identifier =
566  "boolbvt::scope::" + std::to_string(scope_counter) +
567  "::" + id2string(old_identifier);
568 
569  result.emplace_back(new_identifier, binding.type());
570  }
571 
572  return result;
573 }
574 
575 void boolbvt::print_assignment(std::ostream &out) const
576 {
578  map.show(out);
579 }
580 
582 {
583  const struct_typet::componentst &components = src.components();
584  offset_mapt dest;
585  dest.reserve(components.size());
586  std::size_t offset = 0;
587  for(const auto &comp : components)
588  {
589  dest.push_back(offset);
590  offset += boolbv_width(comp.type());
591  }
592  return dest;
593 }
configt config
Definition: config.cpp:25
constant_exprt from_integer(const mp_integer &int_value, const typet &type)
API to expression classes for bitvectors.
const update_bit_exprt & to_update_bit_expr(const exprt &expr)
Cast an exprt to an update_bit_exprt.
const shift_exprt & to_shift_expr(const exprt &expr)
Cast an exprt to a shift_exprt.
const extractbit_exprt & to_extractbit_expr(const exprt &expr)
Cast an exprt to an extractbit_exprt.
const extractbits_exprt & to_extractbits_expr(const exprt &expr)
Cast an exprt to an extractbits_exprt.
const find_first_set_exprt & to_find_first_set_expr(const exprt &expr)
Cast an exprt to a find_first_set_exprt.
const bitreverse_exprt & to_bitreverse_expr(const exprt &expr)
Cast an exprt to a bitreverse_exprt.
const zero_extend_exprt & to_zero_extend_expr(const exprt &expr)
Cast an exprt to a zero_extend_exprt.
const count_trailing_zeros_exprt & to_count_trailing_zeros_expr(const exprt &expr)
Cast an exprt to a count_trailing_zeros_exprt.
const replication_exprt & to_replication_expr(const exprt &expr)
Cast an exprt to a replication_exprt.
const concatenation_exprt & to_concatenation_expr(const exprt &expr)
Cast an exprt to a concatenation_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 popcount_exprt & to_popcount_expr(const exprt &expr)
Cast an exprt to a popcount_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:3413
const array_typet & type() const
Definition: std_expr.h:3427
const symbol_exprt & arg() const
Definition: std_expr.h:3437
const exprt & size() const
Definition: std_types.h:840
const namespacet & ns
Definition: arrays.h:56
exprt & lhs()
Definition: std_expr.h:668
exprt & rhs()
Definition: std_expr.h:678
A base class for variable bindings (quantifiers, let, lambda)
Definition: std_expr.h:3107
exprt instantiate(const exprt::operandst &) const
substitute free occurrences of the variables in where() by the given values
Definition: std_expr.cpp:225
variablest & variables()
Definition: std_expr.h:3128
std::vector< symbol_exprt > variablest
Definition: std_expr.h:3109
void set_literals(const irep_idt &identifier, const typet &type, const bvt &literals)
Definition: boolbv_map.cpp:75
void show(std::ostream &out) const
Definition: boolbv_map.cpp:35
const bvt & get_literals(const irep_idt &identifier, const typet &type, std::size_t width)
Definition: boolbv_map.cpp:41
virtual std::optional< std::size_t > get_width_opt(const typet &type) const
Definition: boolbv_width.h:31
virtual bvt convert_with(const with_exprt &expr)
Definition: boolbv_with.cpp:17
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:135
virtual literalt convert_onehot(const unary_exprt &expr)
virtual bvt convert_index(const exprt &array, const mp_integer &index)
index operator with constant index
virtual const bvt & convert_bv(const exprt &expr, const std::optional< std::size_t > expected_width={})
Convert expression to vector of literalts, using an internal cache to speed up conversion if availabl...
Definition: boolbv.cpp:39
std::size_t scope_counter
Definition: boolbv.h:283
virtual bvt convert_constraint_select_one(const exprt &expr)
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 &)
Definition: boolbv_let.cpp:15
virtual bvt convert_byte_extract(const byte_extract_exprt &expr)
offset_mapt build_offset_map(const struct_typet &src)
Definition: boolbv.cpp:581
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:108
binding_exprt::variablest fresh_binding(const binding_exprt &)
create new, unique variables for the given binding
Definition: boolbv.cpp:552
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:533
virtual bvt convert_mod(const mod_exprt &expr)
Definition: boolbv_mod.cpp:12
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:492
virtual bvt convert_mult(const mult_exprt &expr)
Definition: boolbv_mult.cpp:13
exprt handle(const exprt &) override
Generate a handle, which is an expression that has the same value as the argument in any model that i...
Definition: boolbv.cpp:83
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 &)
Definition: boolbv_cond.cpp:13
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:523
virtual bvt convert_byte_update(const byte_update_exprt &expr)
boolbv_widtht bv_width
Definition: boolbv.h:116
virtual literalt convert_extractbit(const extractbit_exprt &expr)
unbounded_arrayt unbounded_array
Definition: boolbv.h:88
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:575
virtual bvt convert_not(const not_exprt &expr)
Definition: boolbv_not.cpp:13
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)
Definition: boolbv_div.cpp:13
virtual literalt convert_binary_overflow(const binary_overflow_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_saturating_add_sub(const binary_exprt &expr)
virtual bvt convert_overflow_result(const overflow_result_exprt &expr)
virtual bvt convert_bitwise(const exprt &expr)
virtual bvt convert_array_comprehension(const array_comprehension_exprt &)
Definition: boolbv.cpp:264
virtual bvt convert_bv_reduction(const unary_exprt &expr)
virtual literalt convert_equality(const equal_exprt &expr)
functionst functions
Definition: boolbv.h:120
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:94
virtual endianness_mapt endianness_map(const typet &type, bool little_endian) const
Definition: boolbv.h:108
virtual literalt convert_unary_overflow(const unary_overflow_exprt &expr)
virtual std::size_t boolbv_width(const typet &type) const
Definition: boolbv.h:102
virtual bvt convert_case(const exprt &expr)
Definition: boolbv_case.cpp:13
virtual bvt convert_symbol(const exprt &expr)
Definition: boolbv.cpp:299
virtual bvt convert_update_bit(const update_bit_exprt &)
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:276
virtual bvt convert_abs(const abs_exprt &expr)
Definition: boolbv_abs.cpp:17
boolbv_mapt map
Definition: boolbv.h:123
struct configt::ansi_ct ansi_c
void set_to_true(const exprt &)
For a Boolean expression expr, add the constraint 'expr'.
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition: dstring.h:38
bool empty() const
Definition: dstring.h:89
Maps a big-endian offset to a little-endian offset.
Equality.
Definition: std_expr.h:1361
Base class for all expressions.
Definition: expr.h:56
const source_locationt & find_source_location() const
Get a source_locationt from the expression or from its operands (non-recursively).
Definition: expr.cpp:147
bool is_boolean() const
Return whether the expression represents a Boolean.
Definition: expr.h:224
typet & type()
Return the type of the expression.
Definition: expr.h:84
bool is_constant() const
Return whether the expression is a constant.
Definition: expr.h:212
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 irep_idt & get(const irep_idt &name) const
Definition: irep.cpp:44
const irep_idt & id() const
Definition: irep.h:388
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)
void set_to(const exprt &expr, bool value) override
For a Boolean expression expr, add the constraint 'current_context => expr' if value is true,...
exprt handle(const exprt &expr) override
Generate a handle, which is an expression that has the same value as the argument in any model that i...
void print_assignment(std::ostream &out) const override
Print satisfying assignment to out.
virtual literalt land(literalt a, literalt b)=0
virtual void set_frozen(literalt)
Definition: prop.h:117
virtual bvt new_variables(std::size_t width)
generates a bitvector of given width with new variables
Definition: prop.cpp:30
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:160
The type of an expression, extends irept.
Definition: type.h:29
const exprt & op() const
Definition: std_expr.h:391
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.
Definition: floatbv_expr.h:425
const floatbv_typecast_exprt & to_floatbv_typecast_expr(const exprt &expr)
Cast an exprt to a floatbv_typecast_exprt.
Definition: floatbv_expr.h:68
const std::string & id2string(const irep_idt &d)
Definition: irep.h:44
std::vector< literalt > bvt
Definition: literal.h:201
literalt const_literal(bool value)
Definition: literal.h:188
const literal_vector_exprt & to_literal_vector_expr(const exprt &expr)
Cast a generic exprt to a literal_vector_exprt.
Magic numbers used throughout the codebase.
const std::size_t MAX_FLATTENED_ARRAY_SIZE
Definition: magic.h:11
const function_application_exprt & to_function_application_expr(const exprt &expr)
Cast an exprt to a function_application_exprt.
const quantifier_exprt & to_quantifier_expr(const exprt &expr)
Cast an exprt to a quantifier_exprt.
exprt simplify_expr(exprt src, const namespacet &ns)
BigInt mp_integer
Definition: smt_terms.h:17
#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:534
#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
API to expression classes.
const notequal_exprt & to_notequal_expr(const exprt &expr)
Cast an exprt to an notequal_exprt.
Definition: std_expr.h:1445
const if_exprt & to_if_expr(const exprt &expr)
Cast an exprt to an if_exprt.
Definition: std_expr.h:2450
const update_exprt & to_update_expr(const exprt &expr)
Cast an exprt to an update_exprt.
Definition: std_expr.h:2738
const empty_union_exprt & to_empty_union_expr(const exprt &expr)
Cast an exprt to an empty_union_exprt.
Definition: std_expr.h:1855
const let_exprt & to_let_expr(const exprt &expr)
Cast an exprt to a let_exprt.
Definition: std_expr.h:3328
const unary_plus_exprt & to_unary_plus_expr(const exprt &expr)
Cast an exprt to a unary_plus_exprt.
Definition: std_expr.h:556
const constant_exprt & to_constant_expr(const exprt &expr)
Cast an exprt to a constant_exprt.
Definition: std_expr.h:3045
const symbol_exprt & to_symbol_expr(const exprt &expr)
Cast an exprt to a symbol_exprt.
Definition: std_expr.h:272
const mod_exprt & to_mod_expr(const exprt &expr)
Cast an exprt to a mod_exprt.
Definition: std_expr.h:1272
const array_exprt & to_array_expr(const exprt &expr)
Cast an exprt to an array_exprt.
Definition: std_expr.h:1660
const array_comprehension_exprt & to_array_comprehension_expr(const exprt &expr)
Cast an exprt to a array_comprehension_exprt.
Definition: std_expr.h:3480
const typecast_exprt & to_typecast_expr(const exprt &expr)
Cast an exprt to a typecast_exprt.
Definition: std_expr.h:2102
const complex_real_exprt & to_complex_real_expr(const exprt &expr)
Cast an exprt to a complex_real_exprt.
Definition: std_expr.h:2005
const not_exprt & to_not_expr(const exprt &expr)
Cast an exprt to an not_exprt.
Definition: std_expr.h:2352
const union_exprt & to_union_expr(const exprt &expr)
Cast an exprt to a union_exprt.
Definition: std_expr.h:1811
const unary_minus_exprt & to_unary_minus_expr(const exprt &expr)
Cast an exprt to a unary_minus_exprt.
Definition: std_expr.h:514
const named_term_exprt & to_named_term_expr(const exprt &expr)
Cast an exprt to a named_term_exprt.
Definition: std_expr.h:3662
const div_exprt & to_div_expr(const exprt &expr)
Cast an exprt to a div_exprt.
Definition: std_expr.h:1201
const with_exprt & to_with_expr(const exprt &expr)
Cast an exprt to a with_exprt.
Definition: std_expr.h:2533
const struct_exprt & to_struct_expr(const exprt &expr)
Cast an exprt to a struct_exprt.
Definition: std_expr.h:1895
const binary_exprt & to_binary_expr(const exprt &expr)
Cast an exprt to a binary_exprt.
Definition: std_expr.h:715
const array_of_exprt & to_array_of_expr(const exprt &expr)
Cast an exprt to an array_of_exprt.
Definition: std_expr.h:1598
const equal_exprt & to_equal_expr(const exprt &expr)
Cast an exprt to an equal_exprt.
Definition: std_expr.h:1402
const complex_exprt & to_complex_expr(const exprt &expr)
Cast an exprt to a complex_exprt.
Definition: std_expr.h:1960
const member_exprt & to_member_expr(const exprt &expr)
Cast an exprt to a member_exprt.
Definition: std_expr.h:2936
const unary_exprt & to_unary_expr(const exprt &expr)
Cast an exprt to a unary_exprt.
Definition: std_expr.h:426
const complex_imag_exprt & to_complex_imag_expr(const exprt &expr)
Cast an exprt to a complex_imag_exprt.
Definition: std_expr.h:2048
const sign_exprt & to_sign_expr(const exprt &expr)
Cast an exprt to a sign_exprt.
Definition: std_expr.h:621
const abs_exprt & to_abs_expr(const exprt &expr)
Cast an exprt to a abs_exprt.
Definition: std_expr.h:466
const binary_relation_exprt & to_binary_relation_expr(const exprt &expr)
Cast an exprt to a binary_relation_exprt.
Definition: std_expr.h:895
const index_exprt & to_index_expr(const exprt &expr)
Cast an exprt to an index_exprt.
Definition: std_expr.h:1533
const mult_exprt & to_mult_expr(const exprt &expr)
Cast an exprt to a mult_exprt.
Definition: std_expr.h:1132
const cond_exprt & to_cond_expr(const exprt &expr)
Cast an exprt to a cond_exprt.
Definition: std_expr.h:3387
const string_constantt & to_string_constant(const exprt &expr)
std::string to_string(const string_not_contains_constraintt &expr)
Used for debug printing.
endiannesst endianness
Definition: config.h:209