54#define Aig_DomForEachNode( pAig, pDom, pNode, i ) \
55 for ( i = 0; (i < pDom->nNodes) && ((pNode) = Aig_ManObj(pAig, (pDom)->pNodes[i])); i++ )
79 pSto->vDoms = Vec_PtrStart( Aig_ManObjNumMax(pAig) );
80 pSto->vFans = Vec_IntAlloc( 100 );
81 pSto->vTimes = Vec_IntStart( Aig_ManObjNumMax(pAig) );
100 pDom->
uSign = (1 << (Id % 63));
103 Vec_PtrPushFirst( vDoms, pDom );
104 assert( Vec_PtrEntry( pSto->vDoms, Id ) == NULL );
105 Vec_PtrWriteEntry( pSto->vDoms, Id, vDoms );
124 vDoms2 = Vec_PtrAlloc( 0 );
129 Vec_PtrPush( vDoms2, pDom2 );
151 Vec_PtrFree( vDoms );
168 printf(
"%4d : {", Num );
169 for ( k = 0; k < pDom->
nNodes; k++ )
170 printf(
" %4d", pDom->
pNodes[k] );
171 for ( ; k < pSto->Limit; k++ )
212 printf(
"*** PI %4d %4d :\n", i, pObj->
Id );
235 Vec_PtrFree( pSto->vDoms );
236 Vec_IntFree( pSto->vFans );
237 Vec_IntFree( pSto->vTimes );
257 for ( i = 1; i < pDom->
nNodes; i++ )
261 Abc_Print( -1,
"Aig_ObjDomCheck(): Cut has wrong ordering of inputs.\n" );
283 for ( i = 0; i < pDom->
nNodes; i++ )
285 for ( k = 0; k < (int)pCut->
nNodes; k++ )
288 if ( k == (
int)pCut->
nNodes )
321 if ( Aig_ObjDomCheckDominance( pDom, pTemp ) )
323 Vec_PtrRemove( vDoms, pTemp );
326 pSto->nDomsFilter1++;
335 if ( Aig_ObjDomCheckDominance( pTemp, pDom ) )
337 pSto->nDomsFilter2++;
363 for ( i = 0; i < pD0->
nNodes; i++ )
366 for ( i = 0; i < pD0->
nNodes; i++ )
372 if ( pD0->
nNodes == Limit )
374 for ( i = 0; i < pD1->
nNodes; i++ )
376 for ( k = pD0->
nNodes - 1; k >= 0; k-- )
382 for ( i = 0; i < pD0->
nNodes; i++ )
390 for ( c = 0; c < (int)Limit; c++ )
425 if ( i < pD0->nNodes || k < pD1->nNodes )
447 if ( !Aig_ObjDomMergeOrdered( pDom1, pDom0, pDom, Limit ) )
452 if ( !Aig_ObjDomMergeOrdered( pDom0, pDom1, pDom, Limit ) )
477 vDoms = Vec_PtrAlloc( 16 );
481 if ( Aig_WordCountOnes( pDom0->
uSign | pDom1->
uSign ) > pSto->Limit )
496 Vec_PtrPush( vDoms, pDom );
524 Vec_PtrPush( vDoms2, pDom2 );
542 Vec_Ptr_t * vDoms0, * vDoms1, * vDoms2, * vDomsT;
545 pSto->nDomNodes += Aig_ObjIsNode(pObj);
546 Vec_IntClear( pSto->vFans );
548 if ( Aig_ObjIsTravIdCurrent(pSto->pAig, pFanout) )
549 Vec_IntPush( pSto->vFans, iFanout>>1 );
550 if ( Vec_IntSize(pSto->vFans) == 0 )
552 vDoms0 = (
Vec_Ptr_t *)Vec_PtrEntry( pSto->vDoms, Vec_IntEntry(pSto->vFans, 0) );
556 vDoms1 = (
Vec_Ptr_t *)Vec_PtrEntry( pSto->vDoms, iFanout );
561 pSto->nDomsTotal += Vec_PtrSize(vDoms2);
578 assert( !Aig_IsComplement(pObj) );
579 if ( Aig_ObjIsTravIdCurrent(
p, pObj) )
581 Aig_ObjSetTravIdCurrent(
p, pObj);
582 if ( Aig_ObjIsCi(pObj) || Aig_ObjIsConst1(pObj) )
585 if ( Aig_ObjIsNode(pObj) )
636 if ( Aig_ObjIsTravIdCurrent(pSto->pAig, pObj) )
638 Vec_PtrFree( vNodes );
643 printf(
"Nodes =%4d. Flops =%4d. Doms =%9d. Ave =%8.2f. ",
644 pSto->nDomNodes, Aig_ManRegNum(pSto->pAig), pSto->nDomsTotal,
646 1.0 * pSto->nDomsTotal / (pSto->nDomNodes + Aig_ManRegNum(pSto->pAig)) );
647 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
677 if ( Aig_ObjIsTravIdCurrent(pSto->pAig, pObj) )
679 Vec_PtrFree( vNodes );
684 printf(
"Nodes =%4d. PIs =%4d. Doms =%9d. Ave =%8.2f. ",
685 pSto->nDomNodes, Saig_ManPiNum(pSto->pAig), pSto->nDomsTotal,
687 1.0 * pSto->nDomsTotal / (pSto->nDomNodes + Saig_ManPiNum(pSto->pAig)) );
688 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
718 Vec_PtrFree( vNodes );
723 printf(
"Nodes =%6d. Doms =%9d. Ave =%8.2f. ",
724 pSto->nDomNodes, pSto->nDomsTotal,
726 1.0 * pSto->nDomsTotal / pSto->nDomNodes );
727 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
746 vDoms0 = (
Vec_Ptr_t *)Vec_PtrEntry( pSto->vDoms, Vec_IntEntry(vCut, 0) );
750 vDoms1 = (
Vec_Ptr_t *)Vec_PtrEntry( pSto->vDoms, ObjId );
751 if ( vDoms1 == NULL )
773 assert( !Aig_IsComplement(pObj) );
774 if ( Aig_ObjIsTravIdCurrent(
p, pObj) )
776 Aig_ObjSetTravIdCurrent(
p, pObj);
780 if ( Aig_ObjIsCi(pObj) || Aig_ObjIsConst1(pObj) )
783 if ( Aig_ObjIsNode(pObj) )
827 if ( --pNode->
nRefs > 0 )
832 if ( Aig_ObjIsCi(pNode) )
835 if ( Aig_ObjIsNode(pNode) )
855 if ( pNode->
nRefs++ > 0 )
860 if ( Aig_ObjIsCi(pNode) )
863 if ( Aig_ObjIsNode(pNode) )
882 int i, Counter0, Counter1;
886 assert( !Aig_ObjIsCi(pObj) );
888 if ( Aig_ObjIsNode(pObj) )
894 assert( !Aig_ObjIsCi(pObj) );
896 if ( Aig_ObjIsNode(pObj) )
899 assert( Counter0 == Counter1 );
920 vCut = Vec_IntAlloc( Aig_ManRegNum(pSto->pAig) );
923 Vec_IntPush( vCut, pObj->
Id );
987 printf(
"The cut has %d non-trivial %d-dominators.\n", Vec_PtrSize(vDoms), pSto->Limit );
1024 printf(
"ITERATION %d:\n", Num );
1075 int i, k, Entry, iFanout, fPrint = 0;
1076 vSingles = Vec_IntAlloc( 100 );
1080 vDoms = (
Vec_Ptr_t *)Vec_PtrEntry( pSto->vDoms, Aig_ObjId(pFanout) );
1084 Vec_IntAddToEntry( pSto->vTimes, pDom->
pNodes[0], 1 );
1085 Vec_IntPushUnique( vSingles, pDom->
pNodes[0] );
1091 if ( Vec_IntEntry(pSto->vTimes, Entry) > 5 )
1095 printf(
"%6d : Level =%4d. Fanout =%6d.\n",
1096 Aig_ObjId(pObj), Aig_ObjLevel(pObj), Aig_ObjRefs(pObj) );
1099 printf(
"%d(%d) ", Entry, Vec_IntEntry(pSto->vTimes, Entry) );
1101 Vec_IntWriteEntry( pSto->vTimes, Entry, 0);
1105 Vec_IntFree( vSingles );
1130 if ( !Aig_ObjIsCi(pObj) && !Aig_ObjIsNode(pObj) )
1132 if ( Aig_ObjRefs(pObj) < 10 )
1134 vDoms = (
Vec_Ptr_t *)Vec_PtrEntry( pSto->vDoms, Aig_ObjId(pObj) );
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
int Aig_ObjDomMergeTwo(Aig_Dom_t *pDom0, Aig_Dom_t *pDom1, Aig_Dom_t *pDom, int Limit)
struct Aig_Dom_t_ Aig_Dom_t
void Aig_ObjPoLogicRef(Aig_Sto_t *pSto)
int Aig_ObjDomRef_rec(Aig_Obj_t *pNode)
void Aig_ManDomStop(Aig_Sto_t *pSto)
int Aig_ObjDomVolume_rec(Aig_Man_t *p, Aig_Obj_t *pObj)
void Aig_ObjDomCompute(Aig_Sto_t *pSto, Aig_Obj_t *pObj)
void Aig_ObjPoLogicDeref(Aig_Sto_t *pSto)
Aig_Sto_t * Aig_ManComputeDomsPis(Aig_Man_t *pAig, int Limit)
void Aig_ObjDomVecRecycle(Aig_Sto_t *pSto, Vec_Ptr_t *vDoms)
Aig_Sto_t * Aig_ManDomStart(Aig_Man_t *pAig, int Limit)
FUNCTION DEFINITIONS ///.
Aig_Sto_t * Aig_ManComputeDomsNodes(Aig_Man_t *pAig, int Limit)
#define Aig_DomForEachNode(pAig, pDom, pNode, i)
void Aig_ManComputeDomsTest(Aig_Man_t *pAig)
void Aig_ObjDomCount(Aig_Sto_t *pSto, Aig_Obj_t *pObj)
Vec_Ptr_t * Aig_ObjDomCollect(Aig_Sto_t *pSto, Vec_Int_t *vCut)
Vec_Ptr_t * Aig_ObjDomMerge(Aig_Sto_t *pSto, Vec_Ptr_t *vDoms0, Vec_Ptr_t *vDoms1)
int Aig_ObjDomFilter(Aig_Sto_t *pSto, Vec_Ptr_t *vDoms, Aig_Dom_t *pDom)
int Aig_ObjDomDomed(Aig_Sto_t *pSto, Aig_Dom_t *pDom)
int Aig_ObjDomCheck(Aig_Dom_t *pDom)
void Aig_ManComputeDomsTest2(Aig_Man_t *pAig, int Num)
void Aig_ObjDomPrint(Aig_Sto_t *pSto, Aig_Dom_t *pDom, int Num)
int Aig_ObjDomDeref_rec(Aig_Obj_t *pNode)
void Aig_ObjDomVecPrint(Aig_Sto_t *pSto, Vec_Ptr_t *vDoms)
Vec_Ptr_t * Aig_ObjDomVecDup(Aig_Sto_t *pSto, Vec_Ptr_t *vDoms, int fSkip1)
Vec_Int_t * Aig_ObjDomCollectLos(Aig_Sto_t *pSto)
void Aig_ManDomPrint(Aig_Sto_t *pSto)
Aig_Sto_t * Aig_ManComputeDomsFlops(Aig_Man_t *pAig, int Limit)
void Aig_ObjDomFindGood(Aig_Sto_t *pSto)
int Aig_ObjDomVolume(Aig_Sto_t *pSto, Aig_Dom_t *pDom)
void Aig_ManComputeDomsForCofactoring(Aig_Man_t *pAig)
void Aig_ObjAddTriv(Aig_Sto_t *pSto, int Id, Vec_Ptr_t *vDoms)
void Aig_ManMarkFlopTfi(Aig_Man_t *p)
int Aig_ManMarkFlopTfi_rec(Aig_Man_t *p, Aig_Obj_t *pObj)
typedefABC_NAMESPACE_IMPL_START struct Aig_Sto_t_ Aig_Sto_t
DECLARATIONS ///.
void Aig_ObjDomUnion(Aig_Sto_t *pSto, Vec_Ptr_t *vDoms2, Vec_Ptr_t *vDoms1)
void Aig_ManFanoutStart(Aig_Man_t *p)
FUNCTION DEFINITIONS ///.
Vec_Ptr_t * Aig_ManDfsReverse(Aig_Man_t *p)
void Aig_ManCleanMarkA(Aig_Man_t *p)
void Aig_ManFanoutStop(Aig_Man_t *p)
char * Aig_MmFixedEntryFetch(Aig_MmFixed_t *p)
#define Aig_ManForEachObj(p, pObj, i)
#define Aig_ObjForEachFanout(p, pObj, pFanout, iFan, i)
void Aig_ManIncrementTravId(Aig_Man_t *p)
DECLARATIONS ///.
#define Aig_ManForEachCi(p, pObj, i)
ITERATORS ///.
struct Aig_Obj_t_ Aig_Obj_t
typedefABC_NAMESPACE_HEADER_START struct Aig_Man_t_ Aig_Man_t
INCLUDES ///.
Aig_MmFixed_t * Aig_MmFixedStart(int nEntrySize, int nEntriesMax)
FUNCTION DEFINITIONS ///.
#define Aig_ManForEachCo(p, pObj, i)
void Aig_MmFixedEntryRecycle(Aig_MmFixed_t *p, char *pEntry)
struct Aig_MmFixed_t_ Aig_MmFixed_t
void Aig_MmFixedStop(Aig_MmFixed_t *p, int fVerbose)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
#define Saig_ManForEachLi(p, pObj, i)
#define Saig_ManForEachPo(p, pObj, i)
#define Saig_ManForEachLo(p, pObj, i)
#define Saig_ManForEachPi(p, pObj, i)
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
#define Vec_IntForEachEntryStart(vVec, Entry, i, Start)
#define Vec_PtrForEachEntryStart(Type, vVec, pEntry, i, Start)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.