Skip to content

Commit beebdda

Browse files
authored
Merge pull request #8496 from diffblue/fix_update_bit
fix `update_bit` lowering
2 parents 4f56b6a + a42c371 commit beebdda

File tree

3 files changed

+62
-1
lines changed

3 files changed

+62
-1
lines changed

src/util/bitvector_expr.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,17 @@ extractbits_exprt::extractbits_exprt(
3737
add_to_operands(std::move(_src), from_integer(_index, integer_typet()));
3838
}
3939

40+
update_bit_exprt::update_bit_exprt(
41+
exprt _src,
42+
const std::size_t _index,
43+
exprt _new_value)
44+
: update_bit_exprt(
45+
std::move(_src),
46+
from_integer(_index, integer_typet()),
47+
std::move(_new_value))
48+
{
49+
}
50+
4051
exprt update_bit_exprt::lower() const
4152
{
4253
const auto width = to_bitvector_type(type()).get_width();
@@ -54,7 +65,8 @@ exprt update_bit_exprt::lower() const
5465
typecast_exprt(src(), src_bv_type), bitnot_exprt(mask_shifted));
5566

5667
// zero-extend the replacement bit to match src
57-
auto new_value_casted = zero_extend_exprt{new_value(), src_bv_type};
68+
auto new_value_bv = typecast_exprt{new_value(), bv_typet{1}};
69+
auto new_value_casted = zero_extend_exprt{new_value_bv, src_bv_type};
5870

5971
// shift the replacement bits
6072
auto new_value_shifted = shl_exprt(new_value_casted, index());

unit/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ SRC += analyses/ai/ai.cpp \
9696
pointer-analysis/value_set.cpp \
9797
solvers/bdd/miniBDD/miniBDD.cpp \
9898
solvers/flattening/boolbv.cpp \
99+
solvers/flattening/boolbv_update_bit.cpp \
99100
solvers/floatbv/float_utils.cpp \
100101
solvers/prop/bdd_expr.cpp \
101102
solvers/sat/external_sat.cpp \
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*******************************************************************\
2+
3+
Module: Unit tests for boolbvt
4+
5+
Author: Daniel Kroening
6+
7+
\*******************************************************************/
8+
9+
/// \file
10+
/// Unit tests for boolbvt
11+
12+
#include <util/arith_tools.h>
13+
#include <util/bitvector_expr.h>
14+
#include <util/bitvector_types.h>
15+
#include <util/cout_message.h>
16+
#include <util/namespace.h>
17+
#include <util/std_expr.h>
18+
#include <util/symbol_table.h>
19+
20+
#include <solvers/flattening/boolbv.h>
21+
#include <solvers/sat/satcheck.h>
22+
#include <testing-utils/use_catch.h>
23+
24+
SCENARIO(
25+
"boolbvt_update_bit",
26+
"[core][solvers][flattening][boolbvt][update_bit]")
27+
{
28+
console_message_handlert message_handler;
29+
message_handler.set_verbosity(0);
30+
31+
GIVEN("A satisfiable bit-vector formula f with update_bit")
32+
{
33+
satcheckt satcheck{message_handler};
34+
symbol_tablet symbol_table;
35+
namespacet ns{symbol_table};
36+
boolbvt boolbv{ns, satcheck, message_handler};
37+
38+
unsignedbv_typet u32{32};
39+
boolbv << equal_exprt(
40+
symbol_exprt{"x", u32},
41+
update_bit_exprt{from_integer(10, u32), 0, true_exprt{}});
42+
43+
THEN("is indeed satisfiable")
44+
{
45+
REQUIRE(boolbv() == decision_proceduret::resultt::D_SATISFIABLE);
46+
}
47+
}
48+
}

0 commit comments

Comments
 (0)