Skip to content

Commit 30364f5

Browse files
committed
Add padding instantiation to decision procedure
1 parent 15ba50f commit 30364f5

File tree

3 files changed

+49
-3
lines changed

3 files changed

+49
-3
lines changed

src/solvers/smt2_incremental/smt2_incremental_decision_procedure.cpp

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <solvers/smt2_incremental/construct_value_expr_from_smt.h>
1919
#include <solvers/smt2_incremental/convert_expr_to_smt.h>
2020
#include <solvers/smt2_incremental/encoding/enum_encoding.h>
21+
#include <solvers/smt2_incremental/encoding/nondet_padding.h>
2122
#include <solvers/smt2_incremental/smt_solver_process.h>
2223
#include <solvers/smt2_incremental/theories/smt_array_theory.h>
2324
#include <solvers/smt2_incremental/theories/smt_core_theory.h>
@@ -364,12 +365,28 @@ void smt2_incremental_decision_proceduret::define_index_identifiers(
364365
});
365366
}
366367

368+
exprt smt2_incremental_decision_proceduret::substitute_defined_padding(
369+
exprt root_expr)
370+
{
371+
root_expr.visit_pre([&](exprt &node) {
372+
if(const auto pad = expr_try_dynamic_cast<nondet_padding_exprt>(node))
373+
{
374+
const auto instance = "padding_" + std::to_string(padding_sequence());
375+
const auto term =
376+
smt_identifier_termt{instance, convert_type_to_smt_sort(pad->type())};
377+
solver_process->send(smt_declare_function_commandt{term, {}});
378+
node = symbol_exprt{instance, node.type()};
379+
}
380+
});
381+
return root_expr;
382+
}
383+
367384
smt_termt
368385
smt2_incremental_decision_proceduret::convert_expr_to_smt(const exprt &expr)
369386
{
370387
define_index_identifiers(expr);
371-
const exprt substituted =
372-
substitute_identifiers(expr, expression_identifiers);
388+
const exprt substituted = substitute_defined_padding(
389+
substitute_identifiers(expr, expression_identifiers));
373390
track_expression_objects(substituted, ns, object_map);
374391
associate_pointer_sizes(
375392
substituted,

src/solvers/smt2_incremental/smt2_incremental_decision_procedure.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,11 @@ class smt2_incremental_decision_proceduret final
102102
/// \note This function is non-const because it mutates the object_map.
103103
smt_termt convert_expr_to_smt(const exprt &expr);
104104
void define_index_identifiers(const exprt &expr);
105+
/// In the case where lowering passes insert instances of the anonymous
106+
/// `nondet_padding_exprt`, these need functions declaring for each instance.
107+
/// These instances are then substituted for the function identifier in order
108+
/// to free the solver to choose a non-det value.
109+
exprt substitute_defined_padding(exprt expr);
105110
/// Sends the solver the definitions of the object sizes and dynamic memory
106111
/// statuses.
107112
void define_object_properties();
@@ -135,7 +140,7 @@ class smt2_incremental_decision_proceduret final
135140
{
136141
return next_id++;
137142
}
138-
} handle_sequence, array_sequence, index_sequence;
143+
} handle_sequence, array_sequence, index_sequence, padding_sequence;
139144
/// When the `handle(exprt)` member function is called, the decision procedure
140145
/// commands the SMT solver to define a new function corresponding to the
141146
/// given expression. The mapping of the expressions to the function

unit/solvers/smt2_incremental/smt2_incremental_decision_procedure.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Author: Diffblue Ltd.
22

33
#include <util/arith_tools.h>
4+
#include <util/bitvector_expr.h>
45
#include <util/bitvector_types.h>
56
#include <util/config.h>
67
#include <util/exception_utils.h>
@@ -13,6 +14,7 @@
1314
#include <solvers/smt2_incremental/ast/smt_responses.h>
1415
#include <solvers/smt2_incremental/ast/smt_sorts.h>
1516
#include <solvers/smt2_incremental/ast/smt_terms.h>
17+
#include <solvers/smt2_incremental/encoding/nondet_padding.h>
1618
#include <solvers/smt2_incremental/smt2_incremental_decision_procedure.h>
1719
#include <solvers/smt2_incremental/smt_solver_process.h>
1820
#include <solvers/smt2_incremental/theories/smt_array_theory.h>
@@ -268,6 +270,28 @@ TEST_CASE(
268270
smt_identifier_termt{"third_comparison", smt_bool_sortt{}})},
269271
smt_assert_commandt{comparison_conjunction_term}});
270272
}
273+
SECTION("Set with nondet_padding")
274+
{
275+
const exprt to_set = equal_exprt{
276+
concatenation_exprt{
277+
{nondet_padding_exprt{bv_typet{8}}, from_integer(42, bv_typet{8})},
278+
bv_typet{16}},
279+
from_integer(42, bv_typet{16})};
280+
test.sent_commands.clear();
281+
test.procedure.set_to(to_set, true);
282+
// (declare-fun padding_0 () (_ BitVec 8))
283+
// (assert (= (concat padding_0 (_ bv42 8)) (_ bv42 16)))
284+
const auto expected_padding_term =
285+
smt_identifier_termt{"padding_0", smt_bit_vector_sortt{8}};
286+
REQUIRE(
287+
test.sent_commands ==
288+
std::vector<smt_commandt>{
289+
smt_declare_function_commandt{expected_padding_term, {}},
290+
smt_assert_commandt{smt_core_theoryt::equal(
291+
smt_bit_vector_theoryt::concat(
292+
expected_padding_term, smt_bit_vector_constant_termt{42, 8}),
293+
smt_bit_vector_constant_termt{42, 16})}});
294+
}
271295
SECTION("Handle of value-less symbol.")
272296
{
273297
const symbolt foo = make_test_symbol("foo", bool_typet{});

0 commit comments

Comments
 (0)