CBMC
Loading...
Searching...
No Matches
boolbv.h
Go to the documentation of this file.
1/*******************************************************************\
2
3Module:
4
5Author: Daniel Kroening, kroening@kroening.com
6
7\*******************************************************************/
8
9
10#ifndef CPROVER_SOLVERS_FLATTENING_BOOLBV_H
11#define CPROVER_SOLVERS_FLATTENING_BOOLBV_H
12
13//
14// convert expression to boolean formula
15//
16
17#include <util/endianness_map.h>
18#include <util/expr.h>
19#include <util/mp_arith.h>
20
22
23#include "arrays.h"
24#include "boolbv_map.h"
25#include "boolbv_width.h"
26#include "bv_utils.h" // IWYU pragma: keep
27
30class bswap_exprt;
41class popcount_exprt;
42class power_exprt;
45class union_typet;
48
49class boolbvt:public arrayst
50{
51public:
65
66 virtual const bvt &convert_bv( // check cache
67 const exprt &expr,
68 const std::optional<std::size_t> expected_width = {});
69
70 virtual bvt convert_bitvector(const exprt &expr); // no cache
71
72 // overloading
73 exprt get(const exprt &expr) const override;
74 void set_to(const exprt &expr, bool value) override;
75 void print_assignment(std::ostream &out) const override;
76 exprt handle(const exprt &) override;
77
78 void clear_cache() override
79 {
81 bv_cache.clear();
82 }
83
90
93
95 {
96 return get_value(bv, 0, bv.size());
97 }
98
99 mp_integer get_value(const bvt &bv, std::size_t offset, std::size_t width);
100
101 const boolbv_mapt &get_map() const
102 {
103 return map;
104 }
105
106 virtual std::size_t boolbv_width(const typet &type) const
107 {
108 return bv_width(type);
109 }
110
111 virtual endianness_mapt
112 endianness_map(const typet &type, bool little_endian) const
113 {
114 return endianness_mapt{type, little_endian, ns};
115 }
116
117 virtual endianness_mapt endianness_map(const typet &type) const;
118
119protected:
122
123 // uninterpreted functions
125
126 // the mapping from identifiers to literals
128
129 // overloading
130 literalt convert_rest(const exprt &expr) override;
131 virtual bool boolbv_set_equality_to_true(const equal_exprt &expr);
132
133 // NOLINTNEXTLINE(readability/identifiers)
134 typedef arrayst SUB;
135
136 bvt conversion_failed(const exprt &expr);
137
138 typedef std::unordered_map<const exprt, bvt, irep_hash> bv_cachet;
140
141 bool type_conversion(
142 const typet &src_type, const bvt &src,
143 const typet &dest_type, bvt &dest);
144
146 virtual literalt convert_typecast(const typecast_exprt &expr);
147 virtual literalt convert_reduction(const unary_exprt &expr);
148 virtual literalt convert_onehot(const unary_exprt &expr);
149 virtual literalt convert_extractbit(const extractbit_exprt &expr);
152 virtual literalt convert_equality(const equal_exprt &expr);
154 const binary_relation_exprt &expr);
156 virtual literalt convert_quantifier(const quantifier_exprt &expr);
157
158 virtual bvt convert_index(const exprt &array, const mp_integer &index);
159 virtual bvt convert_index(const index_exprt &expr);
160 virtual bvt convert_bswap(const bswap_exprt &expr);
161 virtual bvt convert_byte_extract(const byte_extract_exprt &expr);
162 virtual bvt convert_byte_update(const byte_update_exprt &expr);
163 virtual bvt convert_constraint_select_one(const exprt &expr);
164 virtual bvt convert_if(const if_exprt &expr);
165 virtual bvt convert_struct(const struct_exprt &expr);
166 virtual bvt convert_array(const exprt &expr);
167 virtual bvt convert_complex(const complex_exprt &expr);
168 virtual bvt convert_complex_real(const complex_real_exprt &expr);
169 virtual bvt convert_complex_imag(const complex_imag_exprt &expr);
171 virtual bvt convert_let(const let_exprt &);
172 virtual bvt convert_array_of(const array_of_exprt &expr);
173 virtual bvt convert_union(const union_exprt &expr);
174 virtual bvt convert_empty_union(const empty_union_exprt &expr);
175 virtual bvt convert_bv_typecast(const typecast_exprt &expr);
176 virtual bvt convert_add_sub(const exprt &expr);
177 virtual bvt convert_mult(const mult_exprt &expr);
178 virtual bvt convert_div(const div_exprt &expr);
179 virtual bvt convert_mod(const mod_exprt &expr);
184 virtual bvt
186 virtual bvt convert_member(const member_exprt &expr);
187 virtual bvt convert_with(const with_exprt &expr);
188 virtual bvt convert_update(const update_exprt &);
189 virtual bvt convert_update_bit(const update_bit_exprt &);
191 virtual bvt convert_case(const case_exprt &);
192 virtual bvt convert_cond(const cond_exprt &);
193 virtual bvt convert_shift(const binary_exprt &expr);
194 virtual bvt convert_bitwise(const exprt &expr);
195 virtual bvt convert_unary_minus(const unary_minus_exprt &expr);
196 virtual bvt convert_abs(const abs_exprt &expr);
197 virtual bvt convert_concatenation(const concatenation_exprt &expr);
198 virtual bvt convert_replication(const replication_exprt &expr);
199 virtual bvt convert_constant(const constant_exprt &expr);
200 virtual bvt convert_extractbits(const extractbits_exprt &expr);
201 virtual bvt convert_symbol(const exprt &expr);
202 virtual bvt convert_bv_reduction(const unary_exprt &expr);
203 virtual bvt convert_not(const not_exprt &expr);
204 virtual bvt convert_power(const power_exprt &expr);
206 const function_application_exprt &expr);
207 virtual bvt convert_bitreverse(const bitreverse_exprt &expr);
208 virtual bvt convert_saturating_add_sub(const binary_exprt &expr);
210 virtual bvt convert_popcount(const popcount_exprt &expr);
211
212 bvt convert_update_bits(bvt src, const exprt &index, const bvt &new_value);
213
214 void convert_with(
215 const typet &type,
216 const exprt &where,
217 const exprt &new_value,
218 const bvt &prev_bv,
219 bvt &next_bv);
220
222 const exprt &index,
223 const exprt &new_value,
224 const bvt &prev_bv,
225 bvt &next_bv);
226
228 const array_typet &type,
229 const exprt &index,
230 const exprt &new_value,
231 const bvt &prev_bv,
232 bvt &next_bv);
233
235 const union_typet &type,
236 const exprt &new_value,
237 const bvt &prev_bv,
238 bvt &next_bv);
239
241 const struct_typet &type,
242 const exprt &where,
243 const exprt &new_value,
244 const bvt &prev_bv,
245 bvt &next_bv);
246
248 const exprt::operandst &designator,
249 std::size_t d,
250 const typet &type,
251 std::size_t offset,
252 const exprt &new_value,
253 bvt &bv);
254
255 virtual exprt bv_get_unbounded_array(const exprt &) const;
256
257 virtual exprt
258 bv_get_rec(const exprt &expr, const bvt &bv, std::size_t offset) const;
259
260 exprt bv_get(const bvt &bv, const typet &type) const;
261 exprt bv_get_cache(const exprt &expr) const;
262
267 exprt get_value(const exprt &expr) const;
268
269 // unbounded arrays
270 bool is_unbounded_array(const typet &type) const override;
271
272 // quantifier instantiations
274 {
275 public:
277 : expr(std::move(_expr)), l(std::move(_l))
278 {
279 }
280
283 };
284
285 typedef std::list<quantifiert> quantifier_listt;
287
289
290 typedef std::vector<std::size_t> offset_mapt;
292
293 // strings
295
296 // scopes
297 std::size_t scope_counter = 0;
298
301};
302
303#endif // CPROVER_SOLVERS_FLATTENING_BOOLBV_H
Theory of Arrays with Extensionality.
Absolute value.
Definition std_expr.h:440
ait supplies three of the four components needed: an abstract interpreter (in this case handling func...
Definition ai.h:566
Expression to define a mapping from an argument (index) to elements.
Definition std_expr.h:3586
Array constructor from single element.
Definition std_expr.h:1512
Arrays with given size.
Definition std_types.h:807
const namespacet & ns
Definition arrays.h:63
message_handlert & message_handler
Definition arrays.h:65
void finish_eager_conversion() override
Definition arrays.h:42
bool get_array_constraints
Definition arrays.h:121
A base class for binary expressions.
Definition std_expr.h:649
A Boolean expression returning true, iff operation kind would result in an overflow when applied to o...
A base class for relations, i.e., binary predicates whose two operands have the same type.
Definition std_expr.h:784
A base class for variable bindings (quantifiers, let, lambda)
Definition std_expr.h:3170
std::vector< symbol_exprt > variablest
Definition std_expr.h:3172
Reverse the order of bits in a bit-vector.
quantifiert(exprt _expr, literalt _l)
Definition boolbv.h:276
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:139
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:40
std::size_t scope_counter
Definition boolbv.h:297
virtual bvt convert_constraint_select_one(const exprt &expr)
void convert_update_rec(const exprt::operandst &designator, std::size_t d, const typet &type, std::size_t offset, const exprt &new_value, bvt &bv)
virtual bvt convert_power(const power_exprt &expr)
virtual bvt convert_complex_imag(const complex_imag_exprt &expr)
virtual literalt convert_reduction(const unary_exprt &expr)
virtual bvt convert_popcount(const popcount_exprt &expr)
virtual literalt convert_ieee_float_rel(const binary_relation_exprt &)
std::unordered_map< const exprt, bvt, irep_hash > bv_cachet
Definition boolbv.h:138
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:590
void convert_with_array(const array_typet &type, const exprt &index, const exprt &new_value, const bvt &prev_bv, bvt &next_bv)
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:109
unbounded_arrayt
Definition boolbv.h:91
binding_exprt::variablest fresh_binding(const binding_exprt &)
create new, unique variables for the given binding
Definition boolbv.cpp:561
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:542
bvt convert_update_bits(bvt src, const exprt &index, const bvt &new_value)
void finish_eager_conversion_quantifiers()
exprt bv_get(const bvt &bv, const typet &type) const
virtual bvt convert_mod(const mod_exprt &expr)
virtual bvt convert_add_sub(const exprt &expr)
virtual bvt convert_constant(const constant_exprt &expr)
numberingt< irep_idt > string_numbering
Definition boolbv.h:294
virtual literalt convert_quantifier(const quantifier_exprt &expr)
void convert_with_union(const union_typet &type, const exprt &new_value, const bvt &prev_bv, bvt &next_bv)
boolbvt(const namespacet &_ns, propt &_prop, message_handlert &message_handler, bool get_array_constraints=false)
Definition boolbv.h:52
virtual bool boolbv_set_equality_to_true(const equal_exprt &expr)
Definition boolbv.cpp:502
virtual exprt bv_get_unbounded_array(const exprt &) const
virtual exprt bv_get_rec(const exprt &expr, const bvt &bv, std::size_t offset) const
virtual bvt convert_update_bits(const update_bits_exprt &)
void clear_cache() override
Definition boolbv.h:78
virtual bvt convert_mult(const mult_exprt &expr)
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:84
virtual bvt convert_member(const member_exprt &expr)
virtual bvt convert_case(const case_exprt &)
virtual literalt convert_verilog_case_equality(const binary_relation_exprt &expr)
virtual bvt convert_function_application(const function_application_exprt &expr)
Definition boolbv.cpp:331
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:532
virtual bvt convert_byte_update(const byte_update_exprt &expr)
boolbv_widtht bv_width
Definition boolbv.h:120
virtual literalt convert_extractbit(const extractbit_exprt &expr)
const boolbv_mapt & get_map() const
Definition boolbv.h:101
std::list< quantifiert > quantifier_listt
Definition boolbv.h:285
unbounded_arrayt unbounded_array
Definition boolbv.h:92
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:584
virtual bvt convert_not(const not_exprt &expr)
exprt bv_get_cache(const exprt &expr) const
virtual bvt convert_extractbits(const extractbits_exprt &expr)
virtual bvt convert_shift(const binary_exprt &expr)
virtual bvt convert_update(const update_exprt &)
void finish_eager_conversion() override
Definition boolbv.h:84
virtual bvt convert_unary_minus(const unary_minus_exprt &expr)
virtual bvt convert_div(const div_exprt &expr)
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.
bv_utilst bv_utils
Definition boolbv.h:121
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:272
virtual bvt convert_bv_reduction(const unary_exprt &expr)
virtual literalt convert_equality(const equal_exprt &expr)
functionst functions
Definition boolbv.h:124
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:95
quantifier_listt quantifier_list
Definition boolbv.h:286
virtual endianness_mapt endianness_map(const typet &type, bool little_endian) const
Definition boolbv.h:112
virtual literalt convert_unary_overflow(const unary_overflow_exprt &expr)
virtual std::size_t boolbv_width(const typet &type) const
Definition boolbv.h:106
virtual bvt convert_symbol(const exprt &expr)
Definition boolbv.cpp:307
virtual bvt convert_update_bit(const update_bit_exprt &)
void convert_with_bv(const exprt &index, const exprt &new_value, const bvt &prev_bv, bvt &next_bv)
virtual bvt convert_floatbv_typecast(const floatbv_typecast_exprt &expr)
arrayst SUB
Definition boolbv.h:134
virtual bvt convert_floatbv_fma(const floatbv_fma_exprt &)
virtual bvt convert_bv_typecast(const typecast_exprt &expr)
mp_integer get_value(const bvt &bv)
Definition boolbv.h:94
bool type_conversion(const typet &src_type, const bvt &src, const typet &dest_type, bvt &dest)
virtual bvt convert_concatenation(const concatenation_exprt &expr)
virtual bvt convert_struct(const struct_exprt &expr)
void convert_with_struct(const struct_typet &type, const exprt &where, const exprt &new_value, const bvt &prev_bv, bvt &next_bv)
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:342
virtual bvt convert_floatbv_round_to_integral(const floatbv_round_to_integral_exprt &)
std::vector< std::size_t > offset_mapt
Definition boolbv.h:290
virtual bvt convert_abs(const abs_exprt &expr)
boolbv_mapt map
Definition boolbv.h:127
The byte swap expression.
Expression of type type extracted from some object op starting at position offset (given in number of...
Expression corresponding to op() where the bytes starting at position offset (given in number of byte...
Case expression: evaluates to the value corresponding to the first matching case.
Definition std_expr.h:3466
Complex constructor from a pair of numbers.
Definition std_expr.h:1859
Imaginary part of the expression describing a complex number.
Definition std_expr.h:1957
Real part of the expression describing a complex number.
Definition std_expr.h:1920
Concatenation of bit-vector operands.
this is a parametric version of an if-expression: it returns the value of the first case (using the o...
Definition std_expr.h:3403
A constant literal expression.
Definition std_expr.h:3007
Division.
Definition std_expr.h:1152
Union constructor to support unions without any member (a GCC/Clang feature).
Definition std_expr.h:1783
Maps a big-endian offset to a little-endian offset.
Equality.
Definition std_expr.h:1339
Base class for all expressions.
Definition expr.h:57
std::vector< exprt > operandst
Definition expr.h:59
Extracts a single bit of a bit-vector operand.
Extracts a sub-range of a bit-vector operand.
Fused multiply-add expression: round(op0 * op1 + op2) with a single rounding.
Round a floating-point number to an integral value considering the given rounding mode.
Semantic type conversion from/to floating-point formats.
Application of (mathematical) function.
virtual void finish_eager_conversion()
Definition functions.h:36
IEEE floating-point operations These have two data operands (op0 and op1) and one rounding mode (op2)...
The trinary if-then-else operator.
Definition std_expr.h:2426
Array index operator.
Definition std_expr.h:1431
A let expression.
Definition std_expr.h:3259
Extract member of struct or union.
Definition std_expr.h:2866
Modulo defined as lhs-(rhs * truncate(lhs/rhs)).
Definition std_expr.h:1216
Binary multiplication Associativity is not specified.
Definition std_expr.h:1104
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
Definition namespace.h:91
Boolean negation.
Definition std_expr.h:2388
An expression returning both the result of the arithmetic operation under wrap-around semantics as we...
The popcount (counting the number of bits set to 1) expression.
Exponentiation.
virtual void clear_cache()
TO_BE_DOCUMENTED.
Definition prop.h:25
A base class for quantifier expressions.
Bit-vector replication.
Struct constructor from list of elements.
Definition std_expr.h:1820
Structure type, corresponds to C style structs.
Definition std_types.h:231
Semantic type conversion.
Definition std_expr.h:1995
The type of an expression, extends irept.
Definition type.h:29
Generic base class for unary expressions.
Definition std_expr.h:364
The unary minus expression.
Definition std_expr.h:477
A Boolean expression returning true, iff operation kind would result in an overflow when applied to t...
Union constructor from single element.
Definition std_expr.h:1724
The union type.
Definition c_types.h:147
Replaces a sub-range of a bit-vector operand.
Replaces a sub-range of a bit-vector operand.
Operator to update elements in structs and arrays.
Definition std_expr.h:2679
Operator to update elements in structs and arrays.
Definition std_expr.h:2520
Uninterpreted Functions.
std::vector< literalt > bvt
Definition literal.h:201
STL namespace.
BigInt mp_integer
Definition smt_terms.h:17