41 bool _output_xml_in_refinement)
55 std::unique_ptr<stack_decision_proceduret> p1,
56 std::unique_ptr<propt> p2)
62 std::unique_ptr<stack_decision_proceduret> p1,
63 std::unique_ptr<std::ofstream> p2)
69 std::unique_ptr<boolbvt> p1,
70 std::unique_ptr<propt> p2)
76 std::unique_ptr<boolbvt> p1,
77 std::unique_ptr<propt> p2,
78 std::unique_ptr<std::ofstream> p3)
105 const int timeout_seconds =
106 options.get_signed_int_option(
"solver-time-limit");
108 if(timeout_seconds > 0)
114 if(
options.get_bool_option(
"dimacs"))
116 if(
options.is_set(
"external-sat-solver"))
119 options.get_bool_option(
"refine") &&
120 !
options.get_bool_option(
"refine-strings"))
124 else if(
options.get_bool_option(
"refine-strings"))
126 const auto incremental_smt2_solver =
127 options.get_option(
"incremental-smt2-solver");
128 if(!incremental_smt2_solver.empty())
130 if(
options.get_bool_option(
"smt2"))
144 if(
options.get_bool_option(
"bitwuzla"))
146 else if(
options.get_bool_option(
"boolector"))
148 else if(
options.get_bool_option(
"cprover-smt2"))
150 else if(
options.get_bool_option(
"mathsat"))
152 else if(
options.get_bool_option(
"cvc5"))
154 else if(
options.get_bool_option(
"yices"))
156 else if(
options.get_bool_option(
"z3"))
158 else if(
options.get_bool_option(
"generic"))
167 const std::string &
solver)
171 <<
"', is not available. "
172 <<
"The default solver will be used instead." <<
messaget::eom;
175template <
typename SatcheckT>
176static typename std::enable_if<
177 !std::is_base_of<hardness_collectort, SatcheckT>::value,
178 std::unique_ptr<SatcheckT>>::type
186 <<
"Configured solver does not support --write-solver-stats-to. "
192template <
typename SatcheckT>
193static typename std::enable_if<
194 std::is_base_of<hardness_collectort, SatcheckT>::value,
195 std::unique_ptr<SatcheckT>>::type
201 std::unique_ptr<solver_hardnesst> solver_hardness =
202 std::make_unique<solver_hardnesst>();
204 satcheck->solver_hardness = std::move(solver_hardness);
209static std::unique_ptr<propt>
219 if(solver_option ==
"zchaff")
221#if defined SATCHECK_ZCHAFF
227 else if(solver_option ==
"booleforce")
229#if defined SATCHECK_BOOLERFORCE
235 else if(solver_option ==
"minisat1")
237#if defined SATCHECK_MINISAT1
243 else if(solver_option ==
"minisat2")
245#if defined SATCHECK_MINISAT2
261 else if(solver_option ==
"ipasir")
263#if defined SATCHECK_IPASIR
269 else if(solver_option ==
"picosat")
271#if defined SATCHECK_PICOSAT
277 else if(solver_option ==
"lingeling")
279#if defined SATCHECK_LINGELING
285 else if(solver_option ==
"glucose")
287#if defined SATCHECK_GLUCOSE
303 else if(solver_option ==
"cadical")
305#if defined SATCHECK_CADICAL
315 log.
error() <<
"unknown solver '" << solver_option <<
"'"
335 const std::string &filename,
337 const std::string &arg_name)
347 "failed to open file: " + filename, arg_name);
359 bool get_array_constraints =
360 options.get_bool_option(
"show-array-constraints");
361 auto bv_pointers = std::make_unique<bv_pointerst>(
364 if(
options.get_option(
"arrays-uf") ==
"never")
366 else if(
options.get_option(
"arrays-uf") ==
"always")
371 std::unique_ptr<boolbvt> boolbv = std::move(bv_pointers);
372 return std::make_unique<solvert>(std::move(boolbv), std::move(sat_solver));
382 std::string filename =
options.get_option(
"outfile");
384 if(filename.empty() || filename ==
"-")
386 std::unique_ptr<boolbvt> bv_dimacs =
389 return std::make_unique<solvert>(std::move(bv_dimacs), std::move(prop));
394 std::unique_ptr<boolbvt> bv_dimacs =
397 return std::make_unique<solvert>(
398 std::move(bv_dimacs), std::move(prop), std::move(outfile));
406 std::string external_sat_solver =
options.get_option(
"external-sat-solver");
410 std::unique_ptr<boolbvt> bv_pointers =
413 return std::make_unique<solvert>(std::move(bv_pointers), std::move(prop));
422 info.
prop = prop.get();
426 if(
options.get_bool_option(
"max-node-refinement"))
428 options.get_unsigned_int_option(
"max-node-refinement");
434 std::unique_ptr<boolbvt> decision_procedure =
435 std::make_unique<bv_refinementt>(info);
437 return std::make_unique<solvert>(
438 std::move(decision_procedure), std::move(prop));
444std::unique_ptr<solver_factoryt::solvert>
450 info.
prop = prop.get();
453 if(
options.get_bool_option(
"max-node-refinement"))
455 options.get_unsigned_int_option(
"max-node-refinement");
460 std::unique_ptr<boolbvt> decision_procedure =
461 std::make_unique<string_refinementt>(info);
463 return std::make_unique<solvert>(
464 std::move(decision_procedure), std::move(prop));
467std::unique_ptr<solver_factoryt::solvert>
472 const std::string outfile_arg =
options.get_option(
"outfile");
473 const std::string dump_smt_formula =
options.get_option(
"dump-smt-formula");
475 if(!outfile_arg.empty() && !dump_smt_formula.empty())
478 "Argument --outfile is incompatible with --dump-smt-formula. ",
482 std::unique_ptr<smt_base_solver_processt> solver_process =
nullptr;
484 if(!outfile_arg.empty())
486 bool on_std_out = outfile_arg ==
"-";
487 std::unique_ptr<std::ostream> outfile =
491 solver_process = std::make_unique<smt_incremental_dry_run_solvert>(
492 message_handler, on_std_out ? std::cout : *outfile, std::move(outfile));
496 const auto out_filename =
options.get_option(
"dump-smt-formula");
500 solver_process = std::make_unique<smt_piped_solver_processt>(
501 std::move(solver_command),
507 return std::make_unique<solvert>(
508 std::make_unique<smt2_incremental_decision_proceduret>(
512std::unique_ptr<solver_factoryt::solvert>
517 const std::string &filename =
options.get_option(
"outfile");
524 "required filename not provided",
526 "provide a filename with --outfile");
529 auto smt2_dec = std::make_unique<smt2_dect>(
535 options.get_option(
"external-smt2-solver"),
538 if(
options.get_bool_option(
"fpa"))
539 smt2_dec->use_FPA_theory =
true;
541 return std::make_unique<solvert>(std::move(smt2_dec));
543 else if(filename ==
"-")
545 auto smt2_conv = std::make_unique<smt2_convt>(
553 if(
options.get_bool_option(
"fpa"))
554 smt2_conv->use_FPA_theory =
true;
556 return std::make_unique<solvert>(std::move(smt2_conv));
562 auto smt2_conv = std::make_unique<smt2_convt>(
570 if(
options.get_bool_option(
"fpa"))
571 smt2_conv->use_FPA_theory =
true;
573 return std::make_unique<solvert>(std::move(smt2_conv), std::move(out));
579 if(
options.get_bool_option(
"beautify"))
582 "the chosen solver does not support beautification",
"--beautify");
588 const bool all_properties =
options.get_bool_option(
"all-properties");
589 const bool cover =
options.is_set(
"cover");
590 const bool incremental_loop =
options.is_set(
"incremental-loop");
595 "the chosen solver does not support incremental solving",
601 "the chosen solver does not support incremental solving",
"--cover");
603 else if(incremental_loop)
606 "the chosen solver does not support incremental solving",
607 "--incremental-loop");
613 if(cmdline.
isset(
"external-sat-solver"))
616 "external-sat-solver", cmdline.
get_value(
"external-sat-solver"));
621 if(cmdline.
isset(
"dimacs"))
624 if(cmdline.
isset(
"sat-solver"))
630 if(cmdline.
isset(
"smt2"))
633 if(cmdline.
isset(
"fpa"))
636 bool solver_set =
false;
638 if(cmdline.
isset(
"bitwuzla"))
644 if(cmdline.
isset(
"boolector"))
650 if(cmdline.
isset(
"cprover-smt2"))
656 if(cmdline.
isset(
"mathsat"))
662 if(cmdline.
isset(
"cvc5"))
668 if(cmdline.
isset(
"incremental-smt2-solver"))
671 "incremental-smt2-solver", cmdline.
get_value(
"incremental-smt2-solver")),
675 if(cmdline.
isset(
"yices"))
681 if(cmdline.
isset(
"z3"))
687 if(cmdline.
isset(
"external-smt2-solver"))
690 "external-smt2-solver", cmdline.
get_value(
"external-smt2-solver"));
695 if(cmdline.
isset(
"smt2") && !solver_set)
697 if(cmdline.
isset(
"outfile"))
719 std::vector<std::string> solver_flags;
721 if(cmdline.
isset(
"dimacs"))
722 solver_flags.push_back(
"--dimacs");
724 if(cmdline.
isset(
"external-sat-solver"))
725 solver_flags.push_back(
"--external-sat-solver");
729 for(
const char *smt2_flag :
738 "external-smt2-solver"})
740 if(cmdline.
isset(smt2_flag))
742 solver_flags.push_back(std::string(
"--") + smt2_flag);
747 if(cmdline.
isset(
"incremental-smt2-solver"))
748 solver_flags.push_back(
"--incremental-smt2-solver");
750 if(solver_flags.size() > 1)
753 "conflicting solver options: " + solver_flags[0] +
" and " +
754 solver_flags[1] +
" must not be given together",
755 solver_flags[0] +
" " + solver_flags[1]);
759 if(cmdline.
isset(
"incremental-smt2-solver") && cmdline.
isset(
"fpa"))
762 "--fpa is not supported with --incremental-smt2-solver",
763 "--fpa --incremental-smt2-solver");
766 if(cmdline.
isset(
"outfile"))
769 if(cmdline.
isset(
"dump-smt-formula"))
771 "dump-smt-formula", cmdline.
get_value(
"dump-smt-formula"));
773 if(cmdline.
isset(
"write-solver-stats-to"))
776 "write-solver-stats-to", cmdline.
get_value(
"write-solver-stats-to"));
779 if(cmdline.
isset(
"beautify"))
782 if(cmdline.
isset(
"refine-arrays"))
788 if(cmdline.
isset(
"refine-arithmetic"))
794 if(cmdline.
isset(
"refine"))
801 if(cmdline.
isset(
"max-node-refinement"))
804 "max-node-refinement", cmdline.
get_value(
"max-node-refinement"));
Abstraction Refinement Loop.
std::string get_value(char option) const
virtual bool isset(char option) const
Thrown when users pass incorrect command line arguments, for example passing no files to analysis or ...
Class that provides messages with a built-in verbosity 'level'.
mstreamt & warning() const
mstreamt & status() const
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
bool is_set(const std::string &option) const
N.B. opts.is_set("foo") does not imply opts.get_bool_option("foo").
bool get_bool_option(const std::string &option) const
void set_option(const std::string &option, const bool value)
const std::string get_option(const std::string &option) const
std::unique_ptr< stack_decision_proceduret > decision_procedure_ptr
std::unique_ptr< propt > prop_ptr
std::unique_ptr< std::ofstream > ofstream_ptr
boolbvt & boolbv_decision_procedure() const
solvert(std::unique_ptr< stack_decision_proceduret > p)
stack_decision_proceduret & decision_procedure() const
std::unique_ptr< boolbvt > decision_procedure_is_boolbvt_ptr
message_handlert & message_handler
std::unique_ptr< solvert > get_external_sat()
std::unique_ptr< solvert > get_default()
solver_factoryt(const optionst &_options, const namespacet &_ns, message_handlert &_message_handler, bool _output_xml_in_refinement)
Note: The solver returned will hold a reference to the namespace ns.
void set_decision_procedure_time_limit(solver_resource_limitst &decision_procedure)
Sets the timeout of decision_procedure if the solver-time-limit option has a positive value (in secon...
std::unique_ptr< solvert > get_dimacs()
void no_incremental_check()
std::unique_ptr< solvert > get_string_refinement()
the string refinement adds to the bit vector refinement specifications for functions from the Java st...
std::unique_ptr< solvert > get_smt2(smt2_dect::solvert solver)
const bool output_xml_in_refinement
smt2_dect::solvert get_smt2_solver_type() const
Uses the options to pick an SMT 2.0 solver.
virtual std::unique_ptr< solvert > get_solver()
Returns a solvert object.
std::unique_ptr< solvert > get_incremental_smt2(std::string solver_command)
std::unique_ptr< solvert > get_bv_refinement()
virtual void set_time_limit_seconds(uint32_t)=0
Set the limit for the solver to time out in seconds.
Document and give macros for the exit codes of CPROVER binaries.
#define CPROVER_EXIT_USAGE_ERROR
A usage error is returned when the command line is invalid or conflicting.
Allows calling an external SAT solver to allow faster integration of newer SAT solvers.
Decision procedure with incremental SMT2 solving.
void solver(std::vector< framet > &frames, const std::unordered_set< symbol_exprt, irep_hash > &address_taken, const solver_optionst &solver_options, const namespacet &ns, std::vector< propertyt > &properties, std::size_t property_index)
static std::enable_if<!std::is_base_of< hardness_collectort, SatcheckT >::value, std::unique_ptr< SatcheckT > >::type make_satcheck_prop(message_handlert &message_handler, const optionst &options)
static void parse_sat_options(const cmdlinet &cmdline, optionst &options)
static std::unique_ptr< std::ofstream > open_outfile_and_check(const std::string &filename, message_handlert &message_handler, const std::string &arg_name)
static void parse_smt2_options(const cmdlinet &cmdline, optionst &options)
static std::unique_ptr< propt > get_sat_solver(message_handlert &message_handler, const optionst &options)
static void emit_solver_warning(message_handlert &message_handler, const std::string &solver)
Emit a warning for non-existent solver solver via message_handler.
void parse_solver_options(const cmdlinet &cmdline, optionst &options)
Parse solver-related command-line parameters in cmdline and set corresponding values in options.
Solver capability to set resource limits.
#define PRECONDITION(CONDITION)
String support via creating string constraints and progressively instantiating the universal constrai...
#define DEFAULT_MAX_NB_REFINEMENT
unsigned max_node_refinement
Max number of times we refine a formula node.
bool refine_arrays
Enable array refinement.
bool refine_arithmetic
Enable arithmetic refinement.
message_handlert * message_handler
std::size_t refinement_bound
string_refinementt constructor arguments
#define widen_if_needed(s)
const char * CBMC_VERSION