Commit 27caed8d by Alan Mishchenko

Experiments with SAT sweeping.

parent 3f0cb631
...@@ -43019,7 +43019,7 @@ int Abc_CommandAbc9Test( Abc_Frame_t * pAbc, int argc, char ** argv ) ...@@ -43019,7 +43019,7 @@ int Abc_CommandAbc9Test( Abc_Frame_t * pAbc, int argc, char ** argv )
// Jf_ManTestCnf( pAbc->pGia ); // Jf_ManTestCnf( pAbc->pGia );
// Gia_ManCheckFalseTest( pAbc->pGia, nFrames ); // Gia_ManCheckFalseTest( pAbc->pGia, nFrames );
// Gia_ParTest( pAbc->pGia, nWords, nProcs ); // Gia_ParTest( pAbc->pGia, nWords, nProcs );
Cec2_ManSimulateTest( pAbc->pGia );
// printf( "\nThis command is currently disabled.\n\n" ); // printf( "\nThis command is currently disabled.\n\n" );
return 0; return 0;
usage: usage:
...@@ -55,6 +55,7 @@ struct Cec2_Man_t_ ...@@ -55,6 +55,7 @@ struct Cec2_Man_t_
Vec_Wrd_t * vSims; // CI simulation info Vec_Wrd_t * vSims; // CI simulation info
Vec_Int_t * vNodesNew; // nodes Vec_Int_t * vNodesNew; // nodes
Vec_Int_t * vObjSatPairs; // nodes Vec_Int_t * vObjSatPairs; // nodes
Vec_Int_t * vCexTriples; // nodes
}; };
static inline int Cec2_ObjSatId( Gia_Man_t * p, Gia_Obj_t * pObj ) { return Gia_ObjCopyArray(p, Gia_ObjId(p, pObj)); } static inline int Cec2_ObjSatId( Gia_Man_t * p, Gia_Obj_t * pObj ) { return Gia_ObjCopyArray(p, Gia_ObjId(p, pObj)); }
...@@ -352,11 +353,9 @@ static inline word * Cec2_ObjSim( Gia_Man_t * p, int iObj ) ...@@ -352,11 +353,9 @@ static inline word * Cec2_ObjSim( Gia_Man_t * p, int iObj )
{ {
return Vec_WrdEntryP( p->vSims, p->nSimWords * iObj ); return Vec_WrdEntryP( p->vSims, p->nSimWords * iObj );
} }
static inline void Cec2_ObjSimSetPiBit( Gia_Man_t * p, int iObj, int Bit ) static inline void Cec2_ObjSimSetInputBit( Gia_Man_t * p, int iObj, int Bit )
{ {
word * pSim = Cec2_ObjSim( p, iObj ); word * pSim = Cec2_ObjSim( p, iObj );
p->iPatsPi = (p->iPatsPi == 64 * p->nSimWords - 1) ? 1 : p->iPatsPi + 1;
assert( p->iPatsPi > 0 && p->iPatsPi < 64 * p->nSimWords );
if ( Abc_InfoHasBit( (unsigned*)pSim, p->iPatsPi ) != Bit ) if ( Abc_InfoHasBit( (unsigned*)pSim, p->iPatsPi ) != Bit )
Abc_InfoXorBit( (unsigned*)pSim, p->iPatsPi ); Abc_InfoXorBit( (unsigned*)pSim, p->iPatsPi );
} }
...@@ -421,7 +420,7 @@ static inline int Cec2_ObjSimEqual( Gia_Man_t * p, int iObj0, int iObj1 ) ...@@ -421,7 +420,7 @@ static inline int Cec2_ObjSimEqual( Gia_Man_t * p, int iObj0, int iObj1 )
return 1; return 1;
} }
} }
static inline void Cec2_ObjSimPi( Gia_Man_t * p, int iObj ) static inline void Cec2_ObjSimCi( Gia_Man_t * p, int iObj )
{ {
int w; int w;
word * pSim = Cec2_ObjSim( p, iObj ); word * pSim = Cec2_ObjSim( p, iObj );
...@@ -433,7 +432,7 @@ void Cec2_ManSimulateCis( Gia_Man_t * p ) ...@@ -433,7 +432,7 @@ void Cec2_ManSimulateCis( Gia_Man_t * p )
{ {
int i, Id; int i, Id;
Gia_ManForEachCiId( p, Id, i ) Gia_ManForEachCiId( p, Id, i )
Cec2_ObjSimPi( p, Id ); Cec2_ObjSimCi( p, Id );
p->iPatsPi = 1; p->iPatsPi = 1;
} }
Abc_Cex_t * Cec2_ManDeriveCex( Gia_Man_t * p, int iOut, int iPat ) Abc_Cex_t * Cec2_ManDeriveCex( Gia_Man_t * p, int iOut, int iPat )
...@@ -471,15 +470,28 @@ void Cec2_ManSaveCis( Gia_Man_t * p ) ...@@ -471,15 +470,28 @@ void Cec2_ManSaveCis( Gia_Man_t * p )
Gia_ManForEachCiId( p, Id, i ) Gia_ManForEachCiId( p, Id, i )
Vec_WrdPush( p->vSimsPi, Cec2_ObjSim(p, Id)[w] ); Vec_WrdPush( p->vSimsPi, Cec2_ObjSim(p, Id)[w] );
} }
void Cec2_ManSimulate( Gia_Man_t * p ) void Cec2_ManSimulate( Gia_Man_t * p, Vec_Int_t * vTriples )
{ {
extern void Cec2_ManSimClassRefineOne( Gia_Man_t * p, int iRepr ); extern void Cec2_ManSimClassRefineOne( Gia_Man_t * p, int iRepr );
Gia_Obj_t * pObj; int i; Gia_Obj_t * pObj;
Cec2_ManSaveCis( p ); int i, iRepr, iObj, Entry;
//Cec2_ManSaveCis( p );
Gia_ManForEachAnd( p, pObj, i ) Gia_ManForEachAnd( p, pObj, i )
Cec2_ObjSimAnd( p, i ); Cec2_ObjSimAnd( p, i );
if ( p->pReprs == NULL ) if ( p->pReprs == NULL )
return; return;
if ( vTriples )
{
Vec_IntForEachEntryTriple( vTriples, iRepr, iObj, Entry, i )
{
word * pSim0 = Cec2_ObjSim( p, iRepr );
word * pSim1 = Cec2_ObjSim( p, iObj );
int iPat = Abc_Lit2Var(Entry);
int fPhase = Abc_LitIsCompl(Entry);
if ( (fPhase ^ Abc_InfoHasBit((unsigned *)pSim0, iPat)) == Abc_InfoHasBit((unsigned *)pSim1, iPat) )
printf( "ERROR: Pattern %d did not disprove pair %d and %d.\n", iPat, iRepr, iObj );
}
}
Gia_ManForEachClass0( p, i ) Gia_ManForEachClass0( p, i )
Cec2_ManSimClassRefineOne( p, i ); Cec2_ManSimClassRefineOne( p, i );
} }
...@@ -570,7 +582,8 @@ void Cec2_ManCreateClasses( Gia_Man_t * p ) ...@@ -570,7 +582,8 @@ void Cec2_ManCreateClasses( Gia_Man_t * p )
int nWords = p->nSimWords; int nWords = p->nSimWords;
int * pTable, nTableSize, i, Key; int * pTable, nTableSize, i, Key;
// allocate representation // allocate representation
assert( p->pReprs == NULL ); ABC_FREE( p->pReprs );
ABC_FREE( p->pNexts );
p->pReprs = ABC_CALLOC( Gia_Rpr_t, Gia_ManObjNum(p) ); p->pReprs = ABC_CALLOC( Gia_Rpr_t, Gia_ManObjNum(p) );
p->pNexts = ABC_FALLOC( int, Gia_ManObjNum(p) ); p->pNexts = ABC_FALLOC( int, Gia_ManObjNum(p) );
// hash each node by its simulation info // hash each node by its simulation info
...@@ -618,7 +631,7 @@ Cec2_Man_t * Cec2_ManCreate( Gia_Man_t * pAig, Cec2_Par_t * pPars ) ...@@ -618,7 +631,7 @@ Cec2_Man_t * Cec2_ManCreate( Gia_Man_t * pAig, Cec2_Par_t * pPars )
{ {
Cec2_Man_t * p; Cec2_Man_t * p;
Gia_Obj_t * pObj; int i; Gia_Obj_t * pObj; int i;
assert( Gia_ManRegNum(pAig) == 0 ); //assert( Gia_ManRegNum(pAig) == 0 );
p = ABC_CALLOC( Cec2_Man_t, 1 ); p = ABC_CALLOC( Cec2_Man_t, 1 );
memset( p, 0, sizeof(Cec2_Man_t) ); memset( p, 0, sizeof(Cec2_Man_t) );
p->pPars = pPars; p->pPars = pPars;
...@@ -637,6 +650,7 @@ Cec2_Man_t * Cec2_ManCreate( Gia_Man_t * pAig, Cec2_Par_t * pPars ) ...@@ -637,6 +650,7 @@ Cec2_Man_t * Cec2_ManCreate( Gia_Man_t * pAig, Cec2_Par_t * pPars )
p->vFanins = Vec_PtrAlloc( 100 ); p->vFanins = Vec_PtrAlloc( 100 );
p->vNodesNew = Vec_IntAlloc( 100 ); p->vNodesNew = Vec_IntAlloc( 100 );
p->vObjSatPairs = Vec_IntAlloc( 100 ); p->vObjSatPairs = Vec_IntAlloc( 100 );
p->vCexTriples = Vec_IntAlloc( 100 );
// remember pointer to the solver in the AIG manager // remember pointer to the solver in the AIG manager
pAig->pData = p->pSat; pAig->pData = p->pSat;
return p; return p;
...@@ -652,12 +666,53 @@ void Cec2_ManDestroy( Cec2_Man_t * p ) ...@@ -652,12 +666,53 @@ void Cec2_ManDestroy( Cec2_Man_t * p )
Vec_PtrFreeP( &p->vFanins ); Vec_PtrFreeP( &p->vFanins );
Vec_IntFreeP( &p->vNodesNew ); Vec_IntFreeP( &p->vNodesNew );
Vec_IntFreeP( &p->vObjSatPairs ); Vec_IntFreeP( &p->vObjSatPairs );
Vec_IntFreeP( &p->vCexTriples );
ABC_FREE( p ); ABC_FREE( p );
} }
/**Function************************************************************* /**Function*************************************************************
Synopsis [Verify counter-example.]
Description []
SideEffects []
SeeAlso []
***********************************************************************/
int Cec2_ManVerify_rec( Gia_Man_t * p, int iObj, satoko_t * pSat )
{
int Value0, Value1;
Gia_Obj_t * pObj = Gia_ManObj( p, iObj );
if ( iObj == 0 ) return 0;
if ( Gia_ObjIsTravIdCurrentId(p, iObj) )
return pObj->fMark1;
Gia_ObjSetTravIdCurrentId(p, iObj);
if ( Gia_ObjIsCi(pObj) )
return pObj->fMark1 = var_polarity(pSat, Cec2_ObjSatId(p, pObj)) == LIT_TRUE;
assert( Gia_ObjIsAnd(pObj) );
Value0 = Cec2_ManVerify_rec( p, Gia_ObjFaninId0(pObj, iObj), pSat ) ^ Gia_ObjFaninC0(pObj);
Value1 = Cec2_ManVerify_rec( p, Gia_ObjFaninId1(pObj, iObj), pSat ) ^ Gia_ObjFaninC1(pObj);
return pObj->fMark1 = Value0 & Value1;
}
void Cec2_ManVerify( Gia_Man_t * p, int iObj0, int iObj1, int fPhase, satoko_t * pSat )
{
// int val0 = var_polarity(pSat, Cec2_ObjSatId(p, Gia_ManObj(p, iObj0))) == LIT_TRUE;
// int val1 = var_polarity(pSat, Cec2_ObjSatId(p, Gia_ManObj(p, iObj1))) == LIT_TRUE;
int Value0, Value1;
Gia_ManIncrementTravId( p );
Value0 = Cec2_ManVerify_rec( p, iObj0, pSat );
Value1 = Cec2_ManVerify_rec( p, iObj1, pSat );
if ( (Value0 ^ Value1) == fPhase )
printf( "CEX verification FAILED for obj %d and obj %d.\n", iObj0, iObj1 );
// else
// printf( "CEX verification succeeded for obj %d and obj %d.\n", iObj0, iObj1 );;
}
/**Function*************************************************************
Synopsis [Internal simulation APIs.] Synopsis [Internal simulation APIs.]
Description [] Description []
...@@ -707,6 +762,7 @@ int Cec2_ManSolveTwo( Cec2_Man_t * p, int iObj0, int iObj1, int fPhase ) ...@@ -707,6 +762,7 @@ int Cec2_ManSolveTwo( Cec2_Man_t * p, int iObj0, int iObj1, int fPhase )
Gia_ManIncrementTravId( p->pNew ); Gia_ManIncrementTravId( p->pNew );
Cec2_ManCollect_rec( p, iObj0 ); Cec2_ManCollect_rec( p, iObj0 );
Cec2_ManCollect_rec( p, iObj1 ); Cec2_ManCollect_rec( p, iObj1 );
//printf( "%d ", Vec_IntSize(p->vNodesNew) );
// solve direct // solve direct
satoko_assump_push( p->pSat, Abc_Var2Lit(iVar0, 1) ); satoko_assump_push( p->pSat, Abc_Var2Lit(iVar0, 1) );
satoko_assump_push( p->pSat, Abc_Var2Lit(iVar1, fPhase) ); satoko_assump_push( p->pSat, Abc_Var2Lit(iVar1, fPhase) );
...@@ -722,6 +778,8 @@ int Cec2_ManSolveTwo( Cec2_Man_t * p, int iObj0, int iObj1, int fPhase ) ...@@ -722,6 +778,8 @@ int Cec2_ManSolveTwo( Cec2_Man_t * p, int iObj0, int iObj1, int fPhase )
satoko_assump_pop( p->pSat ); satoko_assump_pop( p->pSat );
satoko_assump_pop( p->pSat ); satoko_assump_pop( p->pSat );
} }
//if ( status == SATOKO_SAT )
// Cec2_ManVerify( p->pNew, iObj0, iObj1, fPhase, p->pSat );
Gia_ManForEachObjVec( p->vNodesNew, p->pNew, pObj, i ) Gia_ManForEachObjVec( p->vNodesNew, p->pNew, pObj, i )
Cec2_ObjCleanSatId( p->pNew, pObj ); Cec2_ObjCleanSatId( p->pNew, pObj );
return status; return status;
...@@ -735,8 +793,10 @@ int Cec2_ManSweepNode( Cec2_Man_t * p, int iObj ) ...@@ -735,8 +793,10 @@ int Cec2_ManSweepNode( Cec2_Man_t * p, int iObj )
status = Cec2_ManSolveTwo( p, Abc_Lit2Var(pRepr->Value), Abc_Lit2Var(pObj->Value), fCompl ); status = Cec2_ManSolveTwo( p, Abc_Lit2Var(pRepr->Value), Abc_Lit2Var(pObj->Value), fCompl );
if ( status == SATOKO_SAT ) if ( status == SATOKO_SAT )
{ {
p->pAig->iPatsPi = (p->pAig->iPatsPi == 64 * p->pAig->nSimWords - 1) ? 1 : p->pAig->iPatsPi + 1;
assert( p->pAig->iPatsPi > 0 && p->pAig->iPatsPi < 64 * p->pAig->nSimWords );
Vec_IntForEachEntryDouble( p->vObjSatPairs, IdAig, IdSat, i ) Vec_IntForEachEntryDouble( p->vObjSatPairs, IdAig, IdSat, i )
Cec2_ObjSimSetPiBit( p->pAig, IdAig, var_value(p->pSat, IdSat) == LIT_TRUE ); Cec2_ObjSimSetInputBit( p->pAig, IdAig, var_polarity(p->pSat, IdSat) == LIT_TRUE );
RetValue = 0; RetValue = 0;
} }
else if ( status == SATOKO_UNSAT ) else if ( status == SATOKO_UNSAT )
...@@ -751,13 +811,14 @@ int Cec2_ManSweepNode( Cec2_Man_t * p, int iObj ) ...@@ -751,13 +811,14 @@ int Cec2_ManSweepNode( Cec2_Man_t * p, int iObj )
assert( 0 ); assert( 0 );
} }
satoko_rollback( p->pSat ); satoko_rollback( p->pSat );
p->pSat->stats.n_conflicts = 0;
return RetValue; return RetValue;
} }
int Cec2_ManPerformSweeping( Gia_Man_t * p, Cec2_Par_t * pPars ) int Cec2_ManPerformSweeping( Gia_Man_t * p, Cec2_Par_t * pPars )
{ {
Cec2_Man_t * pMan; Cec2_Man_t * pMan;
Gia_Obj_t * pObj, * pRepr, * pObjNew; Gia_Obj_t * pObj, * pRepr, * pObjNew;
int i, fDisproved = 1; int i, Iter, fDisproved = 1;
// check if any output trivially fails under all-0 pattern // check if any output trivially fails under all-0 pattern
Gia_ManSetPhase( p ); Gia_ManSetPhase( p );
...@@ -770,10 +831,11 @@ int Cec2_ManPerformSweeping( Gia_Man_t * p, Cec2_Par_t * pPars ) ...@@ -770,10 +831,11 @@ int Cec2_ManPerformSweeping( Gia_Man_t * p, Cec2_Par_t * pPars )
return 0; return 0;
} }
} }
// simulate one round and create classes // simulate one round and create classes
Cec2_ManSimAlloc( p, pPars->nSimWords ); Cec2_ManSimAlloc( p, pPars->nSimWords );
Cec2_ManSimulateCis( p ); Cec2_ManSimulateCis( p );
Cec2_ManSimulate( p ); Cec2_ManSimulate( p, NULL );
if ( pPars->fIsMiter && !Cec2_ManSimulateCos(p) ) // cex detected if ( pPars->fIsMiter && !Cec2_ManSimulateCos(p) ) // cex detected
return 0; return 0;
Cec2_ManCreateClasses( p ); Cec2_ManCreateClasses( p );
...@@ -784,7 +846,7 @@ int Cec2_ManPerformSweeping( Gia_Man_t * p, Cec2_Par_t * pPars ) ...@@ -784,7 +846,7 @@ int Cec2_ManPerformSweeping( Gia_Man_t * p, Cec2_Par_t * pPars )
for ( i = 0; i < pPars->nSimRounds; i++ ) for ( i = 0; i < pPars->nSimRounds; i++ )
{ {
Cec2_ManSimulateCis( p ); Cec2_ManSimulateCis( p );
Cec2_ManSimulate( p ); Cec2_ManSimulate( p, NULL );
if ( pPars->fIsMiter && !Cec2_ManSimulateCos(p) ) // cex detected if ( pPars->fIsMiter && !Cec2_ManSimulateCos(p) ) // cex detected
return 0; return 0;
if ( pPars->fVerbose ) if ( pPars->fVerbose )
...@@ -792,33 +854,34 @@ int Cec2_ManPerformSweeping( Gia_Man_t * p, Cec2_Par_t * pPars ) ...@@ -792,33 +854,34 @@ int Cec2_ManPerformSweeping( Gia_Man_t * p, Cec2_Par_t * pPars )
} }
// perform sweeping // perform sweeping
pMan = Cec2_ManCreate( p, pPars ); pMan = Cec2_ManCreate( p, pPars );
while ( fDisproved ) for ( Iter = 0; fDisproved; Iter++ )
{ {
fDisproved = 0; fDisproved = 0;
Cec2_ManSimulateCis( p ); Cec2_ManSimulateCis( p );
Vec_IntClear( pMan->vCexTriples );
Gia_ManForEachAnd( p, pObj, i ) Gia_ManForEachAnd( p, pObj, i )
{ {
pObj->fMark1 = 0;
if ( ~pObj->Value ) // skip swept nodes
continue;
assert( !Gia_ObjProved(p, i) && !Gia_ObjFailed(p, i) );
pObj->fMark1 = Gia_ObjFanin0(pObj)->fMark1 || Gia_ObjFanin1(pObj)->fMark1; pObj->fMark1 = Gia_ObjFanin0(pObj)->fMark1 || Gia_ObjFanin1(pObj)->fMark1;
if ( pObj->fMark1 ) // skip nodes in the TFO of a disproved one if ( pObj->fMark1 ) // skip nodes in the TFO of a disproved one
continue; continue;
if ( ~pObj->Value ) // skip swept nodes
continue;
if ( !~Gia_ObjFanin0(pObj)->Value || !~Gia_ObjFanin1(pObj)->Value ) // skip fanouts of non-swept nodes
continue;
assert( !Gia_ObjProved(p, i) && !Gia_ObjFailed(p, i) );
// duplicate the node // duplicate the node
pObj->Value = Gia_ManHashAnd( pMan->pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) ); pObj->Value = Gia_ManHashAnd( pMan->pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
if ( Vec_IntSize(&pMan->pNew->vCopies) == Abc_Lit2Var(pObj->Value) ) if ( Vec_IntSize(&pMan->pNew->vCopies) == Abc_Lit2Var(pObj->Value) )
{ {
pObjNew = Gia_ManObj( pMan->pNew, Abc_Lit2Var(pObj->Value) ); pObjNew = Gia_ManObj( pMan->pNew, Abc_Lit2Var(pObj->Value) );
pObjNew->fMark0 = Gia_ObjIsMuxType( pObjNew ); pObjNew->fMark0 = Gia_ObjIsMuxType( pObjNew );
Gia_ObjSetPhase( pMan->pNew, pObjNew );
Vec_IntPush( &pMan->pNew->vCopies, -1 ); Vec_IntPush( &pMan->pNew->vCopies, -1 );
} }
assert( Vec_IntSize(&pMan->pNew->vCopies) == Gia_ManObjNum(pMan->pNew) ); assert( Vec_IntSize(&pMan->pNew->vCopies) == Gia_ManObjNum(pMan->pNew) );
pRepr = Gia_ObjReprObj( p, i ); pRepr = Gia_ObjReprObj( p, i );
if ( pRepr == NULL || pRepr->fMark1 ) if ( pRepr == NULL || pRepr->fMark1 )
continue; continue;
//if ( Gia_ObjIsConst0(pRepr) )
// continue;
if ( Abc_Lit2Var(pObj->Value) == Abc_Lit2Var(pRepr->Value) ) if ( Abc_Lit2Var(pObj->Value) == Abc_Lit2Var(pRepr->Value) )
{ {
assert( (pObj->Value ^ pRepr->Value) == (pObj->fPhase ^ pRepr->fPhase) ); assert( (pObj->Value ^ pRepr->Value) == (pObj->fPhase ^ pRepr->fPhase) );
...@@ -827,13 +890,20 @@ int Cec2_ManPerformSweeping( Gia_Man_t * p, Cec2_Par_t * pPars ) ...@@ -827,13 +890,20 @@ int Cec2_ManPerformSweeping( Gia_Man_t * p, Cec2_Par_t * pPars )
} }
if ( Cec2_ManSweepNode(pMan, i) ) if ( Cec2_ManSweepNode(pMan, i) )
continue; continue;
pObj->Value = ~0;
//Vec_IntPushThree( pMan->vCexTriples, Gia_ObjId(p, pRepr), i, Abc_Var2Lit(p->iPatsPi, pObj->fPhase ^ pRepr->fPhase) );
// mark nodes as disproved // mark nodes as disproved
pRepr->fMark1 = pObj->fMark1 = 1;
fDisproved = 1; fDisproved = 1;
if ( Iter > 5 )
continue;
if ( Gia_ObjIsAnd(pRepr) )
pRepr->fMark1 = 1;
pObj->fMark1 = 1;
} }
if ( fDisproved ) if ( fDisproved )
{ {
Cec2_ManSimulate( p ); //printf( "The number of pattern = %d.\n", p->iPatsPi );
Cec2_ManSimulate( p, pMan->vCexTriples );
if ( pPars->fIsMiter && !Cec2_ManSimulateCos(p) ) // cex detected if ( pPars->fIsMiter && !Cec2_ManSimulateCos(p) ) // cex detected
break; break;
} }
...@@ -841,6 +911,7 @@ int Cec2_ManPerformSweeping( Gia_Man_t * p, Cec2_Par_t * pPars ) ...@@ -841,6 +911,7 @@ int Cec2_ManPerformSweeping( Gia_Man_t * p, Cec2_Par_t * pPars )
Gia_ManEquivPrintClasses( p, pPars->fVeryVerbose, 0 ); Gia_ManEquivPrintClasses( p, pPars->fVeryVerbose, 0 );
} }
Cec2_ManDestroy( pMan ); Cec2_ManDestroy( pMan );
//Gia_ManEquivPrintClasses( p, 1, 0 );
return p->pCexSeq ? 0 : 1; return p->pCexSeq ? 0 : 1;
} }
void Cec2_ManSimulateTest( Gia_Man_t * p ) void Cec2_ManSimulateTest( Gia_Man_t * p )
...@@ -848,6 +919,8 @@ void Cec2_ManSimulateTest( Gia_Man_t * p ) ...@@ -848,6 +919,8 @@ void Cec2_ManSimulateTest( Gia_Man_t * p )
abctime clk = Abc_Clock(); abctime clk = Abc_Clock();
Cec2_Par_t Pars, * pPars = &Pars; Cec2_Par_t Pars, * pPars = &Pars;
Cec2_SetDefaultParams( pPars ); Cec2_SetDefaultParams( pPars );
// Gia_ManComputeGiaEquivs( p, 100000, 0 );
// Gia_ManEquivPrintClasses( p, 1, 0 );
Cec2_ManPerformSweeping( p, pPars ); Cec2_ManPerformSweeping( p, pPars );
Abc_PrintTime( 1, "SAT sweeping time", Abc_Clock() - clk ); Abc_PrintTime( 1, "SAT sweeping time", Abc_Clock() - clk );
} }
......
...@@ -364,6 +364,7 @@ static inline void solver_analyze_final(solver_t *s, unsigned lit) ...@@ -364,6 +364,7 @@ static inline void solver_analyze_final(solver_t *s, unsigned lit)
{ {
int i; int i;
vec_uint_clear(s->final_conflict);
vec_uint_push_back(s->final_conflict, lit); vec_uint_push_back(s->final_conflict, lit);
if (solver_dlevel(s) == 0) if (solver_dlevel(s) == 0)
return; return;
......
...@@ -356,10 +356,15 @@ void satoko_rollback(satoko_t *s) ...@@ -356,10 +356,15 @@ void satoko_rollback(satoko_t *s)
vec_uint_shrink(s->originals, s->book_cl_orig); vec_uint_shrink(s->originals, s->book_cl_orig);
vec_uint_shrink(s->learnts, s->book_cl_lrnt); vec_uint_shrink(s->learnts, s->book_cl_lrnt);
/* Shrink variable related vectors */ /* Shrink variable related vectors */
for (i = s->book_vars; i < 2 * vec_char_size(s->assigns); i++)
vec_wl_at(s->watches, i)->size = 0;
s->watches->size = s->book_vars;
vec_act_shrink(s->activity, s->book_vars); vec_act_shrink(s->activity, s->book_vars);
vec_uint_shrink(s->levels, s->book_vars); vec_uint_shrink(s->levels, s->book_vars);
vec_uint_shrink(s->reasons, s->book_vars); vec_uint_shrink(s->reasons, s->book_vars);
vec_uint_shrink(s->stamps, s->book_vars);
vec_char_shrink(s->assigns, s->book_vars); vec_char_shrink(s->assigns, s->book_vars);
vec_char_shrink(s->seen, s->book_vars);
vec_char_shrink(s->polarity, s->book_vars); vec_char_shrink(s->polarity, s->book_vars);
solver_rebuild_order(s); solver_rebuild_order(s);
/* Rewind solver and cancel level 0 assignments to the trail */ /* Rewind solver and cancel level 0 assignments to the trail */
...@@ -369,6 +374,10 @@ void satoko_rollback(satoko_t *s) ...@@ -369,6 +374,10 @@ void satoko_rollback(satoko_t *s)
s->book_cl_lrnt = 0; s->book_cl_lrnt = 0;
s->book_vars = 0; s->book_vars = 0;
s->book_trail = 0; s->book_trail = 0;
if (!s->book_vars) {
s->all_clauses->size = 0;
s->all_clauses->wasted = 0;
}
} }
void satoko_mark_cone(satoko_t *s, int * pvars, int n_vars) void satoko_mark_cone(satoko_t *s, int * pvars, int n_vars)
......
...@@ -154,7 +154,7 @@ static inline vec_wl_t *vec_wl_alloc(unsigned cap) ...@@ -154,7 +154,7 @@ static inline vec_wl_t *vec_wl_alloc(unsigned cap)
static inline void vec_wl_free(vec_wl_t *vec_wl) static inline void vec_wl_free(vec_wl_t *vec_wl)
{ {
unsigned i; unsigned i;
for (i = 0; i < vec_wl->size; i++) for (i = 0; i < vec_wl->cap; i++)
watch_list_free(vec_wl->watch_lists + i); watch_list_free(vec_wl->watch_lists + i);
satoko_free(vec_wl->watch_lists); satoko_free(vec_wl->watch_lists);
satoko_free(vec_wl); satoko_free(vec_wl);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment