00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00038 #ifndef __NUSMV_CORE_SAT_SAT_SOLVER_H__
00039 #define __NUSMV_CORE_SAT_SAT_SOLVER_H__
00040
00041 #include "nusmv/core/be/be.h"
00042 #include "nusmv/core/utils/object.h"
00043 #include "nusmv/core/utils/utils.h"
00044
00045
00046
00047
00048
00054 #define Term void *
00055
00061 #define TermFactoryCallbacksUserData_ptr void *
00062
00063
00064 typedef enum SatSolverResult_TAG
00065 { SAT_SOLVER_INTERNAL_ERROR=-1,
00066 SAT_SOLVER_TIMEOUT,
00067 SAT_SOLVER_MEMOUT,
00068 SAT_SOLVER_SATISFIABLE_PROBLEM,
00069 SAT_SOLVER_UNSATISFIABLE_PROBLEM,
00070 SAT_SOLVER_UNAVAILABLE
00071 } SatSolverResult;
00072
00073
00074
00075
00076
00083 typedef struct SatSolver_TAG* SatSolver_ptr;
00084
00090 typedef nusmv_ptrint SatSolverGroup;
00091 typedef nusmv_ptrint SatSolverItpGroup;
00092
00093 typedef struct TermFactoryCallbacks_TAG {
00094 Term (*make_false)(TermFactoryCallbacksUserData_ptr user_data);
00095 Term (*make_true)(TermFactoryCallbacksUserData_ptr user_data);
00096
00097 Term (*make_and)(Term t1, Term t2, TermFactoryCallbacksUserData_ptr user_data);
00098 Term (*make_or)(Term t1, Term t2, TermFactoryCallbacksUserData_ptr user_data);
00099 Term (*make_not)(Term t, TermFactoryCallbacksUserData_ptr user_data);
00100
00101 Term (*make_var)(int var, TermFactoryCallbacksUserData_ptr user_data);
00102 } TermFactoryCallbacks;
00103
00109 typedef TermFactoryCallbacks* TermFactoryCallbacks_ptr;
00110
00111
00112
00113
00114
00115
00116
00117
00118
00124 #define SAT_SOLVER(x) \
00125 ((SatSolver_ptr) x)
00126
00132 #define SAT_SOLVER_CHECK_INSTANCE(x) \
00133 (nusmv_assert(SAT_SOLVER(x) != SAT_SOLVER(NULL)))
00134
00136
00137
00138
00139
00140
00141
00148 void SatSolver_destroy(SatSolver_ptr self);
00149
00159 SatSolverGroup
00160 SatSolver_get_permanent_group(const SatSolver_ptr self);
00161
00179 VIRTUAL void
00180 SatSolver_add(const SatSolver_ptr self,
00181 const Be_Cnf_ptr cnfProb,
00182 SatSolverGroup group);
00183
00197 VIRTUAL void
00198 SatSolver_set_polarity(const SatSolver_ptr self,
00199 const Be_Cnf_ptr cnfProb,
00200 int polarity,
00201 SatSolverGroup group);
00202
00211 VIRTUAL void
00212 SatSolver_set_preferred_variables(const SatSolver_ptr self,
00213 const Slist_ptr cnfVars);
00214
00224 VIRTUAL Slist_ptr
00225 SatSolver_get_conflicts(const SatSolver_ptr self);
00226
00235 VIRTUAL void
00236 SatSolver_clear_preferred_variables(const SatSolver_ptr self);
00237
00246 VIRTUAL SatSolverResult
00247 SatSolver_solve_all_groups(const SatSolver_ptr self);
00248
00258 VIRTUAL SatSolverResult
00259 SatSolver_solve_all_groups_assume(const SatSolver_ptr self, Slist_ptr assumptions);
00260
00272 VIRTUAL Slist_ptr
00273 SatSolver_get_model(const SatSolver_ptr self);
00274
00281 VIRTUAL int
00282 SatSolver_get_cnf_var(const SatSolver_ptr self, int var);
00283
00291 VIRTUAL void
00292 SatSolver_set_random_mode(SatSolver_ptr self, double seed);
00293
00300 VIRTUAL void
00301 SatSolver_set_polarity_mode(SatSolver_ptr self, int mode);
00302
00309 VIRTUAL int
00310 SatSolver_get_polarity_mode(const SatSolver_ptr self);
00311
00318 const char*
00319 SatSolver_get_name(const SatSolver_ptr self);
00320
00327 long
00328 SatSolver_get_last_solving_time(const SatSolver_ptr self);
00329
00336 SatSolverItpGroup
00337 SatSolver_curr_itp_group(const SatSolver_ptr self);
00338
00345 SatSolverItpGroup
00346 SatSolver_new_itp_group(const SatSolver_ptr self);
00347
00354 Term
00355 SatSolver_extract_interpolant(const SatSolver_ptr self, int nof_ga_groups,
00356 SatSolverItpGroup* ga_groups,
00357 TermFactoryCallbacks_ptr callbacks,
00358 TermFactoryCallbacksUserData_ptr user_data);
00359
00362 #endif