22#ifndef ABC__sat__bsat__satSolver_h
23#define ABC__sat__bsat__satSolver_h
213 return Sat_MemClauseHand( &s->
Mem, h );
216static inline int sat_solver_var_value(
sat_solver* s,
int v )
218 assert( v >= 0 && v < s->size );
221static inline int sat_solver_var_literal(
sat_solver* s,
int v )
223 assert( v >= 0 && v < s->size );
226static inline void sat_solver_flip_print_clause(
sat_solver* s )
230static inline void sat_solver_act_var_clear(
sat_solver* s)
235 for (i = 0; i < s->
size; i++)
241 for (i = 0; i < s->
size; i++)
247 for (i = 0; i < s->
size; i++)
253static inline void sat_solver_compress(
sat_solver* s)
262static inline void sat_solver_delete_p(
sat_solver ** ps )
268static inline void sat_solver_clean_polarity(
sat_solver* s,
int * pVars,
int nVars )
271 for ( i = 0; i < nVars; i++ )
274static inline void sat_solver_set_polarity(
sat_solver* s,
int * pVars,
int nVars )
277 for ( i = 0; i < s->
size; i++ )
279 for ( i = 0; i < nVars; i++ )
282static inline void sat_solver_set_literal_polarity(
sat_solver* s,
int * pLits,
int nLits )
285 for ( i = 0; i < nLits; i++ )
286 s->
polarity[Abc_Lit2Var(pLits[i])] = !Abc_LitIsCompl(pLits[i]);
289static inline int sat_solver_final(
sat_solver* s,
int ** ppArray)
295static inline void sat_solver_randomize(
sat_solver * pSat,
int iVar,
int nVars )
297 int i, nPols = 0, * pVars =
ABC_ALLOC(
int, nVars );
298 for ( i = 0; i < nVars; i++ )
300 pVars[nPols++] = iVar + i;
301 sat_solver_set_polarity( pSat, pVars, nPols );
302 for ( i = 0; i < nVars; i++ )
304 for ( i = 0; i < nVars; i++ )
307 ABC_SWAP(
int, pVars[i], pVars[j] );
317 return nRuntimeLimit;
320static inline int sat_solver_set_random(
sat_solver* s,
int fNotUseRandom)
324 return fNotUseRandomOld;
327static inline void sat_solver_bookmark(
sat_solver* s)
332 Sat_MemBookMark( &s->
Mem );
339static inline void sat_solver_set_pivot_variables(
sat_solver* s,
int * pPivots,
int nPivots )
345static inline int sat_solver_count_usedvars(
sat_solver* s)
348 for ( i = 0; i < s->
size; i++ )
356static inline void sat_solver_set_runid(
sat_solver *s,
int id )
360static inline void sat_solver_set_stop_func(
sat_solver *s,
int (*fnct)(
int) )
365static inline int sat_solver_add_const(
sat_solver * pSat,
int iVar,
int fCompl )
371 Lits[0] = toLitCond( iVar, fCompl );
376static inline int sat_solver_add_buffer(
sat_solver * pSat,
int iVarA,
int iVarB,
int fCompl )
380 assert( iVarA >= 0 && iVarB >= 0 );
382 Lits[0] = toLitCond( iVarA, 0 );
383 Lits[1] = toLitCond( iVarB, !fCompl );
389 Lits[0] = toLitCond( iVarA, 1 );
390 Lits[1] = toLitCond( iVarB, fCompl );
397static inline int sat_solver_add_buffer_enable(
sat_solver * pSat,
int iVarA,
int iVarB,
int iVarEn,
int fCompl )
401 assert( iVarA >= 0 && iVarB >= 0 && iVarEn >= 0 );
403 Lits[0] = toLitCond( iVarA, 0 );
404 Lits[1] = toLitCond( iVarB, !fCompl );
405 Lits[2] = toLitCond( iVarEn, 1 );
409 Lits[0] = toLitCond( iVarA, 1 );
410 Lits[1] = toLitCond( iVarB, fCompl );
411 Lits[2] = toLitCond( iVarEn, 1 );
421 Lits[0] = toLitCond( iVar, !fCompl );
422 Lits[1] = toLitCond( iVar0, fCompl0 );
426 Lits[0] = toLitCond( iVar, !fCompl );
427 Lits[1] = toLitCond( iVar1, fCompl1 );
431 Lits[0] = toLitCond( iVar, fCompl );
432 Lits[1] = toLitCond( iVar0, !fCompl0 );
433 Lits[2] = toLitCond( iVar1, !fCompl1 );
442 assert( iVarA >= 0 && iVarB >= 0 && iVarC >= 0 );
444 Lits[0] = toLitCond( iVarA, !fCompl );
445 Lits[1] = toLitCond( iVarB, 1 );
446 Lits[2] = toLitCond( iVarC, 1 );
450 Lits[0] = toLitCond( iVarA, !fCompl );
451 Lits[1] = toLitCond( iVarB, 0 );
452 Lits[2] = toLitCond( iVarC, 0 );
456 Lits[0] = toLitCond( iVarA, fCompl );
457 Lits[1] = toLitCond( iVarB, 1 );
458 Lits[2] = toLitCond( iVarC, 0 );
462 Lits[0] = toLitCond( iVarA, fCompl );
463 Lits[1] = toLitCond( iVarB, 0 );
464 Lits[2] = toLitCond( iVarC, 1 );
469static inline int sat_solver_add_mux(
sat_solver * pSat,
int iVarZ,
int iVarC,
int iVarT,
int iVarE,
int iComplC,
int iComplT,
int iComplE,
int iComplZ )
473 assert( iVarC >= 0 && iVarT >= 0 && iVarE >= 0 && iVarZ >= 0 );
475 Lits[0] = toLitCond( iVarC, 1 ^ iComplC );
476 Lits[1] = toLitCond( iVarT, 1 ^ iComplT );
477 Lits[2] = toLitCond( iVarZ, 0 );
481 Lits[0] = toLitCond( iVarC, 1 ^ iComplC );
482 Lits[1] = toLitCond( iVarT, 0 ^ iComplT );
483 Lits[2] = toLitCond( iVarZ, 1 ^ iComplZ );
487 Lits[0] = toLitCond( iVarC, 0 ^ iComplC );
488 Lits[1] = toLitCond( iVarE, 1 ^ iComplE );
489 Lits[2] = toLitCond( iVarZ, 0 ^ iComplZ );
493 Lits[0] = toLitCond( iVarC, 0 ^ iComplC );
494 Lits[1] = toLitCond( iVarE, 0 ^ iComplE );
495 Lits[2] = toLitCond( iVarZ, 1 ^ iComplZ );
499 if ( iVarT == iVarE )
502 Lits[0] = toLitCond( iVarT, 0 ^ iComplT );
503 Lits[1] = toLitCond( iVarE, 0 ^ iComplE );
504 Lits[2] = toLitCond( iVarZ, 1 ^ iComplZ );
508 Lits[0] = toLitCond( iVarT, 1 ^ iComplT );
509 Lits[1] = toLitCond( iVarE, 1 ^ iComplE );
510 Lits[2] = toLitCond( iVarZ, 0 ^ iComplZ );
515static inline int sat_solver_add_mux41(
sat_solver * pSat,
int iVarZ,
int iVarC0,
int iVarC1,
int iVarD0,
int iVarD1,
int iVarD2,
int iVarD3 )
519 assert( iVarC0 >= 0 && iVarC1 >= 0 && iVarD0 >= 0 && iVarD1 >= 0 && iVarD2 >= 0 && iVarD3 >= 0 && iVarZ >= 0 );
521 Lits[0] = toLitCond( iVarD0, 1 );
522 Lits[1] = toLitCond( iVarC0, 0 );
523 Lits[2] = toLitCond( iVarC1, 0 );
524 Lits[3] = toLitCond( iVarZ, 0 );
528 Lits[0] = toLitCond( iVarD1, 1 );
529 Lits[1] = toLitCond( iVarC0, 1 );
530 Lits[2] = toLitCond( iVarC1, 0 );
531 Lits[3] = toLitCond( iVarZ, 0 );
535 Lits[0] = toLitCond( iVarD2, 1 );
536 Lits[1] = toLitCond( iVarC0, 0 );
537 Lits[2] = toLitCond( iVarC1, 1 );
538 Lits[3] = toLitCond( iVarZ, 0 );
542 Lits[0] = toLitCond( iVarD3, 1 );
543 Lits[1] = toLitCond( iVarC0, 1 );
544 Lits[2] = toLitCond( iVarC1, 1 );
545 Lits[3] = toLitCond( iVarZ, 0 );
550 Lits[0] = toLitCond( iVarD0, 0 );
551 Lits[1] = toLitCond( iVarC0, 0 );
552 Lits[2] = toLitCond( iVarC1, 0 );
553 Lits[3] = toLitCond( iVarZ, 1 );
557 Lits[0] = toLitCond( iVarD1, 0 );
558 Lits[1] = toLitCond( iVarC0, 1 );
559 Lits[2] = toLitCond( iVarC1, 0 );
560 Lits[3] = toLitCond( iVarZ, 1 );
564 Lits[0] = toLitCond( iVarD2, 0 );
565 Lits[1] = toLitCond( iVarC0, 0 );
566 Lits[2] = toLitCond( iVarC1, 1 );
567 Lits[3] = toLitCond( iVarZ, 1 );
571 Lits[0] = toLitCond( iVarD3, 0 );
572 Lits[1] = toLitCond( iVarC0, 1 );
573 Lits[2] = toLitCond( iVarC1, 1 );
574 Lits[3] = toLitCond( iVarZ, 1 );
579static inline int sat_solver_add_xor_and(
sat_solver * pSat,
int iVarF,
int iVarA,
int iVarB,
int iVarC )
584 assert( iVarF >= 0 && iVarA >= 0 && iVarB >= 0 && iVarC >= 0 );
586 Lits[0] = toLitCond( iVarF, 1 );
587 Lits[1] = toLitCond( iVarA, 1 );
588 Lits[2] = toLitCond( iVarB, 1 );
592 Lits[0] = toLitCond( iVarF, 1 );
593 Lits[1] = toLitCond( iVarA, 0 );
594 Lits[2] = toLitCond( iVarB, 0 );
598 Lits[0] = toLitCond( iVarF, 1 );
599 Lits[1] = toLitCond( iVarC, 0 );
603 Lits[0] = toLitCond( iVarF, 0 );
604 Lits[1] = toLitCond( iVarA, 1 );
605 Lits[2] = toLitCond( iVarB, 0 );
606 Lits[3] = toLitCond( iVarC, 1 );
610 Lits[0] = toLitCond( iVarF, 0 );
611 Lits[1] = toLitCond( iVarA, 0 );
612 Lits[2] = toLitCond( iVarB, 1 );
613 Lits[3] = toLitCond( iVarC, 1 );
618static inline int sat_solver_add_constraint(
sat_solver * pSat,
int iVar,
int iVar2,
int fCompl )
624 Lits[0] = toLitCond( iVar, fCompl );
625 Lits[1] = toLitCond( iVar2, 0 );
629 Lits[0] = toLitCond( iVar, fCompl );
630 Lits[1] = toLitCond( iVar2, 1 );
636static inline int sat_solver_add_half_sorter(
sat_solver * pSat,
int iVarA,
int iVarB,
int iVar0,
int iVar1 )
641 Lits[0] = toLitCond( iVarA, 0 );
642 Lits[1] = toLitCond( iVar0, 1 );
646 Lits[0] = toLitCond( iVarA, 0 );
647 Lits[1] = toLitCond( iVar1, 1 );
651 Lits[0] = toLitCond( iVarB, 0 );
652 Lits[1] = toLitCond( iVar0, 1 );
653 Lits[2] = toLitCond( iVar1, 1 );
#define ABC_SWAP(Type, a, b)
#define ABC_ALLOC(type, num)
unsigned Abc_Random(int fReset)
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
#define sat_solver_addclause
#define sat_solver_addvar
#define sat_solver_add_and
#define sat_solver_add_xor
unsigned __int64 word
DECLARATIONS ///.
struct Sat_Mem_t_ Sat_Mem_t
sat_solver * sat_solver_new(void)
int sat_solver_get_var_value(sat_solver *s, int v)
int sat_solver_solve_internal(sat_solver *s)
void sat_solver_store_mark_clauses_a(sat_solver *s)
int sat_solver_simplify(sat_solver *s)
void sat_solver_restart(sat_solver *s)
int sat_solver_nconflicts(sat_solver *s)
void sat_solver_store_free(sat_solver *s)
int sat_solver_nclauses(sat_solver *s)
void zsat_solver_restart_seed(sat_solver *s, double seed)
void sat_solver_store_write(sat_solver *s, char *pFileName)
void sat_solver_set_var_activity(sat_solver *s, int *pVars, int nVars)
void sat_solver_setnvars(sat_solver *s, int n)
int * Sat_SolverGetModel(sat_solver *p, int *pVars, int nVars)
void sat_solver_store_alloc(sat_solver *s)
int sat_solver_nvars(sat_solver *s)
void Sat_SolverDoubleClauses(sat_solver *p, int iVar)
void sat_solver_rollback(sat_solver *s)
sat_solver * zsat_solver_new_seed(double seed)
int sat_solver_push(sat_solver *s, int p)
void Sat_SolverWriteDimacs(sat_solver *p, char *pFileName, lit *assumptionsBegin, lit *assumptionsEnd, int incrementVars)
void Sat_SolverTraceStart(sat_solver *pSat, char *pName)
DECLARATIONS ///.
int sat_solver_clause_new(sat_solver *s, lit *begin, lit *end, int learnt)
void Sat_SolverTraceStop(sat_solver *pSat)
void sat_solver_store_mark_roots(sat_solver *s)
int sat_solver_count_assigned(sat_solver *s)
void sat_solver_pop(sat_solver *s)
void Sat_SolverPrintStats(FILE *pFile, sat_solver *p)
void * sat_solver_store_release(sat_solver *s)
int sat_solver_minimize_assumptions2(sat_solver *s, int *pLits, int nLits, int nConfLimit)
void sat_solver_set_resource_limits(sat_solver *s, ABC_INT64_T nConfLimit, ABC_INT64_T nInsLimit, ABC_INT64_T nConfLimitGlobal, ABC_INT64_T nInsLimitGlobal)
void sat_solver_delete(sat_solver *s)
void Sat_SolverTraceWrite(sat_solver *pSat, int *pBeg, int *pEnd, int fRoot)
int sat_solver_solve_lexsat(sat_solver *s, int *pLits, int nLits)
int sat_solver_minimize_assumptions(sat_solver *s, int *pLits, int nLits, int nConfLimit)
double sat_solver_memory(sat_solver *s)
int(* pCnfFunc)(void *p, int)