Skip to content

Commit a01da97

Browse files
committed
fix update_bit
1 parent 4f56b6a commit a01da97

File tree

3 files changed

+55
-1
lines changed

3 files changed

+55
-1
lines changed

src/util/bitvector_expr.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,14 @@ 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(exprt _src, const std::size_t _index, exprt _new_value)
41+
: update_bit_exprt(
42+
std::move(_src),
43+
from_integer(_index, integer_typet()),
44+
std::move(_new_value))
45+
{
46+
}
47+
4048
exprt update_bit_exprt::lower() const
4149
{
4250
const auto width = to_bitvector_type(type()).get_width();
@@ -54,7 +62,8 @@ exprt update_bit_exprt::lower() const
5462
typecast_exprt(src(), src_bv_type), bitnot_exprt(mask_shifted));
5563

5664
// zero-extend the replacement bit to match src
57-
auto new_value_casted = zero_extend_exprt{new_value(), src_bv_type};
65+
auto new_value_bv = typecast_exprt{new_value(), bv_typet{1}};
66+
auto new_value_casted = zero_extend_exprt{new_value_bv, src_bv_type};
5867

5968
// shift the replacement bits
6069
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: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
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("boolbvt_update_bit", "[core][solvers][flattening][boolbvt][update_bit]")
25+
{
26+
console_message_handlert message_handler;
27+
message_handler.set_verbosity(0);
28+
29+
GIVEN("A satisfiable bit-vector formula f with update_bit")
30+
{
31+
satcheckt satcheck{message_handler};
32+
symbol_tablet symbol_table;
33+
namespacet ns{symbol_table};
34+
boolbvt boolbv{ns, satcheck, message_handler};
35+
36+
unsignedbv_typet u32{32};
37+
boolbv << equal_exprt(symbol_exprt{"x", u32}, update_bit_exprt{from_integer(10, u32), 0, true_exprt{}});
38+
39+
THEN("is indeed satisfiable")
40+
{
41+
REQUIRE(boolbv() == decision_proceduret::resultt::D_SATISFIABLE);
42+
}
43+
}
44+
}

0 commit comments

Comments
 (0)