Skip to content

Commit 6d5f292

Browse files
thomasspriggsEnrico Steffinlongo
authored andcommitted
Add index_exprt to smt conversion for array reads
1 parent 9873b7a commit 6d5f292

File tree

2 files changed

+26
-3
lines changed

2 files changed

+26
-3
lines changed

src/solvers/smt2_incremental/convert_expr_to_smt.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
#include <solvers/prop/literal_expr.h>
2020
#include <solvers/smt2_incremental/convert_expr_to_smt.h>
21+
#include <solvers/smt2_incremental/smt_array_theory.h>
2122
#include <solvers/smt2_incremental/smt_bit_vector_theory.h>
2223
#include <solvers/smt2_incremental/smt_core_theory.h>
2324

@@ -917,11 +918,12 @@ static smt_termt convert_expr_to_smt(
917918
}
918919

919920
static smt_termt convert_expr_to_smt(
920-
const index_exprt &index,
921+
const index_exprt &index_of,
921922
const sub_expression_mapt &converted)
922923
{
923-
UNIMPLEMENTED_FEATURE(
924-
"Generation of SMT formula for index expression: " + index.pretty());
924+
const smt_termt &array = converted.at(index_of.array());
925+
const smt_termt &index = converted.at(index_of.index());
926+
return smt_array_theoryt::select(array, index);
925927
}
926928

927929
template <typename factoryt, typename shiftt>

unit/solvers/smt2_incremental/convert_expr_to_smt.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
#include <solvers/smt2_incremental/convert_expr_to_smt.h>
1616
#include <solvers/smt2_incremental/object_tracking.h>
17+
#include <solvers/smt2_incremental/smt_array_theory.h>
1718
#include <solvers/smt2_incremental/smt_bit_vector_theory.h>
1819
#include <solvers/smt2_incremental/smt_core_theory.h>
1920
#include <solvers/smt2_incremental/smt_terms.h>
@@ -1140,6 +1141,26 @@ TEST_CASE(
11401141
}
11411142
}
11421143

1144+
TEST_CASE(
1145+
"expr to smt conversion for index_exprt expressions",
1146+
"[core][smt2_incremental]")
1147+
{
1148+
auto test =
1149+
expr_to_smt_conversion_test_environmentt::make(test_archt::x86_64);
1150+
const typet value_type = signedbv_typet{8};
1151+
const exprt array = symbol_exprt{
1152+
"my_array", array_typet{value_type, from_integer(10, signed_size_type())}};
1153+
const exprt index = from_integer(42, unsignedbv_typet{64});
1154+
const index_exprt index_expr{array, index};
1155+
INFO("Expression being converted: " + index_expr.pretty(2, 0));
1156+
const smt_termt expected = smt_array_theoryt::select(
1157+
smt_identifier_termt{
1158+
"my_array",
1159+
smt_array_sortt{smt_bit_vector_sortt{64}, smt_bit_vector_sortt{8}}},
1160+
smt_bit_vector_constant_termt{42, 64});
1161+
CHECK(test.convert(index_expr) == expected);
1162+
}
1163+
11431164
TEST_CASE(
11441165
"expr to smt conversion for extract bits expressions",
11451166
"[core][smt2_incremental]")

0 commit comments

Comments
 (0)