diff options
Diffstat (limited to 'src/aig/gia/giaLogic.c')
-rw-r--r-- | src/aig/gia/giaLogic.c | 725 |
1 files changed, 0 insertions, 725 deletions
diff --git a/src/aig/gia/giaLogic.c b/src/aig/gia/giaLogic.c deleted file mode 100644 index 825cec02..00000000 --- a/src/aig/gia/giaLogic.c +++ /dev/null @@ -1,725 +0,0 @@ -/**CFile**************************************************************** - - FileName [giaLogic.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Scalable AIG package.] - - Synopsis [Logic network derived from AIG.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: giaLogic.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include <math.h> -#include "gia.h" - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -typedef struct Log_Obj_t_ Log_Obj_t; -struct Log_Obj_t_ -{ - unsigned fTerm : 1; // terminal node (CI/CO) - unsigned fMark0 : 1; // first user-controlled mark - unsigned fMark1 : 1; // second user-controlled mark - unsigned nFanins : 28; // the number of fanins - unsigned nFanouts; // the number of fanouts - unsigned hHandle; // the handle of the node - union { - unsigned TravId; // user-specified value - unsigned iFanin; - }; - union { - unsigned Value; // user-specified value - unsigned iFanout; - }; - int Fanios[0]; // the array of fanins/fanouts -}; - -typedef struct Log_Man_t_ Log_Man_t; -struct Log_Man_t_ -{ - Gia_Man_t * pGia; // the original AIG manager - Vec_Int_t * vCis; // the vector of CIs (PIs + LOs) - Vec_Int_t * vCos; // the vector of COs (POs + LIs) - int nObjs; // the number of objects - int nNodes; // the number of nodes - int nTravIds; // traversal ID of the network - int * pObjData; // the array containing data for objects - int nObjData; // the size of array to store the logic network -}; - -static inline int Log_ManCiNum( Log_Man_t * p ) { return Vec_IntSize(p->vCis); } -static inline int Log_ManCoNum( Log_Man_t * p ) { return Vec_IntSize(p->vCos); } -static inline int Log_ManObjNum( Log_Man_t * p ) { return p->nObjs; } -static inline int Log_ManNodeNum( Log_Man_t * p ) { return p->nNodes; } - -static inline Log_Obj_t * Log_ManObj( Log_Man_t * p, unsigned hHandle ) { return (Log_Obj_t *)(p->pObjData + hHandle); } -static inline Log_Obj_t * Log_ManCi( Log_Man_t * p, int i ) { return Log_ManObj( p, Vec_IntEntry(p->vCis,i) ); } -static inline Log_Obj_t * Log_ManCo( Log_Man_t * p, int i ) { return Log_ManObj( p, Vec_IntEntry(p->vCos,i) ); } - -static inline int Log_ObjIsTerm( Log_Obj_t * pObj ) { return pObj->fTerm; } -static inline int Log_ObjIsCi( Log_Obj_t * pObj ) { return pObj->fTerm && pObj->nFanins == 0; } -static inline int Log_ObjIsCo( Log_Obj_t * pObj ) { return pObj->fTerm && pObj->nFanins == 1; } -static inline int Log_ObjIsNode( Log_Obj_t * pObj ) { return!pObj->fTerm && pObj->nFanins > 0; } -static inline int Log_ObjIsConst0( Log_Obj_t * pObj ) { return!pObj->fTerm && pObj->nFanins == 0; } - -static inline int Log_ObjFaninNum( Log_Obj_t * pObj ) { return pObj->nFanins; } -static inline int Log_ObjFanoutNum( Log_Obj_t * pObj ) { return pObj->nFanouts; } -static inline int Log_ObjSize( Log_Obj_t * pObj ) { return sizeof(Log_Obj_t) / 4 + pObj->nFanins + pObj->nFanouts; } -static inline Log_Obj_t * Log_ObjFanin( Log_Obj_t * pObj, int i ) { return (Log_Obj_t *)(((int *)pObj) - pObj->Fanios[i]); } -static inline Log_Obj_t * Log_ObjFanout( Log_Obj_t * pObj, int i ) { return (Log_Obj_t *)(((int *)pObj) + pObj->Fanios[pObj->nFanins+i]); } - -static inline void Log_ManResetTravId( Log_Man_t * p ) { extern void Log_ManCleanTravId( Log_Man_t * p ); Log_ManCleanTravId( p ); p->nTravIds = 1; } -static inline void Log_ManIncrementTravId( Log_Man_t * p ) { p->nTravIds++; } -static inline void Log_ObjSetTravId( Log_Obj_t * pObj, int TravId ) { pObj->TravId = TravId; } -static inline void Log_ObjSetTravIdCurrent( Log_Man_t * p, Log_Obj_t * pObj ) { pObj->TravId = p->nTravIds; } -static inline void Log_ObjSetTravIdPrevious( Log_Man_t * p, Log_Obj_t * pObj ) { pObj->TravId = p->nTravIds - 1; } -static inline int Log_ObjIsTravIdCurrent( Log_Man_t * p, Log_Obj_t * pObj ) { return ((int)pObj->TravId == p->nTravIds); } -static inline int Log_ObjIsTravIdPrevious( Log_Man_t * p, Log_Obj_t * pObj ) { return ((int)pObj->TravId == p->nTravIds - 1); } - -#define Log_ManForEachObj( p, pObj, i ) \ - for ( i = 0; (i < p->nObjData) && (pObj = Log_ManObj(p,i)); i += Log_ObjSize(pObj) ) -#define Log_ManForEachNode( p, pObj, i ) \ - for ( i = 0; (i < p->nObjData) && (pObj = Log_ManObj(p,i)); i += Log_ObjSize(pObj) ) if ( Log_ObjIsTerm(pObj) ) {} else -#define Log_ManForEachObjVec( vVec, p, pObj, i ) \ - for ( i = 0; (i < Vec_IntSize(vVec)) && ((pObj) = Log_ManObj(p, Vec_IntEntry(vVec,i))); i++ ) -#define Log_ObjForEachFanin( pObj, pNext, i ) \ - for ( i = 0; (i < (int)pObj->nFanins) && (pNext = Log_ObjFanin(pObj,i)); i++ ) -#define Log_ObjForEachFanout( pObj, pNext, i ) \ - for ( i = 0; (i < (int)pObj->nFanouts) && (pNext = Log_ObjFanout(pObj,i)); i++ ) - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Collect the fanin IDs.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Log_ManCollectSuper( Gia_Man_t * p, Gia_Obj_t * pObj, Vec_Int_t * vSuper ) -{ - if ( pObj->fMark0 ) - { - Vec_IntPushUnique( vSuper, Gia_ObjId(p, pObj) ); - return; - } - assert( Gia_ObjIsAnd(pObj) ); - Log_ManCollectSuper( p, Gia_ObjFanin0(pObj), vSuper ); - Log_ManCollectSuper( p, Gia_ObjFanin1(pObj), vSuper ); -} - -/**Function************************************************************* - - Synopsis [Assigns references while removing the MUX/XOR ones.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Log_ManCreateRefsSpecial( Gia_Man_t * p ) -{ - Gia_Obj_t * pObj, * pFan0, * pFan1; - Gia_Obj_t * pObjC, * pObjD0, * pObjD1; - int i; - assert( p->pRefs == NULL ); - Gia_ManCleanMark0( p ); - Gia_ManCreateRefs( p ); - Gia_ManForEachAnd( p, pObj, i ) - { - assert( pObj->fMark0 == 0 ); - pFan0 = Gia_ObjFanin0(pObj); - pFan1 = Gia_ObjFanin1(pObj); - // skip nodes whose fanins are PIs or are already marked - if ( Gia_ObjIsCi(pFan0) || pFan0->fMark0 || - Gia_ObjIsCi(pFan1) || pFan1->fMark0 ) - continue; - // skip nodes that are not MUX type - if ( !Gia_ObjIsMuxType(pObj) ) - continue; - // the node is MUX type, mark it and its fanins - pObj->fMark0 = 1; - pFan0->fMark0 = 1; - pFan1->fMark0 = 1; - // deref the control - pObjC = Gia_ObjRecognizeMux( pObj, &pObjD1, &pObjD0 ); - Gia_ObjRefDec( p, Gia_Regular(pObjC) ); - if ( Gia_Regular(pObjD0) == Gia_Regular(pObjD1) ) - Gia_ObjRefDec( p, Gia_Regular(pObjD0) ); - } - Gia_ManForEachAnd( p, pObj, i ) - assert( Gia_ObjRefs(p, pObj) > 0 ); - Gia_ManCleanMark0( p ); -} - -/**Function************************************************************* - - Synopsis [Assigns references while removing the MUX/XOR ones.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Log_ManTransformRefs( Gia_Man_t * p, int * pnObjs, int * pnFanios ) -{ - Vec_Int_t * vSuper; - Gia_Obj_t * pObj, * pFanin; - int i, k, Counter; - assert( p->pRefs != NULL ); - - // mark nodes to be used in the logic network - Gia_ManCleanMark0( p ); - Gia_ManConst0(p)->fMark0 = 1; - // mark the inputs - Gia_ManForEachCi( p, pObj, i ) - pObj->fMark0 = 1; - // mark those nodes that have ref count more than 1 - Gia_ManForEachAnd( p, pObj, i ) - pObj->fMark0 = (Gia_ObjRefs(p, pObj) > 1); - // mark the output drivers - Gia_ManForEachCoDriver( p, pObj, i ) - pObj->fMark0 = 1; - - // count the number of nodes - Counter = 0; - Gia_ManForEachObj( p, pObj, i ) - Counter += pObj->fMark0; - *pnObjs = Counter + Gia_ManCoNum(p); - - // reset the references - ABC_FREE( p->pRefs ); - p->pRefs = ABC_CALLOC( int, Gia_ManObjNum(p) ); - // reference from internal nodes - Counter = 0; - vSuper = Vec_IntAlloc( 100 ); - Gia_ManForEachAnd( p, pObj, i ) - { - if ( pObj->fMark0 == 0 ) - continue; - Vec_IntClear( vSuper ); - pObj->fMark0 = 0; - Log_ManCollectSuper( p, pObj, vSuper ); - pObj->fMark0 = 1; - Gia_ManForEachObjVec( vSuper, p, pFanin, k ) - { - assert( pFanin->fMark0 ); - Gia_ObjRefInc( p, pFanin ); - } - Counter += Vec_IntSize( vSuper ); - } - Vec_IntFree( vSuper ); - // reference from outputs - Gia_ManForEachCoDriver( p, pObj, i ) - { - assert( pObj->fMark0 ); - Gia_ObjRefInc( p, pObj ); - } - *pnFanios = Counter + Gia_ManCoNum(p); -} - -/**Function************************************************************* - - Synopsis [Creates fanin/fanout pair.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Log_ObjAddFanin( Log_Obj_t * pObj, Log_Obj_t * pFanin ) -{ - assert( pObj->iFanin < pObj->nFanins ); - assert( pFanin->iFanout < pFanin->nFanouts ); - pFanin->Fanios[pFanin->nFanins + pFanin->iFanout++] = - pObj->Fanios[pObj->iFanin++] = pObj->hHandle - pFanin->hHandle; -} - -/**Function************************************************************* - - Synopsis [Creates logic network isomorphic to the given AIG.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Log_Man_t * Log_ManStart( Gia_Man_t * pGia ) -{ - Log_Man_t * p; - Log_Obj_t * pObjLog, * pFanLog; - Gia_Obj_t * pObj, * pFanin; - Vec_Int_t * vSuper; - int nObjs, nFanios; - int i, k, hHandle = 0; - // prepare the AIG -// Gia_ManCreateRefs( pGia ); - Log_ManCreateRefsSpecial( pGia ); - Log_ManTransformRefs( pGia, &nObjs, &nFanios ); - Gia_ManFillValue( pGia ); - // create logic network - p = ABC_CALLOC( Log_Man_t, 1 ); - p->pGia = pGia; - p->vCis = Vec_IntAlloc( Gia_ManCiNum(pGia) ); - p->vCos = Vec_IntAlloc( Gia_ManCoNum(pGia) ); - p->nObjData = (sizeof(Log_Obj_t) / 4) * nObjs + 2 * nFanios; - p->pObjData = ABC_CALLOC( int, p->nObjData ); - // create constant node - Gia_ManConst0(pGia)->Value = hHandle; - pObjLog = Log_ManObj( p, hHandle ); - pObjLog->hHandle = hHandle; - pObjLog->nFanins = 0; - pObjLog->nFanouts = Gia_ObjRefs( pGia, Gia_ManConst0(pGia) ); - // count objects - hHandle += Log_ObjSize( pObjLog ); - p->nNodes++; - p->nObjs++; - // create the PIs - Gia_ManForEachCi( pGia, pObj, i ) - { - // create PI object - pObj->Value = hHandle; - Vec_IntPush( p->vCis, hHandle ); - pObjLog = Log_ManObj( p, hHandle ); - pObjLog->hHandle = hHandle; - pObjLog->nFanins = 0; - pObjLog->nFanouts = Gia_ObjRefs( pGia, pObj ); - pObjLog->fTerm = 1; - // count objects - hHandle += Log_ObjSize( pObjLog ); - p->nObjs++; - } - // create internal nodes - vSuper = Vec_IntAlloc( 100 ); - Gia_ManForEachAnd( pGia, pObj, i ) - { - if ( pObj->fMark0 == 0 ) - { - assert( Gia_ObjRefs( pGia, pObj ) == 0 ); - continue; - } - assert( Gia_ObjRefs( pGia, pObj ) > 0 ); - // collect fanins - Vec_IntClear( vSuper ); - pObj->fMark0 = 0; - Log_ManCollectSuper( pGia, pObj, vSuper ); - pObj->fMark0 = 1; - // create node object - pObj->Value = hHandle; - pObjLog = Log_ManObj( p, hHandle ); - pObjLog->hHandle = hHandle; - pObjLog->nFanins = Vec_IntSize( vSuper ); - pObjLog->nFanouts = Gia_ObjRefs( pGia, pObj ); - // add fanins - Gia_ManForEachObjVec( vSuper, pGia, pFanin, k ) - { - pFanLog = Log_ManObj( p, Gia_ObjValue(pFanin) ); - Log_ObjAddFanin( pObjLog, pFanLog ); - } - // count objects - hHandle += Log_ObjSize( pObjLog ); - p->nNodes++; - p->nObjs++; - } - Vec_IntFree( vSuper ); - // create the POs - Gia_ManForEachCo( pGia, pObj, i ) - { - // create PO object - pObj->Value = hHandle; - Vec_IntPush( p->vCos, hHandle ); - pObjLog = Log_ManObj( p, hHandle ); - pObjLog->hHandle = hHandle; - pObjLog->nFanins = 1; - pObjLog->nFanouts = 0; - pObjLog->fTerm = 1; - // add fanins - pFanLog = Log_ManObj( p, Gia_ObjValue(Gia_ObjFanin0(pObj)) ); - Log_ObjAddFanin( pObjLog, pFanLog ); - // count objects - hHandle += Log_ObjSize( pObjLog ); - p->nObjs++; - } - Gia_ManCleanMark0( pGia ); - assert( nObjs == p->nObjs ); - assert( hHandle == p->nObjData ); - // make sure the fanin/fanout counters are correct - Gia_ManForEachObj( pGia, pObj, i ) - { - if ( !~Gia_ObjValue(pObj) ) - continue; - pObjLog = Log_ManObj( p, Gia_ObjValue(pObj) ); - assert( pObjLog->nFanins == pObjLog->iFanin ); - assert( pObjLog->nFanouts == pObjLog->iFanout ); - pObjLog->iFanin = pObjLog->iFanout = 0; - } - ABC_FREE( pGia->pRefs ); - return p; -} - -/**Function************************************************************* - - Synopsis [Creates logic network isomorphic to the given AIG.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Log_ManPrintStats( Log_Man_t * p ) -{ -// if ( p->pName ) -// printf( "%8s : ", p->pName ); - printf( "i/o =%7d/%7d ", Log_ManCiNum(p), Log_ManCoNum(p) ); -// if ( Log_ManRegNum(p) ) -// printf( "ff =%7d ", Log_ManRegNum(p) ); - printf( "node =%8d ", Log_ManNodeNum(p) ); -// printf( "lev =%5d ", Log_ManLevelNum(p) ); -// printf( "cut =%5d ", Log_ManCrossCut(p) ); - printf( "mem =%5.2f Mb", 4.0*p->nObjData/(1<<20) ); -// printf( "obj =%5d ", Log_ManObjNum(p) ); - printf( "\n" ); - -// Log_ManSatExperiment( p ); -} - -/**Function************************************************************* - - Synopsis [Creates logic network isomorphic to the given AIG.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Log_ManStop( Log_Man_t * p ) -{ - Vec_IntFree( p->vCis ); - Vec_IntFree( p->vCos ); - ABC_FREE( p->pObjData ); - ABC_FREE( p ); -} - -/**Function************************************************************* - - Synopsis [Cleans the value.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Log_ManCleanTravId( Log_Man_t * p ) -{ - Log_Obj_t * pObj; - int i; - Log_ManForEachObj( p, pObj, i ) - pObj->TravId = 0; -} - -/**Function************************************************************* - - Synopsis [Cleans the value.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Log_ManCleanValue( Log_Man_t * p ) -{ - Log_Obj_t * pObj; - int i; - Log_ManForEachObj( p, pObj, i ) - pObj->Value = 0; -} - -/**Function************************************************************* - - Synopsis [Prints the distribution of fanins/fanouts in the network.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Log_ManPrintFanio( Log_Man_t * p ) -{ - char Buffer[100]; - Log_Obj_t * pNode; - Vec_Int_t * vFanins, * vFanouts; - int nFanins, nFanouts, nFaninsMax, nFanoutsMax, nFaninsAll, nFanoutsAll; - int i, k, nSizeMax; - - // determine the largest fanin and fanout - nFaninsMax = nFanoutsMax = 0; - nFaninsAll = nFanoutsAll = 0; - Log_ManForEachNode( p, pNode, i ) - { - if ( i == 0 ) continue; // skip const 0 obj - nFanins = Log_ObjFaninNum(pNode); - nFanouts = Log_ObjFanoutNum(pNode); - nFaninsAll += nFanins; - nFanoutsAll += nFanouts; - nFaninsMax = ABC_MAX( nFaninsMax, nFanins ); - nFanoutsMax = ABC_MAX( nFanoutsMax, nFanouts ); - } - - // allocate storage for fanin/fanout numbers - nSizeMax = AIG_MAX( 10 * (Aig_Base10Log(nFaninsMax) + 1), 10 * (Aig_Base10Log(nFanoutsMax) + 1) ); - vFanins = Vec_IntStart( nSizeMax ); - vFanouts = Vec_IntStart( nSizeMax ); - - // count the number of fanins and fanouts - Log_ManForEachNode( p, pNode, i ) - { - if ( i == 0 ) continue; // skip const 0 obj - nFanins = Log_ObjFaninNum(pNode); - nFanouts = Log_ObjFanoutNum(pNode); - - if ( nFanins < 10 ) - Vec_IntAddToEntry( vFanins, nFanins, 1 ); - else if ( nFanins < 100 ) - Vec_IntAddToEntry( vFanins, 10 + nFanins/10, 1 ); - else if ( nFanins < 1000 ) - Vec_IntAddToEntry( vFanins, 20 + nFanins/100, 1 ); - else if ( nFanins < 10000 ) - Vec_IntAddToEntry( vFanins, 30 + nFanins/1000, 1 ); - else if ( nFanins < 100000 ) - Vec_IntAddToEntry( vFanins, 40 + nFanins/10000, 1 ); - else if ( nFanins < 1000000 ) - Vec_IntAddToEntry( vFanins, 50 + nFanins/100000, 1 ); - else if ( nFanins < 10000000 ) - Vec_IntAddToEntry( vFanins, 60 + nFanins/1000000, 1 ); - - if ( nFanouts < 10 ) - Vec_IntAddToEntry( vFanouts, nFanouts, 1 ); - else if ( nFanouts < 100 ) - Vec_IntAddToEntry( vFanouts, 10 + nFanouts/10, 1 ); - else if ( nFanouts < 1000 ) - Vec_IntAddToEntry( vFanouts, 20 + nFanouts/100, 1 ); - else if ( nFanouts < 10000 ) - Vec_IntAddToEntry( vFanouts, 30 + nFanouts/1000, 1 ); - else if ( nFanouts < 100000 ) - Vec_IntAddToEntry( vFanouts, 40 + nFanouts/10000, 1 ); - else if ( nFanouts < 1000000 ) - Vec_IntAddToEntry( vFanouts, 50 + nFanouts/100000, 1 ); - else if ( nFanouts < 10000000 ) - Vec_IntAddToEntry( vFanouts, 60 + nFanouts/1000000, 1 ); - } - - printf( "The distribution of fanins and fanouts in the network:\n" ); - printf( " Number Nodes with fanin Nodes with fanout\n" ); - for ( k = 0; k < nSizeMax; k++ ) - { - if ( vFanins->pArray[k] == 0 && vFanouts->pArray[k] == 0 ) - continue; - if ( k < 10 ) - printf( "%15d : ", k ); - else - { - sprintf( Buffer, "%d - %d", (int)pow(10, k/10) * (k%10), (int)pow(10, k/10) * (k%10+1) - 1 ); - printf( "%15s : ", Buffer ); - } - if ( vFanins->pArray[k] == 0 ) - printf( " " ); - else - printf( "%12d ", vFanins->pArray[k] ); - printf( " " ); - if ( vFanouts->pArray[k] == 0 ) - printf( " " ); - else - printf( "%12d ", vFanouts->pArray[k] ); - printf( "\n" ); - } - Vec_IntFree( vFanins ); - Vec_IntFree( vFanouts ); - - printf( "Fanins: Max = %d. Ave = %.2f. Fanouts: Max = %d. Ave = %.2f.\n", - nFaninsMax, 1.0*nFaninsAll/Log_ManNodeNum(p), - nFanoutsMax, 1.0*nFanoutsAll/Log_ManNodeNum(p) ); -} - -/**Function************************************************************* - - Synopsis [Computes the distance from the given object] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -int Log_ManComputeDistance( Log_Man_t * p, Log_Obj_t * pPivot ) -{ - Vec_Int_t * vThis, * vNext, * vTemp; - Log_Obj_t * pThis, * pNext; - int i, k, d, nVisited = 0; -// assert( Log_ObjIsTerm(pPivot) ); - vThis = Vec_IntAlloc( 1000 ); - vNext = Vec_IntAlloc( 1000 ); - Log_ManIncrementTravId( p ); - Log_ObjSetTravIdCurrent( p, pPivot ); - Vec_IntPush( vThis, pPivot->hHandle ); - for ( d = 0; Vec_IntSize(vThis) > 0; d++ ) - { - nVisited += Vec_IntSize(vThis); - Vec_IntClear( vNext ); - Log_ManForEachObjVec( vThis, p, pThis, i ) - { - Log_ObjForEachFanin( pThis, pNext, k ) - { - if ( Log_ObjIsTravIdCurrent(p, pNext) ) - continue; - Log_ObjSetTravIdCurrent(p, pNext); - Vec_IntPush( vNext, pNext->hHandle ); - nVisited += !Log_ObjIsTerm(pNext); - } - Log_ObjForEachFanout( pThis, pNext, k ) - { - if ( Log_ObjIsTravIdCurrent(p, pNext) ) - continue; - Log_ObjSetTravIdCurrent(p, pNext); - Vec_IntPush( vNext, pNext->hHandle ); - nVisited += !Log_ObjIsTerm(pNext); - } - } - vTemp = vThis; vThis = vNext; vNext = vTemp; - } - Vec_IntFree( vThis ); - Vec_IntFree( vNext ); - // check if there are several strongly connected components -// if ( nVisited < Log_ManNodeNum(p) ) -// printf( "Visited less nodes (%d) than present (%d).\n", nVisited, Log_ManNodeNum(p) ); - return d; -} - -/**Function************************************************************* - - Synopsis [Traverses from the given node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Gia_ManTestDistanceInternal( Log_Man_t * p ) -{ - int nAttempts = 20; - int i, iNode, Dist, clk; - Log_Obj_t * pPivot, * pNext; - Aig_ManRandom( 1 ); - Log_ManResetTravId( p ); - // compute distances from several randomly selected PIs - clk = clock(); - printf( "From inputs: " ); - for ( i = 0; i < nAttempts; i++ ) - { - iNode = Aig_ManRandom( 0 ) % Log_ManCiNum(p); - pPivot = Log_ManCi( p, iNode ); - if ( Log_ObjFanoutNum(pPivot) == 0 ) - { i--; continue; } - pNext = Log_ObjFanout( pPivot, 0 ); - if ( !Log_ObjIsNode(pNext) ) - { i--; continue; } - Dist = Log_ManComputeDistance( p, pPivot ); - printf( "%d ", Dist ); - } - ABC_PRT( "Time", clock() - clk ); - // compute distances from several randomly selected POs - clk = clock(); - printf( "From outputs: " ); - for ( i = 0; i < nAttempts; i++ ) - { - iNode = Aig_ManRandom( 0 ) % Log_ManCoNum(p); - pPivot = Log_ManCo( p, iNode ); - pNext = Log_ObjFanin( pPivot, 0 ); - if ( !Log_ObjIsNode(pNext) ) - { i--; continue; } - Dist = Log_ManComputeDistance( p, pPivot ); - printf( "%d ", Dist ); - } - ABC_PRT( "Time", clock() - clk ); - // compute distances from several randomly selected nodes - clk = clock(); - printf( "From nodes: " ); - for ( i = 0; i < nAttempts; i++ ) - { - iNode = Aig_ManRandom( 0 ) % Gia_ManObjNum(p->pGia); - if ( !~Gia_ManObj(p->pGia, iNode)->Value ) - { i--; continue; } - pPivot = Log_ManObj( p, Gia_ManObj(p->pGia, iNode)->Value ); - if ( !Log_ObjIsNode(pPivot) ) - { i--; continue; } - Dist = Log_ManComputeDistance( p, pPivot ); - printf( "%d ", Dist ); - } - ABC_PRT( "Time", clock() - clk ); -} - -/**Function************************************************************* - - Synopsis [Returns sorted array of node handles with largest fanout.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Gia_ManTestDistance( Gia_Man_t * pGia ) -{ - Log_Man_t * p; - int clk = clock(); - p = Log_ManStart( pGia ); -// Log_ManPrintFanio( p ); - Log_ManPrintStats( p ); -ABC_PRT( "Time", clock() - clk ); - Gia_ManTestDistanceInternal( p ); - Log_ManStop( p ); -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - |