mirror of https://github.com/YosysHQ/abc.git
Experiments with simulation.
This commit is contained in:
parent
e44f409c1d
commit
d0efef2fe9
|
|
@ -5539,6 +5539,10 @@ SOURCE=.\src\proof\cec\cecSeq.c
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\src\proof\cec\cecSim.c
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=.\src\proof\cec\cecSolve.c
|
SOURCE=.\src\proof\cec\cecSolve.c
|
||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
|
||||||
|
|
@ -479,6 +479,7 @@ static inline int Gia_ObjValue( Gia_Obj_t * pObj ) {
|
||||||
static inline void Gia_ObjSetValue( Gia_Obj_t * pObj, int i ) { pObj->Value = i; }
|
static inline void Gia_ObjSetValue( Gia_Obj_t * pObj, int i ) { pObj->Value = i; }
|
||||||
static inline int Gia_ObjPhase( Gia_Obj_t * pObj ) { return pObj->fPhase; }
|
static inline int Gia_ObjPhase( Gia_Obj_t * pObj ) { return pObj->fPhase; }
|
||||||
static inline int Gia_ObjPhaseReal( Gia_Obj_t * pObj ) { return Gia_Regular(pObj)->fPhase ^ Gia_IsComplement(pObj); }
|
static inline int Gia_ObjPhaseReal( Gia_Obj_t * pObj ) { return Gia_Regular(pObj)->fPhase ^ Gia_IsComplement(pObj); }
|
||||||
|
static inline int Gia_ObjPhaseDiff( Gia_Man_t * p, int i, int k ) { return Gia_ManObj(p, i)->fPhase ^ Gia_ManObj(p, k)->fPhase; }
|
||||||
|
|
||||||
static inline int Gia_ObjIsTerm( Gia_Obj_t * pObj ) { return pObj->fTerm; }
|
static inline int Gia_ObjIsTerm( Gia_Obj_t * pObj ) { return pObj->fTerm; }
|
||||||
static inline int Gia_ObjIsAndOrConst0( Gia_Obj_t * pObj ) { return!pObj->fTerm; }
|
static inline int Gia_ObjIsAndOrConst0( Gia_Obj_t * pObj ) { return!pObj->fTerm; }
|
||||||
|
|
|
||||||
|
|
@ -216,6 +216,12 @@ static inline void Abc_TtMask( word * pTruth, int nWords, int nBits )
|
||||||
SeeAlso []
|
SeeAlso []
|
||||||
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
static inline void Abc_TtVec( word * pOut, int nWords, word Entry )
|
||||||
|
{
|
||||||
|
int w;
|
||||||
|
for ( w = 0; w < nWords; w++ )
|
||||||
|
pOut[w] = Entry;
|
||||||
|
}
|
||||||
static inline void Abc_TtConst( word * pOut, int nWords, int fConst1 )
|
static inline void Abc_TtConst( word * pOut, int nWords, int fConst1 )
|
||||||
{
|
{
|
||||||
int w;
|
int w;
|
||||||
|
|
@ -316,6 +322,12 @@ static inline void Abc_TtOrXor( word * pOut, word * pIn1, word * pIn2, int nWord
|
||||||
for ( w = 0; w < nWords; w++ )
|
for ( w = 0; w < nWords; w++ )
|
||||||
pOut[w] |= pIn1[w] ^ pIn2[w];
|
pOut[w] |= pIn1[w] ^ pIn2[w];
|
||||||
}
|
}
|
||||||
|
static inline void Abc_TtOrAnd( word * pOut, word * pIn1, word * pIn2, int nWords )
|
||||||
|
{
|
||||||
|
int w;
|
||||||
|
for ( w = 0; w < nWords; w++ )
|
||||||
|
pOut[w] |= pIn1[w] & pIn2[w];
|
||||||
|
}
|
||||||
static inline void Abc_TtXor( word * pOut, word * pIn1, word * pIn2, int nWords, int fCompl )
|
static inline void Abc_TtXor( word * pOut, word * pIn1, word * pIn2, int nWords, int fCompl )
|
||||||
{
|
{
|
||||||
int w;
|
int w;
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
PackageName [Combinational equivalence checking.]
|
PackageName [Combinational equivalence checking.]
|
||||||
|
|
||||||
Synopsis [Simulation manager.]
|
Synopsis [Simulation.]
|
||||||
|
|
||||||
Author [Alan Mishchenko]
|
Author [Alan Mishchenko]
|
||||||
|
|
||||||
|
|
@ -19,14 +19,40 @@
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
|
||||||
#include "cecInt.h"
|
#include "cecInt.h"
|
||||||
|
#include "aig/gia/giaAig.h"
|
||||||
|
#include "misc/util/utilTruth.h"
|
||||||
|
|
||||||
|
|
||||||
ABC_NAMESPACE_IMPL_START
|
ABC_NAMESPACE_IMPL_START
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
/// DECLARATIONS ///
|
/// DECLARATIONS ///
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#define SIM_RANDS 113
|
||||||
|
|
||||||
|
typedef struct Cec_ManS_t_ Cec_ManS_t;
|
||||||
|
struct Cec_ManS_t_
|
||||||
|
{
|
||||||
|
int nWords;
|
||||||
|
int nLevelMax;
|
||||||
|
int nLevelMin;
|
||||||
|
int iRand;
|
||||||
|
Gia_Man_t * pAig;
|
||||||
|
Vec_Int_t * vInputs;
|
||||||
|
Vec_Wec_t * vLevels;
|
||||||
|
Vec_Wrd_t * vSims;
|
||||||
|
word * pTemp[4];
|
||||||
|
word Rands[SIM_RANDS];
|
||||||
|
int nSkipped;
|
||||||
|
int nVisited;
|
||||||
|
int nCexes;
|
||||||
|
abctime clkSat;
|
||||||
|
abctime clkUnsat;
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline word * Cec_ManSSim( Cec_ManS_t * p, int iNode, int Value ) { return Vec_WrdEntryP(p->vSims, p->nWords*(iNode+iNode+Value)); }
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
/// FUNCTION DEFINITIONS ///
|
/// FUNCTION DEFINITIONS ///
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
@ -36,12 +62,343 @@ ABC_NAMESPACE_IMPL_START
|
||||||
Synopsis []
|
Synopsis []
|
||||||
|
|
||||||
Description []
|
Description []
|
||||||
|
|
||||||
SideEffects []
|
SideEffects []
|
||||||
|
|
||||||
SeeAlso []
|
SeeAlso []
|
||||||
|
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
|
Cec_ManS_t * Cec_ManSStart( Gia_Man_t * pAig, int nWords )
|
||||||
|
{
|
||||||
|
Cec_ManS_t * p; int i;
|
||||||
|
p = ABC_ALLOC( Cec_ManS_t, 1 );
|
||||||
|
memset( p, 0, sizeof(Cec_ManS_t) );
|
||||||
|
p->nWords = nWords;
|
||||||
|
p->pAig = pAig;
|
||||||
|
p->vInputs = Vec_IntAlloc( 100 );
|
||||||
|
p->vLevels = Vec_WecStart( Gia_ManLevelNum(pAig) + 1 );
|
||||||
|
p->vSims = Vec_WrdStart( Gia_ManObjNum(pAig) * nWords * 2 );
|
||||||
|
p->pTemp[0] = ABC_ALLOC( word, 4*nWords );
|
||||||
|
for ( i = 1; i < 4; i++ )
|
||||||
|
p->pTemp[i] = p->pTemp[i-1] + nWords;
|
||||||
|
for ( i = 0; i < SIM_RANDS; i++ )
|
||||||
|
p->Rands[i] = Gia_ManRandomW(0);
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
void Cec_ManSStop( Cec_ManS_t * p )
|
||||||
|
{
|
||||||
|
Vec_IntFree( p->vInputs );
|
||||||
|
Vec_WecFree( p->vLevels );
|
||||||
|
Vec_WrdFree( p->vSims );
|
||||||
|
ABC_FREE( p->pTemp[0] );
|
||||||
|
ABC_FREE( p );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**Function*************************************************************
|
||||||
|
|
||||||
|
Synopsis [Verify counter-example.]
|
||||||
|
|
||||||
|
Description []
|
||||||
|
|
||||||
|
SideEffects []
|
||||||
|
|
||||||
|
SeeAlso []
|
||||||
|
|
||||||
|
***********************************************************************/
|
||||||
|
int Cec_ManSVerify_rec( Gia_Man_t * p, int iObj )
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
assert( Gia_ObjIsAnd(pObj) );
|
||||||
|
Value0 = Cec_ManSVerify_rec( p, Gia_ObjFaninId0(pObj, iObj) ) ^ Gia_ObjFaninC0(pObj);
|
||||||
|
Value1 = Cec_ManSVerify_rec( p, Gia_ObjFaninId1(pObj, iObj) ) ^ Gia_ObjFaninC1(pObj);
|
||||||
|
return pObj->fMark1 = Gia_ObjIsXor(pObj) ? Value0 ^ Value1 : Value0 & Value1;
|
||||||
|
}
|
||||||
|
void Cec_ManSVerifyTwo( Gia_Man_t * p, int iObj0, int iObj1 )
|
||||||
|
{
|
||||||
|
int Value0, Value1;
|
||||||
|
Gia_ManIncrementTravId( p );
|
||||||
|
Value0 = Cec_ManSVerify_rec( p, iObj0 );
|
||||||
|
Value1 = Cec_ManSVerify_rec( p, iObj1 );
|
||||||
|
if ( (Value0 ^ Value1) == Gia_ObjPhaseDiff(p, iObj0, iObj1) )
|
||||||
|
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 );;
|
||||||
|
}
|
||||||
|
void Cec_ManSVerify( Cec_ManS_t * p, int iObj0, int iObj1 )
|
||||||
|
{
|
||||||
|
int fDoVerify = 0;
|
||||||
|
int w, i, iObj, nCares;
|
||||||
|
word * pCare = Vec_WrdArray(p->vSims);
|
||||||
|
if ( Vec_IntSize(p->vInputs) == 0 )
|
||||||
|
{
|
||||||
|
printf( "No primary inputs.\n" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Vec_IntForEachEntry( p->vInputs, iObj, i )
|
||||||
|
{
|
||||||
|
word * pSim_0 = Cec_ManSSim( p, iObj, 0 );
|
||||||
|
word * pSim_1 = Cec_ManSSim( p, iObj, 1 );
|
||||||
|
if ( p->nWords == 1 )
|
||||||
|
pCare[0] |= pSim_0[0] & pSim_1[0];
|
||||||
|
else
|
||||||
|
Abc_TtOrAnd( pCare, pSim_0, pSim_1, p->nWords );
|
||||||
|
}
|
||||||
|
nCares = Abc_TtCountOnesVec( pCare, p->nWords );
|
||||||
|
if ( nCares == 64*p->nWords )
|
||||||
|
{
|
||||||
|
printf( "No CEXes.\n" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
assert( Vec_IntSize(p->vInputs) > 0 );
|
||||||
|
for ( w = 0; w < 64*p->nWords; w++ )
|
||||||
|
{
|
||||||
|
if ( Abc_TtGetBit(pCare, w) )
|
||||||
|
continue;
|
||||||
|
if ( !fDoVerify )
|
||||||
|
continue;
|
||||||
|
Vec_IntForEachEntry( p->vInputs, iObj, i )
|
||||||
|
Gia_ManObj(p->pAig, iObj)->fMark1 = Abc_TtGetBit( Cec_ManSSim(p, iObj, 1), w );
|
||||||
|
Cec_ManSVerifyTwo( p->pAig, iObj0, iObj1 );
|
||||||
|
}
|
||||||
|
printf( "Considered %d CEXes of nodes %d and %d.\n", 64*p->nWords - nCares, iObj0, iObj1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**Function*************************************************************
|
||||||
|
|
||||||
|
Synopsis []
|
||||||
|
|
||||||
|
Description []
|
||||||
|
|
||||||
|
SideEffects []
|
||||||
|
|
||||||
|
SeeAlso []
|
||||||
|
|
||||||
|
***********************************************************************/
|
||||||
|
void Cec_ManSRunImply( Cec_ManS_t * p, int iNode )
|
||||||
|
{
|
||||||
|
Gia_Obj_t * pNode = Gia_ManObj( p->pAig, iNode );
|
||||||
|
if ( Gia_ObjIsAnd(pNode) )
|
||||||
|
{
|
||||||
|
int iFan0 = Gia_ObjFaninId0( pNode, iNode );
|
||||||
|
int iFan1 = Gia_ObjFaninId1( pNode, iNode );
|
||||||
|
word * pSim__ = Cec_ManSSim( p, 0, 0 );
|
||||||
|
word * pSim_0 = Cec_ManSSim( p, iNode, 0 );
|
||||||
|
word * pSim_1 = Cec_ManSSim( p, iNode, 1 );
|
||||||
|
word * pSim00 = Cec_ManSSim( p, iFan0, Gia_ObjFaninC0(pNode) );
|
||||||
|
word * pSim01 = Cec_ManSSim( p, iFan0, !Gia_ObjFaninC0(pNode) );
|
||||||
|
word * pSim10 = Cec_ManSSim( p, iFan1, Gia_ObjFaninC1(pNode) );
|
||||||
|
word * pSim11 = Cec_ManSSim( p, iFan1, !Gia_ObjFaninC1(pNode) );
|
||||||
|
if ( p->nWords == 1 )
|
||||||
|
{
|
||||||
|
pSim_0[0] |= pSim00[0] | pSim10[0];
|
||||||
|
pSim_1[0] |= pSim01[0] & pSim11[0];
|
||||||
|
pSim__[0] |= pSim_0[0] & pSim_1[0];
|
||||||
|
pSim_0[0] &= ~pSim__[0];
|
||||||
|
pSim_1[0] &= ~pSim__[0];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Abc_TtOr( pSim_0, pSim_0, pSim00, p->nWords );
|
||||||
|
Abc_TtOr( pSim_0, pSim_0, pSim10, p->nWords );
|
||||||
|
Abc_TtOrAnd( pSim_1, pSim01, pSim11, p->nWords );
|
||||||
|
Abc_TtOrAnd( pSim__, pSim_0, pSim_1, p->nWords );
|
||||||
|
Abc_TtAndSharp( pSim_0, pSim_0, pSim__, p->nWords, 1 );
|
||||||
|
Abc_TtAndSharp( pSim_1, pSim_1, pSim__, p->nWords, 1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int Cec_ManSRunPropagate( Cec_ManS_t * p, int iNode )
|
||||||
|
{
|
||||||
|
Gia_Obj_t * pNode = Gia_ManObj( p->pAig, iNode );
|
||||||
|
int iFan0 = Gia_ObjFaninId0( pNode, iNode );
|
||||||
|
int iFan1 = Gia_ObjFaninId1( pNode, iNode );
|
||||||
|
word * pSim_0 = Cec_ManSSim( p, iNode, 0 );
|
||||||
|
word * pSim_1 = Cec_ManSSim( p, iNode, 1 );
|
||||||
|
if ( Abc_TtIsConst0(pSim_0, p->nWords) && Abc_TtIsConst0(pSim_1, p->nWords) )
|
||||||
|
{
|
||||||
|
p->nSkipped++;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
p->nVisited++;
|
||||||
|
Cec_ManSRunImply( p, iFan0 );
|
||||||
|
Cec_ManSRunImply( p, iFan1 );
|
||||||
|
{
|
||||||
|
word * pSim__ = Cec_ManSSim( p, 0, 0 );
|
||||||
|
word * pSim00 = Cec_ManSSim( p, iFan0, Gia_ObjFaninC0(pNode) );
|
||||||
|
word * pSim01 = Cec_ManSSim( p, iFan0, !Gia_ObjFaninC0(pNode) );
|
||||||
|
word * pSim10 = Cec_ManSSim( p, iFan1, Gia_ObjFaninC1(pNode) );
|
||||||
|
word * pSim11 = Cec_ManSSim( p, iFan1, !Gia_ObjFaninC1(pNode) );
|
||||||
|
p->iRand = p->iRand == SIM_RANDS-1 ? 0 : p->iRand + 1;
|
||||||
|
if ( p->nWords == 1 )
|
||||||
|
{
|
||||||
|
pSim__[0] |= pSim_0[0] & pSim01[0] & pSim11[0];
|
||||||
|
pSim__[0] |= pSim_1[0] & (pSim00[0] | pSim10[0]);
|
||||||
|
|
||||||
|
pSim00[0] |= pSim_0[0] & ~pSim__[0] & (pSim01[0] | ~p->Rands[p->iRand]);
|
||||||
|
pSim10[0] |= pSim_0[0] & ~pSim__[0] & (pSim11[0] | p->Rands[p->iRand]);
|
||||||
|
|
||||||
|
pSim01[0] |= pSim_1[0] & ~pSim__[0];
|
||||||
|
pSim11[0] |= pSim_1[0] & ~pSim__[0];
|
||||||
|
|
||||||
|
pSim__[0] |= pSim00[0] & pSim01[0];
|
||||||
|
pSim__[0] |= pSim10[0] & pSim11[0];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int w;
|
||||||
|
|
||||||
|
Abc_TtAnd( p->pTemp[0], pSim01, pSim11, p->nWords, 0 );
|
||||||
|
Abc_TtOrAnd( pSim__, pSim_0, p->pTemp[0], p->nWords );
|
||||||
|
|
||||||
|
Abc_TtOr( p->pTemp[0], pSim00, pSim10, p->nWords );
|
||||||
|
Abc_TtOrAnd( pSim__, pSim_1, p->pTemp[0], p->nWords );
|
||||||
|
|
||||||
|
//Abc_TtVec( p->pTemp[0], p->nWords, p->Rands[p->iRand] );
|
||||||
|
for ( w = 0; w < p->nWords; w++ )
|
||||||
|
p->pTemp[0][w] = p->Rands[(p->iRand + w) % SIM_RANDS];
|
||||||
|
|
||||||
|
Abc_TtAndCompl( p->pTemp[1], pSim01, 1, p->pTemp[0], 0, p->nWords );
|
||||||
|
Abc_TtAndCompl( p->pTemp[2], pSim__, 1, p->pTemp[1], 1, p->nWords );
|
||||||
|
Abc_TtOrAnd( pSim00, pSim_0, p->pTemp[2], p->nWords );
|
||||||
|
|
||||||
|
Abc_TtAndCompl( p->pTemp[1], pSim11, 1, p->pTemp[0], 1, p->nWords );
|
||||||
|
Abc_TtAndCompl( p->pTemp[2], pSim__, 1, p->pTemp[1], 1, p->nWords );
|
||||||
|
Abc_TtOrAnd( pSim10, pSim_0, p->pTemp[2], p->nWords );
|
||||||
|
|
||||||
|
Abc_TtAndSharp( p->pTemp[0], pSim_1, pSim__, p->nWords, 1 );
|
||||||
|
Abc_TtOr( pSim01, pSim01, p->pTemp[0], p->nWords );
|
||||||
|
Abc_TtOr( pSim11, pSim11, p->pTemp[0], p->nWords );
|
||||||
|
|
||||||
|
Abc_TtOrAnd( pSim__, pSim00, pSim01, p->nWords );
|
||||||
|
Abc_TtOrAnd( pSim__, pSim10, pSim11, p->nWords );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
void Cec_ManSInsert( Cec_ManS_t * p, int iNode )
|
||||||
|
{
|
||||||
|
Gia_Obj_t * pNode; int Level;
|
||||||
|
assert( iNode > 0 );
|
||||||
|
if ( Gia_ObjIsTravIdCurrentId(p->pAig, iNode) )
|
||||||
|
return;
|
||||||
|
Gia_ObjSetTravIdCurrentId(p->pAig, iNode);
|
||||||
|
pNode = Gia_ManObj( p->pAig, iNode );
|
||||||
|
if ( Gia_ObjIsCi(pNode) )
|
||||||
|
{
|
||||||
|
Vec_IntPush( p->vInputs, iNode );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
assert( Gia_ObjIsAnd(pNode) );
|
||||||
|
Level = Gia_ObjLevelId( p->pAig, iNode );
|
||||||
|
assert( Level > 0 );
|
||||||
|
Vec_WecPush( p->vLevels, Level, iNode );
|
||||||
|
p->nLevelMax = Abc_MaxInt( p->nLevelMax, Level );
|
||||||
|
p->nLevelMin = Abc_MinInt( p->nLevelMin, Level );
|
||||||
|
assert( p->nLevelMin <= p->nLevelMax );
|
||||||
|
}
|
||||||
|
int Cec_ManSRunSimInt( Cec_ManS_t * p )
|
||||||
|
{
|
||||||
|
Vec_Int_t * vLevel;
|
||||||
|
int i, k, iNode, fSolved = 0;
|
||||||
|
Vec_WecForEachLevelReverseStartStop( p->vLevels, vLevel, i, p->nLevelMax+1, p->nLevelMin )
|
||||||
|
{
|
||||||
|
Vec_IntForEachEntry( vLevel, iNode, k )
|
||||||
|
{
|
||||||
|
Gia_Obj_t * pNode = Gia_ManObj( p->pAig, iNode );
|
||||||
|
if ( !fSolved && Cec_ManSRunPropagate( p, iNode ) )
|
||||||
|
{
|
||||||
|
Cec_ManSInsert( p, Gia_ObjFaninId0(pNode, iNode) );
|
||||||
|
Cec_ManSInsert( p, Gia_ObjFaninId1(pNode, iNode) );
|
||||||
|
if ( Abc_TtIsConst1(Vec_WrdArray(p->vSims), p->nWords) )
|
||||||
|
fSolved = 1;
|
||||||
|
}
|
||||||
|
Abc_TtClear( Cec_ManSSim(p, iNode, 0), 2*p->nWords );
|
||||||
|
}
|
||||||
|
Vec_IntClear( vLevel );
|
||||||
|
}
|
||||||
|
//Vec_WecForEachLevel( p->vLevels, vLevel, i )
|
||||||
|
// assert( Vec_IntSize(vLevel) == 0 );
|
||||||
|
return fSolved;
|
||||||
|
}
|
||||||
|
int Cec_ManSRunSim( Cec_ManS_t * p, int iNode0, int iNode1 )
|
||||||
|
{
|
||||||
|
abctime clk = Abc_Clock();
|
||||||
|
//Vec_Int_t * vLevel;
|
||||||
|
int pNodes[2] = { iNode0, iNode1 };
|
||||||
|
int i, iNode, Status, fDiff = Gia_ObjPhaseDiff( p->pAig, iNode0, iNode1 );
|
||||||
|
word * pSim00 = Cec_ManSSim( p, iNode0, 0 );
|
||||||
|
word * pSim01 = Cec_ManSSim( p, iNode0, 1 );
|
||||||
|
word * pSim10 = Cec_ManSSim( p, iNode1, fDiff );
|
||||||
|
word * pSim11 = Cec_ManSSim( p, iNode1, !fDiff );
|
||||||
|
Abc_TtClear( Vec_WrdArray(p->vSims), p->nWords );
|
||||||
|
//for ( i = 0; i < Vec_WrdSize(p->vSims); i++ )
|
||||||
|
// assert( p->vSims->pArray[i] == 0 );
|
||||||
|
assert( Vec_IntSize(p->vInputs) == 0 );
|
||||||
|
if ( iNode0 == 0 )
|
||||||
|
Abc_TtFill( pSim11, p->nWords );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( p->nWords == 1 )
|
||||||
|
{
|
||||||
|
pSim00[0] = (word)0xFFFFFFFF;
|
||||||
|
pSim11[0] = (word)0xFFFFFFFF;
|
||||||
|
pSim01[0] = pSim00[0] << 32;
|
||||||
|
pSim10[0] = pSim11[0] << 32;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
assert( p->nWords % 2 == 0 );
|
||||||
|
Abc_TtFill( pSim00, p->nWords/2 );
|
||||||
|
Abc_TtFill( pSim11, p->nWords/2 );
|
||||||
|
Abc_TtFill( pSim01 + p->nWords/2, p->nWords/2 );
|
||||||
|
Abc_TtFill( pSim10 + p->nWords/2, p->nWords/2 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p->nLevelMin = ABC_INFINITY;
|
||||||
|
p->nLevelMax = 0;
|
||||||
|
Gia_ManIncrementTravId( p->pAig );
|
||||||
|
if ( iNode0 )
|
||||||
|
Cec_ManSInsert( p, iNode0 );
|
||||||
|
Cec_ManSInsert( p, iNode1 );
|
||||||
|
p->nSkipped = p->nVisited = 0;
|
||||||
|
Status = Cec_ManSRunSimInt( p );
|
||||||
|
if ( Status == 0 )
|
||||||
|
p->clkSat += Abc_Clock() - clk;
|
||||||
|
else
|
||||||
|
p->clkUnsat += Abc_Clock() - clk;
|
||||||
|
// if ( Status == 0 )
|
||||||
|
// printf( "Solving %6d and %6d. Skipped = %6d. Visited = %6d. Cone = %6d. Min = %3d. Max = %3d.\n",
|
||||||
|
// iNode0, iNode1, p->nSkipped, p->nVisited, Gia_ManConeSize(p->pAig, pNodes, 2), p->nLevelMin, p->nLevelMax );
|
||||||
|
if ( Status == 0 )
|
||||||
|
Cec_ManSVerify( p, iNode0, iNode1 ), p->nCexes++;
|
||||||
|
Vec_IntForEachEntry( p->vInputs, iNode, i )
|
||||||
|
Abc_TtClear( Cec_ManSSim(p, iNode, 0), 2*p->nWords );
|
||||||
|
Vec_IntClear( p->vInputs );
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
void Cec_ManSRunTest( Gia_Man_t * pAig )
|
||||||
|
{
|
||||||
|
abctime clk = Abc_Clock();
|
||||||
|
Cec_ManS_t * p;
|
||||||
|
int i, k, nWords = 1;
|
||||||
|
Gia_ManRandomW( 1 );
|
||||||
|
p = Cec_ManSStart( pAig, nWords );
|
||||||
|
Gia_ManForEachClass0( p->pAig, i )
|
||||||
|
Gia_ClassForEachObj1( p->pAig, i, k )
|
||||||
|
Cec_ManSRunSim( p, i, k );
|
||||||
|
printf( "Detected %d CEXes. ", p->nCexes );
|
||||||
|
Abc_PrintTime( 1, "Time ", Abc_Clock() - clk );
|
||||||
|
Abc_PrintTime( 1, "Sat ", p->clkSat );
|
||||||
|
Abc_PrintTime( 1, "Unsat", p->clkUnsat );
|
||||||
|
Cec_ManSStop( p );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ SRC += src/proof/cec/cecCec.c \
|
||||||
src/proof/cec/cecSatG.c \
|
src/proof/cec/cecSatG.c \
|
||||||
src/proof/cec/cecSatG2.c \
|
src/proof/cec/cecSatG2.c \
|
||||||
src/proof/cec/cecSeq.c \
|
src/proof/cec/cecSeq.c \
|
||||||
|
src/proof/cec/cecSim.c \
|
||||||
src/proof/cec/cecSolve.c \
|
src/proof/cec/cecSolve.c \
|
||||||
src/proof/cec/cecSolveG.c \
|
src/proof/cec/cecSolveG.c \
|
||||||
src/proof/cec/cecSplit.c \
|
src/proof/cec/cecSplit.c \
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue