30static inline int Gia_ObjDom(
Gia_Man_t *
p,
Gia_Obj_t * pObj ) {
return Vec_IntEntry(
p->vDoms, Gia_ObjId(
p, pObj)); }
31static inline void Gia_ObjSetDom(
Gia_Man_t *
p,
Gia_Obj_t * pObj,
int d ) { Vec_IntWriteEntry(
p->vDoms, Gia_ObjId(
p, pObj), d); }
56 if ( Gia_ObjDom(
p, pObj) == -1 )
58 Gia_ObjSetDom(
p, pObj, iDom0 );
61 iDom1 = Gia_ObjDom(
p, pObj );
66 iDomNext = Gia_ObjDom(
p, Gia_ManObj(
p, iDom1) );
67 if ( iDomNext == iDom1 )
74 iDomNext = Gia_ObjDom(
p, Gia_ManObj(
p, iDom0) );
75 if ( iDomNext == iDom0 )
81 Gia_ObjSetDom(
p, pObj, iDom0 );
84 Gia_ObjSetDom(
p, pObj, Gia_ObjId(
p, pObj) );
90 if (
p->vDoms == NULL )
91 p->vDoms = Vec_IntAlloc( 0 );
92 Vec_IntFill(
p->vDoms, Gia_ManObjNum(
p), -1 );
95 if ( i == 0 || Gia_ObjIsCi(pObj) )
97 if ( pObj->
fMark1 || (
p->pRefs && Gia_ObjIsAnd(pObj) && Gia_ObjRefNum(
p, pObj) == 0) )
99 if ( Gia_ObjIsCo(pObj) )
101 Gia_ObjSetDom(
p, pObj, i );
105 assert( Gia_ObjIsAnd(pObj) );
127 Vec_Wec_t * vSupps = Vec_WecStart( Gia_ManObjNum(
p) );
129 Vec_IntPush( Vec_WecEntry(vSupps, Id), i );
131 Vec_IntTwoMerge2( Vec_WecEntry(vSupps, Gia_ObjFaninId0(pObj, Id)),
132 Vec_WecEntry(vSupps, Gia_ObjFaninId1(pObj, Id)),
133 Vec_WecEntry(vSupps, Id) );
137 Abc_PrintTime( 1,
"Support computation", Abc_Clock() - clk );
145 Vec_Wec_t * vDomeds = Vec_WecStart( Gia_ManObjNum(
p) );
146 Gia_Obj_t * pObj, * pDom;
int i, Id, nMffcSize;
151 if ( Gia_ObjDom(
p, pObj) == -1 )
153 for ( pDom = Gia_ManObj(
p, Gia_ObjDom(
p, pObj)); Gia_ObjIsAnd(pDom); pDom = Gia_ManObj(
p, Gia_ObjDom(
p, pDom)) )
154 Vec_IntPush( Vec_WecEntry(vDomeds, Gia_ObjId(
p, pDom)), i );
157 if ( Vec_IntEqual(Vec_WecEntry(vSupps, i), Vec_WecEntry(vDomeds, i)) )
158 Vec_IntPush( vDoms, i );
159 Vec_WecFree( vSupps );
160 Vec_WecFree( vDomeds );
164 Gia_ObjRefInc(
p, Gia_ManObj(
p, Id) );
168 printf(
"%d(%d:%d) ", Id, Vec_IntSize(vSupp), nMffcSize );
172 Gia_ObjRefDec(
p, Gia_ManObj(
p, Id) );
175 Vec_IntFree( vDoms );
176 Vec_IntFree( vSupp );
203 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
208 vNodes = Vec_IntAlloc( 100 );
212 if ( Gia_ObjId(
p, pObj) == Gia_ObjDom(
p, pObj) )
215 pDom = Gia_ManObj(
p, Gia_ObjDom(
p, pObj));
216 if ( Gia_ObjIsCo(pDom) )
218 assert( Gia_ObjFanin0(pDom) == pObj );
221 assert( Gia_ObjIsAnd(pDom) );
222 Abs_GiaObjDeref_rec(
p, pDom );
223 Abs_ManSupport2(
p, pDom, vNodes );
224 Abs_GiaObjRef_rec(
p, pDom );
226 if ( Vec_IntFind(vNodes, Gia_ObjId(
p, pObj)) == -1 )
227 printf(
"FAILURE.\n" );
231 Vec_IntFree( vNodes );
251 int i, iDom, iDomNext;
252 vNodes = Vec_IntAlloc( 100 );
257 if (
p->pRefs && Gia_ObjRefNum(
p, pObj) == 0 )
259 iDom = Gia_ObjDom(
p, pObj);
264 for ( Lev = 0; Lev < LevMax && Gia_ObjIsAnd( Gia_ManObj(
p, iDom) ); Lev++ )
266 Vec_IntPush( vNodes, iDom );
267 iDomNext = Gia_ObjDom(
p, Gia_ManObj(
p, iDom) );
268 if ( iDomNext == iDom )
273 Vec_IntUniqify( vNodes );
298 Vec_IntFree( vNodes );
322 if ( Gia_ObjRefNum(
p, pObj) == 0 )
324 printf(
"Fanoutless flops = %d.\n", Counter );
341 if ( Gia_ObjIsTravIdCurrent(
p, pObj) )
343 Gia_ObjSetTravIdCurrent(
p, pObj);
346 Vec_IntPush( vPis, Gia_ObjId(
p, pObj) );
349 assert( Gia_ObjIsAnd(pObj) );
352 Vec_IntPush( vAnds, Gia_ObjId(
p, pObj) );
360 Gia_ObjSetTravIdCurrent(
p, Gia_ManConst0(
p) );
362 Gia_ObjSetTravIdCurrent(
p, pObj );
364 Vec_IntClear( vPis );
365 Vec_IntClear( vAnds );
385 if ( pNode->
fMark1 || Gia_ObjIsRo(
p, pNode) )
387 assert( Gia_ObjIsAnd(pNode) );
388 pFanin = Gia_ObjFanin0(pNode);
389 assert( Gia_ObjRefNum(
p, pFanin) > 0 );
390 if ( Gia_ObjRefDec(
p, pFanin) == 0 )
391 Counter += Abs_GiaObjDeref_rec(
p, pFanin );
392 pFanin = Gia_ObjFanin1(pNode);
393 assert( Gia_ObjRefNum(
p, pFanin) > 0 );
394 if ( Gia_ObjRefDec(
p, pFanin) == 0 )
395 Counter += Abs_GiaObjDeref_rec(
p, pFanin );
402 if ( pNode->
fMark1 || Gia_ObjIsRo(
p, pNode) )
404 assert( Gia_ObjIsAnd(pNode) );
405 pFanin = Gia_ObjFanin0(pNode);
406 if ( Gia_ObjRefInc(
p, pFanin) == 0 )
407 Counter += Abs_GiaObjRef_rec(
p, pFanin );
408 pFanin = Gia_ObjFanin1(pNode);
409 if ( Gia_ObjRefInc(
p, pFanin) == 0 )
410 Counter += Abs_GiaObjRef_rec(
p, pFanin );
428 int nSize = Vec_IntSize(vSupp);
431 if ( i < nSize && Gia_ObjRefNum(
p, pObj) == 0 && !Gia_ObjIsRo(
p, pObj) )
434 Vec_IntPush( vSupp, Gia_ObjId(
p, pObj) );
436 RetValue = Vec_IntSize(vSupp) - nSize;
438 if ( i < nSize && !(Gia_ObjRefNum(
p, pObj) == 0 && !Gia_ObjIsRo(
p, pObj)) )
439 Vec_IntPush( vSupp, Gia_ObjId(
p, pObj) );
440 assert( Vec_IntSize(vSupp) == 2 * nSize );
441 memmove( Vec_IntArray(vSupp), Vec_IntArray(vSupp) + nSize,
sizeof(
int) * nSize );
442 Vec_IntShrink( vSupp, nSize );
460 if ( Gia_ObjIsTravIdCurrent(
p, pObj) )
462 Gia_ObjSetTravIdCurrent(
p, pObj);
463 if ( pObj->
fMark1 || Gia_ObjIsRo(
p, pObj) )
465 Vec_IntPush( vSupp, Gia_ObjId(
p, pObj) );
468 assert( Gia_ObjIsAnd(pObj) );
474 assert( Gia_ObjIsAnd(pObj) );
475 Vec_IntClear( vSupp );
478 return Vec_IntSize(vSupp);
494 if ( Gia_ObjIsTravIdCurrent(
p, pObj) )
496 Gia_ObjSetTravIdCurrent(
p, pObj);
497 if ( pObj->
fMark1 || Gia_ObjIsRo(
p, pObj) || Gia_ObjRefNum(
p, pObj) > 0 )
499 Vec_IntPush( vSupp, Gia_ObjId(
p, pObj) );
502 assert( Gia_ObjIsAnd(pObj) );
508 assert( Gia_ObjIsAnd(pObj) );
509 Vec_IntClear( vSupp );
513 Gia_ObjSetTravIdCurrent(
p, pObj);
514 return Vec_IntSize(vSupp);
533 Abs_ManSupport2(
p, pObj, vSupp );
545 if ( !Gia_ObjIsAnd(pTemp) )
548 assert( Gia_ObjRefNum(
p, pTemp) > 0 );
549 pFan0 = Gia_ObjFanin0(pTemp);
550 pFan1 = Gia_ObjFanin1(pTemp);
551 if ( Gia_ObjIsTravIdCurrent(
p, pFan0) && Gia_ObjIsTravIdCurrent(
p, pFan1) )
553 Vec_IntRemove( vSupp, Gia_ObjId(
p, pTemp) );
557 if ( Gia_ObjIsTravIdCurrent(
p, pFan0) )
559 Vec_IntRemove( vSupp, Gia_ObjId(
p, pTemp) );
560 Vec_IntPush( vSupp, Gia_ObjId(
p, pFan1) );
561 assert( !Gia_ObjIsTravIdCurrent(
p, pFan1) );
562 Gia_ObjSetTravIdCurrent(
p, pFan1);
566 if ( Gia_ObjIsTravIdCurrent(
p, pFan1) )
568 Vec_IntRemove( vSupp, Gia_ObjId(
p, pTemp) );
569 Vec_IntPush( vSupp, Gia_ObjId(
p, pFan0) );
570 assert( !Gia_ObjIsTravIdCurrent(
p, pFan0) );
571 Gia_ObjSetTravIdCurrent(
p, pFan0);
579 return Vec_IntSize(vSupp);
597 int nBits = (1 << nSize);
598 int nStep = (1 << nSize0);
600 for ( i = 0; i < nBits; i++ )
602 if ( i % nStep == 0 )
605 assert( Res || (Mark[0] && Mark[1]) );
606 Mark[0] = Mark[1] = 0;
608 Bit = Abc_InfoHasBit((
unsigned *)pTruth, i);
613 assert( Res || (Mark[0] && Mark[1]) );
631 unsigned char * pStr = (
unsigned char *)pTruth;
632 int nStr = (nSize >= 3 ? (1 << (nSize - 3)) : 1);
634 assert( nSize0 > 0 && nSize0 <= nSize );
637 for ( i = 0; i < nStr; i++ )
638 if ( (((
unsigned)pStr[i] ^ ((
unsigned)pStr[i] >> 1)) & 0x55) != 0x55 )
644 for ( i = 0; i < nStr; i++ )
645 if ( ((
unsigned)pStr[i] & 0xF) == 0x0 || (((
unsigned)pStr[i] >> 4) & 0xF) == 0x0 ||
646 ((
unsigned)pStr[i] & 0xF) == 0xF || (((
unsigned)pStr[i] >> 4) & 0xF) == 0xF )
651 nSteps = (1 << (nSize0 - 3));
652 for ( i = 0; i < nStr; i += nSteps )
654 for ( k = 0; k < nSteps; k++ )
655 if ( ((
unsigned)pStr[i+k] & 0xFF) != 0x00 )
659 for ( k = 0; k < nSteps; k++ )
660 if ( ((
unsigned)pStr[i+k] & 0xFF) != 0xFF )
666 return (
int)( i == nStr );
686 int Iter, i, nSize0, nNodes;
687 int fHasConst, fChanges = 1;
692 vPis = Vec_IntAlloc( 100 );
693 vAnds = Vec_IntAlloc( 100 );
694 vSupp1 = Vec_IntAlloc( 100 );
695 vSupp2 = Vec_IntAlloc( 100 );
696 for ( Iter = 0; fChanges; Iter++ )
701 if ( fVerbose || fVeryVerbose )
704 printf(
"Iter %3d : ", Iter );
705 printf(
"PI = %5d (%6.2f %%) ", Vec_IntSize(vPis), 100.0 * Vec_IntSize(vPis) / Gia_ManPiNum(
p) );
706 printf(
"And = %6d (%6.2f %%) ", Vec_IntSize(vAnds), 100.0 * Vec_IntSize(vAnds) / Gia_ManAndNum(
p) );
707 printf(
"Dom = %5d (%6.2f %%) ", Vec_IntSize(vDoms), 100.0 * Vec_IntSize(vDoms) / Gia_ManAndNum(
p) );
714 assert( Gia_ObjRefNum(
p, pObj ) > 0 );
716 nNodes = Abs_GiaObjDeref_rec(
p, pObj );
738 if ( Abs_ManSupport2(
p, pObj, vSupp2) > nCutMax )
740 Abs_GiaObjRef_rec(
p, pObj );
747 assert( nSize0 > 0 && nSize0 <= nCutMax );
750 if ( pTruth == NULL )
752 Abs_GiaObjRef_rec(
p, pObj );
758 printf(
"Nodes =%3d ", nNodes );
759 printf(
"Size =%3d ", Vec_IntSize(vSupp) );
760 printf(
"Size0 =%3d ", nSize0 );
761 printf(
"%3s", fHasConst ?
"yes" :
"no" );
766 Abs_GiaObjRef_rec(
p, pObj );
773 Vec_IntFree( vDoms );
779 printf(
"Iter %3d : ", Iter );
780 printf(
"PI = %5d (%6.2f %%) ", Vec_IntSize(vPis), 100.0 * Vec_IntSize(vPis) / Gia_ManPiNum(
p) );
781 printf(
"And = %6d (%6.2f %%) ", Vec_IntSize(vAnds), 100.0 * Vec_IntSize(vAnds) / Gia_ManAndNum(
p) );
787 Vec_IntFree( vAnds );
788 Vec_IntFree( vSupp1 );
789 Vec_IntFree( vSupp2 );
812 vPis = Vec_IntAlloc( 100 );
813 vAnds = Vec_IntAlloc( 100 );
819 pNew->
pName = Abc_UtilStrsav(
p->pName );
820 pNew->
pSpec = Abc_UtilStrsav(
p->pSpec );
821 Gia_ManConst0(
p)->Value = 0;
824 pObj->
Value = Gia_ManAppendCi(pNew);
827 pObj->
Value = Gia_ManAppendCi( pNew );
830 pObj->
Value = Gia_ManAppendAnd( pNew, Gia_ObjFanin0Copy(pObj), Gia_ObjFanin1Copy(pObj) );
833 Gia_ManAppendCo( pNew, Gia_ObjFanin0Copy(pObj) );
838 Vec_IntFree( vAnds );
#define ABC_INFINITY
MACRO DEFINITIONS ///.
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
void Gia_ManTestDoms2(Gia_Man_t *p)
Vec_Wec_t * Gia_ManCreateSupps(Gia_Man_t *p, int fVerbose)
int Abs_GiaCheckTruth(word *pTruth, int nSize, int nSize0)
void Gia_ManDomTest(Gia_Man_t *p)
Gia_Man_t * Abs_RpmPerform(Gia_Man_t *p, int nCutMax, int fVerbose, int fVeryVerbose)
void Abs_ManSupport2_rec(Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Int_t *vSupp)
void Abs_RpmPerformMark(Gia_Man_t *p, int nCutMax, int fVerbose, int fVeryVerbose)
void Gia_ManCountPisNodes_rec(Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Int_t *vPis, Vec_Int_t *vAnds)
Vec_Int_t * Gia_ManComputePiDoms(Gia_Man_t *p)
void Gia_ManCountFanoutlessFlops(Gia_Man_t *p)
void Gia_ManCountPisNodes(Gia_Man_t *p, Vec_Int_t *vPis, Vec_Int_t *vAnds)
void Gia_ManComputeDoms(Gia_Man_t *p)
Gia_Man_t * Gia_ManDupRpm(Gia_Man_t *p)
int Abs_ManSupport3(Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Int_t *vSupp)
int Abs_GiaCofPrint(word *pTruth, int nSize, int nSize0, int Res)
int Abs_GiaSortNodes(Gia_Man_t *p, Vec_Int_t *vSupp)
void Gia_ManAddDom(Gia_Man_t *p, Gia_Obj_t *pObj, int iDom0)
FUNCTION DEFINITIONS ///.
int Abs_ManSupport1(Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Int_t *vSupp)
void Abs_ManSupport1_rec(Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Int_t *vSupp)
void Gia_ManTestDoms(Gia_Man_t *p)
Vec_Int_t * Gia_ManCollectDoms(Gia_Man_t *p)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
#define Gia_ManForEachRo(p, pObj, i)
word * Gia_ObjComputeTruthTableCut(Gia_Man_t *p, Gia_Obj_t *pObj, Vec_Int_t *vLeaves)
int Gia_NodeMffcSizeSupp(Gia_Man_t *p, Gia_Obj_t *pNode, Vec_Int_t *vSupp)
#define Gia_ManForEachAnd(p, pObj, i)
void Gia_ManSetRegNum(Gia_Man_t *p, int nRegs)
#define Gia_ManForEachObjReverse(p, pObj, i)
#define Gia_ManForEachPi(p, pObj, i)
Gia_Man_t * Gia_ManStart(int nObjsMax)
FUNCTION DEFINITIONS ///.
struct Gia_Obj_t_ Gia_Obj_t
void Gia_ManFillValue(Gia_Man_t *p)
struct Gia_Man_t_ Gia_Man_t
#define Gia_ManForEachObjVec(vVec, p, pObj, i)
void Gia_ObjComputeTruthTableStart(Gia_Man_t *p, int nVarsMax)
void Gia_ObjComputeTruthTableStop(Gia_Man_t *p)
void Gia_ManCreateRefs(Gia_Man_t *p)
void Gia_ManIncrementTravId(Gia_Man_t *p)
#define Gia_ManForEachObj(p, pObj, i)
MACRO DEFINITIONS ///.
#define Gia_ManForEachCo(p, pObj, i)
#define Gia_ManForEachCi(p, pObj, i)
#define Gia_ManForEachCiId(p, Id, i)
void Gia_ManCleanMark1(Gia_Man_t *p)
unsigned __int64 word
DECLARATIONS ///.
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.