ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
kissatSolver.c
Go to the documentation of this file.
1
20
21#include "kissat.h"
22#include "kissatSolver.h"
23
25
29
33
47 s->p = (void*)kissat_init();
48 s->nVars = 0;
49 return s;
50}
51
67
82int kissat_solver_addclause(kissat_solver* s, int* begin, int* end) {
83 for(;begin != end; begin++) {
84 if(*begin & 1) {
85 kissat_add((kissat*)s->p, -(1 + ((*begin) >> 1)));
86 } else {
87 kissat_add((kissat*)s->p, 1 + ((*begin) >> 1) );
88 }
89 }
90 kissat_add((kissat*)s->p, 0);
91 return !kissat_is_inconsistent((kissat*)s->p);
92}
93
105int kissat_solver_solve(kissat_solver* s, int* begin, int* end, ABC_INT64_T nConfLimit, ABC_INT64_T nInsLimit, ABC_INT64_T nConfLimitGlobal, ABC_INT64_T nInsLimitGlobal) {
106 // assumptions are not supported
107 assert(begin == end);
108 // inspection limits are not supported
109 assert(nInsLimit == 0);
110 assert(nInsLimitGlobal == 0);
111 // set conflict limits
112 if(nConfLimit)
113 kissat_set_conflict_limit((kissat*)s->p, nConfLimit);
114 if(nConfLimitGlobal && (nConfLimit == 0 || nConfLimit > nConfLimitGlobal))
115 kissat_set_conflict_limit((kissat*)s->p, nConfLimitGlobal);
116 // solve
117 int res = kissat_solve((kissat*)s->p);
118 // translate this kissat return value into a corresponding ABC status value
119 switch(res) {
120 case 0: // UNDETERMINED
121 return 0;
122 case 10: // SATISFIABLE
123 return 1;
124 case 20: // UNSATISFIABLE
125 return -1;
126 default:
127 assert(0);
128 }
129 return 0;
130}
131
144 return s->nVars;
145}
146
159 return s->nVars++;
160}
161
174 s->nVars = n;
175 kissat_reserve((kissat*)s->p, n);
176}
177
191 return kissat_value((kissat*)s->p, v + 1) > 0;
192}
193
194
206Vec_Int_t * kissat_solve_cnf( Cnf_Dat_t * pCnf, char * pArgs, int nConfs, int nTimeLimit, int fSat, int fUnsat, int fPrintCex, int fVerbose )
207{
208 abctime clk = Abc_Clock();
209 Vec_Int_t * vRes = NULL;
210 int i, * pBeg, * pEnd, RetValue;
211 if ( fVerbose )
212 printf( "CNF stats: Vars = %6d. Clauses = %7d. Literals = %8d. ", pCnf->nVars, pCnf->nClauses, pCnf->nLiterals );
214 kissat_solver_setnvars(pSat, pCnf->nVars);
215 assert(kissat_solver_nvars(pSat) == pCnf->nVars);
216 Cnf_CnfForClause( pCnf, pBeg, pEnd, i ) {
217 if ( !kissat_solver_addclause(pSat, pBeg, pEnd) )
218 {
219 assert( 0 ); // if it happens, can return 1 (unsatisfiable)
220 return NULL;
221 }
222 }
223 RetValue = kissat_solver_solve(pSat, NULL, NULL, 0, 0, 0, 0);
224 if ( RetValue == 1 )
225 printf( "Result: Satisfiable. " );
226 else if ( RetValue == -1 )
227 printf( "Result: Unsatisfiable. " );
228 else
229 printf( "Result: Undecided. " );
230 if ( RetValue == 1 ) {
231 vRes = Vec_IntAlloc( pCnf->nVars );
232 for ( i = 0; i < pCnf->nVars; i++ )
233 Vec_IntPush( vRes, kissat_solver_get_var_value(pSat, i) );
234 }
236 Abc_PrintTime( 1, "Time", Abc_Clock() - clk );
237 return vRes;
238}
239
240
244
ABC_INT64_T abctime
Definition abc_global.h:332
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
#define Cnf_CnfForClause(p, pBeg, pEnd, i)
MACRO DEFINITIONS ///.
Definition cnf.h:117
struct Cnf_Dat_t_ Cnf_Dat_t
Definition cnf.h:52
int kissat_value(kissat *solver, int elit)
Definition internal.c:498
int kissat_solve(kissat *solver)
Definition internal.c:477
void kissat_set_conflict_limit(kissat *solver, unsigned limit)
Definition internal.c:222
kissat * kissat_init(void)
Definition internal.c:27
void kissat_add(kissat *solver, int elit)
Definition internal.c:268
void kissat_release(kissat *solver)
Definition internal.c:81
void kissat_reserve(kissat *solver, int max_var)
Definition internal.c:169
int kissat_is_inconsistent(kissat *solver)
Definition internal.c:524
int kissat_solver_solve(kissat_solver *s, int *begin, int *end, ABC_INT64_T nConfLimit, ABC_INT64_T nInsLimit, ABC_INT64_T nConfLimitGlobal, ABC_INT64_T nInsLimitGlobal)
int kissat_solver_addclause(kissat_solver *s, int *begin, int *end)
int kissat_solver_get_var_value(kissat_solver *s, int v)
Vec_Int_t * kissat_solve_cnf(Cnf_Dat_t *pCnf, char *pArgs, int nConfs, int nTimeLimit, int fSat, int fUnsat, int fPrintCex, int fVerbose)
void kissat_solver_delete(kissat_solver *s)
ABC_NAMESPACE_IMPL_START kissat_solver * kissat_solver_new(void)
DECLARATIONS ///.
int kissat_solver_nvars(kissat_solver *s)
int kissat_solver_addvar(kissat_solver *s)
void kissat_solver_setnvars(kissat_solver *s, int n)
typedefABC_NAMESPACE_HEADER_START struct kissat_solver_ kissat_solver
INCLUDES ///.
int nVars
Definition cnf.h:59
int nLiterals
Definition cnf.h:60
int nClauses
Definition cnf.h:61
#define assert(ex)
Definition util_old.h:213
VOID_HACK free()
char * malloc()