Skip to content

Commit 446f6bb

Browse files
committed
Implement construction of exprt bit vectors from smt terms
Macros are used in order to make the duplications in the test inputs manageable. However clang-format needs to be off for these macros as the way clang-format formats them makes them less readable.
1 parent 1a0620f commit 446f6bb

File tree

2 files changed

+72
-2
lines changed

2 files changed

+72
-2
lines changed

src/solvers/smt2_incremental/construct_value_expr_from_smt.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
#include <solvers/smt2_incremental/smt_terms.h>
66

7+
#include <util/arith_tools.h>
8+
#include <util/bitvector_types.h>
79
#include <util/std_expr.h>
810
#include <util/std_types.h>
911
#include <util/type.h>
@@ -35,7 +37,23 @@ class value_expr_from_smt_factoryt : public smt_term_const_downcast_visitort
3537

3638
void visit(const smt_bit_vector_constant_termt &bit_vector_constant) override
3739
{
38-
UNIMPLEMENTED;
40+
if(
41+
const auto integer_type =
42+
type_try_dynamic_cast<integer_bitvector_typet>(type_to_construct))
43+
{
44+
INVARIANT(
45+
integer_type->get_width() == bit_vector_constant.get_sort().bit_width(),
46+
"Width of smt bit vector term must match the width of bit vector "
47+
"type.");
48+
result = from_integer(bit_vector_constant.value(), type_to_construct);
49+
return;
50+
}
51+
52+
INVARIANT(
53+
false,
54+
"construct_value_expr_from_smt for bit vector should not be applied to "
55+
"unsupported type " +
56+
type_to_construct.pretty());
3957
}
4058

4159
void

unit/solvers/smt2_incremental/construct_value_expr_from_smt.cpp

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,70 @@
77
#include <solvers/smt2_incremental/smt_terms.h>
88
#include <solvers/smt2_incremental/smt_to_smt2_string.h>
99

10+
#include <util/arith_tools.h>
11+
#include <util/bitvector_types.h>
12+
#include <util/mp_arith.h>
1013
#include <util/std_expr.h>
1114
#include <util/std_types.h>
1215

16+
static mp_integer power2(unsigned exponent)
17+
{
18+
mp_integer result;
19+
result.setPower2(exponent);
20+
return result;
21+
}
22+
23+
/// Returns the maximum integer value which can be stored in \p bits as an
24+
/// unsigned integer.
25+
static mp_integer max_int(const std::size_t bits)
26+
{
27+
return power2(bits) - 1;
28+
}
29+
1330
TEST_CASE("Value expr construction from smt.", "[core][smt2_incremental]")
1431
{
1532
optionalt<smt_termt> input_term;
1633
optionalt<exprt> expected_result;
1734

1835
using rowt = std::pair<smt_termt, exprt>;
36+
37+
// clang-format off
38+
#define UNSIGNED_BIT_VECTOR_TESTS(bits) \
39+
rowt{smt_bit_vector_constant_termt{0, (bits)}, \
40+
from_integer(0, unsignedbv_typet{(bits)})}, \
41+
rowt{smt_bit_vector_constant_termt{42, (bits)}, \
42+
from_integer(42, unsignedbv_typet{(bits)})}, \
43+
rowt{smt_bit_vector_constant_termt{max_int((bits) - 1), (bits)}, \
44+
from_integer(max_int((bits) - 1), unsignedbv_typet{(bits)})}, \
45+
rowt{smt_bit_vector_constant_termt{power2((bits) - 1), (bits)}, \
46+
from_integer(power2((bits) - 1), unsignedbv_typet{(bits)})}, \
47+
rowt{smt_bit_vector_constant_termt{max_int((bits)), (bits)}, \
48+
from_integer(max_int((bits)), unsignedbv_typet{(bits)})}
49+
50+
#define SIGNED_BIT_VECTOR_TESTS(bits) \
51+
rowt{smt_bit_vector_constant_termt{0, (bits)}, \
52+
from_integer(0, signedbv_typet{(bits)})}, \
53+
rowt{smt_bit_vector_constant_termt{42, (bits)}, \
54+
from_integer(42, signedbv_typet{(bits)})}, \
55+
rowt{smt_bit_vector_constant_termt{max_int((bits) - 1), (bits)}, \
56+
from_integer(max_int((bits) - 1), signedbv_typet{(bits)})}, \
57+
rowt{smt_bit_vector_constant_termt{power2((bits) - 1), (bits)}, \
58+
from_integer(-power2((bits) - 1), signedbv_typet{(bits)})}, \
59+
rowt{smt_bit_vector_constant_termt{max_int((bits)), (bits)}, \
60+
from_integer(-1, signedbv_typet{(bits)})}
61+
// clang-format on
62+
1963
std::tie(input_term, expected_result) = GENERATE(
2064
rowt{smt_bool_literal_termt{true}, true_exprt{}},
21-
rowt{smt_bool_literal_termt{false}, false_exprt{}});
65+
rowt{smt_bool_literal_termt{false}, false_exprt{}},
66+
UNSIGNED_BIT_VECTOR_TESTS(8),
67+
SIGNED_BIT_VECTOR_TESTS(8),
68+
UNSIGNED_BIT_VECTOR_TESTS(16),
69+
SIGNED_BIT_VECTOR_TESTS(16),
70+
UNSIGNED_BIT_VECTOR_TESTS(32),
71+
SIGNED_BIT_VECTOR_TESTS(32),
72+
UNSIGNED_BIT_VECTOR_TESTS(64),
73+
SIGNED_BIT_VECTOR_TESTS(64));
2274
SECTION(
2375
"Construction of \"" + id2string(expected_result->type().id()) +
2476
"\" from \"" + smt_to_smt2_string(*input_term) + "\"")

0 commit comments

Comments
 (0)