47 if ( Aig_ObjIsTravIdCurrent(pAig, pObj) )
49 Aig_ObjSetTravIdCurrent(pAig, pObj);
50 if ( Aig_ObjIsNode(pObj) )
55 if ( Aig_ObjLevel(pObj) <= nLevelMax && (vUseful == NULL || Vec_IntEntry(vUseful, Aig_ObjId(pObj))) )
56 Vec_PtrPush( vCands, pObj );
72 Vec_PtrClear( vCands );
73 if ( !Aig_ObjIsNode(pObj) )
94 if ( Aig_ObjIsCo(pObj) || Aig_ObjLevel(pObj) > nOdcMax )
96 if ( Aig_ObjIsTravIdCurrent(pAig, pObj) )
98 Aig_ObjSetTravIdCurrent(pAig, pObj);
99 Vec_PtrPush( vFanout, pObj );
118 int i, k, f, iFanout = -1;
120 Vec_PtrClear( vFanout );
129 if ( !Aig_ObjIsTravIdCurrent(pAig, pFanout) )
131 if ( f == Aig_ObjRefs(pObj) )
133 Vec_PtrWriteEntry( vFanout, k++, pObj );
135 Vec_PtrShrink( vFanout, k );
137 assert( Vec_PtrSize(vFanout) > 0 );
153 if ( Aig_ObjIsCi(pObj) )
155 if ( Aig_ObjIsTravIdCurrent(pAig, pObj) )
157 Aig_ObjSetTravIdCurrent(pAig, pObj);
158 assert( Aig_ObjIsNode(pObj) );
161 Vec_PtrPush( vVisited, pObj );
179 Vec_PtrClear( vVisited );
197{
return Aig_NotCond((
Aig_Obj_t *)Vec_PtrEntry(vCopy, Aig_ObjFaninId0(pObj)), Aig_ObjFaninC0(pObj)); }
199{
return Aig_NotCond((
Aig_Obj_t *)Vec_PtrEntry(vCopy, Aig_ObjFaninId1(pObj)), Aig_ObjFaninC1(pObj)); }
216 assert( Aig_ObjIsCi(pObjLo) );
223 assert( Aig_ObjIsNode(pObj) );
224 if ( Saig_ObjIsPi(
p->pAig, Aig_ObjFanin0(pObj)) && Vec_PtrEntry(vCopy0, Aig_ObjFaninId0(pObj)) == NULL )
227 Vec_PtrWriteEntry( vCopy0, Aig_ObjFaninId0(pObj), pTemp );
228 Vec_PtrWriteEntry( vCopy1, Aig_ObjFaninId0(pObj), pTemp );
230 if ( Saig_ObjIsPi(
p->pAig, Aig_ObjFanin1(pObj)) && Vec_PtrEntry(vCopy0, Aig_ObjFaninId1(pObj)) == NULL )
233 Vec_PtrWriteEntry( vCopy0, Aig_ObjFaninId1(pObj), pTemp );
234 Vec_PtrWriteEntry( vCopy1, Aig_ObjFaninId1(pObj), pTemp );
240 pTemp =
Aig_And( pNew, Aig_ObjChild0CopyVec(vCopy0, pObj), Aig_ObjChild1CopyVec(vCopy0, pObj) );
241 Vec_PtrWriteEntry( vCopy0, Aig_ObjId(pObj), pTemp );
242 pTemp =
Aig_And( pNew, Aig_ObjChild0CopyVec(vCopy1, pObj), Aig_ObjChild1CopyVec(vCopy1, pObj) );
243 Vec_PtrWriteEntry( vCopy1, Aig_ObjId(pObj), pTemp );
246 pMiter = Aig_ManConst0( pNew );
249 pTemp =
Aig_Exor( pNew, (
Aig_Obj_t *)Vec_PtrEntry(vCopy0, Aig_ObjId(pObj)), (
Aig_Obj_t *)Vec_PtrEntry(vCopy1, Aig_ObjId(pObj)) );
250 pMiter =
Aig_Or( pNew, pMiter, pTemp );
269 Aig_Obj_t * pObj, * pObjLi, * pObjLo, * pCare, * pMiter;
272 assert( Aig_ManRegNum(
p->pAig) );
274 pNew->pName = Abc_UtilStrsav(
"CG_miter" );
276 Aig_ManConst1(
p->pAig)->pData = Aig_ManConst1(pNew);
280 pObj->
pData =
Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
283 if (
p->pPars->nOdcMax > 0 )
286 vCopy0 = Vec_PtrStart( Aig_ManObjNumMax(
p->pAig) );
287 vCopy1 = Vec_PtrStart( Aig_ManObjNumMax(
p->pAig) );
291 Vec_PtrWriteEntry( vCopy0, Aig_ObjId(pObjLo), Aig_ObjChild0Copy(pObjLi) );
292 Vec_PtrWriteEntry( vCopy1, Aig_ObjId(pObjLo), Aig_ObjChild0Copy(pObjLi) );
298 Vec_PtrWriteEntry( vCopy0, Aig_ObjId(pObjLo), Aig_ManConst0(pNew) );
299 Vec_PtrWriteEntry( vCopy1, Aig_ObjId(pObjLo), Aig_ManConst1(pNew) );
303 Vec_PtrWriteEntry( vCopy0, Aig_ObjId(pObjLo), Aig_ObjChild0Copy(pObjLi) );
304 Vec_PtrWriteEntry( vCopy1, Aig_ObjId(pObjLo), Aig_ObjChild0Copy(pObjLi) );
307 pMiter =
Aig_And( pNew, pMiter, pCare );
310 Vec_PtrFree( vCopy0 );
311 Vec_PtrFree( vCopy1 );
341 if ( Aig_ObjIsTravIdCurrent( pCare, pObj ) )
343 Aig_ObjSetTravIdCurrent( pCare, pObj );
344 if ( Aig_ObjIsCi(pObj) )
352 pObj0 = Aig_NotCond( pObj0, Aig_ObjFaninC0(pObj) );
353 pObj1 = Aig_NotCond( pObj1, Aig_ObjFaninC1(pObj) );
371 Aig_Obj_t * pLeaf, * pPi, * pPo, * pObjAig;
378 pPi = Aig_ManCi( pCare, Aig_ObjCioId(pLeaf) );
379 Aig_ObjSetTravIdCurrent( pCare, pPi );
385 vOuts = Vec_VecEntryInt( vSuppsInv, Aig_ObjCioId(pLeaf) );
388 pPo = Aig_ManCo( pCare, iOut );
389 if ( Aig_ObjIsTravIdCurrent( pCare, pPo ) )
391 Aig_ObjSetTravIdCurrent( pCare, pPo );
392 if ( Aig_ObjFanin0(pPo) == Aig_ManConst1(pCare) )
395 if ( pObjAig == NULL )
397 pObjAig = Aig_NotCond( pObjAig, Aig_ObjFaninC0(pPo) );
416 if ( Aig_ObjIsTravIdCurrent(pAig, pObj) )
418 Aig_ObjSetTravIdCurrent(pAig, pObj);
419 if ( Aig_ObjIsCi(pObj) )
422 Vec_PtrPush( vLeaves, pObj );
427 return (
Aig_Obj_t *)(pObj->
pData =
Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) ));
447 assert( Aig_ManRegNum(pFrame) == 0 );
448 vRoots = Vec_PtrAlloc( 100 );
449 vLeaves = Vec_PtrAlloc( 100 );
450 vPos = Vec_PtrAlloc( 100 );
452 pNew->pName = Abc_UtilStrsav(
"partition" );
454 Aig_ManConst1(pFrame)->pData = Aig_ManConst1(pNew);
455 Aig_ObjSetTravIdCurrent( pFrame, Aig_ManConst1(pFrame) );
456 for ( i = iStart; i < iStart + nFlopsMin && i < Aig_ManCoNum(pFrame); i++ )
458 pObj = Aig_ManCo( pFrame, i );
460 Vec_PtrPush( vRoots, Aig_ObjChild0Copy(pObj) );
461 Vec_PtrPush( vPos, pObj );
463 for ( ; Aig_ManObjNum(pNew) < nVarsMin && i < Aig_ManCoNum(pFrame); i++ )
465 pObj = Aig_ManCo( pFrame, i );
467 Vec_PtrPush( vRoots, Aig_ObjChild0Copy(pObj) );
468 Vec_PtrPush( vPos, pObj );
470 assert( nFlopsMin >= Vec_PtrSize(vRoots) || Vec_PtrSize(vRoots) >= nFlopsMin );
477 if ( pnOutputs != NULL )
478 *pnOutputs = Vec_PtrSize( vPos );
479 Vec_PtrFree( vRoots );
480 Vec_PtrFree( vLeaves );
500 assert( Vec_PtrSize(vGates) > 0 );
501 pTotal = Aig_ManConst0(pNew);
504 if ( Aig_Regular(pGate)->pNext )
505 pGate = Aig_NotCond( Aig_Regular(pGate)->pNext, Aig_IsComplement(pGate) );
507 pGate = Aig_NotCond( (
Aig_Obj_t *)Aig_Regular(pGate)->pData, Aig_IsComplement(pGate) );
508 pTotal =
Aig_Or( pNew, pTotal, pGate );
527 Aig_Obj_t * pObj, * pObjNew, * pObjLi, * pObjLo, * pGateNew;
534 if ( Aig_IsComplement(pObj) )
535 Aig_Regular(pObj)->fMarkB = 1;
537 Aig_Regular(pObj)->fMarkA = 1;
540 assert( Aig_ManRegNum(pAig) );
542 pNew->pName = Abc_UtilStrsav( pAig->pName );
543 pNew->pSpec = Abc_UtilStrsav( pAig->pSpec );
544 Aig_ManConst1(pAig)->pData = Aig_ManConst1(pNew);
552 pObj->
pData =
Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
556 pObj->
pData = Aig_ManConst0(pNew);
561 pObj->
pData = Aig_ManConst1(pNew);
568 pObj->
pData =
Aig_And( pNew, Aig_ObjChild0Copy(pObj), Aig_ObjChild1Copy(pObj) );
570 if ( pnUsedNodes != NULL )
571 *pnUsedNodes = Aig_ManNodeNum(pNew);
576 vOne = Vec_VecEntry( vGates, i );
577 if ( Vec_PtrSize(vOne) == 0 )
578 pObjNew = Aig_ObjChild0Copy(pObjLi);
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Aig_ManSetRegNum(Aig_Man_t *p, int nRegs)
void Aig_ManSetCioIds(Aig_Man_t *p)
#define Aig_ObjForEachFanout(p, pObj, pFanout, iFan, i)
void Aig_ManIncrementTravId(Aig_Man_t *p)
DECLARATIONS ///.
#define Aig_ManForEachCi(p, pObj, i)
ITERATORS ///.
Aig_Obj_t * Aig_And(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
Aig_Obj_t * Aig_ObjCreateCo(Aig_Man_t *p, Aig_Obj_t *pDriver)
Aig_Obj_t * Aig_Mux(Aig_Man_t *p, Aig_Obj_t *pC, Aig_Obj_t *p1, Aig_Obj_t *p0)
void Aig_ManCleanNext(Aig_Man_t *p)
struct Aig_Obj_t_ Aig_Obj_t
Aig_Obj_t * Aig_Exor(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
Aig_Man_t * Aig_ManStart(int nNodesMax)
DECLARATIONS ///.
int Aig_ObjCompareIdIncrease(Aig_Obj_t **pp1, Aig_Obj_t **pp2)
#define Aig_ManForEachNode(p, pObj, i)
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
int Aig_ManCleanup(Aig_Man_t *p)
void Aig_ManCleanMarkAB(Aig_Man_t *p)
Aig_Obj_t * Aig_ObjCreateCi(Aig_Man_t *p)
DECLARATIONS ///.
Aig_Obj_t * Aig_Or(Aig_Man_t *p, Aig_Obj_t *p0, Aig_Obj_t *p1)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Aig_Obj_t * Cgt_ManConstructCare_rec(Aig_Man_t *pCare, Aig_Obj_t *pObj, Aig_Man_t *pNew)
Aig_Obj_t * Cgt_ManDupPartition_rec(Aig_Man_t *pNew, Aig_Man_t *pAig, Aig_Obj_t *pObj, Vec_Ptr_t *vLeaves)
void Cgt_ManDetectCandidates(Aig_Man_t *pAig, Vec_Int_t *vUseful, Aig_Obj_t *pObj, int nLevelMax, Vec_Ptr_t *vCands)
MACRO DEFINITIONS ///.
void Cgt_ManConstructCare(Aig_Man_t *pNew, Aig_Man_t *pCare, Vec_Vec_t *vSuppsInv, Vec_Ptr_t *vLeaves)
void Cgt_ManDetectFanout_rec(Aig_Man_t *pAig, Aig_Obj_t *pObj, int nOdcMax, Vec_Ptr_t *vFanout)
Aig_Man_t * Cgt_ManDeriveGatedAig(Aig_Man_t *pAig, Vec_Vec_t *vGates, int fReduce, int *pnUsedNodes)
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)
Aig_Man_t * Cgt_ManDeriveAigForGating(Cgt_Man_t *p)
void Cgt_ManCollectVisited_rec(Aig_Man_t *pAig, Aig_Obj_t *pObj, Vec_Ptr_t *vVisited)
void Cgt_ManCollectVisited(Aig_Man_t *pAig, Vec_Ptr_t *vFanout, Vec_Ptr_t *vVisited)
ABC_NAMESPACE_IMPL_START void Cgt_ManDetectCandidates_rec(Aig_Man_t *pAig, Vec_Int_t *vUseful, Aig_Obj_t *pObj, int nLevelMax, Vec_Ptr_t *vCands)
DECLARATIONS ///.
Aig_Obj_t * Cgt_ManBuildClockGate(Aig_Man_t *pNew, Vec_Ptr_t *vGates)
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)
void Cgt_ManDetectFanout(Aig_Man_t *pAig, Aig_Obj_t *pObj, int nOdcMax, Vec_Ptr_t *vFanout)
typedefABC_NAMESPACE_HEADER_START struct Cgt_Man_t_ Cgt_Man_t
INCLUDES ///.
#define Saig_ManForEachLiLo(p, pObjLi, pObjLo, i)
#define Saig_ManForEachPo(p, pObj, i)
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
#define Vec_VecForEachEntry(Type, vGlob, pEntry, i, k)
typedefABC_NAMESPACE_HEADER_START struct Vec_Vec_t_ Vec_Vec_t
INCLUDES ///.