55 if ( xSAT_HeapSize( s->
hOrder ) == 0 )
61 NextVar = xSAT_HeapRemoveMin( s->
hOrder );
84 Vec_IntPush( vTemp,
Var );
86 xSAT_HeapBuild( s->
hOrder, vTemp );
101static inline void xSAT_SolverVarActRescale(
xSAT_Solver_t * s )
104 unsigned * pActivity = (
unsigned * ) Vec_IntArray( s->
vActivity );
106 for ( i = 0; i < Vec_IntSize( s->
vActivity ); i++ )
126 unsigned * pActivity = (
unsigned * ) Vec_IntArray( s->
vActivity );
129 if ( pActivity[
Var] & 0x80000000 )
130 xSAT_SolverVarActRescale( s );
147static inline void xSAT_SolverVarActDecay(
xSAT_Solver_t * s )
163static inline void xSAT_SolverClaActRescale(
xSAT_Solver_t * s )
170 pC = xSAT_SolverReadClause( s, (
unsigned ) CRef );
171 pC->pData[pC->nSize].Act >>= 14;
190 pCla->pData[pCla->nSize].Act += s->
nClaActInc;
191 if ( pCla->pData[pCla->nSize].Act & 0x80000000 )
192 xSAT_SolverClaActRescale( s );
206static inline void xSAT_SolverClaActDecay(
xSAT_Solver_t * s )
228 for ( i = 0; i < pCla->nSize; i++ )
230 int Level = Vec_IntEntry( s->
vLevels, xSAT_Lit2Var( pCla->pData[i].Lit ) );
231 if ( (
unsigned ) Vec_IntEntry( s->
vStamp, Level ) != s->
nStamp )
233 Vec_IntWriteEntry( s->
vStamp, Level, (
int ) s->
nStamp );
246 for ( i = 0; i < Vec_IntSize( vLits ); i++ )
248 int Level = Vec_IntEntry( s->
vLevels, xSAT_Lit2Var( Vec_IntEntry( vLits, i ) ) );
249 if ( (
unsigned ) Vec_IntEntry( s->
vStamp, Level ) != s->
nStamp )
251 Vec_IntWriteEntry( s->
vStamp, Level, (
int ) s->
nStamp );
277 assert( Vec_IntSize( vLits ) > 1);
278 assert( fLearnt == 0 || fLearnt == 1 );
280 nWords = 3 + fLearnt + Vec_IntSize( vLits );
282 pCla = xSAT_SolverReadClause( s, CRef );
283 pCla->fLearnt = fLearnt;
286 pCla->fCanBeDel = fLearnt;
287 pCla->nSize = Vec_IntSize( vLits );
288 memcpy( &( pCla->pData[0].Lit ), Vec_IntArray( vLits ),
sizeof(
int ) * Vec_IntSize( vLits ) );
293 pCla->nLBD = xSAT_SolverClaCalcLBD2( s, vLits );
294 pCla->pData[pCla->nSize].Act = 0;
296 xSAT_SolverClaActBump(s, pCla);
306 w1.Blocker = pCla->pData[1].Lit;
307 w2.Blocker = pCla->pData[0].Lit;
309 if ( Vec_IntSize( vLits ) == 2 )
311 xSAT_WatchListPush( xSAT_VecWatchListEntry( s->
vBinWatches, xSAT_NegLit( pCla->pData[0].Lit ) ), w1 );
312 xSAT_WatchListPush( xSAT_VecWatchListEntry( s->
vBinWatches, xSAT_NegLit( pCla->pData[1].Lit ) ), w2 );
316 xSAT_WatchListPush( xSAT_VecWatchListEntry( s->
vWatches, xSAT_NegLit( pCla->pData[0].Lit ) ), w1 );
317 xSAT_WatchListPush( xSAT_VecWatchListEntry( s->
vWatches, xSAT_NegLit( pCla->pData[1].Lit ) ), w2 );
335 int Var = xSAT_Lit2Var( Lit );
337 Vec_StrWriteEntry( s->
vAssigns,
Var, (
char)xSAT_LitSign( Lit ) );
338 Vec_IntWriteEntry( s->
vLevels,
Var, xSAT_SolverDecisionLevel( s ) );
339 Vec_IntWriteEntry( s->
vReasons,
Var, (
int ) Reason );
340 Vec_IntPush( s->
vTrail, Lit );
356static inline void xSAT_SolverNewDecision(
xSAT_Solver_t * s,
int Lit )
379 if ( xSAT_SolverDecisionLevel( s ) <= Level )
382 for ( c = Vec_IntSize( s->
vTrail ) - 1; c >= Vec_IntEntry( s->
vTrailLim, Level ); c-- )
384 int Var = xSAT_Lit2Var( Vec_IntEntry( s->
vTrail, c ) );
388 Vec_StrWriteEntry( s->
vPolarity,
Var, (
char )xSAT_LitSign( Vec_IntEntry( s->
vTrail, c ) ) );
390 if ( !xSAT_HeapInHeap( s->
hOrder,
Var ) )
410static int xSAT_SolverIsLitRemovable(
xSAT_Solver_t* s,
int Lit,
int MinLevel )
412 int top = Vec_IntSize( s->
vTagged );
415 Vec_IntClear( s->
vStack );
416 Vec_IntPush( s->
vStack, xSAT_Lit2Var( Lit ) );
418 while ( Vec_IntSize( s->
vStack ) )
421 int v = Vec_IntPop( s->
vStack );
423 int * Lits = &( c->pData[0].Lit );
426 if( c->nSize == 2 && Vec_StrEntry( s->
vAssigns, xSAT_Lit2Var( Lits[0] ) ) == xSAT_LitSign( xSAT_NegLit( Lits[0] ) ) )
428 assert( Vec_StrEntry( s->
vAssigns, xSAT_Lit2Var( Lits[1] ) ) == xSAT_LitSign( ( Lits[1] ) ) );
432 for ( i = 1; i < c->nSize; i++ )
434 int v = xSAT_Lit2Var( Lits[i] );
435 if ( !Vec_StrEntry( s->
vSeen, v ) && Vec_IntEntry( s->
vLevels, v ) )
437 if ( (
unsigned ) Vec_IntEntry( s->
vReasons, v ) !=
CRefUndef && ( ( 1 << (Vec_IntEntry( s->
vLevels, v ) & 31 ) ) & MinLevel ) )
439 Vec_IntPush( s->
vStack, v );
440 Vec_IntPush( s->
vTagged, Lits[i] );
441 Vec_StrWriteEntry( s->
vSeen, v, 1 );
447 Vec_StrWriteEntry( s->
vSeen, xSAT_Lit2Var( Lit ), 0 );
448 Vec_IntShrink( s->
vTagged, top );
470 int * pLits = Vec_IntArray( vLits );
474 for ( i = 1; i < Vec_IntSize( vLits ); i++ )
476 int Level = Vec_IntEntry( s->
vLevels, xSAT_Lit2Var( pLits[i] ) );
477 MinLevel |= 1 << ( Level & 31 );
481 Vec_IntAppend( s->
vTagged, vLits );
482 for ( i = j = 1; i < Vec_IntSize( vLits ); i++ )
483 if ( (
unsigned ) Vec_IntEntry( s->
vReasons, xSAT_Lit2Var( pLits[i] ) ) ==
CRefUndef || !xSAT_SolverIsLitRemovable( s, pLits[i], MinLevel ) )
484 pLits[j++] = pLits[i];
485 Vec_IntShrink( vLits, j );
488 if( Vec_IntSize( vLits ) <= 30 && xSAT_SolverClaCalcLBD2( s, vLits ) <= 6 )
492 int FlaseLit = xSAT_NegLit( pLits[0] );
500 Vec_IntWriteEntry( s->
vStamp, xSAT_Lit2Var( Lit ), (
int ) s->
nStamp );
503 for ( pWatcher = begin; pWatcher < end; pWatcher++ )
505 int ImpLit = pWatcher->Blocker;
507 if ( (
unsigned ) Vec_IntEntry( s->
vStamp, xSAT_Lit2Var( ImpLit ) ) == s->
nStamp && Vec_StrEntry( s->
vAssigns, xSAT_Lit2Var( ImpLit ) ) == xSAT_LitSign( ImpLit ) )
510 Vec_IntWriteEntry( s->
vStamp, xSAT_Lit2Var( ImpLit ), (
int )( s->
nStamp - 1 ) );
514 l = Vec_IntSize( vLits ) - 1;
517 for ( i = 1; i < Vec_IntSize( vLits ) - nb; i++ )
518 if ( (
unsigned ) Vec_IntEntry( s->
vStamp, xSAT_Lit2Var( pLits[i] ) ) != s->
nStamp )
520 int TempLit = pLits[l];
526 Vec_IntShrink( vLits, Vec_IntSize( vLits ) - nb );
542static void xSAT_SolverAnalyze(
xSAT_Solver_t* s,
unsigned ConfCRef,
Vec_Int_t * vLearnt,
int * OutBtLevel,
unsigned * nLBD )
544 int * trail = Vec_IntArray( s->
vTrail );
547 int Idx = Vec_IntSize( s->
vTrail ) - 1;
558 pCla = xSAT_SolverReadClause(s, ConfCRef);
559 Lits = &( pCla->pData[0].Lit );
561 if(
p !=
LitUndef && pCla->nSize == 2 && Vec_StrEntry( s->
vAssigns, xSAT_Lit2Var( Lits[0] ) ) == xSAT_LitSign( xSAT_NegLit( Lits[0] ) ) )
563 assert( Vec_StrEntry( s->
vAssigns, xSAT_Lit2Var( Lits[1] ) ) == xSAT_LitSign( ( Lits[1] ) ) );
568 xSAT_SolverClaActBump( s, pCla );
570 if ( pCla->fLearnt && pCla->nLBD > 2 )
572 unsigned int nLevels = xSAT_SolverClaCalcLBD( s, pCla );
573 if ( nLevels + 1 < pCla->nLBD )
577 pCla->nLBD = nLevels;
581 for ( j = (
p ==
LitUndef ? 0 : 1 ); j < pCla->nSize; j++ )
583 int Var = xSAT_Lit2Var( Lits[j] );
587 Vec_StrWriteEntry( s->
vSeen,
Var, 1 );
588 xSAT_SolverVarActBump( s,
Var );
589 if ( Vec_IntEntry( s->
vLevels,
Var ) >= xSAT_SolverDecisionLevel( s ) )
596 Vec_IntPush( vLearnt, Lits[j] );
600 while ( !Vec_StrEntry( s->
vSeen, xSAT_Lit2Var( trail[Idx--] ) ) );
604 ConfCRef = ( unsigned ) Vec_IntEntry( s->
vReasons, xSAT_Lit2Var(
p ) );
605 Vec_StrWriteEntry( s->
vSeen, xSAT_Lit2Var(
p ), 0 );
608 }
while ( Count > 0 );
610 Vec_IntArray( vLearnt )[0] = xSAT_NegLit(
p );
611 xSAT_SolverClaMinimisation( s, vLearnt );
614 Lits = Vec_IntArray( vLearnt );
615 if ( Vec_IntSize( vLearnt ) == 1 )
620 int Max = Vec_IntEntry( s->
vLevels, xSAT_Lit2Var( Lits[1] ) );
623 for (i = 2; i < Vec_IntSize( vLearnt ); i++)
624 if ( Vec_IntEntry( s->
vLevels, xSAT_Lit2Var( Lits[i]) ) > Max)
626 Max = Vec_IntEntry( s->
vLevels, xSAT_Lit2Var( Lits[i]) );
631 Lits[1] = Lits[iMax];
633 *OutBtLevel = Vec_IntEntry( s->
vLevels, xSAT_Lit2Var( Lits[1] ) );
636 *nLBD = xSAT_SolverClaCalcLBD2( s, vLearnt );
642 if ( xSAT_SolverReadClause( s, Vec_IntEntry( s->
vReasons,
Var ) )->nLBD < *nLBD )
643 xSAT_SolverVarActBump( s,
Var );
650 Vec_StrWriteEntry( s->
vSeen, xSAT_Lit2Var( Lit ), 0 );
681 for ( i = begin; i < end; i++ )
683 if ( Vec_StrEntry( s->
vAssigns, xSAT_Lit2Var( i->Blocker ) ) ==
VarX )
685 else if ( Vec_StrEntry( s->
vAssigns, xSAT_Lit2Var( i->Blocker ) ) == xSAT_LitSign( xSAT_NegLit( i->Blocker ) ) )
689 ws = xSAT_VecWatchListEntry( s->
vWatches,
p );
690 begin = xSAT_WatchListArray( ws );
691 end = begin + xSAT_WatchListSize( ws );
693 for ( i = j = begin; i < end; )
697 if ( Vec_StrEntry( s->
vAssigns, xSAT_Lit2Var( i->Blocker ) ) == xSAT_LitSign( i->Blocker ) )
703 pCla = xSAT_SolverReadClause( s, i->CRef );
704 Lits = &( pCla->pData[0].Lit );
707 NegLit = xSAT_NegLit(
p );
708 if ( Lits[0] == NegLit )
713 assert( Lits[1] == NegLit );
719 if ( Lits[0] != i->Blocker && Vec_StrEntry( s->
vAssigns, xSAT_Lit2Var( Lits[0] ) ) == xSAT_LitSign( Lits[0] ) )
724 int * stop = Lits + pCla->nSize;
726 for ( k = Lits + 2; k < stop; k++ )
728 if (Vec_StrEntry( s->
vAssigns, xSAT_Lit2Var( *k ) ) != !xSAT_LitSign( *k ) )
732 xSAT_WatchListPush( xSAT_VecWatchListEntry( s->
vWatches, xSAT_NegLit( Lits[1] ) ), w );
740 if (Vec_StrEntry( s->
vAssigns, xSAT_Lit2Var( Lits[0] ) ) == xSAT_LitSign( xSAT_NegLit( Lits[0] ) ) )
757 xSAT_WatchListShrink( ws, j - xSAT_WatchListArray( ws ) );
781 int nLearnedOld = Vec_IntSize( s->
vLearnts );
789 learnts_cls[i] = xSAT_SolverReadClause(s, CRef);
791 limit = nLearnedOld / 2;
793 xSAT_UtilSort((
void **) learnts_cls, nLearnedOld,
794 (
int (*)(
const void *,
const void * )) xSAT_ClauseCompare);
796 if ( learnts_cls[nLearnedOld / 2]->nLBD <= 3 )
798 if ( learnts_cls[nLearnedOld - 1]->nLBD <= 5 )
802 for ( i = 0; i < nLearnedOld; i++ )
806 pCla = learnts_cls[i];
807 CRef = xSAT_MemCRef( s->
pMemory, (
unsigned * ) pCla );
808 assert( pCla->fMark == 0 );
809 if ( pCla->fCanBeDel && pCla->nLBD > 2 && pCla->nSize > 2 && (
unsigned) Vec_IntEntry( s->
vReasons, xSAT_Lit2Var( pCla->pData[0].Lit ) ) != CRef && ( i < limit ) )
813 xSAT_WatchListRemove( xSAT_VecWatchListEntry( s->
vWatches, xSAT_NegLit( pCla->pData[0].Lit ) ), CRef );
814 xSAT_WatchListRemove( xSAT_VecWatchListEntry( s->
vWatches, xSAT_NegLit( pCla->pData[1].Lit ) ), CRef );
818 if ( !pCla->fCanBeDel )
826 TimeTotal += Abc_Clock() - clk;
829 Abc_Print(1,
"reduceDB: Keeping %7d out of %7d clauses (%5.2f %%) ",
830 Vec_IntSize( s->
vLearnts ), nLearnedOld, 100.0 * Vec_IntSize( s->
vLearnts ) / nLearnedOld );
831 Abc_PrintTime( 1,
"Time", TimeTotal );
866 if ( xSAT_SolverDecisionLevel( s ) == 0 )
871 xSAT_BQueueClean(s->
bqLBD);
874 xSAT_SolverAnalyze( s, hConfl, s->
vLearntClause, &BacktrackLevel, &nLBD );
877 xSAT_BQueuePush( s->
bqLBD, nLBD );
883 xSAT_SolverVarActDecay( s );
884 xSAT_SolverClaActDecay( s );
892 xSAT_BQueueClean( s->
bqLBD );
898 if ( xSAT_SolverDecisionLevel( s ) == 0 )
911 NextVar = xSAT_SolverDecide( s );
916 xSAT_SolverNewDecision( s, xSAT_Var2Lit( NextVar, (
int ) Vec_StrEntry( s->
vPolarity, NextVar ) ) );
938 xSAT_Clause_t * pOldCla = xSAT_MemClauseHand( pSrc, *pCRef );
940 if ( pOldCla->fReallocd )
942 *pCRef = ( unsigned ) pOldCla->nSize;
945 nNewCRef = xSAT_MemAppend( pDest, 3 + pOldCla->fLearnt + pOldCla->nSize );
946 pNewCla = xSAT_MemClauseHand( pDest, nNewCRef );
947 memcpy( pNewCla, pOldCla, (
size_t)(( 3 + pOldCla->fLearnt + pOldCla->nSize ) * 4) );
948 pOldCla->fReallocd = 1;
949 pOldCla->nSize = ( unsigned ) nNewCRef;
970 for ( i = 0; i < 2 * Vec_StrSize( s->
vAssigns ); i++ )
977 for ( w = begin; w != end; w++ )
981 begin = xSAT_WatchListArray(ws);
982 end = begin + xSAT_WatchListSize(ws);
983 for ( w = begin; w != end; w++ )
987 for ( i = 0; i < Vec_IntSize( s->
vTrail ); i++ )
991 pArray = (
unsigned * ) Vec_IntArray( s->
vLearnts );
992 for ( i = 0; i < Vec_IntSize( s->
vLearnts ); i++ )
995 pArray = (
unsigned * ) Vec_IntArray( s->
vClauses );
996 for ( i = 0; i < Vec_IntSize( s->
vClauses ); i++ )
#define ABC_SWAP(Type, a, b)
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
RegionAllocator< uint32_t >::Ref CRef
unsigned nLBDFrozenClause
xSAT_SolverOptions_t Config
xSAT_VecWatchList_t * vWatches
Vec_Int_t * vLearntClause
xSAT_VecWatchList_t * vBinWatches
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
#define Vec_IntForEachEntryStart(vVec, Entry, i, Start)
typedefABC_NAMESPACE_HEADER_START struct xSAT_Clause_t_ xSAT_Clause_t
INCLUDES ///.
typedefABC_NAMESPACE_HEADER_START struct xSAT_Mem_t_ xSAT_Mem_t
INCLUDES ///.
void xSAT_SolverReduceDB(xSAT_Solver_t *s)
void xSAT_SolverRebuildOrderHeap(xSAT_Solver_t *s)
void xSAT_SolverClaRealloc(xSAT_Mem_t *pDest, xSAT_Mem_t *pSrc, unsigned *pCRef)
void xSAT_SolverGarbageCollect(xSAT_Solver_t *s)
void xSAT_SolverCancelUntil(xSAT_Solver_t *s, int Level)
int xSAT_SolverEnqueue(xSAT_Solver_t *s, int Lit, unsigned Reason)
char xSAT_SolverSearch(xSAT_Solver_t *s)
unsigned xSAT_SolverPropagate(xSAT_Solver_t *s)
unsigned xSAT_SolverClaNew(xSAT_Solver_t *s, Vec_Int_t *vLits, int fLearnt)
FUNCTION DECLARATIONS ///.
struct xSAT_WatchList_t_ xSAT_WatchList_t
typedefABC_NAMESPACE_HEADER_START struct xSAT_Watcher_t_ xSAT_Watcher_t
INCLUDES ///.
int xSAT_SolverSimplify(xSAT_Solver_t *)
struct xSAT_Solver_t_ xSAT_Solver_t