diff options
Diffstat (limited to 'src/aig/cgt/cgtAig.c')
-rw-r--r-- | src/aig/cgt/cgtAig.c | 601 |
1 files changed, 0 insertions, 601 deletions
diff --git a/src/aig/cgt/cgtAig.c b/src/aig/cgt/cgtAig.c deleted file mode 100644 index 428fcd1a..00000000 --- a/src/aig/cgt/cgtAig.c +++ /dev/null @@ -1,601 +0,0 @@ -/**CFile**************************************************************** - - FileName [cgtAig.c] - - SystemName [ABC: Logic synthesis and verification system.] - - PackageName [Clock gating package.] - - Synopsis [Creates AIG to compute clock-gating.] - - Author [Alan Mishchenko] - - Affiliation [UC Berkeley] - - Date [Ver. 1.0. Started - June 20, 2005.] - - Revision [$Id: cgtAig.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $] - -***********************************************************************/ - -#include "cgtInt.h" - -ABC_NAMESPACE_IMPL_START - - -//////////////////////////////////////////////////////////////////////// -/// DECLARATIONS /// -//////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////// -/// FUNCTION DEFINITIONS /// -//////////////////////////////////////////////////////////////////////// - -/**Function************************************************************* - - Synopsis [Computes transitive fanout cone of the node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cgt_ManDetectCandidates_rec( Aig_Man_t * pAig, Aig_Obj_t * pObj, int nLevelMax, Vec_Ptr_t * vCands ) -{ - if ( Aig_ObjIsTravIdCurrent(pAig, pObj) ) - return; - Aig_ObjSetTravIdCurrent(pAig, pObj); - if ( Aig_ObjIsNode(pObj) ) - { - Cgt_ManDetectCandidates_rec( pAig, Aig_ObjFanin0(pObj), nLevelMax, vCands ); - Cgt_ManDetectCandidates_rec( pAig, Aig_ObjFanin1(pObj), nLevelMax, vCands ); - } - if ( Aig_ObjLevel(pObj) <= nLevelMax ) - Vec_PtrPush( vCands, pObj ); -} - -/**Function************************************************************* - - Synopsis [Computes transitive fanout cone of the node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cgt_ManDetectCandidates( Aig_Man_t * pAig, Aig_Obj_t * pObj, int nLevelMax, Vec_Ptr_t * vCands ) -{ - Vec_PtrClear( vCands ); - if ( !Aig_ObjIsNode(pObj) ) - return; - Aig_ManIncrementTravId( pAig ); - Cgt_ManDetectCandidates_rec( pAig, pObj, nLevelMax, vCands ); -} - -/**Function************************************************************* - - Synopsis [Computes transitive fanout cone of the node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cgt_ManDetectFanout_rec( Aig_Man_t * pAig, Aig_Obj_t * pObj, int nOdcMax, Vec_Ptr_t * vFanout ) -{ - Aig_Obj_t * pFanout; - int f, iFanout; - if ( Aig_ObjIsPo(pObj) || Aig_ObjLevel(pObj) > nOdcMax ) - return; - if ( Aig_ObjIsTravIdCurrent(pAig, pObj) ) - return; - Aig_ObjSetTravIdCurrent(pAig, pObj); - Vec_PtrPush( vFanout, pObj ); - Aig_ObjForEachFanout( pAig, pObj, pFanout, iFanout, f ) - Cgt_ManDetectFanout_rec( pAig, pFanout, nOdcMax, vFanout ); -} - -/**Function************************************************************* - - Synopsis [Computes transitive fanout cone of the node.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cgt_ManDetectFanout( Aig_Man_t * pAig, Aig_Obj_t * pObj, int nOdcMax, Vec_Ptr_t * vFanout ) -{ - Aig_Obj_t * pFanout; - int i, k, f, iFanout; - // collect visited nodes - Vec_PtrClear( vFanout ); - Aig_ManIncrementTravId( pAig ); - Cgt_ManDetectFanout_rec( pAig, pObj, nOdcMax, vFanout ); - // remove those nodes whose fanout is included - k = 0; - Vec_PtrForEachEntry( Aig_Obj_t *, vFanout, pObj, i ) - { - // go through the fanouts of this node - Aig_ObjForEachFanout( pAig, pObj, pFanout, iFanout, f ) - if ( !Aig_ObjIsTravIdCurrent(pAig, pFanout) ) - break; - if ( f == Aig_ObjRefs(pObj) ) // all fanouts are included - continue; - Vec_PtrWriteEntry( vFanout, k++, pObj ); - } - Vec_PtrShrink( vFanout, k ); - Vec_PtrSort( vFanout, (int (*)(void))Aig_ObjCompareIdIncrease ); - assert( Vec_PtrSize(vFanout) > 0 ); -} - -/**Function************************************************************* - - Synopsis [Computes visited nodes in the topological order.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cgt_ManCollectVisited_rec( Aig_Man_t * pAig, Aig_Obj_t * pObj, Vec_Ptr_t * vVisited ) -{ - if ( Aig_ObjIsPi(pObj) ) - return; - if ( Aig_ObjIsTravIdCurrent(pAig, pObj) ) - return; - Aig_ObjSetTravIdCurrent(pAig, pObj); - assert( Aig_ObjIsNode(pObj) ); - Cgt_ManCollectVisited_rec( pAig, Aig_ObjFanin0(pObj), vVisited ); - Cgt_ManCollectVisited_rec( pAig, Aig_ObjFanin1(pObj), vVisited ); - Vec_PtrPush( vVisited, pObj ); -} - -/**Function************************************************************* - - Synopsis [Computes visited nodes in the topological order.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cgt_ManCollectVisited( Aig_Man_t * pAig, Vec_Ptr_t * vFanout, Vec_Ptr_t * vVisited ) -{ - Aig_Obj_t * pObj; - int i; - Vec_PtrClear( vVisited ); - Aig_ManIncrementTravId( pAig ); - Vec_PtrForEachEntry( Aig_Obj_t *, vFanout, pObj, i ) - Cgt_ManCollectVisited_rec( pAig, pObj, vVisited ); -} - -/**Function************************************************************* - - Synopsis [] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -static inline Aig_Obj_t * Aig_ObjChild0CopyVec( Vec_Ptr_t * vCopy, Aig_Obj_t * pObj ) -{ return Aig_NotCond((Aig_Obj_t *)Vec_PtrEntry(vCopy, Aig_ObjFaninId0(pObj)), Aig_ObjFaninC0(pObj)); } -static inline Aig_Obj_t * Aig_ObjChild1CopyVec( Vec_Ptr_t * vCopy, Aig_Obj_t * pObj ) -{ return Aig_NotCond((Aig_Obj_t *)Vec_PtrEntry(vCopy, Aig_ObjFaninId1(pObj)), Aig_ObjFaninC1(pObj)); } - -/**Function************************************************************* - - Synopsis [Derives miter for clock-gating.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Cgt_ManConstructCareCondition( Cgt_Man_t * p, Aig_Man_t * pNew, Aig_Obj_t * pObjLo, Vec_Ptr_t * vCopy0, Vec_Ptr_t * vCopy1 ) -{ - Aig_Obj_t * pMiter, * pObj, * pTemp; - int i; - assert( Aig_ObjIsPi(pObjLo) ); - // detect nodes and their cone - Cgt_ManDetectFanout( p->pAig, pObjLo, p->pPars->nOdcMax, p->vFanout ); - Cgt_ManCollectVisited( p->pAig, p->vFanout, p->vVisited ); - // add new variables if the observability condition depends on PI variables - Vec_PtrForEachEntry( Aig_Obj_t *, p->vVisited, pObj, i ) - { - assert( Aig_ObjIsNode(pObj) ); - if ( Saig_ObjIsPi(p->pAig, Aig_ObjFanin0(pObj)) && Vec_PtrEntry(vCopy0, Aig_ObjFaninId0(pObj)) == NULL ) - { - pTemp = Aig_ObjCreatePi( pNew ); - Vec_PtrWriteEntry( vCopy0, Aig_ObjFaninId0(pObj), pTemp ); - Vec_PtrWriteEntry( vCopy1, Aig_ObjFaninId0(pObj), pTemp ); - } - if ( Saig_ObjIsPi(p->pAig, Aig_ObjFanin1(pObj)) && Vec_PtrEntry(vCopy0, Aig_ObjFaninId1(pObj)) == NULL ) - { - pTemp = Aig_ObjCreatePi( pNew ); - Vec_PtrWriteEntry( vCopy0, Aig_ObjFaninId1(pObj), pTemp ); - Vec_PtrWriteEntry( vCopy1, Aig_ObjFaninId1(pObj), pTemp ); - } - } - // construct AIGs for the nodes - Vec_PtrForEachEntry( Aig_Obj_t *, p->vVisited, pObj, i ) - { - pTemp = Aig_And( pNew, Aig_ObjChild0CopyVec(vCopy0, pObj), Aig_ObjChild1CopyVec(vCopy0, pObj) ); - Vec_PtrWriteEntry( vCopy0, Aig_ObjId(pObj), pTemp ); - pTemp = Aig_And( pNew, Aig_ObjChild0CopyVec(vCopy1, pObj), Aig_ObjChild1CopyVec(vCopy1, pObj) ); - Vec_PtrWriteEntry( vCopy1, Aig_ObjId(pObj), pTemp ); - } - // construct the care miter - pMiter = Aig_ManConst0( pNew ); - Vec_PtrForEachEntry( Aig_Obj_t *, p->vFanout, pObj, i ) - { - pTemp = Aig_Exor( pNew, (Aig_Obj_t *)Vec_PtrEntry(vCopy0, Aig_ObjId(pObj)), (Aig_Obj_t *)Vec_PtrEntry(vCopy1, Aig_ObjId(pObj)) ); - pMiter = Aig_Or( pNew, pMiter, pTemp ); - } - return pMiter; -} - -/**Function************************************************************* - - Synopsis [Derives AIG for clock-gating.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Man_t * Cgt_ManDeriveAigForGating( Cgt_Man_t * p ) -{ - Aig_Man_t * pNew; - Aig_Obj_t * pObj, * pObjLi, * pObjLo, * pCare, * pMiter; - Vec_Ptr_t * vCopy0, * vCopy1; - int i; - assert( Aig_ManRegNum(p->pAig) ); - pNew = Aig_ManStart( Aig_ManObjNumMax(p->pAig) ); - pNew->pName = Aig_UtilStrsav( "CG_miter" ); - // build the first frame - Aig_ManConst1(p->pAig)->pData = Aig_ManConst1(pNew); - Aig_ManForEachPi( p->pAig, pObj, i ) - pObj->pData = Aig_ObjCreatePi( pNew ); - Aig_ManForEachNode( p->pAig, pObj, i ) - pObj->pData = Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) ); -// Saig_ManForEachPo( p->pAig, pObj, i ) -// pObj->pData = Aig_ObjCreatePo( pNew, Aig_ObjChild0Copy(pObj) ); - if ( p->pPars->nOdcMax > 0 ) - { - // create storage for observability conditions - vCopy0 = Vec_PtrStart( Aig_ManObjNumMax(p->pAig) ); - vCopy1 = Vec_PtrStart( Aig_ManObjNumMax(p->pAig) ); - // initialize register outputs - Saig_ManForEachLiLo( p->pAig, pObjLi, pObjLo, i ) - { - Vec_PtrWriteEntry( vCopy0, Aig_ObjId(pObjLo), Aig_ObjChild0Copy(pObjLi) ); - Vec_PtrWriteEntry( vCopy1, Aig_ObjId(pObjLo), Aig_ObjChild0Copy(pObjLi) ); - } - // compute observability condition for each latch output - Saig_ManForEachLiLo( p->pAig, pObjLi, pObjLo, i ) - { - // set the constants - Vec_PtrWriteEntry( vCopy0, Aig_ObjId(pObjLo), Aig_ManConst0(pNew) ); - Vec_PtrWriteEntry( vCopy1, Aig_ObjId(pObjLo), Aig_ManConst1(pNew) ); - // compute condition - pCare = Cgt_ManConstructCareCondition( p, pNew, pObjLo, vCopy0, vCopy1 ); - // restore the values - Vec_PtrWriteEntry( vCopy0, Aig_ObjId(pObjLo), Aig_ObjChild0Copy(pObjLi) ); - Vec_PtrWriteEntry( vCopy1, Aig_ObjId(pObjLo), Aig_ObjChild0Copy(pObjLi) ); - // compute the miter - pMiter = Aig_Exor( pNew, (Aig_Obj_t *)pObjLo->pData, Aig_ObjChild0Copy(pObjLi) ); - pMiter = Aig_And( pNew, pMiter, pCare ); - pObjLi->pData = Aig_ObjCreatePo( pNew, pMiter ); - } - Vec_PtrFree( vCopy0 ); - Vec_PtrFree( vCopy1 ); - } - else - { - // construct clock-gating miters for each register input - Saig_ManForEachLiLo( p->pAig, pObjLi, pObjLo, i ) - { - pMiter = Aig_Exor( pNew, (Aig_Obj_t *)pObjLo->pData, Aig_ObjChild0Copy(pObjLi) ); - pObjLi->pData = Aig_ObjCreatePo( pNew, pMiter ); - } - } - Aig_ManCleanup( pNew ); - Aig_ManSetPioNumbers( pNew ); - return pNew; -} - -/**Function************************************************************* - - Synopsis [Adds relevant constraints.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Cgt_ManConstructCare_rec( Aig_Man_t * pCare, Aig_Obj_t * pObj, Aig_Man_t * pNew ) -{ - Aig_Obj_t * pObj0, * pObj1; - if ( Aig_ObjIsTravIdCurrent( pCare, pObj ) ) - return (Aig_Obj_t *)pObj->pData; - Aig_ObjSetTravIdCurrent( pCare, pObj ); - if ( Aig_ObjIsPi(pObj) ) - return (Aig_Obj_t *)(pObj->pData = NULL); - pObj0 = Cgt_ManConstructCare_rec( pCare, Aig_ObjFanin0(pObj), pNew ); - if ( pObj0 == NULL ) - return (Aig_Obj_t *)(pObj->pData = NULL); - pObj1 = Cgt_ManConstructCare_rec( pCare, Aig_ObjFanin1(pObj), pNew ); - if ( pObj1 == NULL ) - return (Aig_Obj_t *)(pObj->pData = NULL); - pObj0 = Aig_NotCond( pObj0, Aig_ObjFaninC0(pObj) ); - pObj1 = Aig_NotCond( pObj1, Aig_ObjFaninC1(pObj) ); - return (Aig_Obj_t *)(pObj->pData = Aig_And( pNew, pObj0, pObj1 )); -} - -/**Function************************************************************* - - Synopsis [Builds constraints belonging to the given partition.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -void Cgt_ManConstructCare( Aig_Man_t * pNew, Aig_Man_t * pCare, Vec_Vec_t * vSuppsInv, Vec_Ptr_t * vLeaves ) -{ - Vec_Int_t * vOuts; - Aig_Obj_t * pLeaf, * pPi, * pPo, * pObjAig; - int i, k, iOut; - // go through the PIs of the partition - // label the corresponding PIs of the care set - Aig_ManIncrementTravId( pCare ); - Vec_PtrForEachEntry( Aig_Obj_t *, vLeaves, pLeaf, i ) - { - pPi = Aig_ManPi( pCare, Aig_ObjPioNum(pLeaf) ); - Aig_ObjSetTravIdCurrent( pCare, pPi ); - pPi->pData = pLeaf->pData; - } - // construct the constraints - Vec_PtrForEachEntry( Aig_Obj_t *, vLeaves, pLeaf, i ) - { - vOuts = Vec_VecEntryInt( vSuppsInv, Aig_ObjPioNum(pLeaf) ); - Vec_IntForEachEntry( vOuts, iOut, k ) - { - pPo = Aig_ManPo( pCare, iOut ); - if ( Aig_ObjIsTravIdCurrent( pCare, pPo ) ) - continue; - Aig_ObjSetTravIdCurrent( pCare, pPo ); - if ( Aig_ObjFanin0(pPo) == Aig_ManConst1(pCare) ) - continue; - pObjAig = Cgt_ManConstructCare_rec( pCare, Aig_ObjFanin0(pPo), pNew ); - if ( pObjAig == NULL ) - continue; - pObjAig = Aig_NotCond( pObjAig, Aig_ObjFaninC0(pPo) ); - Aig_ObjCreatePo( pNew, pObjAig ); - } - } -} - -/**Function************************************************************* - - Synopsis [Duplicates the AIG recursively.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Cgt_ManDupPartition_rec( Aig_Man_t * pNew, Aig_Man_t * pAig, Aig_Obj_t * pObj, Vec_Ptr_t * vLeaves ) -{ - if ( Aig_ObjIsTravIdCurrent(pAig, pObj) ) - return (Aig_Obj_t *)pObj->pData; - Aig_ObjSetTravIdCurrent(pAig, pObj); - if ( Aig_ObjIsPi(pObj) ) - { - pObj->pData = Aig_ObjCreatePi( pNew ); - Vec_PtrPush( vLeaves, pObj ); - return (Aig_Obj_t *)pObj->pData; - } - Cgt_ManDupPartition_rec( pNew, pAig, Aig_ObjFanin0(pObj), vLeaves ); - Cgt_ManDupPartition_rec( pNew, pAig, Aig_ObjFanin1(pObj), vLeaves ); - return (Aig_Obj_t *)(pObj->pData = Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) )); -} - -/**Function************************************************************* - - Synopsis [Duplicates register outputs starting from the given one.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Man_t * Cgt_ManDupPartition( Aig_Man_t * pFrame, int nVarsMin, int nFlopsMin, int iStart, Aig_Man_t * pCare, Vec_Vec_t * vSuppsInv, int * pnOutputs ) -{ - Vec_Ptr_t * vRoots, * vLeaves, * vPos; - Aig_Man_t * pNew; - Aig_Obj_t * pObj; - int i; - assert( Aig_ManRegNum(pFrame) == 0 ); - vRoots = Vec_PtrAlloc( 100 ); - vLeaves = Vec_PtrAlloc( 100 ); - vPos = Vec_PtrAlloc( 100 ); - pNew = Aig_ManStart( nVarsMin ); - pNew->pName = Aig_UtilStrsav( "partition" ); - Aig_ManIncrementTravId( pFrame ); - Aig_ManConst1(pFrame)->pData = Aig_ManConst1(pNew); - Aig_ObjSetTravIdCurrent( pFrame, Aig_ManConst1(pFrame) ); - for ( i = iStart; i < iStart + nFlopsMin && i < Aig_ManPoNum(pFrame); i++ ) - { - pObj = Aig_ManPo( pFrame, i ); - Cgt_ManDupPartition_rec( pNew, pFrame, Aig_ObjFanin0(pObj), vLeaves ); - Vec_PtrPush( vRoots, Aig_ObjChild0Copy(pObj) ); - Vec_PtrPush( vPos, pObj ); - } - for ( ; Aig_ManObjNum(pNew) < nVarsMin && i < Aig_ManPoNum(pFrame); i++ ) - { - pObj = Aig_ManPo( pFrame, i ); - Cgt_ManDupPartition_rec( pNew, pFrame, Aig_ObjFanin0(pObj), vLeaves ); - Vec_PtrPush( vRoots, Aig_ObjChild0Copy(pObj) ); - Vec_PtrPush( vPos, pObj ); - } - assert( nFlopsMin >= Vec_PtrSize(vRoots) || Vec_PtrSize(vRoots) >= nFlopsMin ); - // create constaints - if ( pCare ) - Cgt_ManConstructCare( pNew, pCare, vSuppsInv, vLeaves ); - // create POs - Vec_PtrForEachEntry( Aig_Obj_t *, vPos, pObj, i ) - pObj->pData = (Aig_Obj_t *)Aig_ObjCreatePo( pNew, (Aig_Obj_t *)Vec_PtrEntry(vRoots, i) ); - if ( pnOutputs != NULL ) - *pnOutputs = Vec_PtrSize( vPos ); - Vec_PtrFree( vRoots ); - Vec_PtrFree( vLeaves ); - Vec_PtrFree( vPos ); - return pNew; -} - -/**Function************************************************************* - - Synopsis [Implements one clock-gate.] - - Description [] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Obj_t * Cgt_ManBuildClockGate( Aig_Man_t * pNew, Vec_Ptr_t * vGates ) -{ - Aig_Obj_t * pGate, * pTotal; - int i; - assert( Vec_PtrSize(vGates) > 0 ); - pTotal = Aig_ManConst0(pNew); - Vec_PtrForEachEntry( Aig_Obj_t *, vGates, pGate, i ) - { - if ( Aig_Regular(pGate)->pNext ) - pGate = Aig_NotCond( Aig_Regular(pGate)->pNext, Aig_IsComplement(pGate) ); - else - pGate = Aig_NotCond( (Aig_Obj_t *)Aig_Regular(pGate)->pData, Aig_IsComplement(pGate) ); - pTotal = Aig_Or( pNew, pTotal, pGate ); - } - return pTotal; -} - -/**Function************************************************************* - - Synopsis [Derives AIG after clock-gating.] - - Description [The array contains, for each flop, its gate if present.] - - SideEffects [] - - SeeAlso [] - -***********************************************************************/ -Aig_Man_t * Cgt_ManDeriveGatedAig( Aig_Man_t * pAig, Vec_Vec_t * vGates, int fReduce, int * pnUsedNodes ) -{ - Aig_Man_t * pNew; - Aig_Obj_t * pObj, * pObjNew, * pObjLi, * pObjLo, * pGateNew; - Vec_Ptr_t * vOne; - int i, k; - Aig_ManCleanNext( pAig ); - // label nodes - Vec_VecForEachEntry( Aig_Obj_t *, vGates, pObj, i, k ) - { - if ( Aig_IsComplement(pObj) ) - Aig_Regular(pObj)->fMarkB = 1; - else - Aig_Regular(pObj)->fMarkA = 1; - } - // construct AIG - assert( Aig_ManRegNum(pAig) ); - pNew = Aig_ManStart( Aig_ManObjNumMax(pAig) ); - pNew->pName = Aig_UtilStrsav( pAig->pName ); - pNew->pSpec = Aig_UtilStrsav( pAig->pSpec ); - Aig_ManConst1(pAig)->pData = Aig_ManConst1(pNew); - Aig_ManForEachPi( pAig, pObj, i ) - pObj->pData = Aig_ObjCreatePi( pNew ); - if ( fReduce ) - { - Aig_ManForEachNode( pAig, pObj, i ) - { - assert( !(pObj->fMarkA && pObj->fMarkB) ); - pObj->pData = Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) ); - if ( pObj->fMarkA ) - { - pObj->pNext = (Aig_Obj_t *)pObj->pData; - pObj->pData = Aig_ManConst0(pNew); - } - else if ( pObj->fMarkB ) - { - pObj->pNext = (Aig_Obj_t *)pObj->pData; - pObj->pData = Aig_ManConst1(pNew); - } - } - } - else - { - Aig_ManForEachNode( pAig, pObj, i ) - pObj->pData = Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) ); - } - if ( pnUsedNodes != NULL ) - *pnUsedNodes = Aig_ManNodeNum(pNew); - Saig_ManForEachPo( pAig, pObj, i ) - pObj->pData = Aig_ObjCreatePo( pNew, Aig_ObjChild0Copy(pObj) ); - Saig_ManForEachLiLo( pAig, pObjLi, pObjLo, i ) - { - vOne = Vec_VecEntry( vGates, i ); - if ( Vec_PtrSize(vOne) == 0 ) - pObjNew = Aig_ObjChild0Copy(pObjLi); - else - { -// pGateNew = Aig_NotCond( Aig_Regular(pGate)->pData, Aig_IsComplement(pGate) ); - pGateNew = Cgt_ManBuildClockGate( pNew, vOne ); - pObjNew = Aig_Mux( pNew, pGateNew, (Aig_Obj_t *)pObjLo->pData, Aig_ObjChild0Copy(pObjLi) ); - } - pObjLi->pData = Aig_ObjCreatePo( pNew, pObjNew ); - } - Aig_ManCleanup( pNew ); - Aig_ManSetRegNum( pNew, Aig_ManRegNum(pAig) ); - // unlabel nodes - Aig_ManCleanMarkAB( pAig ); - Aig_ManCleanNext( pAig ); - return pNew; -} - -//////////////////////////////////////////////////////////////////////// -/// END OF FILE /// -//////////////////////////////////////////////////////////////////////// - - -ABC_NAMESPACE_IMPL_END - |