47 Vec_WecFreeP( &pBox->vAdds );
48 Vec_WecFreeP( &pBox->vLeafLits );
49 Vec_WecFreeP( &pBox->vRootLits );
50 Vec_WecFreeP( &pBox->vUnique );
51 Vec_WecFreeP( &pBox->vShared );
75 int i, k, iLit, Count = 0;
76 if ( vIgnore == NULL )
80 if ( Gia_ObjIsAnd(Gia_ManObj(pBox->pGia, Abc_Lit2Var(iLit))) && !Vec_BitEntry(vIgnore, Abc_Lit2Var(iLit)) )
81 printf(
"Internal node %d of rank %d is not part of PPG.\n", Abc_Lit2Var(iLit), i ), Count++;
82 printf(
"Detected %d suspicious leaves.\n", Count );
98 Vec_Bit_t * vIsRoot = Vec_BitStart( Gia_ManObjNum(
p) );
99 Vec_Bit_t * vMarked = Vec_BitStart( Gia_ManObjNum(
p) ) ;
101 int i, k = 0, Box, Rank;
105 Vec_BitWriteEntry( vIsRoot, Vec_IntEntry(vAdds, 6*Box+3), 1 );
106 Vec_BitWriteEntry( vIsRoot, Vec_IntEntry(vAdds, 6*Box+4), 1 );
110 Vec_BitWriteEntry( vIsRoot, Vec_IntEntry(vAdds, 6*Box+0), 0 );
111 Vec_BitWriteEntry( vIsRoot, Vec_IntEntry(vAdds, 6*Box+1), 0 );
112 Vec_BitWriteEntry( vIsRoot, Vec_IntEntry(vAdds, 6*Box+2), 0 );
117 if ( Vec_BitEntry(vIsRoot, Gia_ObjFaninId0(pObj,i)) || Vec_BitEntry(vIsRoot, Gia_ObjFaninId1(pObj,i)) ||
118 Vec_BitEntry(vMarked, Gia_ObjFaninId0(pObj,i)) || Vec_BitEntry(vMarked, Gia_ObjFaninId1(pObj,i)) )
119 Vec_BitWriteEntry( vMarked, i, 1 );
140 if ( Vec_BitEntry(vMarked, Vec_IntEntry(vAdds, 6*Box+3)) || Vec_BitEntry(vMarked, Vec_IntEntry(vAdds, 6*Box+4)) )
142 printf(
"Removing box %d=(%d,%d) of rank %d.\n", Box, Vec_IntEntry(vAdds, 6*Box+3), Vec_IntEntry(vAdds, 6*Box+4), Rank );
145 Vec_IntWriteEntry( vTree, k++, Box );
146 Vec_IntWriteEntry( vTree, k++, Rank );
148 Vec_IntShrink( vTree, k );
149 Vec_BitFree( vIsRoot );
150 Vec_BitFree( vMarked );
174 if ( Vec_BitEntry(vMarked, Id) )
176 Vec_BitWriteEntry( vMarked, Id, 1 );
177 if ( !Gia_ObjIsAnd(pObj) )
184 Vec_Bit_t * vIsLeaf = Vec_BitStart( Gia_ManObjNum(
p) );
185 Vec_Bit_t * vMarked = Vec_BitStart( Gia_ManObjNum(
p) ) ;
187 int i, k = 0, Box, Rank;
191 Vec_BitWriteEntry( vIsLeaf, Vec_IntEntry(vAdds, 6*Box+0), 1 );
192 Vec_BitWriteEntry( vIsLeaf, Vec_IntEntry(vAdds, 6*Box+1), 1 );
193 Vec_BitWriteEntry( vIsLeaf, Vec_IntEntry(vAdds, 6*Box+2), 1 );
197 Vec_BitWriteEntry( vIsLeaf, Vec_IntEntry(vAdds, 6*Box+3), 0 );
198 Vec_BitWriteEntry( vIsLeaf, Vec_IntEntry(vAdds, 6*Box+4), 0 );
202 if ( Vec_BitEntry(vIsLeaf, i) )
210 if ( Vec_BitEntry(vMarked, Vec_IntEntry(vAdds, 6*Box+3)) || Vec_BitEntry(vMarked, Vec_IntEntry(vAdds, 6*Box+4)) )
212 printf(
"Removing box %d=(%d,%d) of rank %d.\n", Box, Vec_IntEntry(vAdds, 6*Box+3), Vec_IntEntry(vAdds, 6*Box+4), Rank );
215 Vec_IntWriteEntry( vTree, k++, Box );
216 Vec_IntWriteEntry( vTree, k++, Rank );
218 Vec_IntShrink( vTree, k );
219 Vec_BitFree( vIsLeaf );
220 Vec_BitFree( vMarked );
244 if ( Gia_ObjIsTravIdCurrent(
p, pObj) )
246 Gia_ObjSetTravIdCurrent(
p, pObj);
247 assert( Gia_ObjIsAnd(pObj) );
248 assert( !Gia_ObjIsXor(pObj) );
251 Truth0 = Gia_ObjFaninC0(pObj) ? 0xFF & ~Truth0 : Truth0;
252 Truth1 = Gia_ObjFaninC1(pObj) ? 0xFF & ~Truth1 : Truth1;
253 return (pObj->
Value = Truth0 & Truth1);
258 unsigned TruthXor, TruthMaj, Truths[3] = { 0xAA, 0xCC, 0xF0 };
259 int k, iObj, fFadd = Vec_IntEntry(vAdds, 6*iBox+2) > 0;
260 int fFlip = !fFadd && Acec_SignBit2(vAdds, iBox, 2);
263 for ( k = 0; k < 3; k++ )
265 iObj = Vec_IntEntry( vAdds, 6*iBox+k );
268 pObj = Gia_ManObj(
p, iObj );
269 pObj->
Value = (Acec_SignBit2(vAdds, iBox, k) ^ fFlip) ? 0xFF & ~Truths[k] : Truths[k];
270 Gia_ObjSetTravIdCurrent(
p, pObj );
273 iObj = Vec_IntEntry( vAdds, 6*iBox+3 );
275 TruthXor = (Acec_SignBit2(vAdds, iBox, 3) ^ fFlip) ? 0xFF & ~TruthXor : TruthXor;
277 iObj = Vec_IntEntry( vAdds, 6*iBox+4 );
279 TruthMaj = (Acec_SignBit2(vAdds, iBox, 4) ^ fFlip) ? 0xFF & ~TruthMaj : TruthMaj;
283 if ( TruthXor != 0x96 )
284 printf(
"Fadd %d sum %d is wrong.\n", iBox, Vec_IntEntry( vAdds, 6*iBox+3 ) );
285 if ( TruthMaj != 0xE8 )
286 printf(
"Fadd %d carry %d is wrong.\n", iBox, Vec_IntEntry( vAdds, 6*iBox+4 ) );
292 if ( TruthXor != 0x66 )
293 printf(
"Hadd %d sum %d is wrong.\n", iBox, Vec_IntEntry( vAdds, 6*iBox+3 ) );
294 if ( TruthMaj != 0x88 )
295 printf(
"Hadd %d carry %d is wrong.\n", iBox, Vec_IntEntry( vAdds, 6*iBox+4 ) );
308 Vec_Bit_t * vPhase = Vec_BitStart( Gia_ManObjNum(
p) );
309 Vec_Bit_t * vRoots = Vec_BitStart( Gia_ManObjNum(
p) );
316 Vec_BitWriteEntry( vRoots, Vec_IntEntry( vAdds, 6*Box+3 ), 1 );
317 Vec_BitWriteEntry( vRoots, Vec_IntEntry( vAdds, 6*Box+4 ), 1 );
318 Vec_BitWriteEntry( vPhase, Vec_IntEntry( vAdds, 6*Box+3 ), Acec_SignBit2(vAdds, Box, 3) );
319 Vec_BitWriteEntry( vPhase, Vec_IntEntry( vAdds, 6*Box+4 ), Acec_SignBit2(vAdds, Box, 4) );
324 for ( n = 0; n < 3; n++ )
326 if ( !Vec_BitEntry(vRoots, Vec_IntEntry(vAdds, 6*Box+n)) )
328 if ( Vec_BitEntry(vPhase, Vec_IntEntry(vAdds, 6*Box+n)) == Acec_SignBit2(vAdds, Box, n) )
330 printf(
"Phase of input %d=%d is mismatched in box %d=(%d,%d).\n",
331 n, Vec_IntEntry(vAdds, 6*Box+n), Box, Vec_IntEntry(vAdds, 6*Box+3), Vec_IntEntry(vAdds, 6*Box+4) );
333 Vec_BitFree( vPhase );
334 Vec_BitFree( vRoots );
338 Vec_Int_t * vCounts = Vec_IntStartFull( Gia_ManObjNum(
p) );
345 Vec_IntWriteEntry( vCounts, Vec_IntEntry( vAdds, 6*Box+3 ), 0 );
346 Vec_IntWriteEntry( vCounts, Vec_IntEntry( vAdds, 6*Box+4 ), 0 );
351 for ( n = 0; n < 3; n++ )
352 if ( Vec_IntEntry( vCounts, Vec_IntEntry(vAdds, 6*Box+n) ) != -1 )
353 Vec_IntAddToEntry( vCounts, Vec_IntEntry(vAdds, 6*Box+n), 1 );
355 printf(
"The adder tree has %d internal cut points. ", Vec_IntCountLarger(vCounts, -1) );
356 if ( Vec_IntCountLarger(vCounts, 1) == 0 )
357 printf(
"There is no internal fanouts.\n" );
360 printf(
"These %d points have more than one fanout:\n", Vec_IntCountLarger(vCounts, 1) );
363 printf(
"Node %d(lev %d) has fanout %d.\n", i, Gia_ObjLevelId(
p, i), Box );
365 Vec_IntFree( vCounts );
381 Vec_Int_t * vMap = Vec_IntStartFull( Gia_ManObjNum(
p) );
386 Vec_IntWriteEntry( vMap, Vec_IntEntry(vAdds, 6*Box+4), Box );
391 int k, iBox, iXor, fXorPhase, fPhaseThis;
393 iBox = Vec_IntEntry( vMap, Node );
396 assert( Node == Vec_IntEntry( vAdds, 6*iBox+4 ) );
397 if ( Vec_BitEntry(vVisit, iBox) )
399 Vec_BitWriteEntry( vVisit, iBox, 1 );
400 iXor = Vec_IntEntry( vAdds, 6*iBox+3 );
401 fXorPhase = Acec_SignBit(vAdds, iBox, 3);
402 if ( Vec_IntEntry(vAdds, 6*iBox+2) == 0 )
407 fPhase ^= Acec_SignBit( vAdds, iBox, 2 );
409 Acec_SignSetBit2( vAdds, iBox, 2, fPhase );
411 for ( k = 0; k < 3; k++ )
413 int iObj = Vec_IntEntry( vAdds, 6*iBox+k );
416 fPhaseThis = Acec_SignBit(vAdds, iBox, k) ^ fPhase;
417 fXorPhase ^= fPhaseThis;
419 Acec_SignSetBit2( vAdds, iBox, k, fPhaseThis );
421 Acec_SignSetBit2( vAdds, iBox, 3, fXorPhase );
422 Acec_SignSetBit2( vAdds, iBox, 4, fPhase );
438 int * pPlace = Vec_IntEntryP( vMap, Abc_Var2Lit(iObj, fOut) );
441 else if ( *pPlace >= 0 )
446 Vec_Int_t * vMap = Vec_IntStartFull( 2*Gia_ManObjNum(
p) );
448 for ( i = 0; 6*i < Vec_IntSize(vAdds); i++ )
450 if ( vIgnore && (Vec_BitEntry(vIgnore, Vec_IntEntry(vAdds, 6*i+3)) || Vec_BitEntry(vIgnore, Vec_IntEntry(vAdds, 6*i+4))) )
475 for ( k = 0; k < 5; k++ )
476 if ( Vec_IntEntry(vAdds, 6*iAdd+k) == iObj )
485 if ( Vec_BitEntry(vFound, iAdd) )
487 Vec_BitWriteEntry( vFound, iAdd, 1 );
488 Vec_IntPush( vTree, iAdd );
489 Vec_IntPush( vTree, Rank );
491 for ( k = 0; k < 5; k++ )
492 Acec_TreeFindTrees_rec( vAdds, vMap, Vec_IntEntry(vAdds, 6*iAdd+k), k == 4 ? Rank + 1 : Rank, vTree, vFound );
496 int In = Vec_IntEntry( vMap, Abc_Var2Lit(iObj, 1) );
497 int Out = Vec_IntEntry( vMap, Abc_Var2Lit(iObj, 0) );
498 if ( In < 0 || Out < 0 )
507 Vec_Bit_t * vFound = Vec_BitStart( Vec_IntSize(vAdds)/6 );
509 int i, k, In, Out, Box, Rank, MinRank;
513 if ( In < 0 || Out < 0 )
515 assert( Vec_BitEntry(vFound, In) == Vec_BitEntry(vFound, Out) );
516 if ( Vec_BitEntry(vFound, In) )
518 vTree = Vec_WecPushLevel( vTrees );
523 MinRank = Abc_MinInt( MinRank, Rank );
525 Vec_IntWriteEntry( vTree, k+1, Rank - MinRank );
527 Vec_BitFree( vFound );
532 else if ( fFilterOut )
535 Vec_WecSort( vTrees, 1 );
545 printf(
"Detected %d adders (%d FAs and %d HAs). ", Vec_IntSize(vAdds)/6, nFadds, Vec_IntSize(vAdds)/6-nFadds );
546 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
550 printf(
"Collected %d trees with %d adders in them. ", Vec_WecSize(vTrees), Vec_WecSizeSize(vTrees)/2 );
551 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
552 Vec_WecPrint( vTrees, 0 );
554 Vec_WecFree( vTrees );
555 Vec_IntFree( vAdds );
576 printf(
" %4d : %2d {", i, Vec_IntSize(vLevel) );
579 printf(
" %s%d=(%d,%d)", Vec_IntEntry(vAdds, 6*iBox+2) == 0 ?
"*":
"", iBox,
580 Vec_IntEntry(vAdds, 6*iBox+3), Vec_IntEntry(vAdds, 6*iBox+4) );
588 printf(
"Adders:\n" );
590 printf(
"Inputs:\n" );
591 Vec_WecPrintLits( pBox->vLeafLits );
592 printf(
"Outputs:\n" );
593 Vec_WecPrintLits( pBox->vRootLits );
602 int k, Box, Rank, MaxRank = 0;
604 MaxRank = Abc_MaxInt( MaxRank, Rank );
610 Vec_Bit_t * vVisit = Vec_BitStart( Vec_IntSize(vAdds)/6 );
611 Vec_Bit_t * vIsLeaf = Vec_BitStart( Gia_ManObjNum(
p) );
612 Vec_Bit_t * vIsRoot = Vec_BitStart( Gia_ManObjNum(
p) );
614 int i, j, k, Box, Rank;
618 pBox->vAdds = Vec_WecStart( MaxRank + 1 );
619 pBox->vLeafLits = Vec_WecStart( MaxRank + 1 );
620 pBox->vRootLits = Vec_WecStart( MaxRank + 2 );
630 Vec_BitWriteEntry( vIsLeaf, Vec_IntEntry(vAdds, 6*Box+0), 1 );
631 Vec_BitWriteEntry( vIsLeaf, Vec_IntEntry(vAdds, 6*Box+1), 1 );
632 Vec_BitWriteEntry( vIsLeaf, Vec_IntEntry(vAdds, 6*Box+2), 1 );
633 Vec_BitWriteEntry( vIsRoot, Vec_IntEntry(vAdds, 6*Box+3), 1 );
634 Vec_BitWriteEntry( vIsRoot, Vec_IntEntry(vAdds, 6*Box+4), 1 );
635 Vec_WecPush( pBox->vAdds, Rank, Box );
639 Vec_IntSort( vLevel, 0 );
645 if ( !Vec_BitEntry( vIsLeaf, Vec_IntEntry(vAdds, 6*Box+4) ) )
648 Acec_TreePhases_rec(
p, vAdds, vMap, Vec_IntEntry(vAdds, 6*Box+4), Vec_IntEntry(vAdds, 6*Box+2) != 0, vVisit );
652 Vec_BitFree( vVisit );
656 Vec_BitWriteEntry( vIsRoot, 0, 1 );
660 for ( k = 0; k < 3; k++ )
661 if ( !Vec_BitEntry( vIsRoot, Vec_IntEntry(vAdds, 6*Box+k) ) )
662 Vec_WecPush( pBox->vLeafLits, i, Abc_Var2Lit(Vec_IntEntry(vAdds, 6*Box+k), Acec_SignBit2(vAdds, Box, k)) );
663 for ( k = 3; k < 5; k++ )
664 if ( !Vec_BitEntry( vIsLeaf, Vec_IntEntry(vAdds, 6*Box+k) ) )
671 Vec_WecPush( pBox->vRootLits, k == 4 ? i + 1 : i, Abc_Var2Lit(Vec_IntEntry(vAdds, 6*Box+k), Acec_SignBit2(vAdds, Box, k)) );
673 if ( Vec_IntEntry(vAdds, 6*Box+2) == 0 && Acec_SignBit2(vAdds, Box, 2) )
674 Vec_WecPush( pBox->vLeafLits, i, 1 );
676 Vec_BitFree( vIsLeaf );
677 Vec_BitFree( vIsRoot );
680 Vec_IntSort( vLevel, 0 );
682 Vec_IntSort( vLevel, 1 );
720 printf(
"Detected %d adders (%d FAs and %d HAs). ", Vec_IntSize(vAdds)/6, nFadds, Vec_IntSize(vAdds)/6-nFadds );
721 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
725 printf(
"Collected %d trees with %d adders in them. ", Vec_WecSize(vTrees), Vec_WecSizeSize(vTrees)/2 );
726 Abc_PrintTime( 1,
"Time", Abc_Clock() - clk );
732 printf(
"Processing tree %d: Ranks = %d. Adders = %d. Leaves = %d. Roots = %d.\n",
733 i, Vec_WecSize(pBox->vAdds), Vec_WecSizeSize(pBox->vAdds),
734 Vec_WecSizeSize(pBox->vLeafLits), Vec_WecSizeSize(pBox->vRootLits) );
739 Vec_WecFree( vTrees );
740 Vec_IntFree( vAdds );
759 if ( vTrees && Vec_WecSize(vTrees) > 0 )
765 printf(
"Processing tree %d: Ranks = %d. Adders = %d. Leaves = %d. Roots = %d.\n",
766 0, Vec_WecSize(pBox->vAdds), Vec_WecSizeSize(pBox->vAdds),
767 Vec_WecSizeSize(pBox->vLeafLits), Vec_WecSizeSize(pBox->vRootLits) );
768 if ( pBox && fVerbose )
772 Vec_WecFreeP( &vTrees );
773 Vec_IntFree( vAdds );
#define ABC_INFINITY
MACRO DEFINITIONS ///.
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_HEADER_START struct Acec_Box_t_ Acec_Box_t
INCLUDES ///.
void Acec_TreeFilterTrees2(Gia_Man_t *p, Vec_Int_t *vAdds, Vec_Wec_t *vTrees)
void Acec_PrintAdders(Vec_Wec_t *vBoxes, Vec_Int_t *vAdds)
Acec_Box_t * Acec_DeriveBox(Gia_Man_t *p, Vec_Bit_t *vIgnore, int fFilterIn, int fFilterOut, int fVerbose)
void Acec_TreeMarkTFI_rec(Gia_Man_t *p, int Id, Vec_Bit_t *vMarked)
Vec_Int_t * Acec_TreeFindPoints(Gia_Man_t *p, Vec_Int_t *vAdds, Vec_Bit_t *vIgnore)
void Acec_TreeFilterOne(Gia_Man_t *p, Vec_Int_t *vAdds, Vec_Int_t *vTree)
ABC_NAMESPACE_IMPL_START void Acec_BoxFree(Acec_Box_t *pBox)
DECLARATIONS ///.
void Acec_TreeFindTreesTest(Gia_Man_t *p)
void Acec_TreeVerifyPhases2(Gia_Man_t *p, Vec_Int_t *vAdds, Vec_Wec_t *vBoxes)
void Acec_TreeAddInOutPoint(Vec_Int_t *vMap, int iObj, int iAdd, int fOut)
Vec_Int_t * Acec_TreeCarryMap(Gia_Man_t *p, Vec_Int_t *vAdds, Vec_Wec_t *vBoxes)
void Acec_TreeVerifyPhaseOne(Gia_Man_t *p, Vec_Int_t *vAdds, int iBox)
void Acec_TreeFindTrees2_rec(Vec_Int_t *vAdds, Vec_Int_t *vMap, int iAdd, int Rank, Vec_Int_t *vTree, Vec_Bit_t *vFound)
int Acec_TreeVerifyPhaseOne_rec(Gia_Man_t *p, Gia_Obj_t *pObj)
void Acec_TreePhases_rec(Gia_Man_t *p, Vec_Int_t *vAdds, Vec_Int_t *vMap, int Node, int fPhase, Vec_Bit_t *vVisit)
int Acec_TreeWhichPoint(Vec_Int_t *vAdds, int iAdd, int iObj)
int Acec_CreateBoxMaxRank(Vec_Int_t *vTree)
void Acec_TreeFindTrees_rec(Vec_Int_t *vAdds, Vec_Int_t *vMap, int iObj, int Rank, Vec_Int_t *vTree, Vec_Bit_t *vFound)
void Acec_TreeVerifyConnections(Gia_Man_t *p, Vec_Int_t *vAdds, Vec_Wec_t *vBoxes)
void Acec_TreePrintBox(Acec_Box_t *pBox, Vec_Int_t *vAdds)
void Acec_TreeFilterTrees(Gia_Man_t *p, Vec_Int_t *vAdds, Vec_Wec_t *vTrees)
void Acec_TreeVerifyPhases(Gia_Man_t *p, Vec_Int_t *vAdds, Vec_Wec_t *vBoxes)
void Acec_BoxFreeP(Acec_Box_t **ppBox)
void Acec_TreeFilterOne2(Gia_Man_t *p, Vec_Int_t *vAdds, Vec_Int_t *vTree)
Acec_Box_t * Acec_CreateBox(Gia_Man_t *p, Vec_Int_t *vAdds, Vec_Int_t *vTree)
Vec_Wec_t * Acec_TreeFindTrees(Gia_Man_t *p, Vec_Int_t *vAdds, Vec_Bit_t *vIgnore, int fFilterIn, int fFilterOut)
void Acec_CreateBoxTest(Gia_Man_t *p)
void Acec_VerifyBoxLeaves(Acec_Box_t *pBox, Vec_Bit_t *vIgnore)
Vec_Int_t * Ree_ManComputeCuts(Gia_Man_t *p, Vec_Int_t **pvXors, int fVerbose)
int Ree_ManCountFadds(Vec_Int_t *vAdds)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
#define Gia_ManForEachAnd(p, pObj, i)
struct Gia_Obj_t_ Gia_Obj_t
struct Gia_Man_t_ Gia_Man_t
void Gia_ManIncrementTravId(Gia_Man_t *p)
typedefABC_NAMESPACE_HEADER_START struct Vec_Bit_t_ Vec_Bit_t
INCLUDES ///.
#define Vec_IntForEachEntryDouble(vVec, Entry1, Entry2, i)
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
#define Vec_WecForEachLevel(vGlob, vVec, i)
MACRO DEFINITIONS ///.
#define Vec_WecForEachLevelReverse(vGlob, vVec, i)
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.