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 <algorithm>
12 
13 #include <util/arith_tools.h>
14 #include <util/bitvector_expr.h>
15 #include <util/bitvector_types.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/simplify_expr.h>
22 #include <util/std_expr.h>
23 #include <util/string2int.h>
24 #include <util/string_constant.h>
25 
27 
29 {
30  const bool little_endian =
32  return endianness_map(type, little_endian);
33 }
34 
38 const bvt &
39 boolbvt::convert_bv(const exprt &expr, optionalt<std::size_t> expected_width)
40 {
41  // check cache first
42  std::pair<bv_cachet::iterator, bool> cache_result=
43  bv_cache.insert(std::make_pair(expr, bvt()));
44 
45  // get a reference to the cache entry
46  auto &cache_entry = cache_result.first->second;
47 
48  if(!cache_result.second)
49  {
50  // Found in cache
51  return cache_entry;
52  }
53 
54  // Iterators into hash_maps do not remain valid when inserting
55  // more elements recursively. C++11 ยง23.2.5/13
56  // However, the _reference_ to the entry does!
57  cache_entry = convert_bitvector(expr);
58 
60  !expected_width || cache_entry.size() == *expected_width,
61  "bitvector width shall match the indicated expected width",
62  expr.find_source_location(),
64 
65  // check
66  for(const auto &literal : cache_entry)
67  {
68  if(freeze_all && !literal.is_constant())
69  prop.set_frozen(literal);
70 
72  literal.var_no() != literalt::unused_var_no(),
73  "variable number must be different from the unused variable number",
74  expr.find_source_location(),
76  }
77 
78  return cache_entry;
79 }
80 
84 {
85  ignoring(expr);
86 
87  // try to make it free bits
88  std::size_t width=boolbv_width(expr.type());
89  return prop.new_variables(width);
90 }
91 
98 {
99  if(expr.type().id()==ID_bool)
100  return {convert(expr)};
101 
102  if(expr.id()==ID_index)
103  return convert_index(to_index_expr(expr));
104  else if(expr.id()==ID_constraint_select_one)
105  return convert_constraint_select_one(expr);
106  else if(expr.id()==ID_member)
107  return convert_member(to_member_expr(expr));
108  else if(expr.id()==ID_with)
109  return convert_with(to_with_expr(expr));
110  else if(expr.id()==ID_update)
111  return convert_update(to_update_expr(expr));
112  else if(expr.id()==ID_case)
113  return convert_case(expr);
114  else if(expr.id()==ID_cond)
115  return convert_cond(to_cond_expr(expr));
116  else if(expr.id()==ID_if)
117  return convert_if(to_if_expr(expr));
118  else if(expr.id()==ID_constant)
119  return convert_constant(to_constant_expr(expr));
120  else if(expr.id()==ID_typecast)
122  else if(expr.id()==ID_symbol)
123  return convert_symbol(to_symbol_expr(expr));
124  else if(expr.id()==ID_plus || expr.id()==ID_minus ||
125  expr.id()=="no-overflow-plus" ||
126  expr.id()=="no-overflow-minus")
127  return convert_add_sub(expr);
128  else if(expr.id() == ID_mult)
129  return convert_mult(to_mult_expr(expr));
130  else if(expr.id()==ID_div)
131  return convert_div(to_div_expr(expr));
132  else if(expr.id()==ID_mod)
133  return convert_mod(to_mod_expr(expr));
134  else if(expr.id()==ID_shl || expr.id()==ID_ashr || expr.id()==ID_lshr ||
135  expr.id()==ID_rol || expr.id()==ID_ror)
136  return convert_shift(to_shift_expr(expr));
137  else if(
138  expr.id() == ID_floatbv_plus || expr.id() == ID_floatbv_minus ||
139  expr.id() == ID_floatbv_mult || expr.id() == ID_floatbv_div)
140  {
142  }
143  else if(expr.id() == ID_floatbv_mod)
145  else if(expr.id() == ID_floatbv_rem)
147  else if(expr.id()==ID_floatbv_typecast)
149  else if(expr.id()==ID_concatenation)
151  else if(expr.id()==ID_replication)
153  else if(expr.id()==ID_extractbits)
155  else if(expr.id()==ID_bitnot || expr.id()==ID_bitand ||
156  expr.id()==ID_bitor || expr.id()==ID_bitxor ||
157  expr.id()==ID_bitxnor || expr.id()==ID_bitnor ||
158  expr.id()==ID_bitnand)
159  return convert_bitwise(expr);
160  else if(expr.id() == ID_unary_minus)
162  else if(expr.id()==ID_unary_plus)
163  {
164  return convert_bitvector(to_unary_plus_expr(expr).op());
165  }
166  else if(expr.id()==ID_abs)
167  return convert_abs(to_abs_expr(expr));
168  else if(expr.id() == ID_bswap)
169  return convert_bswap(to_bswap_expr(expr));
170  else if(expr.id()==ID_byte_extract_little_endian ||
171  expr.id()==ID_byte_extract_big_endian)
173  else if(expr.id()==ID_byte_update_little_endian ||
174  expr.id()==ID_byte_update_big_endian)
176  else if(expr.id()==ID_nondet_symbol ||
177  expr.id()=="quant_symbol")
178  return convert_symbol(expr);
179  else if(expr.id()==ID_struct)
180  return convert_struct(to_struct_expr(expr));
181  else if(expr.id()==ID_union)
182  return convert_union(to_union_expr(expr));
183  else if(expr.id() == ID_empty_union)
185  else if(expr.id()==ID_string_constant)
186  return convert_bitvector(
188  else if(expr.id() == ID_named_term)
189  {
190  const auto &named_term_expr = to_named_term_expr(expr);
191  set_to_true(equal_exprt(named_term_expr.symbol(), named_term_expr.value()));
192  return convert_symbol(named_term_expr.symbol());
193  }
194  else if(expr.id()==ID_array)
195  return convert_array(expr);
196  else if(expr.id()==ID_vector)
197  return convert_vector(to_vector_expr(expr));
198  else if(expr.id()==ID_complex)
199  return convert_complex(to_complex_expr(expr));
200  else if(expr.id()==ID_complex_real)
202  else if(expr.id()==ID_complex_imag)
204  else if(expr.id() == ID_array_comprehension)
206  else if(expr.id()==ID_array_of)
207  return convert_array_of(to_array_of_expr(expr));
208  else if(expr.id()==ID_let)
209  return convert_let(to_let_expr(expr));
210  else if(expr.id()==ID_function_application)
213  else if(expr.id()==ID_reduction_or || expr.id()==ID_reduction_and ||
214  expr.id()==ID_reduction_nor || expr.id()==ID_reduction_nand ||
215  expr.id()==ID_reduction_xor || expr.id()==ID_reduction_xnor)
216  return convert_bv_reduction(to_unary_expr(expr));
217  else if(expr.id()==ID_not)
218  return convert_not(to_not_expr(expr));
219  else if(expr.id()==ID_power)
220  return convert_power(to_binary_expr(expr));
221  else if(expr.id() == ID_popcount)
222  return convert_bv(simplify_expr(to_popcount_expr(expr).lower(), ns));
223  else if(expr.id() == ID_count_leading_zeros)
224  {
225  return convert_bv(
227  }
228  else if(expr.id() == ID_count_trailing_zeros)
229  {
230  return convert_bv(
232  }
233  else if(expr.id() == ID_bitreverse)
235  else if(expr.id() == ID_saturating_minus || expr.id() == ID_saturating_plus)
237  else if(
238  const auto overflow_with_result =
239  expr_try_dynamic_cast<overflow_result_exprt>(expr))
240  {
241  return convert_overflow_result(*overflow_with_result);
242  }
243  else if(expr.id() == ID_find_first_set)
244  return convert_bv(simplify_expr(to_find_first_set_expr(expr).lower(), ns));
245 
246  return conversion_failed(expr);
247 }
248 
250 {
251  std::size_t width=boolbv_width(expr.type());
252 
253  const exprt &array_size = expr.type().size();
254 
255  const auto size = numeric_cast_v<mp_integer>(to_constant_expr(array_size));
256 
257  typet counter_type = expr.arg().type();
258 
259  bvt bv;
260  bv.resize(width);
261 
262  for(mp_integer i = 0; i < size; ++i)
263  {
264  exprt counter=from_integer(i, counter_type);
265 
266  exprt body = expr.instantiate({counter});
267 
268  const bvt &tmp = convert_bv(body);
269 
270  INVARIANT(
271  size * tmp.size() == width,
272  "total bitvector width shall equal the number of operands times the size "
273  "per operand");
274 
275  std::size_t offset = numeric_cast_v<std::size_t>(i * tmp.size());
276 
277  for(std::size_t j=0; j<tmp.size(); j++)
278  bv[offset+j]=tmp[j];
279  }
280 
281  return bv;
282 }
283 
285 {
286  const typet &type=expr.type();
287  std::size_t width=boolbv_width(type);
288 
289  const irep_idt &identifier = expr.get(ID_identifier);
290  CHECK_RETURN(!identifier.empty());
291 
292  bvt bv = map.get_literals(identifier, type, width);
293 
295  std::all_of(
296  bv.begin(),
297  bv.end(),
298  [this](const literalt &l) {
299  return l.var_no() < prop.no_variables() || l.is_constant();
300  }),
301  "variable number of non-constant literals should be within bounds",
302  id2string(identifier));
303 
304  return bv;
305 }
306 
307 
309  const function_application_exprt &expr)
310 {
311  // record
312  functions.record(expr);
313 
314  // make it free bits
315  return prop.new_variables(boolbv_width(expr.type()));
316 }
317 
318 
320 {
321  PRECONDITION(expr.type().id() == ID_bool);
322 
323  if(expr.id()==ID_typecast)
324  return convert_typecast(to_typecast_expr(expr));
325  else if(expr.id()==ID_equal)
326  return convert_equality(to_equal_expr(expr));
327  else if(expr.id()==ID_verilog_case_equality ||
328  expr.id()==ID_verilog_case_inequality)
330  else if(expr.id()==ID_notequal)
331  {
332  const auto &notequal_expr = to_notequal_expr(expr);
333  return !convert_equality(
334  equal_exprt(notequal_expr.lhs(), notequal_expr.rhs()));
335  }
336  else if(expr.id()==ID_ieee_float_equal ||
337  expr.id()==ID_ieee_float_notequal)
338  {
340  }
341  else if(expr.id()==ID_le || expr.id()==ID_ge ||
342  expr.id()==ID_lt || expr.id()==ID_gt)
343  {
345  }
346  else if(expr.id()==ID_extractbit)
348  else if(expr.id()==ID_forall)
350  else if(expr.id()==ID_exists)
352  else if(expr.id()==ID_let)
353  {
354  bvt bv=convert_let(to_let_expr(expr));
355 
356  DATA_INVARIANT(bv.size()==1,
357  "convert_let must return 1-bit vector for boolean let");
358 
359  return bv[0];
360  }
361  else if(expr.id()==ID_index)
362  {
363  bvt bv=convert_index(to_index_expr(expr));
364  CHECK_RETURN(bv.size() == 1);
365  return bv[0];
366  }
367  else if(expr.id()==ID_member)
368  {
370  CHECK_RETURN(bv.size() == 1);
371  return bv[0];
372  }
373  else if(expr.id()==ID_case)
374  {
375  bvt bv=convert_case(expr);
376  CHECK_RETURN(bv.size() == 1);
377  return bv[0];
378  }
379  else if(expr.id()==ID_cond)
380  {
381  bvt bv = convert_cond(to_cond_expr(expr));
382  CHECK_RETURN(bv.size() == 1);
383  return bv[0];
384  }
385  else if(expr.id()==ID_sign)
386  {
387  const auto &op = to_sign_expr(expr).op();
388  const bvt &bv = convert_bv(op);
389  CHECK_RETURN(!bv.empty());
390  const irep_idt type_id = op.type().id();
391  if(type_id == ID_signedbv || type_id == ID_fixedbv || type_id == ID_floatbv)
392  return bv[bv.size()-1];
393  if(type_id == ID_unsignedbv)
394  return const_literal(false);
395  }
396  else if(expr.id()==ID_reduction_or || expr.id()==ID_reduction_and ||
397  expr.id()==ID_reduction_nor || expr.id()==ID_reduction_nand ||
398  expr.id()==ID_reduction_xor || expr.id()==ID_reduction_xnor)
399  return convert_reduction(to_unary_expr(expr));
400  else if(expr.id()==ID_onehot || expr.id()==ID_onehot0)
401  return convert_onehot(to_unary_expr(expr));
402  else if(
403  const auto binary_overflow =
404  expr_try_dynamic_cast<binary_overflow_exprt>(expr))
405  {
406  return convert_binary_overflow(*binary_overflow);
407  }
408  else if(
409  const auto unary_overflow =
410  expr_try_dynamic_cast<unary_overflow_exprt>(expr))
411  {
412  return convert_unary_overflow(*unary_overflow);
413  }
414  else if(expr.id()==ID_isnan)
415  {
416  const auto &op = to_unary_expr(expr).op();
417  const bvt &bv = convert_bv(op);
418 
419  if(op.type().id() == ID_floatbv)
420  {
421  float_utilst float_utils(prop, to_floatbv_type(op.type()));
422  return float_utils.is_NaN(bv);
423  }
424  else if(op.type().id() == ID_fixedbv)
425  return const_literal(false);
426  }
427  else if(expr.id()==ID_isfinite)
428  {
429  const auto &op = to_unary_expr(expr).op();
430  const bvt &bv = convert_bv(op);
431 
432  if(op.type().id() == ID_floatbv)
433  {
434  float_utilst float_utils(prop, to_floatbv_type(op.type()));
435  return prop.land(
436  !float_utils.is_infinity(bv),
437  !float_utils.is_NaN(bv));
438  }
439  else if(op.id() == ID_fixedbv)
440  return const_literal(true);
441  }
442  else if(expr.id()==ID_isinf)
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 float_utils.is_infinity(bv);
451  }
452  else if(op.type().id() == ID_fixedbv)
453  return const_literal(false);
454  }
455  else if(expr.id()==ID_isnormal)
456  {
457  const auto &op = to_unary_expr(expr).op();
458 
459  if(op.type().id() == ID_floatbv)
460  {
461  const bvt &bv = convert_bv(op);
462  float_utilst float_utils(prop, to_floatbv_type(op.type()));
463  return float_utils.is_normal(bv);
464  }
465  else if(op.type().id() == ID_fixedbv)
466  return const_literal(true);
467  }
468  else if(expr.id() == ID_function_application)
469  {
471  return prop.new_variable();
472  }
473 
474  return SUB::convert_rest(expr);
475 }
476 
478 {
480  return true;
481 
482  const typet &type = expr.lhs().type();
483 
484  if(
485  expr.lhs().id() == ID_symbol && type == expr.rhs().type() &&
486  type.id() != ID_bool)
487  {
488  // see if it is an unbounded array
489  if(is_unbounded_array(type))
490  return true;
491 
492  const bvt &bv1=convert_bv(expr.rhs());
493 
494  const irep_idt &identifier=
496 
497  map.set_literals(identifier, type, bv1);
498 
499  if(freeze_all)
500  set_frozen(bv1);
501 
502  return false;
503  }
504 
505  return true;
506 }
507 
508 void boolbvt::set_to(const exprt &expr, bool value)
509 {
510  PRECONDITION(expr.type().id() == ID_bool);
511 
512  const auto equal_expr = expr_try_dynamic_cast<equal_exprt>(expr);
513  if(value && equal_expr && !boolbv_set_equality_to_true(*equal_expr))
514  return;
515  SUB::set_to(expr, value);
516 }
517 
518 bool boolbvt::is_unbounded_array(const typet &type) const
519 {
520  if(type.id()!=ID_array)
521  return false;
522 
524  return true;
525 
526  const auto &size_opt = bv_width.get_width_opt(type);
527  if(!size_opt.has_value())
528  return true;
529 
531  if(*size_opt > MAX_FLATTENED_ARRAY_SIZE)
532  return true;
533 
534  return false;
535 }
536 
538 {
539  // to ensure freshness of the new identifiers
540  scope_counter++;
541 
543  result.reserve(binding.variables().size());
544 
545  for(const auto &binding : binding.variables())
546  {
547  const auto &old_identifier = binding.get_identifier();
548 
549  // produce a new identifier
550  const irep_idt new_identifier =
551  "boolbvt::scope::" + std::to_string(scope_counter) +
552  "::" + id2string(old_identifier);
553 
554  result.emplace_back(new_identifier, binding.type());
555  }
556 
557  return result;
558 }
559 
560 void boolbvt::print_assignment(std::ostream &out) const
561 {
563  map.show(out);
564 }
565 
567 {
568  const struct_typet::componentst &components = src.components();
569  offset_mapt dest;
570  dest.reserve(components.size());
571  std::size_t offset = 0;
572  for(const auto &comp : components)
573  {
574  dest.push_back(offset);
575  offset += boolbv_width(comp.type());
576  }
577  return dest;
578 }
struct_union_typet::components
const componentst & components() const
Definition: std_types.h:147
boolbvt::convert_bv_typecast
virtual bvt convert_bv_typecast(const typecast_exprt &expr)
Definition: boolbv_typecast.cpp:20
dstringt
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
Definition: dstring.h:36
boolbvt::bv_width
boolbv_widtht bv_width
Definition: boolbv.h:116
boolbvt::unbounded_array
unbounded_arrayt unbounded_array
Definition: boolbv.h:88
to_array_comprehension_expr
const array_comprehension_exprt & to_array_comprehension_expr(const exprt &expr)
Cast an exprt to a array_comprehension_exprt.
Definition: std_expr.h:3418
to_vector_expr
const vector_exprt & to_vector_expr(const exprt &expr)
Cast an exprt to an vector_exprt.
Definition: std_expr.h:1692
prop_conv_solvert::equality_propagation
bool equality_propagation
Definition: prop_conv_solver.h:75
to_update_expr
const update_exprt & to_update_expr(const exprt &expr)
Cast an exprt to an update_exprt.
Definition: std_expr.h:2688
to_extractbit_expr
const extractbit_exprt & to_extractbit_expr(const exprt &expr)
Cast an exprt to an extractbit_exprt.
Definition: bitvector_expr.h:429
to_unary_expr
const unary_exprt & to_unary_expr(const exprt &expr)
Cast an exprt to a unary_exprt.
Definition: std_expr.h:361
boolbvt::map
boolbv_mapt map
Definition: boolbv.h:123
boolbvt::convert_member
virtual bvt convert_member(const member_exprt &expr)
Definition: boolbv_member.cpp:46
mp_integer
BigInt mp_integer
Definition: smt_terms.h:17
boolbvt::convert_bv_rel
virtual literalt convert_bv_rel(const binary_relation_exprt &)
Flatten <, >, <= and >= expressions.
Definition: boolbv_bv_rel.cpp:18
to_div_expr
const div_exprt & to_div_expr(const exprt &expr)
Cast an exprt to a div_exprt.
Definition: std_expr.h:1146
binary_exprt::rhs
exprt & rhs()
Definition: std_expr.h:623
boolbvt::convert_byte_update
virtual bvt convert_byte_update(const byte_update_exprt &expr)
Definition: boolbv_byte_update.cpp:17
arith_tools.h
mp_arith.h
to_array_expr
const array_exprt & to_array_expr(const exprt &expr)
Cast an exprt to an array_exprt.
Definition: std_expr.h:1603
boolbvt::convert_array_of
virtual bvt convert_array_of(const array_of_exprt &expr)
Flatten arrays constructed from a single element.
Definition: boolbv_array_of.cpp:16
boolbvt::convert_reduction
virtual literalt convert_reduction(const unary_exprt &expr)
Definition: boolbv_reduction.cpp:13
boolbvt::convert_cond
virtual bvt convert_cond(const cond_exprt &)
Definition: boolbv_cond.cpp:13
propt::new_variables
virtual bvt new_variables(std::size_t width)
generates a bitvector of given width with new variables
Definition: prop.cpp:20
boolbvt::convert_bitvector
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:97
boolbvt::is_unbounded_array
bool is_unbounded_array(const typet &type) const override
Definition: boolbv.cpp:518
CHECK_RETURN
#define CHECK_RETURN(CONDITION)
Definition: invariant.h:495
float_utilst
Definition: float_utils.h:17
typet
The type of an expression, extends irept.
Definition: type.h:28
float_utils.h
bvt
std::vector< literalt > bvt
Definition: literal.h:201
to_byte_extract_expr
const byte_extract_exprt & to_byte_extract_expr(const exprt &expr)
Definition: byte_operators.h:57
boolbvt::fresh_binding
binding_exprt::variablest fresh_binding(const binding_exprt &)
create new, unique variables for the given binding
Definition: boolbv.cpp:537
to_floatbv_type
const floatbv_typet & to_floatbv_type(const typet &type)
Cast a typet to a floatbv_typet.
Definition: bitvector_types.h:367
to_index_expr
const index_exprt & to_index_expr(const exprt &expr)
Cast an exprt to an index_exprt.
Definition: std_expr.h:1478
to_if_expr
const if_exprt & to_if_expr(const exprt &expr)
Cast an exprt to an if_exprt.
Definition: std_expr.h:2403
boolbvt::set_to
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:508
boolbvt::convert_complex
virtual bvt convert_complex(const complex_exprt &expr)
Definition: boolbv_complex.cpp:13
boolbv_mapt::get_literals
const bvt & get_literals(const irep_idt &identifier, const typet &type, std::size_t width)
Definition: boolbv_map.cpp:41
MAX_FLATTENED_ARRAY_SIZE
const std::size_t MAX_FLATTENED_ARRAY_SIZE
Definition: magic.h:11
boolbvt::convert_mod
virtual bvt convert_mod(const mod_exprt &expr)
Definition: boolbv_mod.cpp:12
to_string_constant
const string_constantt & to_string_constant(const exprt &expr)
Definition: string_constant.h:40
to_array_of_expr
const array_of_exprt & to_array_of_expr(const exprt &expr)
Cast an exprt to an array_of_exprt.
Definition: std_expr.h:1543
boolbvt::convert_vector
virtual bvt convert_vector(const vector_exprt &expr)
Definition: boolbv_vector.cpp:12
prop_conv_solvert::freeze_all
bool freeze_all
Definition: prop_conv_solver.h:76
boolbvt::convert_symbol
virtual bvt convert_symbol(const exprt &expr)
Definition: boolbv.cpp:284
propt::new_variable
virtual literalt new_variable()=0
string_constant.h
boolbvt::convert_index
virtual bvt convert_index(const exprt &array, const mp_integer &index)
index operator with constant index
Definition: boolbv_index.cpp:284
exprt
Base class for all expressions.
Definition: expr.h:55
to_complex_expr
const complex_exprt & to_complex_expr(const exprt &expr)
Cast an exprt to a complex_exprt.
Definition: std_expr.h:1907
binary_exprt::lhs
exprt & lhs()
Definition: std_expr.h:613
struct_union_typet::componentst
std::vector< componentt > componentst
Definition: std_types.h:140
decision_proceduret::set_to_true
void set_to_true(const exprt &expr)
For a Boolean expression expr, add the constraint 'expr'.
Definition: decision_procedure.cpp:23
to_union_expr
const union_exprt & to_union_expr(const exprt &expr)
Cast an exprt to a union_exprt.
Definition: std_expr.h:1754
boolbvt::convert_onehot
virtual literalt convert_onehot(const unary_exprt &expr)
Definition: boolbv_onehot.cpp:12
boolbvt::convert_abs
virtual bvt convert_abs(const abs_exprt &expr)
Definition: boolbv_abs.cpp:17
array_comprehension_exprt::arg
const symbol_exprt & arg() const
Definition: std_expr.h:3375
to_string
std::string to_string(const string_not_contains_constraintt &expr)
Used for debug printing.
Definition: string_constraint.cpp:58
boolbvt::convert_union
virtual bvt convert_union(const union_exprt &expr)
Definition: boolbv_union.cpp:11
configt::ansi_c
struct configt::ansi_ct ansi_c
boolbvt::convert_case
virtual bvt convert_case(const exprt &expr)
Definition: boolbv_case.cpp:13
propt::land
virtual literalt land(literalt a, literalt b)=0
equal_exprt
Equality.
Definition: std_expr.h:1305
magic.h
Magic numbers used throughout the codebase.
array_comprehension_exprt::type
const array_typet & type() const
Definition: std_expr.h:3365
boolbvt::functions
functionst functions
Definition: boolbv.h:120
to_popcount_expr
const popcount_exprt & to_popcount_expr(const exprt &expr)
Cast an exprt to a popcount_exprt.
Definition: bitvector_expr.h:685
boolbvt::convert_add_sub
virtual bvt convert_add_sub(const exprt &expr)
Definition: boolbv_add_sub.cpp:16
boolbvt::unbounded_arrayt::U_AUTO
@ U_AUTO
to_find_first_set_expr
const find_first_set_exprt & to_find_first_set_expr(const exprt &expr)
Cast an exprt to a find_first_set_exprt.
Definition: bitvector_expr.h:1489
boolbvt::convert_constant
virtual bvt convert_constant(const constant_exprt &expr)
Definition: boolbv_constant.cpp:13
boolbv_widtht::get_width_opt
virtual optionalt< std::size_t > get_width_opt(const typet &type) const
Definition: boolbv_width.h:31
literalt::unused_var_no
static var_not unused_var_no()
Definition: literal.h:176
boolbvt::convert_extractbit
virtual literalt convert_extractbit(const extractbit_exprt &expr)
Definition: boolbv_extractbit.cpp:19
boolbvt::convert_overflow_result
virtual bvt convert_overflow_result(const overflow_result_exprt &expr)
Definition: boolbv_overflow.cpp:194
boolbvt::convert_concatenation
virtual bvt convert_concatenation(const concatenation_exprt &expr)
Definition: boolbv_concatenation.cpp:14
to_floatbv_typecast_expr
const floatbv_typecast_exprt & to_floatbv_typecast_expr(const exprt &expr)
Cast an exprt to a floatbv_typecast_exprt.
Definition: floatbv_expr.h:68
irept::get
const irep_idt & get(const irep_idt &name) const
Definition: irep.cpp:45
prop_conv_solvert::ignoring
virtual void ignoring(const exprt &expr)
Definition: prop_conv_solver.cpp:433
to_unary_plus_expr
const unary_plus_exprt & to_unary_plus_expr(const exprt &expr)
Cast an exprt to a unary_plus_exprt.
Definition: std_expr.h:497
to_complex_real_expr
const complex_real_exprt & to_complex_real_expr(const exprt &expr)
Cast an exprt to a complex_real_exprt.
Definition: std_expr.h:1952
float_utilst::is_infinity
literalt is_infinity(const bvt &)
Definition: float_utils.cpp:673
to_binary_expr
const binary_exprt & to_binary_expr(const exprt &expr)
Cast an exprt to a binary_exprt.
Definition: std_expr.h:660
binding_exprt::variables
variablest & variables()
Definition: std_expr.h:3073
INVARIANT_WITH_DIAGNOSTICS
#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
to_bswap_expr
const bswap_exprt & to_bswap_expr(const exprt &expr)
Cast an exprt to a bswap_exprt.
Definition: bitvector_expr.h:63
array_typet::size
const exprt & size() const
Definition: std_types.h:800
boolbvt::convert_mult
virtual bvt convert_mult(const mult_exprt &expr)
Definition: boolbv_mult.cpp:13
boolbvt::convert_shift
virtual bvt convert_shift(const binary_exprt &expr)
Definition: boolbv_shift.cpp:15
string2int.h
exprt::type
typet & type()
Return the type of the expression.
Definition: expr.h:84
prop_conv_solvert::set_frozen
void set_frozen(literalt)
Definition: prop_conv_solver.cpp:30
boolbvt::convert_byte_extract
virtual bvt convert_byte_extract(const byte_extract_exprt &expr)
Definition: boolbv_byte_extract.cpp:35
boolbvt::boolbv_set_equality_to_true
virtual bool boolbv_set_equality_to_true(const equal_exprt &expr)
Definition: boolbv.cpp:477
configt::ansi_ct::endiannesst::IS_LITTLE_ENDIAN
@ IS_LITTLE_ENDIAN
byte_operators.h
Expression classes for byte-level operators.
to_cond_expr
const cond_exprt & to_cond_expr(const exprt &expr)
Cast an exprt to a cond_exprt.
Definition: std_expr.h:3325
boolbvt::convert_array
virtual bvt convert_array(const exprt &expr)
Flatten array.
Definition: boolbv_array.cpp:16
boolbv_mapt::show
void show(std::ostream &out) const
Definition: boolbv_map.cpp:35
float_utilst::is_normal
literalt is_normal(const bvt &)
Definition: float_utils.cpp:219
to_mod_expr
const mod_exprt & to_mod_expr(const exprt &expr)
Cast an exprt to a mod_exprt.
Definition: std_expr.h:1217
functionst::record
void record(const function_application_exprt &function_application)
Definition: functions.cpp:15
boolbvt::bv_cache
bv_cachet bv_cache
Definition: boolbv.h:135
DATA_INVARIANT
#define DATA_INVARIANT(CONDITION, REASON)
This condition should be used to document that assumptions that are made on goto_functions,...
Definition: invariant.h:510
to_mult_expr
const mult_exprt & to_mult_expr(const exprt &expr)
Cast an exprt to a mult_exprt.
Definition: std_expr.h:1077
boolbvt::convert_extractbits
virtual bvt convert_extractbits(const extractbits_exprt &expr)
Definition: boolbv_extractbits.cpp:14
id2string
const std::string & id2string(const irep_idt &d)
Definition: irep.h:47
boolbvt::boolbv_width
virtual std::size_t boolbv_width(const typet &type) const
Definition: boolbv.h:102
boolbvt::convert_bv
virtual const bvt & convert_bv(const exprt &expr, const optionalt< 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
to_byte_update_expr
const byte_update_exprt & to_byte_update_expr(const exprt &expr)
Definition: byte_operators.h:117
to_empty_union_expr
const empty_union_exprt & to_empty_union_expr(const exprt &expr)
Cast an exprt to an empty_union_exprt.
Definition: std_expr.h:1800
PRECONDITION
#define PRECONDITION(CONDITION)
Definition: invariant.h:463
exprt::find_source_location
const source_locationt & find_source_location() const
Get a source_locationt from the expression or from its operands (non-recursively).
Definition: expr.cpp:165
boolbvt::convert_empty_union
virtual bvt convert_empty_union(const empty_union_exprt &expr)
Definition: boolbv_union.cpp:38
symbol_exprt::get_identifier
const irep_idt & get_identifier() const
Definition: std_expr.h:142
boolbvt::convert_floatbv_typecast
virtual bvt convert_floatbv_typecast(const floatbv_typecast_exprt &expr)
Definition: boolbv_floatbv_op.cpp:20
boolbvt::convert_bitreverse
virtual bvt convert_bitreverse(const bitreverse_exprt &expr)
Definition: boolbv_bitreverse.cpp:13
boolbvt::convert_verilog_case_equality
virtual literalt convert_verilog_case_equality(const binary_relation_exprt &expr)
Definition: boolbv_equality.cpp:60
arrayst::ns
const namespacet & ns
Definition: arrays.h:56
bitvector_types.h
boolbvt::convert_if
virtual bvt convert_if(const if_exprt &expr)
Definition: boolbv_if.cpp:12
boolbvt::convert_complex_real
virtual bvt convert_complex_real(const complex_real_exprt &expr)
Definition: boolbv_complex.cpp:37
to_let_expr
const let_exprt & to_let_expr(const exprt &expr)
Cast an exprt to a let_exprt.
Definition: std_expr.h:3266
boolbvt::convert_ieee_float_rel
virtual literalt convert_ieee_float_rel(const binary_relation_exprt &)
Definition: boolbv_ieee_float_rel.cpp:17
boolbvt::scope_counter
std::size_t scope_counter
Definition: boolbv.h:280
function_application_exprt
Application of (mathematical) function.
Definition: mathematical_expr.h:196
const_literal
literalt const_literal(bool value)
Definition: literal.h:188
to_notequal_expr
const notequal_exprt & to_notequal_expr(const exprt &expr)
Cast an exprt to an notequal_exprt.
Definition: std_expr.h:1390
binding_exprt::variablest
std::vector< symbol_exprt > variablest
Definition: std_expr.h:3054
simplify_expr
exprt simplify_expr(exprt src, const namespacet &ns)
Definition: simplify_expr.cpp:2931
to_unary_minus_expr
const unary_minus_exprt & to_unary_minus_expr(const exprt &expr)
Cast an exprt to a unary_minus_exprt.
Definition: std_expr.h:453
to_symbol_expr
const symbol_exprt & to_symbol_expr(const exprt &expr)
Cast an exprt to a symbol_exprt.
Definition: std_expr.h:222
boolbvt::convert_bv_reduction
virtual bvt convert_bv_reduction(const unary_exprt &expr)
Definition: boolbv_reduction.cpp:54
float_utilst::is_NaN
literalt is_NaN(const bvt &)
Definition: float_utils.cpp:701
boolbvt::convert_saturating_add_sub
virtual bvt convert_saturating_add_sub(const binary_exprt &expr)
Definition: boolbv_add_sub.cpp:143
irept::id
const irep_idt & id() const
Definition: irep.h:396
propt::set_frozen
virtual void set_frozen(literalt)
Definition: prop.h:112
binding_exprt
A base class for variable bindings (quantifiers, let, lambda)
Definition: std_expr.h:3051
dstringt::empty
bool empty() const
Definition: dstring.h:88
to_count_trailing_zeros_expr
const count_trailing_zeros_exprt & to_count_trailing_zeros_expr(const exprt &expr)
Cast an exprt to a count_trailing_zeros_exprt.
Definition: bitvector_expr.h:1136
floatbv_expr.h
unary_exprt::op
const exprt & op() const
Definition: std_expr.h:326
boolbvt::convert_constraint_select_one
virtual bvt convert_constraint_select_one(const exprt &expr)
Definition: boolbv_constraint_select_one.cpp:12
boolbvt::convert_bswap
virtual bvt convert_bswap(const bswap_exprt &expr)
Definition: boolbv_bswap.cpp:13
to_complex_imag_expr
const complex_imag_exprt & to_complex_imag_expr(const exprt &expr)
Cast an exprt to a complex_imag_exprt.
Definition: std_expr.h:1997
optionalt
nonstd::optional< T > optionalt
Definition: optional.h:35
to_shift_expr
const shift_exprt & to_shift_expr(const exprt &expr)
Cast an exprt to a shift_exprt.
Definition: bitvector_expr.h:278
prop_conv_solvert::convert
literalt convert(const exprt &expr) override
Convert a Boolean expression and return the corresponding literal.
Definition: prop_conv_solver.cpp:156
to_with_expr
const with_exprt & to_with_expr(const exprt &expr)
Cast an exprt to a with_exprt.
Definition: std_expr.h:2486
prop_conv_solvert::convert_rest
virtual literalt convert_rest(const exprt &expr)
Definition: prop_conv_solver.cpp:315
config
configt config
Definition: config.cpp:25
simplify_expr.h
to_ieee_float_op_expr
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
irep_pretty_diagnosticst
Definition: irep.h:502
to_concatenation_expr
const concatenation_exprt & to_concatenation_expr(const exprt &expr)
Cast an exprt to a concatenation_exprt.
Definition: bitvector_expr.h:636
boolbvt::convert_let
virtual bvt convert_let(const let_exprt &)
Definition: boolbv_let.cpp:15
boolbvt::convert_bitwise
virtual bvt convert_bitwise(const exprt &expr)
Definition: boolbv_bitwise.cpp:13
boolbvt::convert_floatbv_op
virtual bvt convert_floatbv_op(const ieee_float_op_exprt &)
Definition: boolbv_floatbv_op.cpp:86
struct_typet
Structure type, corresponds to C style structs.
Definition: std_types.h:230
boolbvt::convert_struct
virtual bvt convert_struct(const struct_exprt &expr)
Definition: boolbv_struct.cpp:13
to_quantifier_expr
const quantifier_exprt & to_quantifier_expr(const exprt &expr)
Cast an exprt to a quantifier_exprt.
Definition: mathematical_expr.h:319
to_sign_expr
const sign_exprt & to_sign_expr(const exprt &expr)
Cast an exprt to a sign_exprt.
Definition: std_expr.h:564
to_not_expr
const not_exprt & to_not_expr(const exprt &expr)
Cast an exprt to an not_exprt.
Definition: std_expr.h:2303
to_bitreverse_expr
const bitreverse_exprt & to_bitreverse_expr(const exprt &expr)
Cast an exprt to a bitreverse_exprt.
Definition: bitvector_expr.h:1186
boolbvt::convert_binary_overflow
virtual literalt convert_binary_overflow(const binary_overflow_exprt &expr)
Definition: boolbv_overflow.cpp:114
from_integer
constant_exprt from_integer(const mp_integer &int_value, const typet &type)
Definition: arith_tools.cpp:100
to_typecast_expr
const typecast_exprt & to_typecast_expr(const exprt &expr)
Cast an exprt to a typecast_exprt.
Definition: std_expr.h:2051
boolbvt::unbounded_arrayt::U_ALL
@ U_ALL
binding_exprt::instantiate
exprt instantiate(const exprt::operandst &) const
substitute free occurrences of the variables in where() by the given values
Definition: std_expr.cpp:262
literalt
Definition: literal.h:25
to_equal_expr
const equal_exprt & to_equal_expr(const exprt &expr)
Cast an exprt to an equal_exprt.
Definition: std_expr.h:1347
prop_conv_solvert::print_assignment
void print_assignment(std::ostream &out) const override
Print satisfying assignment to out.
Definition: prop_conv_solver.cpp:501
endianness_mapt
Maps a big-endian offset to a little-endian offset.
Definition: endianness_map.h:30
config.h
boolbvt::convert_equality
virtual literalt convert_equality(const equal_exprt &expr)
Definition: boolbv_equality.cpp:16
to_extractbits_expr
const extractbits_exprt & to_extractbits_expr(const exprt &expr)
Cast an exprt to an extractbits_exprt.
Definition: bitvector_expr.h:517
boolbvt::convert_unary_minus
virtual bvt convert_unary_minus(const unary_minus_exprt &expr)
Definition: boolbv_unary_minus.cpp:20
to_member_expr
const member_exprt & to_member_expr(const exprt &expr)
Cast an exprt to a member_exprt.
Definition: std_expr.h:2886
boolbvt::conversion_failed
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:83
boolbvt::convert_replication
virtual bvt convert_replication(const replication_exprt &expr)
Definition: boolbv_replication.cpp:14
boolbvt::convert_quantifier
virtual literalt convert_quantifier(const quantifier_exprt &expr)
Definition: boolbv_quantifier.cpp:249
boolbv.h
to_named_term_expr
const named_term_exprt & to_named_term_expr(const exprt &expr)
Cast an exprt to a named_term_exprt.
Definition: std_expr.h:3602
boolbvt::convert_array_comprehension
virtual bvt convert_array_comprehension(const array_comprehension_exprt &)
Definition: boolbv.cpp:249
boolbvt::endianness_map
virtual endianness_mapt endianness_map(const typet &type, bool little_endian) const
Definition: boolbv.h:108
boolbvt::convert_floatbv_mod_rem
virtual bvt convert_floatbv_mod_rem(const binary_exprt &)
Definition: boolbv_floatbv_mod_rem.cpp:15
boolbvt::convert_not
virtual bvt convert_not(const not_exprt &expr)
Definition: boolbv_not.cpp:13
boolbvt::convert_typecast
virtual literalt convert_typecast(const typecast_exprt &expr)
conversion from bitvector types to boolean
Definition: boolbv_typecast.cpp:620
boolbvt::offset_mapt
std::vector< std::size_t > offset_mapt
Definition: boolbv.h:273
boolbvt::build_offset_map
offset_mapt build_offset_map(const struct_typet &src)
Definition: boolbv.cpp:566
array_comprehension_exprt
Expression to define a mapping from an argument (index) to elements.
Definition: std_expr.h:3350
boolbvt::convert_unary_overflow
virtual literalt convert_unary_overflow(const unary_overflow_exprt &expr)
Definition: boolbv_overflow.cpp:180
boolbvt::convert_rest
literalt convert_rest(const exprt &expr) override
Definition: boolbv.cpp:319
boolbvt::convert_power
virtual bvt convert_power(const binary_exprt &expr)
Definition: boolbv_power.cpp:12
std_expr.h
to_binary_relation_expr
const binary_relation_exprt & to_binary_relation_expr(const exprt &expr)
Cast an exprt to a binary_relation_exprt.
Definition: std_expr.h:840
boolbvt::convert_function_application
virtual bvt convert_function_application(const function_application_exprt &expr)
Definition: boolbv.cpp:308
boolbvt::convert_div
virtual bvt convert_div(const div_exprt &expr)
Definition: boolbv_div.cpp:13
to_function_application_expr
const function_application_exprt & to_function_application_expr(const exprt &expr)
Cast an exprt to a function_application_exprt.
Definition: mathematical_expr.h:247
boolbvt::print_assignment
void print_assignment(std::ostream &out) const override
Print satisfying assignment to out.
Definition: boolbv.cpp:560
configt::ansi_ct::endianness
endiannesst endianness
Definition: config.h:192
to_count_leading_zeros_expr
const count_leading_zeros_exprt & to_count_leading_zeros_expr(const exprt &expr)
Cast an exprt to a count_leading_zeros_exprt.
Definition: bitvector_expr.h:1043
bitvector_expr.h
to_replication_expr
const replication_exprt & to_replication_expr(const exprt &expr)
Cast an exprt to a replication_exprt.
Definition: bitvector_expr.h:585
prop_conv_solvert::set_to
void set_to(const exprt &expr, bool value) override
For a Boolean expression expr, add the constraint 'current_context => expr' if value is true,...
Definition: prop_conv_solver.cpp:514
to_struct_expr
const struct_exprt & to_struct_expr(const exprt &expr)
Cast an exprt to a struct_exprt.
Definition: std_expr.h:1842
validation_modet::INVARIANT
@ INVARIANT
to_abs_expr
const abs_exprt & to_abs_expr(const exprt &expr)
Cast an exprt to a abs_exprt.
Definition: std_expr.h:403
prop_conv_solvert::prop
propt & prop
Definition: prop_conv_solver.h:130
boolbv_mapt::set_literals
void set_literals(const irep_idt &identifier, const typet &type, const bvt &literals)
Definition: boolbv_map.cpp:75
boolbvt::convert_update
virtual bvt convert_update(const update_exprt &)
Definition: boolbv_update.cpp:15
to_constant_expr
const constant_exprt & to_constant_expr(const exprt &expr)
Cast an exprt to a constant_exprt.
Definition: std_expr.h:2992
boolbvt::convert_with
virtual bvt convert_with(const with_exprt &expr)
Definition: boolbv_with.cpp:16
boolbvt::convert_complex_imag
virtual bvt convert_complex_imag(const complex_imag_exprt &expr)
Definition: boolbv_complex.cpp:48