diff options
Diffstat (limited to 'src/aig/cec/cecClass.c')
-rw-r--r-- | src/aig/cec/cecClass.c | 931 |
1 files changed, 0 insertions, 931 deletions
diff --git a/src/aig/cec/cecClass.c b/src/aig/cec/cecClass.c deleted file mode 100644 index b6118038..00000000 --- a/src/aig/cec/cecClass.c +++ /dev/null @@ -1,931 +0,0 @@ -/**CFile**************************************************************** - - FileName [cecClass.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Combinational equivalence checking.] - - Synopsis [Equivalence class refinement.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: cecClass.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "cecInt.h" - -ABC_NAMESPACE_IMPL_START - - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -static inline unsigned * Cec_ObjSim( Cec_ManSim_t * p, int Id ) { return p->pMems + p->pSimInfo[Id] + 1; } -static inline void Cec_ObjSetSim( Cec_ManSim_t * p, int Id, int n ) { p->pSimInfo[Id] = n; } - -static inline float Cec_MemUsage( Cec_ManSim_t * p ) { return 1.0*p->nMemsMax*(p->pPars->nWords+1)/(1<<20); } - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Compares simulation info of one node with constant 0.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Cec_ManSimCompareConst( unsigned * p, int nWords ) -{ - int w; - if ( p[0] & 1 ) - { - for ( w = 0; w < nWords; w++ ) - if ( p[w] != ~0 ) - return 0; - return 1; - } - else - { - for ( w = 0; w < nWords; w++ ) - if ( p[w] != 0 ) - return 0; - return 1; - } -} - -/**Function************************************************************* - - Synopsis [Compares simulation info of two nodes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Cec_ManSimCompareEqual( unsigned * p0, unsigned * p1, int nWords ) -{ - int w; - if ( (p0[0] & 1) == (p1[0] & 1) ) - { - for ( w = 0; w < nWords; w++ ) - if ( p0[w] != p1[w] ) - return 0; - return 1; - } - else - { - for ( w = 0; w < nWords; w++ ) - if ( p0[w] != ~p1[w] ) - return 0; - return 1; - } -} - -/**Function************************************************************* - - Synopsis [Returns the number of the first non-equal bit.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Cec_ManSimCompareConstFirstBit( unsigned * p, int nWords ) -{ - int w; - if ( p[0] & 1 ) - { - for ( w = 0; w < nWords; w++ ) - if ( p[w] != ~0 ) - return 32*w + Gia_WordFindFirstBit( ~p[w] ); - return -1; - } - else - { - for ( w = 0; w < nWords; w++ ) - if ( p[w] != 0 ) - return 32*w + Gia_WordFindFirstBit( p[w] ); - return -1; - } -} - -/**Function************************************************************* - - Synopsis [Compares simulation info of two nodes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Cec_ManSimCompareEqualFirstBit( unsigned * p0, unsigned * p1, int nWords ) -{ - int w; - if ( (p0[0] & 1) == (p1[0] & 1) ) - { - for ( w = 0; w < nWords; w++ ) - if ( p0[w] != p1[w] ) - return 32*w + Gia_WordFindFirstBit( p0[w] ^ p1[w] ); - return -1; - } - else - { - for ( w = 0; w < nWords; w++ ) - if ( p0[w] != ~p1[w] ) - return 32*w + Gia_WordFindFirstBit( p0[w] ^ ~p1[w] ); - return -1; - } -} - -/**Function************************************************************* - - Synopsis [Returns the number of the first non-equal bit.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cec_ManSimCompareConstScore( unsigned * p, int nWords, int * pScores ) -{ - int w, b; - if ( p[0] & 1 ) - { - for ( w = 0; w < nWords; w++ ) - if ( p[w] != ~0 ) - for ( b = 0; b < 32; b++ ) - if ( ((~p[w]) >> b ) & 1 ) - pScores[32*w + b]++; - } - else - { - for ( w = 0; w < nWords; w++ ) - if ( p[w] != 0 ) - for ( b = 0; b < 32; b++ ) - if ( ((p[w]) >> b ) & 1 ) - pScores[32*w + b]++; - } -} - -/**Function************************************************************* - - Synopsis [Compares simulation info of two nodes.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cec_ManSimCompareEqualScore( unsigned * p0, unsigned * p1, int nWords, int * pScores ) -{ - int w, b; - if ( (p0[0] & 1) == (p1[0] & 1) ) - { - for ( w = 0; w < nWords; w++ ) - if ( p0[w] != p1[w] ) - for ( b = 0; b < 32; b++ ) - if ( ((p0[w] ^ p1[w]) >> b ) & 1 ) - pScores[32*w + b]++; - } - else - { - for ( w = 0; w < nWords; w++ ) - if ( p0[w] != ~p1[w] ) - for ( b = 0; b < 32; b++ ) - if ( ((p0[w] ^ ~p1[w]) >> b ) & 1 ) - pScores[32*w + b]++; - } -} - -/**Function************************************************************* - - Synopsis [Creates equivalence class.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cec_ManSimClassCreate( Gia_Man_t * p, Vec_Int_t * vClass ) -{ - int Repr = GIA_VOID, EntPrev = -1, Ent, i; - assert( Vec_IntSize(vClass) > 0 ); - Vec_IntForEachEntry( vClass, Ent, i ) - { - if ( i == 0 ) - { - Repr = Ent; - Gia_ObjSetRepr( p, Ent, GIA_VOID ); - EntPrev = Ent; - } - else - { - assert( Repr < Ent ); - Gia_ObjSetRepr( p, Ent, Repr ); - Gia_ObjSetNext( p, EntPrev, Ent ); - EntPrev = Ent; - } - } - Gia_ObjSetNext( p, EntPrev, 0 ); -} - -/**Function************************************************************* - - Synopsis [Refines one equivalence class.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Cec_ManSimClassRefineOne( Cec_ManSim_t * p, int i ) -{ - unsigned * pSim0, * pSim1; - int Ent; - Vec_IntClear( p->vClassOld ); - Vec_IntClear( p->vClassNew ); - Vec_IntPush( p->vClassOld, i ); - pSim0 = Cec_ObjSim(p, i); - Gia_ClassForEachObj1( p->pAig, i, Ent ) - { - pSim1 = Cec_ObjSim(p, Ent); - if ( Cec_ManSimCompareEqual( pSim0, pSim1, p->nWords ) ) - Vec_IntPush( p->vClassOld, Ent ); - else - { - Vec_IntPush( p->vClassNew, Ent ); - if ( p->pBestState ) - Cec_ManSimCompareEqualScore( pSim0, pSim1, p->nWords, p->pScores ); - } - } - if ( Vec_IntSize( p->vClassNew ) == 0 ) - return 0; - Cec_ManSimClassCreate( p->pAig, p->vClassOld ); - Cec_ManSimClassCreate( p->pAig, p->vClassNew ); - if ( Vec_IntSize(p->vClassNew) > 1 ) - return 1 + Cec_ManSimClassRefineOne( p, Vec_IntEntry(p->vClassNew,0) ); - return 1; -} - -/**Function************************************************************* - - Synopsis [Refines one equivalence class.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Cec_ManSimClassRemoveOne( Cec_ManSim_t * p, int i ) -{ - int iRepr, Ent; - if ( Gia_ObjIsConst(p->pAig, i) ) - { - Gia_ObjSetRepr( p->pAig, i, GIA_VOID ); - return 1; - } - if ( !Gia_ObjIsClass(p->pAig, i) ) - return 0; - assert( Gia_ObjIsClass(p->pAig, i) ); - iRepr = Gia_ObjRepr( p->pAig, i ); - if ( iRepr == GIA_VOID ) - iRepr = i; - // collect nodes - Vec_IntClear( p->vClassOld ); - Vec_IntClear( p->vClassNew ); - Gia_ClassForEachObj( p->pAig, iRepr, Ent ) - { - if ( Ent == i ) - Vec_IntPush( p->vClassNew, Ent ); - else - Vec_IntPush( p->vClassOld, Ent ); - } - assert( Vec_IntSize( p->vClassNew ) == 1 ); - Cec_ManSimClassCreate( p->pAig, p->vClassOld ); - Cec_ManSimClassCreate( p->pAig, p->vClassNew ); - assert( !Gia_ObjIsClass(p->pAig, i) ); - return 1; -} - -/**Function************************************************************* - - Synopsis [Computes hash key of the simuation info.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Cec_ManSimHashKey( unsigned * pSim, int nWords, int nTableSize ) -{ - static int s_Primes[16] = { - 1291, 1699, 1999, 2357, 2953, 3313, 3907, 4177, - 4831, 5147, 5647, 6343, 6899, 7103, 7873, 8147 }; - unsigned uHash = 0; - int i; - if ( pSim[0] & 1 ) - for ( i = 0; i < nWords; i++ ) - uHash ^= ~pSim[i] * s_Primes[i & 0xf]; - else - for ( i = 0; i < nWords; i++ ) - uHash ^= pSim[i] * s_Primes[i & 0xf]; - return (int)(uHash % nTableSize); - -} - -/**Function************************************************************* - - Synopsis [Resets pointers to the simulation memory.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cec_ManSimMemRelink( Cec_ManSim_t * p ) -{ - unsigned * pPlace, Ent; - pPlace = (unsigned *)&p->MemFree; - for ( Ent = p->nMems * (p->nWords + 1); - Ent + p->nWords + 1 < (unsigned)p->nWordsAlloc; - Ent += p->nWords + 1 ) - { - *pPlace = Ent; - pPlace = p->pMems + Ent; - } - *pPlace = 0; - p->nWordsOld = p->nWords; -} - -/**Function************************************************************* - - Synopsis [References simulation info.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -unsigned * Cec_ManSimSimRef( Cec_ManSim_t * p, int i ) -{ - unsigned * pSim; - assert( p->pSimInfo[i] == 0 ); - if ( p->MemFree == 0 ) - { - if ( p->nWordsAlloc == 0 ) - { - assert( p->pMems == NULL ); - p->nWordsAlloc = (1<<17); // -> 1Mb - p->nMems = 1; - } - p->nWordsAlloc *= 2; - p->pMems = ABC_REALLOC( unsigned, p->pMems, p->nWordsAlloc ); - Cec_ManSimMemRelink( p ); - } - p->pSimInfo[i] = p->MemFree; - pSim = p->pMems + p->MemFree; - p->MemFree = pSim[0]; - pSim[0] = Gia_ObjValue( Gia_ManObj(p->pAig, i) ); - p->nMems++; - if ( p->nMemsMax < p->nMems ) - p->nMemsMax = p->nMems; - return pSim; -} - -/**Function************************************************************* - - Synopsis [Dereferences simulaton info.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -unsigned * Cec_ManSimSimDeref( Cec_ManSim_t * p, int i ) -{ - unsigned * pSim; - assert( p->pSimInfo[i] > 0 ); - pSim = p->pMems + p->pSimInfo[i]; - if ( --pSim[0] == 0 ) - { - pSim[0] = p->MemFree; - p->MemFree = p->pSimInfo[i]; - p->pSimInfo[i] = 0; - p->nMems--; - } - return pSim; -} - -/**Function************************************************************* - - Synopsis [Refines nodes belonging to candidate constant class.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cec_ManSimProcessRefined( Cec_ManSim_t * p, Vec_Int_t * vRefined ) -{ - unsigned * pSim; - int * pTable, nTableSize, i, k, Key; - if ( Vec_IntSize(vRefined) == 0 ) - return; - nTableSize = Gia_PrimeCudd( 100 + Vec_IntSize(vRefined) / 3 ); - pTable = ABC_CALLOC( int, nTableSize ); - Vec_IntForEachEntry( vRefined, i, k ) - { - pSim = Cec_ObjSim( p, i ); - assert( !Cec_ManSimCompareConst( pSim, p->nWords ) ); - Key = Cec_ManSimHashKey( pSim, p->nWords, nTableSize ); - if ( pTable[Key] == 0 ) - { - assert( Gia_ObjRepr(p->pAig, i) == 0 ); - assert( Gia_ObjNext(p->pAig, i) == 0 ); - Gia_ObjSetRepr( p->pAig, i, GIA_VOID ); - } - else - { - Gia_ObjSetNext( p->pAig, pTable[Key], i ); - Gia_ObjSetRepr( p->pAig, i, Gia_ObjRepr(p->pAig, pTable[Key]) ); - if ( Gia_ObjRepr(p->pAig, i) == GIA_VOID ) - Gia_ObjSetRepr( p->pAig, i, pTable[Key] ); - assert( Gia_ObjRepr(p->pAig, i) > 0 ); - } - pTable[Key] = i; - } - Vec_IntForEachEntry( vRefined, i, k ) - { - if ( Gia_ObjIsHead( p->pAig, i ) ) - Cec_ManSimClassRefineOne( p, i ); - } - Vec_IntForEachEntry( vRefined, i, k ) - Cec_ManSimSimDeref( p, i ); - ABC_FREE( pTable ); -} - - -/**Function************************************************************* - - Synopsis [Saves the input pattern with the given number.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cec_ManSimSavePattern( Cec_ManSim_t * p, int iPat ) -{ - unsigned * pInfo; - int i; - assert( p->pCexComb == NULL ); - assert( iPat >= 0 && iPat < 32 * p->nWords ); - p->pCexComb = (Abc_Cex_t *)ABC_CALLOC( char, - sizeof(Abc_Cex_t) + sizeof(unsigned) * Gia_BitWordNum(Gia_ManCiNum(p->pAig)) ); - p->pCexComb->iPo = p->iOut; - p->pCexComb->nPis = Gia_ManCiNum(p->pAig); - p->pCexComb->nBits = Gia_ManCiNum(p->pAig); - for ( i = 0; i < Gia_ManCiNum(p->pAig); i++ ) - { - pInfo = (unsigned *)Vec_PtrEntry( p->vCiSimInfo, i ); - if ( Gia_InfoHasBit( pInfo, iPat ) ) - Gia_InfoSetBit( p->pCexComb->pData, i ); - } -} - -/**Function************************************************************* - - Synopsis [Find the best pattern using the scores.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cec_ManSimFindBestPattern( Cec_ManSim_t * p ) -{ - unsigned * pInfo; - int i, ScoreBest = 0, iPatBest = 1; // set the first pattern - // find the best pattern - for ( i = 0; i < 32 * p->nWords; i++ ) - if ( ScoreBest < p->pScores[i] ) - { - ScoreBest = p->pScores[i]; - iPatBest = i; - } - // compare this with the available patterns - and save - if ( p->pBestState->iPo <= ScoreBest ) - { - assert( p->pBestState->nRegs == Gia_ManRegNum(p->pAig) ); - for ( i = 0; i < Gia_ManRegNum(p->pAig); i++ ) - { - pInfo = (unsigned *)Vec_PtrEntry( p->vCiSimInfo, Gia_ManPiNum(p->pAig) + i ); - if ( Gia_InfoHasBit(p->pBestState->pData, i) != Gia_InfoHasBit(pInfo, iPatBest) ) - Gia_InfoXorBit( p->pBestState->pData, i ); - } - p->pBestState->iPo = ScoreBest; - } -} - -/**Function************************************************************* - - Synopsis [Returns 1 if computation should stop.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Cec_ManSimAnalyzeOutputs( Cec_ManSim_t * p ) -{ - unsigned * pInfo, * pInfo2; - int i; - if ( !p->pPars->fCheckMiter ) - return 0; - assert( p->vCoSimInfo != NULL ); - // compare outputs with 0 - if ( p->pPars->fDualOut ) - { - assert( (Gia_ManPoNum(p->pAig) & 1) == 0 ); - for ( i = 0; i < Gia_ManPoNum(p->pAig); i++ ) - { - pInfo = (unsigned *)Vec_PtrEntry( p->vCoSimInfo, i ); - pInfo2 = (unsigned *)Vec_PtrEntry( p->vCoSimInfo, ++i ); - if ( !Cec_ManSimCompareEqual( pInfo, pInfo2, p->nWords ) ) - { - if ( p->iOut == -1 ) - { - p->iOut = i/2; - Cec_ManSimSavePattern( p, Cec_ManSimCompareEqualFirstBit(pInfo, pInfo2, p->nWords) ); - } - if ( p->pCexes == NULL ) - p->pCexes = ABC_CALLOC( void *, Gia_ManPoNum(p->pAig)/2 ); - if ( p->pCexes[i/2] == NULL ) - { - p->nOuts++; - p->pCexes[i/2] = (void *)1; - } - } - } - } - else - { - for ( i = 0; i < Gia_ManPoNum(p->pAig); i++ ) - { - pInfo = (unsigned *)Vec_PtrEntry( p->vCoSimInfo, i ); - if ( !Cec_ManSimCompareConst( pInfo, p->nWords ) ) - { - if ( p->iOut == -1 ) - { - p->iOut = i; - Cec_ManSimSavePattern( p, Cec_ManSimCompareConstFirstBit(pInfo, p->nWords) ); - } - if ( p->pCexes == NULL ) - p->pCexes = ABC_CALLOC( void *, Gia_ManPoNum(p->pAig) ); - if ( p->pCexes[i] == NULL ) - { - p->nOuts++; - p->pCexes[i] = (void *)1; - } - } - } - } - return p->pCexes != NULL; -} - -/**Function************************************************************* - - Synopsis [Simulates one round.] - - Description [Returns the number of PO entry if failed; 0 otherwise.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Cec_ManSimSimulateRound( Cec_ManSim_t * p, Vec_Ptr_t * vInfoCis, Vec_Ptr_t * vInfoCos ) -{ - Gia_Obj_t * pObj; - unsigned * pRes0, * pRes1, * pRes; - int i, k, w, Ent, iCiId = 0, iCoId = 0; - // prepare internal storage - if ( p->nWordsOld != p->nWords ) - Cec_ManSimMemRelink( p ); - p->nMemsMax = 0; - // allocate score counters - ABC_FREE( p->pScores ); - if ( p->pBestState ) - p->pScores = ABC_CALLOC( int, 32 * p->nWords ); - // simulate nodes - Vec_IntClear( p->vRefinedC ); - if ( Gia_ObjValue(Gia_ManConst0(p->pAig)) ) - { - pRes = Cec_ManSimSimRef( p, 0 ); - for ( w = 1; w <= p->nWords; w++ ) - pRes[w] = 0; - } - Gia_ManForEachObj1( p->pAig, pObj, i ) - { - if ( Gia_ObjIsCi(pObj) ) - { - if ( Gia_ObjValue(pObj) == 0 ) - { - iCiId++; - continue; - } - pRes = Cec_ManSimSimRef( p, i ); - if ( vInfoCis ) - { - pRes0 = (unsigned *)Vec_PtrEntry( vInfoCis, iCiId++ ); - for ( w = 1; w <= p->nWords; w++ ) - pRes[w] = pRes0[w-1]; - } - else - { - for ( w = 1; w <= p->nWords; w++ ) - pRes[w] = Gia_ManRandom( 0 ); - } - // make sure the first pattern is always zero - pRes[1] ^= (pRes[1] & 1); - goto references; - } - if ( Gia_ObjIsCo(pObj) ) // co always has non-zero 1st fanin and zero 2nd fanin - { - pRes0 = Cec_ManSimSimDeref( p, Gia_ObjFaninId0(pObj,i) ); - if ( vInfoCos ) - { - pRes = (unsigned *)Vec_PtrEntry( vInfoCos, iCoId++ ); - if ( Gia_ObjFaninC0(pObj) ) - for ( w = 1; w <= p->nWords; w++ ) - pRes[w-1] = ~pRes0[w]; - else - for ( w = 1; w <= p->nWords; w++ ) - pRes[w-1] = pRes0[w]; - } - continue; - } - assert( Gia_ObjValue(pObj) ); - pRes = Cec_ManSimSimRef( p, i ); - pRes0 = Cec_ManSimSimDeref( p, Gia_ObjFaninId0(pObj,i) ); - pRes1 = Cec_ManSimSimDeref( p, Gia_ObjFaninId1(pObj,i) ); - -// Abc_Print( 1, "%d,%d ", Gia_ObjValue( Gia_ObjFanin0(pObj) ), Gia_ObjValue( Gia_ObjFanin1(pObj) ) ); - - if ( Gia_ObjFaninC0(pObj) ) - { - if ( Gia_ObjFaninC1(pObj) ) - for ( w = 1; w <= p->nWords; w++ ) - pRes[w] = ~(pRes0[w] | pRes1[w]); - else - for ( w = 1; w <= p->nWords; w++ ) - pRes[w] = ~pRes0[w] & pRes1[w]; - } - else - { - if ( Gia_ObjFaninC1(pObj) ) - for ( w = 1; w <= p->nWords; w++ ) - pRes[w] = pRes0[w] & ~pRes1[w]; - else - for ( w = 1; w <= p->nWords; w++ ) - pRes[w] = pRes0[w] & pRes1[w]; - } - -references: - // if this node is candidate constant, collect it - if ( Gia_ObjIsConst(p->pAig, i) && !Cec_ManSimCompareConst(pRes + 1, p->nWords) ) - { - pRes[0]++; - Vec_IntPush( p->vRefinedC, i ); - if ( p->pBestState ) - Cec_ManSimCompareConstScore( pRes + 1, p->nWords, p->pScores ); - } - // if the node belongs to a class, save it - if ( Gia_ObjIsClass(p->pAig, i) ) - pRes[0]++; - // if this is the last node of the class, process it - if ( Gia_ObjIsTail(p->pAig, i) ) - { - Vec_IntClear( p->vClassTemp ); - Gia_ClassForEachObj( p->pAig, Gia_ObjRepr(p->pAig, i), Ent ) - Vec_IntPush( p->vClassTemp, Ent ); - Cec_ManSimClassRefineOne( p, Gia_ObjRepr(p->pAig, i) ); - Vec_IntForEachEntry( p->vClassTemp, Ent, k ) - Cec_ManSimSimDeref( p, Ent ); - } - } - - if ( p->pPars->fConstCorr ) - { - Vec_IntForEachEntry( p->vRefinedC, i, k ) - { - Gia_ObjSetRepr( p->pAig, i, GIA_VOID ); - Cec_ManSimSimDeref( p, i ); - } - Vec_IntClear( p->vRefinedC ); - } - - if ( Vec_IntSize(p->vRefinedC) > 0 ) - Cec_ManSimProcessRefined( p, p->vRefinedC ); - assert( vInfoCis == NULL || iCiId == Gia_ManCiNum(p->pAig) ); - assert( vInfoCos == NULL || iCoId == Gia_ManCoNum(p->pAig) ); - assert( p->nMems == 1 ); - if ( p->nMems != 1 ) - Abc_Print( 1, "Cec_ManSimSimulateRound(): Memory management error!\n" ); - if ( p->pPars->fVeryVerbose ) - Gia_ManEquivPrintClasses( p->pAig, 0, Cec_MemUsage(p) ); - if ( p->pBestState ) - Cec_ManSimFindBestPattern( p ); -/* - if ( p->nMems > 1 ) { - for ( i = 1; i < p->nObjs; i++ ) - if ( p->pSims[i] ) { - int x = 0; - } - } -*/ - return Cec_ManSimAnalyzeOutputs( p ); -} - - - -/**Function************************************************************* - - Synopsis [Creates simulation info for this round.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cec_ManSimCreateInfo( Cec_ManSim_t * p, Vec_Ptr_t * vInfoCis, Vec_Ptr_t * vInfoCos ) -{ - unsigned * pRes0, * pRes1; - int i, w; - if ( p->pPars->fSeqSimulate && Gia_ManRegNum(p->pAig) > 0 ) - { - assert( vInfoCis && vInfoCos ); - for ( i = 0; i < Gia_ManPiNum(p->pAig); i++ ) - { - pRes0 = (unsigned *)Vec_PtrEntry( vInfoCis, i ); - for ( w = 0; w < p->nWords; w++ ) - pRes0[w] = Gia_ManRandom( 0 ); - } - for ( i = 0; i < Gia_ManRegNum(p->pAig); i++ ) - { - pRes0 = (unsigned *)Vec_PtrEntry( vInfoCis, Gia_ManPiNum(p->pAig) + i ); - pRes1 = (unsigned *)Vec_PtrEntry( vInfoCos, Gia_ManPoNum(p->pAig) + i ); - for ( w = 0; w < p->nWords; w++ ) - pRes0[w] = pRes1[w]; - } - } - else - { - for ( i = 0; i < Gia_ManCiNum(p->pAig); i++ ) - { - pRes0 = (unsigned *)Vec_PtrEntry( vInfoCis, i ); - for ( w = 0; w < p->nWords; w++ ) - pRes0[w] = Gia_ManRandom( 0 ); - } - } -} - -/**Function************************************************************* - - Synopsis [Returns 1 if the bug is found.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Cec_ManSimClassesPrepare( Cec_ManSim_t * p, int LevelMax ) -{ - Gia_Obj_t * pObj; - int i; - assert( p->pAig->pReprs == NULL ); - // allocate representation - p->pAig->pReprs = ABC_CALLOC( Gia_Rpr_t, Gia_ManObjNum(p->pAig) ); - p->pAig->pNexts = ABC_CALLOC( int, Gia_ManObjNum(p->pAig) ); - // create references - Gia_ManSetRefs( p->pAig ); - // set starting representative of internal nodes to be constant 0 - if ( p->pPars->fLatchCorr ) - Gia_ManForEachObj( p->pAig, pObj, i ) - Gia_ObjSetRepr( p->pAig, i, GIA_VOID ); - else if ( LevelMax == -1 ) - Gia_ManForEachObj( p->pAig, pObj, i ) - Gia_ObjSetRepr( p->pAig, i, Gia_ObjIsAnd(pObj) ? 0 : GIA_VOID ); - else - { - Gia_ManLevelNum( p->pAig ); - Gia_ManForEachObj( p->pAig, pObj, i ) - Gia_ObjSetRepr( p->pAig, i, (Gia_ObjIsAnd(pObj) && Gia_ObjLevel(p->pAig,pObj) <= LevelMax) ? 0 : GIA_VOID ); - Vec_IntFreeP( &p->pAig->vLevels ); - } - // if sequential simulation, set starting representative of ROs to be constant 0 - if ( p->pPars->fSeqSimulate ) - Gia_ManForEachRo( p->pAig, pObj, i ) - if ( pObj->Value ) - Gia_ObjSetRepr( p->pAig, Gia_ObjId(p->pAig, pObj), 0 ); - // perform simulation - p->nWords = 1; - do { - if ( p->pPars->fVerbose ) - Gia_ManEquivPrintClasses( p->pAig, 0, Cec_MemUsage(p) ); - for ( i = 0; i < 4; i++ ) - { - Cec_ManSimCreateInfo( p, p->vCiSimInfo, p->vCoSimInfo ); - if ( Cec_ManSimSimulateRound( p, p->vCiSimInfo, p->vCoSimInfo ) ) - return 1; - } - p->nWords = 2 * p->nWords + 1; - } - while ( p->nWords <= p->pPars->nWords ); - return 0; -} - -/**Function************************************************************* - - Synopsis [Returns 1 if the bug is found.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Cec_ManSimClassesRefine( Cec_ManSim_t * p ) -{ - int i; - Gia_ManSetRefs( p->pAig ); - p->nWords = p->pPars->nWords; - for ( i = 0; i < p->pPars->nRounds; i++ ) - { - if ( (i % (p->pPars->nRounds / 5)) == 0 && p->pPars->fVerbose ) - Gia_ManEquivPrintClasses( p->pAig, 0, Cec_MemUsage(p) ); - Cec_ManSimCreateInfo( p, p->vCiSimInfo, p->vCoSimInfo ); - if ( Cec_ManSimSimulateRound( p, p->vCiSimInfo, p->vCoSimInfo ) ) - return 1; - } - if ( p->pPars->fVerbose ) - Gia_ManEquivPrintClasses( p->pAig, 0, Cec_MemUsage(p) ); - return 0; -} -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - -ABC_NAMESPACE_IMPL_END - |