50 : decision_procedure_ptr(
std::move(p))
55 std::unique_ptr<stack_decision_proceduret>
p1,
56 std::unique_ptr<propt>
p2)
57 : prop_ptr(
std::move(
p2)), decision_procedure_ptr(
std::move(
p1))
62 std::unique_ptr<stack_decision_proceduret>
p1,
63 std::unique_ptr<std::ofstream>
p2)
64 : ofstream_ptr(
std::move(
p2)), decision_procedure_ptr(
std::move(
p1))
69 std::unique_ptr<boolbvt>
p1,
70 std::unique_ptr<propt>
p2)
71 : prop_ptr(
std::move(
p2)), decision_procedure_is_boolbvt_ptr(
std::move(
p1))
76 std::unique_ptr<boolbvt>
p1,
77 std::unique_ptr<propt>
p2,
78 std::unique_ptr<std::ofstream>
p3)
79 : ofstream_ptr(
std::move(
p3)),
80 prop_ptr(
std::move(
p2)),
81 decision_procedure_is_boolbvt_ptr(
std::move(
p1))
88 (decision_procedure_ptr !=
nullptr) !=
89 (decision_procedure_is_boolbvt_ptr !=
nullptr));
90 if(decision_procedure_ptr)
91 return *decision_procedure_ptr;
93 return *decision_procedure_is_boolbvt_ptr;
98 PRECONDITION(decision_procedure_is_boolbvt_ptr !=
nullptr);
99 return *decision_procedure_is_boolbvt_ptr;
106 options.get_signed_int_option(
"solver-time-limit");
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"))
127 options.get_option(
"incremental-smt2-solver");
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)
170 log.warning() <<
"The specified solver, '" <<
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
182 if(
options.is_set(
"write-solver-stats-to"))
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
199 if(
options.is_set(
"write-solver-stats-to"))
201 std::unique_ptr<solver_hardnesst> solver_hardness =
202 std::make_unique<solver_hardnesst>();
203 solver_hardness->set_outfile(
options.get_option(
"write-solver-stats-to"));
204 satcheck->solver_hardness = std::move(solver_hardness);
209static std::unique_ptr<propt>
213 !
options.get_bool_option(
"sat-preprocessor") ||
214 options.get_bool_option(
"refine-strings");
216 if(
options.is_set(
"sat-solver"))
221#if defined SATCHECK_ZCHAFF
229#if defined SATCHECK_BOOLERFORCE
237#if defined SATCHECK_MINISAT1
245#if defined SATCHECK_MINISAT2
263#if defined SATCHECK_IPASIR
271#if defined SATCHECK_PICOSAT
279#if defined SATCHECK_LINGELING
287#if defined SATCHECK_GLUCOSE
305#if defined SATCHECK_CADICAL
335 const std::string &filename,
347 "failed to open file: " + filename,
arg_name);
351 log.status() <<
"Outputting formula to file: " << filename <<
messaget::eom;
359 bool get_array_constraints =
360 options.get_bool_option(
"show-array-constraints");
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 ==
"-")
389 return std::make_unique<solvert>(std::move(
bv_dimacs), std::move(prop));
397 return std::make_unique<solvert>(
398 std::move(
bv_dimacs), std::move(prop), std::move(outfile));
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"))
427 info.max_node_refinement =
428 options.get_unsigned_int_option(
"max-node-refinement");
430 info.refine_arrays =
options.get_bool_option(
"refine-arrays");
431 info.refine_arithmetic =
options.get_bool_option(
"refine-arithmetic");
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"))
454 info.max_node_refinement =
455 options.get_unsigned_int_option(
"max-node-refinement");
456 info.refine_arrays =
options.get_bool_option(
"refine-arrays");
457 info.refine_arithmetic =
options.get_bool_option(
"refine-arithmetic");
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>
478 "Argument --outfile is incompatible with --dump-smt-formula. ",
482 std::unique_ptr<smt_base_solver_processt> solver_process =
nullptr;
487 std::unique_ptr<std::ostream> outfile =
491 solver_process = std::make_unique<smt_incremental_dry_run_solvert>(
500 solver_process = std::make_unique<smt_piped_solver_processt>(
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"))
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");
595 "the chosen solver does not support incremental solving",
601 "the chosen solver does not support incremental solving",
"--cover");
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"));
619 options.set_option(
"sat-preprocessor", !cmdline.
isset(
"no-sat-preprocessor"));
621 if(cmdline.
isset(
"dimacs"))
622 options.set_option(
"dimacs",
true);
624 if(cmdline.
isset(
"sat-solver"))
630 if(cmdline.
isset(
"smt2"))
631 options.set_option(
"smt2",
true);
633 if(cmdline.
isset(
"fpa"))
634 options.set_option(
"fpa",
true);
638 if(cmdline.
isset(
"bitwuzla"))
641 options.set_option(
"smt2",
true);
644 if(cmdline.
isset(
"boolector"))
647 options.set_option(
"smt2",
true);
650 if(cmdline.
isset(
"cprover-smt2"))
653 options.set_option(
"smt2",
true);
656 if(cmdline.
isset(
"mathsat"))
659 options.set_option(
"smt2",
true);
662 if(cmdline.
isset(
"cvc5"))
665 options.set_option(
"smt2",
true);
668 if(cmdline.
isset(
"incremental-smt2-solver"))
671 "incremental-smt2-solver", cmdline.
get_value(
"incremental-smt2-solver")),
675 if(cmdline.
isset(
"yices"))
678 options.set_option(
"smt2",
true);
681 if(cmdline.
isset(
"z3"))
684 options.set_option(
"smt2",
true);
687 if(cmdline.
isset(
"external-smt2-solver"))
690 "external-smt2-solver", cmdline.
get_value(
"external-smt2-solver"));
692 options.set_option(
"smt2",
true);
697 if(cmdline.
isset(
"outfile"))
700 options.set_option(
"generic",
true);
705 options.set_option(
"z3",
true);
721 if(cmdline.
isset(
"dimacs"))
724 if(cmdline.
isset(
"external-sat-solver"))
738 "external-smt2-solver"})
747 if(cmdline.
isset(
"incremental-smt2-solver"))
753 "conflicting solver options: " +
solver_flags[0] +
" and " +
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"))
780 options.set_option(
"beautify",
true);
782 if(cmdline.
isset(
"refine-arrays"))
784 options.set_option(
"refine",
true);
785 options.set_option(
"refine-arrays",
true);
788 if(cmdline.
isset(
"refine-arithmetic"))
790 options.set_option(
"refine",
true);
791 options.set_option(
"refine-arithmetic",
true);
794 if(cmdline.
isset(
"refine"))
796 options.set_option(
"refine",
true);
797 options.set_option(
"refine-arrays",
true);
798 options.set_option(
"refine-arithmetic",
true);
801 if(cmdline.
isset(
"max-node-refinement"))
804 "max-node-refinement", cmdline.
get_value(
"max-node-refinement"));
Abstraction Refinement Loop.
message_handlert & message_handler
virtual xmlt output_xml(const namespacet &ns, const irep_idt &function_id, const goto_programt &goto_program) const
Output the abstract states for a single function as XML.
ait supplies three of the four components needed: an abstract interpreter (in this case handling func...
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'.
A namespacet is essentially one or two symbol tables bound together, to allow for symbol lookups in t...
boolbvt & boolbv_decision_procedure() const
solvert(std::unique_ptr< stack_decision_proceduret > p)
stack_decision_proceduret & decision_procedure() const
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
string_refinementt constructor arguments
#define widen_if_needed(s)
const char * CBMC_VERSION