Go to the documentation of this file.
34 const std::size_t bit,
37 if(expr.
type().
id()==ID_bool)
41 "boolean expressions shall be represented by a single bit and hence the "
42 "only valid bit index is 0");
47 if(expr.
id()==ID_symbol ||
48 expr.
id()==ID_nondet_symbol)
52 boolbv_mapt::mappingt::const_iterator it_m=
61 bit < map_entry.
literal_map.size(),
"bit index shall be within bounds");
68 else if(expr.
id()==ID_index)
77 std::size_t offset = numeric_cast_v<std::size_t>(index * element_width);
81 else if(expr.
id()==ID_member)
91 for(
const auto &c : components)
93 const typet &subtype = c.type();
95 if(c.get_name() == component_name)
101 offset+=element_width;
104 INVARIANT(
false,
"struct type should have accessed component");
108 INVARIANT(
false,
"expression should have a corresponding literal");
115 std::pair<bv_cachet::iterator, bool> cache_result=
117 if(!cache_result.second)
119 return cache_result.first->second;
128 !expected_width || bv.size() == *expected_width,
129 "bitvector width shall match the indicated expected width",
133 cache_result.first->second = bv;
143 "variable number must be different from the unused variable number",
148 return cache_result.first->second;
170 if(expr.
type().
id()==ID_bool)
178 if(expr.
id()==ID_index)
180 else if(expr.
id()==ID_constraint_select_one)
182 else if(expr.
id()==ID_member)
184 else if(expr.
id()==ID_with)
186 else if(expr.
id()==ID_update)
188 else if(expr.
id()==ID_width)
203 if(expr.
type().
id()==ID_unsignedbv ||
204 expr.
type().
id()==ID_signedbv)
207 else if(expr.
id()==ID_case)
209 else if(expr.
id()==ID_cond)
211 else if(expr.
id()==ID_if)
213 else if(expr.
id()==ID_constant)
215 else if(expr.
id()==ID_typecast)
217 else if(expr.
id()==ID_symbol)
219 else if(expr.
id()==ID_bv_literals)
221 else if(expr.
id()==ID_plus || expr.
id()==ID_minus ||
222 expr.
id()==
"no-overflow-plus" ||
223 expr.
id()==
"no-overflow-minus")
225 else if(expr.
id() == ID_mult)
227 else if(expr.
id()==ID_div)
229 else if(expr.
id()==ID_mod)
231 else if(expr.
id()==ID_shl || expr.
id()==ID_ashr || expr.
id()==ID_lshr ||
232 expr.
id()==ID_rol || expr.
id()==ID_ror)
234 else if(expr.
id()==ID_floatbv_plus || expr.
id()==ID_floatbv_minus ||
235 expr.
id()==ID_floatbv_mult || expr.
id()==ID_floatbv_div ||
236 expr.
id()==ID_floatbv_rem)
238 else if(expr.
id()==ID_floatbv_typecast)
240 else if(expr.
id()==ID_concatenation)
242 else if(expr.
id()==ID_replication)
244 else if(expr.
id()==ID_extractbits)
246 else if(expr.
id()==ID_bitnot || expr.
id()==ID_bitand ||
247 expr.
id()==ID_bitor || expr.
id()==ID_bitxor ||
248 expr.
id()==ID_bitxnor || expr.
id()==ID_bitnor ||
249 expr.
id()==ID_bitnand)
251 else if(expr.
id() == ID_unary_minus)
253 else if(expr.
id()==ID_unary_plus)
257 else if(expr.
id()==ID_abs)
259 else if(expr.
id() == ID_bswap)
261 else if(expr.
id()==ID_byte_extract_little_endian ||
262 expr.
id()==ID_byte_extract_big_endian)
264 else if(expr.
id()==ID_byte_update_little_endian ||
265 expr.
id()==ID_byte_update_big_endian)
267 else if(expr.
id()==ID_nondet_symbol ||
268 expr.
id()==
"quant_symbol")
270 else if(expr.
id()==ID_struct)
272 else if(expr.
id()==ID_union)
274 else if(expr.
id()==ID_string_constant)
277 else if(expr.
id()==ID_array)
279 else if(expr.
id()==ID_vector)
281 else if(expr.
id()==ID_complex)
283 else if(expr.
id()==ID_complex_real)
285 else if(expr.
id()==ID_complex_imag)
287 else if(expr.
id()==ID_lambda)
289 else if(expr.
id()==ID_array_of)
291 else if(expr.
id()==ID_let)
293 else if(expr.
id()==ID_function_application)
296 else if(expr.
id()==ID_reduction_or || expr.
id()==ID_reduction_and ||
297 expr.
id()==ID_reduction_nor || expr.
id()==ID_reduction_nand ||
298 expr.
id()==ID_reduction_xor || expr.
id()==ID_reduction_xnor)
300 else if(expr.
id()==ID_not)
302 else if(expr.
id()==ID_power)
304 else if(expr.
id() == ID_popcount)
318 expr.
operands().size() == 2,
"lambda expression should have two operands");
320 if(expr.
type().
id()!=ID_array)
323 const exprt &array_size=
326 const auto size = numeric_cast<mp_integer>(array_size);
328 if(!size.has_value())
346 *size * tmp.size() == width,
347 "total bitvector width shall equal the number of operands times the size "
350 std::size_t offset = numeric_cast_v<std::size_t>(i * tmp.size());
352 for(std::size_t j=0; j<tmp.size(); j++)
371 if(bv_sub.size()!=width)
372 throw "bv_literals with wrong size";
374 for(std::size_t i=0; i<width; i++)
388 const irep_idt &identifier = expr.
get(ID_identifier);
405 return l.var_no() < prop.no_variables() || l.is_constant();
407 "variable number of non-constant literals should be within bounds",
431 if(expr.
id()==ID_typecast)
433 else if(expr.
id()==ID_equal)
435 else if(expr.
id()==ID_verilog_case_equality ||
436 expr.
id()==ID_verilog_case_inequality)
438 else if(expr.
id()==ID_notequal)
443 else if(expr.
id()==ID_ieee_float_equal ||
444 expr.
id()==ID_ieee_float_notequal)
446 else if(expr.
id()==ID_le || expr.
id()==ID_ge ||
447 expr.
id()==ID_lt || expr.
id()==ID_gt)
449 else if(expr.
id()==ID_extractbit)
451 else if(expr.
id()==ID_forall)
453 else if(expr.
id()==ID_exists)
455 else if(expr.
id()==ID_let)
460 "convert_let must return 1-bit vector for boolean let");
464 else if(expr.
id()==ID_index)
470 else if(expr.
id()==ID_member)
476 else if(expr.
id()==ID_case)
482 else if(expr.
id()==ID_cond)
488 else if(expr.
id()==ID_sign)
493 const irep_idt type_id = operands[0].type().id();
494 if(type_id == ID_signedbv || type_id == ID_fixedbv || type_id == ID_floatbv)
495 return bv[bv.size()-1];
496 if(type_id == ID_unsignedbv)
499 else if(expr.
id()==ID_reduction_or || expr.
id()==ID_reduction_and ||
500 expr.
id()==ID_reduction_nor || expr.
id()==ID_reduction_nand ||
501 expr.
id()==ID_reduction_xor || expr.
id()==ID_reduction_xnor)
503 else if(expr.
id()==ID_onehot || expr.
id()==ID_onehot0)
507 else if(expr.
id()==ID_isnan)
515 return float_utils.
is_NaN(bv);
517 else if(expr.
op0().
type().
id() == ID_fixedbv)
520 else if(expr.
id()==ID_isfinite)
531 else if(expr.
op0().
type().
id() == ID_fixedbv)
534 else if(expr.
id()==ID_isinf)
543 else if(expr.
op0().
type().
id() == ID_fixedbv)
546 else if(expr.
id()==ID_isnormal)
555 else if(expr.
op0().
type().
id() == ID_fixedbv)
569 if(expr.
lhs().
id()==ID_symbol &&
597 const auto equal_expr = expr_try_dynamic_cast<equal_exprt>(expr);
605 exprt dest(ID_bv_literals, type);
607 bv_sub.resize(bv.size());
609 for(std::size_t i=0; i<bv.size(); i++)
626 if(type.
id() == ID_symbol_type)
629 if(type.
id()!=ID_array)
652 out << pair.first <<
"=" << pair.second.get_value(
prop) <<
'\n';
659 dest.reserve(components.size());
660 std::size_t offset = 0;
661 for(
const auto &comp : components)
663 dest.push_back(offset);
const popcount_exprt & to_popcount_expr(const exprt &expr)
Cast an exprt to a popcount_exprt.
const componentst & components() const
virtual bvt convert_bv_typecast(const typecast_exprt &expr)
dstringt has one field, an unsigned integer no which is an index into a static table of strings.
virtual literalt convert_overflow(const exprt &expr)
unbounded_arrayt unbounded_array
const vector_exprt & to_vector_expr(const exprt &expr)
Cast an exprt to an vector_exprt.
bool equality_propagation
#define PRECONDITION(CONDITION)
const unary_exprt & to_unary_expr(const exprt &expr)
Cast an exprt to a unary_exprt.
virtual bvt convert_member(const member_exprt &expr)
const div_exprt & to_div_expr(const exprt &expr)
Cast an exprt to a div_exprt.
virtual bvt convert_byte_update(const byte_update_exprt &expr)
map_entryt & get_map_entry(const irep_idt &identifier, const typet &type)
const array_exprt & to_array_expr(const exprt &expr)
Cast an exprt to an array_exprt.
virtual bvt convert_array_of(const array_of_exprt &expr)
virtual literalt convert_reduction(const unary_exprt &expr)
const struct_typet & to_struct_type(const typet &type)
Cast a typet to a struct_typet.
#define DATA_INVARIANT(CONDITION, REASON)
This condition should be used to document that assumptions that are made on goto_functions,...
virtual bvt convert_cond(const cond_exprt &)
bvt new_variables(std::size_t width)
generates a bitvector of given width with new variables
virtual bvt convert_bitvector(const exprt &expr)
Converts an expression into its gate-level representation and returns a vector of literals correspond...
bool is_unbounded_array(const typet &type) const override
The type of an expression, extends irept.
std::vector< literalt > bvt
const byte_extract_exprt & to_byte_extract_expr(const exprt &expr)
const function_application_exprt & to_function_application_expr(const exprt &expr)
Cast an exprt to a function_application_exprt.
const index_exprt & to_index_expr(const exprt &expr)
Cast an exprt to an index_exprt.
const if_exprt & to_if_expr(const exprt &expr)
Cast an exprt to an if_exprt.
void set_to(const exprt &expr, bool value) override
virtual bvt convert_complex(const complex_exprt &expr)
irept & add(const irep_namet &name)
virtual bvt convert_floatbv_op(const exprt &expr)
const std::size_t MAX_FLATTENED_ARRAY_SIZE
const irept & find(const irep_namet &name) const
void get_literals(const irep_idt &identifier, const typet &type, const std::size_t width, bvt &literals)
virtual bvt convert_mod(const mod_exprt &expr)
virtual bvt convert_update(const exprt &expr)
const string_constantt & to_string_constant(const exprt &expr)
const array_of_exprt & to_array_of_expr(const exprt &expr)
Cast an exprt to an array_of_exprt.
virtual bvt convert_vector(const vector_exprt &expr)
virtual bvt convert_symbol(const exprt &expr)
virtual literalt new_variable()=0
virtual bvt convert_index(const exprt &array, const mp_integer &index)
index operator with constant index
Base class for all expressions.
const complex_exprt & to_complex_expr(const exprt &expr)
Cast an exprt to a complex_exprt.
std::vector< componentt > componentst
virtual bool literal(const exprt &expr, std::size_t bit, literalt &literal) const
const union_exprt & to_union_expr(const exprt &expr)
Cast an exprt to a union_exprt.
virtual literalt convert_onehot(const unary_exprt &expr)
virtual literalt convert_bv_rel(const exprt &expr)
virtual bvt convert_abs(const abs_exprt &expr)
std::string to_string(const string_not_contains_constraintt &expr)
Used for debug printing.
virtual bvt convert_union(const union_exprt &expr)
virtual bvt convert_case(const exprt &expr)
#define forall_literals(it, bv)
virtual literalt land(literalt a, literalt b)=0
Magic numbers used throughout the codebase.
virtual bvt convert_add_sub(const exprt &expr)
virtual bvt convert_constant(const constant_exprt &expr)
static var_not unused_var_no()
virtual literalt convert_extractbit(const extractbit_exprt &expr)
virtual bvt convert_concatenation(const concatenation_exprt &expr)
virtual void ignoring(const exprt &expr)
const unary_plus_exprt & to_unary_plus_expr(const exprt &expr)
Cast an exprt to a unary_plus_exprt.
const complex_real_exprt & to_complex_real_expr(const exprt &expr)
Cast an exprt to a complex_real_exprt.
literalt is_infinity(const bvt &)
const binary_exprt & to_binary_expr(const exprt &expr)
Cast an exprt to a binary_exprt.
const concatenation_exprt & to_concatenation_expr(const exprt &expr)
Cast an exprt to a concatenation_exprt.
const shift_exprt & to_shift_expr(const exprt &expr)
Cast an exprt to a shift_exprt.
const exprt & size() const
virtual bvt convert_mult(const mult_exprt &expr)
virtual bvt convert_shift(const binary_exprt &expr)
typet & type()
Return the type of the expression.
bool literal(const symbol_exprt &expr, literalt &literal) const
virtual bvt convert_byte_extract(const byte_extract_exprt &expr)
virtual bool boolbv_set_equality_to_true(const equal_exprt &expr)
const cond_exprt & to_cond_expr(const exprt &expr)
Cast an exprt to a cond_exprt.
virtual bvt convert_array(const exprt &expr)
boolbv_widtht boolbv_width
literalt is_normal(const bvt &)
const mod_exprt & to_mod_expr(const exprt &expr)
Cast an exprt to a mod_exprt.
void record(const function_application_exprt &function_application)
void conversion_failed(const exprt &expr, bvt &bv)
virtual bvt convert_bv_literals(const exprt &expr)
const mult_exprt & to_mult_expr(const exprt &expr)
Cast an exprt to a mult_exprt.
virtual bvt convert_extractbits(const extractbits_exprt &expr)
const std::string & id2string(const irep_idt &d)
exprt lower_popcount(const popcount_exprt &expr, const namespacet &ns)
Lower a popcount_exprt to arithmetic and logic expressions.
const replication_exprt & to_replication_expr(const exprt &expr)
Cast an exprt to a replication_exprt.
#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...
const byte_update_exprt & to_byte_update_expr(const exprt &expr)
const source_locationt & find_source_location() const
Get a source_locationt from the expression or from its operands (non-recursively).
const irep_idt & get_identifier() const
virtual bvt convert_floatbv_typecast(const floatbv_typecast_exprt &expr)
virtual literalt convert_verilog_case_equality(const binary_relation_exprt &expr)
virtual bvt convert_if(const if_exprt &expr)
virtual bvt convert_complex_real(const complex_real_exprt &expr)
virtual exprt make_bv_expr(const typet &type, const bvt &bv)
const let_exprt & to_let_expr(const exprt &expr)
Cast an exprt to a let_exprt.
const std::string & id_string() const
Application of (mathematical) function.
literalt const_literal(bool value)
const unary_minus_exprt & to_unary_minus_expr(const exprt &expr)
Cast an exprt to a unary_minus_exprt.
const symbol_exprt & to_symbol_expr(const exprt &expr)
Cast an exprt to a symbol_exprt.
virtual bvt convert_bv_reduction(const unary_exprt &expr)
literalt is_NaN(const bvt &)
const irep_idt & id() const
virtual void set_frozen(literalt)
std::vector< exprt > operandst
virtual bvt convert_constraint_select_one(const exprt &expr)
virtual const bvt & convert_bv(const exprt &expr, const optionalt< std::size_t > expected_width=nullopt)
const quantifier_exprt & to_quantifier_expr(const exprt &expr)
Cast an exprt to a quantifier_exprt.
virtual bvt convert_bswap(const bswap_exprt &expr)
const complex_imag_exprt & to_complex_imag_expr(const exprt &expr)
Cast an exprt to a complex_imag_exprt.
nonstd::optional< T > optionalt
const bswap_exprt & to_bswap_expr(const exprt &expr)
Cast an exprt to a bswap_exprt.
virtual exprt make_free_bv_expr(const typet &type)
literalt convert(const exprt &expr) override
virtual literalt convert_rest(const exprt &expr)
virtual literalt convert_ieee_float_rel(const exprt &expr)
Extract member of struct or union.
virtual bvt convert_let(const let_exprt &)
virtual bvt convert_bitwise(const exprt &expr)
bvt build_constant(const mp_integer &i, std::size_t width)
virtual bvt convert_lambda(const exprt &expr)
Structure type, corresponds to C style structs.
virtual bvt convert_struct(const struct_exprt &expr)
const extractbits_exprt & to_extractbits_expr(const exprt &expr)
Cast an exprt to an extractbits_exprt.
const typet & follow(const typet &) const
Resolve type symbol to the type it points to.
const not_exprt & to_not_expr(const exprt &expr)
Cast an exprt to an not_exprt.
const irep_idt & get(const irep_namet &name) const
const floatbv_typecast_exprt & to_floatbv_typecast_expr(const exprt &expr)
Cast an exprt to a floatbv_typecast_exprt.
void set_frozen(literalt a) override
bool replace_expr(const exprt &what, const exprt &by, exprt &dest)
const typecast_exprt & to_typecast_expr(const exprt &expr)
Cast an exprt to a typecast_exprt.
unsigned unsafe_string2unsigned(const std::string &str, int base)
const array_typet & to_array_type(const typet &type)
Cast a typet to an array_typet.
const equal_exprt & to_equal_expr(const exprt &expr)
Cast an exprt to an equal_exprt.
void print_assignment(std::ostream &out) const override
const floatbv_typet & to_floatbv_type(const typet &type)
Cast a typet to a floatbv_typet.
virtual literalt convert_equality(const equal_exprt &expr)
virtual bvt convert_unary_minus(const unary_minus_exprt &expr)
const member_exprt & to_member_expr(const exprt &expr)
Cast an exprt to a member_exprt.
virtual bvt convert_replication(const replication_exprt &expr)
bool has_prefix(const std::string &s, const std::string &prefix)
irep_idt get_component_name() const
virtual literalt convert_quantifier(const quantifier_exprt &expr)
virtual bvt convert_with(const exprt &expr)
virtual bvt convert_not(const not_exprt &expr)
virtual literalt convert_typecast(const typecast_exprt &expr)
conversion from bitvector types to boolean
std::vector< std::size_t > offset_mapt
offset_mapt build_offset_map(const struct_typet &src)
literalt convert_rest(const exprt &expr) override
virtual bvt convert_power(const binary_exprt &expr)
std::vector< irept > subt
const binary_relation_exprt & to_binary_relation_expr(const exprt &expr)
Cast an exprt to a binary_relation_exprt.
virtual bvt convert_function_application(const function_application_exprt &expr)
virtual bvt convert_div(const div_exprt &expr)
void print_assignment(std::ostream &out) const override
exprt get(const exprt &expr) const override
const extractbit_exprt & to_extractbit_expr(const exprt &expr)
Cast an exprt to an extractbit_exprt.
void set_to(const exprt &expr, bool value) override
const struct_exprt & to_struct_expr(const exprt &expr)
Cast an exprt to a struct_exprt.
const abs_exprt & to_abs_expr(const exprt &expr)
Cast an exprt to a abs_exprt.
void set_literals(const irep_idt &identifier, const typet &type, const bvt &literals)
const constant_exprt & to_constant_expr(const exprt &expr)
Cast an exprt to a constant_exprt.
virtual bvt convert_complex_imag(const complex_imag_exprt &expr)
#define CHECK_RETURN(CONDITION)