diff --git a/src/goto-checker/goto_symex_property_decider.cpp b/src/goto-checker/goto_symex_property_decider.cpp index 0ab8671caab..7dcc0fe1c40 100644 --- a/src/goto-checker/goto_symex_property_decider.cpp +++ b/src/goto-checker/goto_symex_property_decider.cpp @@ -120,6 +120,11 @@ goto_symex_property_decidert::get_decision_procedure() const return solver->decision_procedure(); } +boolbvt &goto_symex_property_decidert::get_boolbv_decision_procedure() const +{ + return solver->boolbv_decision_procedure(); +} + symex_target_equationt &goto_symex_property_decidert::get_equation() const { return equation; diff --git a/src/goto-checker/goto_symex_property_decider.h b/src/goto-checker/goto_symex_property_decider.h index 62bfa3c1757..21b4036b65d 100644 --- a/src/goto-checker/goto_symex_property_decider.h +++ b/src/goto-checker/goto_symex_property_decider.h @@ -47,6 +47,9 @@ class goto_symex_property_decidert /// Returns the solver instance stack_decision_proceduret &get_decision_procedure() const; + /// Returns the solver instance + boolbvt &get_boolbv_decision_procedure() const; + /// Return the equation associated with this instance symex_target_equationt &get_equation() const; diff --git a/src/goto-checker/multi_path_symex_checker.cpp b/src/goto-checker/multi_path_symex_checker.cpp index b29c4ab50c8..40f60b6ed85 100644 --- a/src/goto-checker/multi_path_symex_checker.cpp +++ b/src/goto-checker/multi_path_symex_checker.cpp @@ -113,8 +113,7 @@ goto_tracet multi_path_symex_checkert::build_shortest_trace() const { // NOLINTNEXTLINE(whitespace/braces) counterexample_beautificationt{ui_message_handler}( - dynamic_cast(property_decider.get_decision_procedure()), - equation); + property_decider.get_boolbv_decision_procedure(), equation); } goto_tracet goto_trace; diff --git a/src/goto-checker/single_loop_incremental_symex_checker.cpp b/src/goto-checker/single_loop_incremental_symex_checker.cpp index 551988655f2..47a2194d55d 100644 --- a/src/goto-checker/single_loop_incremental_symex_checker.cpp +++ b/src/goto-checker/single_loop_incremental_symex_checker.cpp @@ -207,8 +207,7 @@ goto_tracet single_loop_incremental_symex_checkert::build_shortest_trace() const { // NOLINTNEXTLINE(whitespace/braces) counterexample_beautificationt{ui_message_handler}( - dynamic_cast(property_decider.get_decision_procedure()), - equation); + property_decider.get_boolbv_decision_procedure(), equation); } goto_tracet goto_trace; diff --git a/src/goto-checker/single_path_symex_checker.cpp b/src/goto-checker/single_path_symex_checker.cpp index 4c9c8be312c..0e616252879 100644 --- a/src/goto-checker/single_path_symex_checker.cpp +++ b/src/goto-checker/single_path_symex_checker.cpp @@ -144,7 +144,7 @@ goto_tracet single_path_symex_checkert::build_shortest_trace() const { // NOLINTNEXTLINE(whitespace/braces) counterexample_beautificationt{ui_message_handler}( - dynamic_cast(property_decider->get_decision_procedure()), + property_decider->get_boolbv_decision_procedure(), property_decider->get_equation()); } diff --git a/src/goto-checker/solver_factory.cpp b/src/goto-checker/solver_factory.cpp index 8cb087f5fa0..79d4c2a2d99 100644 --- a/src/goto-checker/solver_factory.cpp +++ b/src/goto-checker/solver_factory.cpp @@ -29,7 +29,6 @@ Author: Daniel Kroening, Peter Schrammel #include #include #include -#include #include #include @@ -65,10 +64,28 @@ solver_factoryt::solvert::solvert( { } +solver_factoryt::solvert::solvert( + std::unique_ptr p1, + std::unique_ptr p2) + : prop_ptr(std::move(p2)), decision_procedure_is_boolbvt_ptr(std::move(p1)) +{ +} + stack_decision_proceduret &solver_factoryt::solvert::decision_procedure() const { - PRECONDITION(decision_procedure_ptr != nullptr); - return *decision_procedure_ptr; + PRECONDITION( + (decision_procedure_ptr != nullptr) != + (decision_procedure_is_boolbvt_ptr != nullptr)); + if(decision_procedure_ptr) + return *decision_procedure_ptr; + else + return *decision_procedure_is_boolbvt_ptr; +} + +boolbvt &solver_factoryt::solvert::boolbv_decision_procedure() const +{ + PRECONDITION(decision_procedure_is_boolbvt_ptr != nullptr); + return *decision_procedure_is_boolbvt_ptr; } void solver_factoryt::set_decision_procedure_time_limit( @@ -81,22 +98,6 @@ void solver_factoryt::set_decision_procedure_time_limit( decision_procedure.set_time_limit_seconds(timeout_seconds); } -void solver_factoryt::solvert::set_decision_procedure( - std::unique_ptr p) -{ - decision_procedure_ptr = std::move(p); -} - -void solver_factoryt::solvert::set_prop(std::unique_ptr p) -{ - prop_ptr = std::move(p); -} - -void solver_factoryt::solvert::set_ofstream(std::unique_ptr p) -{ - ofstream_ptr = std::move(p); -} - std::unique_ptr solver_factoryt::get_solver() { if(options.get_bool_option("dimacs")) @@ -339,8 +340,8 @@ std::unique_ptr solver_factoryt::get_default() set_decision_procedure_time_limit(*bv_pointers); - return std::make_unique( - std::move(bv_pointers), std::move(sat_solver)); + std::unique_ptr boolbv = std::move(bv_pointers); + return std::make_unique(std::move(boolbv), std::move(sat_solver)); } std::unique_ptr solver_factoryt::get_dimacs() @@ -352,7 +353,7 @@ std::unique_ptr solver_factoryt::get_dimacs() std::string filename = options.get_option("outfile"); - auto bv_dimacs = + std::unique_ptr bv_dimacs = std::make_unique(ns, *prop, message_handler, filename); return std::make_unique(std::move(bv_dimacs), std::move(prop)); @@ -367,7 +368,8 @@ std::unique_ptr solver_factoryt::get_external_sat() auto prop = std::make_unique(message_handler, external_sat_solver); - auto bv_pointers = std::make_unique(ns, *prop, message_handler); + std::unique_ptr bv_pointers = + std::make_unique(ns, *prop, message_handler); return std::make_unique(std::move(bv_pointers), std::move(prop)); } @@ -390,7 +392,8 @@ std::unique_ptr solver_factoryt::get_bv_refinement() info.refine_arithmetic = options.get_bool_option("refine-arithmetic"); info.message_handler = &message_handler; - auto decision_procedure = std::make_unique(info); + std::unique_ptr decision_procedure = + std::make_unique(info); set_decision_procedure_time_limit(*decision_procedure); return std::make_unique( std::move(decision_procedure), std::move(prop)); @@ -415,7 +418,8 @@ solver_factoryt::get_string_refinement() info.refine_arithmetic = options.get_bool_option("refine-arithmetic"); info.message_handler = &message_handler; - auto decision_procedure = std::make_unique(info); + std::unique_ptr decision_procedure = + std::make_unique(info); set_decision_procedure_time_limit(*decision_procedure); return std::make_unique( std::move(decision_procedure), std::move(prop)); diff --git a/src/goto-checker/solver_factory.h b/src/goto-checker/solver_factory.h index f62d97ff5b8..98784c45ba2 100644 --- a/src/goto-checker/solver_factory.h +++ b/src/goto-checker/solver_factory.h @@ -12,7 +12,7 @@ Author: Daniel Kroening, Peter Schrammel #ifndef CPROVER_GOTO_CHECKER_SOLVER_FACTORY_H #define CPROVER_GOTO_CHECKER_SOLVER_FACTORY_H -#include +#include #include #include @@ -45,17 +45,17 @@ class solver_factoryt final solvert( std::unique_ptr p1, std::unique_ptr p2); + solvert(std::unique_ptr p1, std::unique_ptr p2); stack_decision_proceduret &decision_procedure() const; + boolbvt &boolbv_decision_procedure() const; - void set_decision_procedure(std::unique_ptr p); - void set_prop(std::unique_ptr p); - void set_ofstream(std::unique_ptr p); - + private: // the objects are deleted in the opposite order they appear below std::unique_ptr ofstream_ptr; std::unique_ptr prop_ptr; std::unique_ptr decision_procedure_ptr; + std::unique_ptr decision_procedure_is_boolbvt_ptr; }; /// Returns a solvert object