47 if (
p->nTravIds >= (1<<30)-1 - 1000 )
88 assert( Ivy_ObjIsAnd(pNode) || Ivy_ObjIsExor(pNode) );
91 Vec_IntPush( vNodes, pNode->
Id );
110 Vec_IntClear( vNodes );
113 Vec_IntPush( vNodes, Leaf );
114 Ivy_ManObj(
p, Leaf)->fMarkA = 1;
120 Ivy_ManObj(
p, Leaf)->fMarkA = 0;
136 return ((
unsigned *)Vec_IntArray(vTruth)) + 8 * ObjNum;
152 unsigned * pTruth, * pTruth0, * pTruth1;
157 if ( Ivy_ObjIsExor(pNode) )
158 for ( i = 0; i <
nWords; i++ )
159 pTruth[i] = pTruth0[i] ^ pTruth1[i];
160 else if ( !Ivy_ObjFaninC0(pNode) && !Ivy_ObjFaninC1(pNode) )
161 for ( i = 0; i <
nWords; i++ )
162 pTruth[i] = pTruth0[i] & pTruth1[i];
163 else if ( !Ivy_ObjFaninC0(pNode) && Ivy_ObjFaninC1(pNode) )
164 for ( i = 0; i <
nWords; i++ )
165 pTruth[i] = pTruth0[i] & ~pTruth1[i];
166 else if ( Ivy_ObjFaninC0(pNode) && !Ivy_ObjFaninC1(pNode) )
167 for ( i = 0; i <
nWords; i++ )
168 pTruth[i] = ~pTruth0[i] & pTruth1[i];
170 for ( i = 0; i <
nWords; i++ )
171 pTruth[i] = ~pTruth0[i] & ~pTruth1[i];
188 static unsigned uTruths[8][8] = {
189 { 0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA },
190 { 0xCCCCCCCC,0xCCCCCCCC,0xCCCCCCCC,0xCCCCCCCC,0xCCCCCCCC,0xCCCCCCCC,0xCCCCCCCC,0xCCCCCCCC },
191 { 0xF0F0F0F0,0xF0F0F0F0,0xF0F0F0F0,0xF0F0F0F0,0xF0F0F0F0,0xF0F0F0F0,0xF0F0F0F0,0xF0F0F0F0 },
192 { 0xFF00FF00,0xFF00FF00,0xFF00FF00,0xFF00FF00,0xFF00FF00,0xFF00FF00,0xFF00FF00,0xFF00FF00 },
193 { 0xFFFF0000,0xFFFF0000,0xFFFF0000,0xFFFF0000,0xFFFF0000,0xFFFF0000,0xFFFF0000,0xFFFF0000 },
194 { 0x00000000,0xFFFFFFFF,0x00000000,0xFFFFFFFF,0x00000000,0xFFFFFFFF,0x00000000,0xFFFFFFFF },
195 { 0x00000000,0x00000000,0xFFFFFFFF,0xFFFFFFFF,0x00000000,0x00000000,0xFFFFFFFF,0xFFFFFFFF },
196 { 0x00000000,0x00000000,0x00000000,0x00000000,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF }
203 Ivy_ManObj(
p, Leaf)->TravId = i;
205 Vec_IntClear( vTruth );
206 Vec_IntGrow( vTruth, 8 * Vec_IntSize(vNodes) );
232 vLatches = Vec_IntAlloc( Ivy_ManLatchNum(
p) );
234 Vec_IntPush( vLatches, pObj->
Id );
254 LevelMax =
IVY_MAX( LevelMax, (
int)Ivy_ObjFanin0(pObj)->Level );
271 if ( pObj->
Level || Ivy_ObjIsCi(pObj) || Ivy_ObjIsConst1(pObj) )
273 if ( Ivy_ObjIsBuf(pObj) )
275 assert( Ivy_ObjIsNode(pObj) );
278 return pObj->
Level = Ivy_ObjLevelNew( pObj );
319 Ivy_ObjSetTravIdCurrent(
p, pNode );
321 if ( Ivy_ObjIsPi(pNode) )
323 assert( Ivy_ObjIsNode(pNode) || Ivy_ObjIsBuf(pNode) || Ivy_ObjIsLatch(pNode) );
325 pNode0 = Ivy_ObjFanin0(pNode);
326 pNode1 = Ivy_ObjFanin1(pNode);
327 Counter = Ivy_ObjIsNode(pNode);
330 if ( pNode0->
nRefs++ == 0 )
332 if ( pNode1 && pNode1->
nRefs++ == 0 )
339 if ( --pNode0->
nRefs == 0 )
341 if ( pNode1 && --pNode1->
nRefs == 0 )
361 int nConeSize1, nConeSize2;
362 assert( !Ivy_IsComplement( pNode ) );
363 assert( Ivy_ObjIsNode( pNode ) );
366 assert( nConeSize1 == nConeSize2 );
388 assert( Ivy_ObjIsNode(pObj) );
389 vFanouts = Vec_PtrAlloc( 10 );
392 if ( Ivy_ObjIsCo(pFanout) )
397 LevelNew = Ivy_ObjLevelNew( pFanout );
398 if ( (
int)pFanout->
Level == LevelNew )
400 pFanout->
Level = LevelNew;
403 Vec_PtrFree( vFanouts );
421 int i, Required, LevelNew = 1000000;
422 assert(
p->fFanout &&
p->vRequired );
423 vFanouts = Vec_PtrAlloc( 10 );
426 Required = Vec_IntEntry(
p->vRequired, pFanout->
Id);
427 LevelNew =
IVY_MIN( LevelNew, Required );
429 Vec_PtrFree( vFanouts );
447 if ( Ivy_ObjIsConst1(pObj) || Ivy_ObjIsCi(pObj) )
449 assert( Ivy_ObjIsNode(pObj) || Ivy_ObjIsBuf(pObj) );
451 pFanin = Ivy_ObjFanin0(pObj);
452 if ( Vec_IntEntry(
p->vRequired, pFanin->
Id) > ReqNew - 1 )
454 Vec_IntWriteEntry(
p->vRequired, pFanin->
Id, ReqNew - 1 );
457 if ( Ivy_ObjIsBuf(pObj) )
460 pFanin = Ivy_ObjFanin1(pObj);
461 if ( Vec_IntEntry(
p->vRequired, pFanin->
Id) > ReqNew - 1 )
463 Vec_IntWriteEntry(
p->vRequired, pFanin->
Id, ReqNew - 1 );
483 assert( !Ivy_IsComplement(pNode) );
485 if ( !Ivy_ObjIsAnd(pNode) )
488 if ( !Ivy_ObjFaninC0(pNode) || !Ivy_ObjFaninC1(pNode) )
491 pNode0 = Ivy_ObjFanin0(pNode);
492 pNode1 = Ivy_ObjFanin1(pNode);
494 if ( !Ivy_ObjIsAnd(pNode0) || !Ivy_ObjIsAnd(pNode1) )
497 return (Ivy_ObjFaninId0(pNode0) == Ivy_ObjFaninId0(pNode1) && (Ivy_ObjFaninC0(pNode0) ^ Ivy_ObjFaninC0(pNode1))) ||
498 (Ivy_ObjFaninId0(pNode0) == Ivy_ObjFaninId1(pNode1) && (Ivy_ObjFaninC0(pNode0) ^ Ivy_ObjFaninC1(pNode1))) ||
499 (Ivy_ObjFaninId1(pNode0) == Ivy_ObjFaninId0(pNode1) && (Ivy_ObjFaninC1(pNode0) ^ Ivy_ObjFaninC0(pNode1))) ||
500 (Ivy_ObjFaninId1(pNode0) == Ivy_ObjFaninId1(pNode1) && (Ivy_ObjFaninC1(pNode0) ^ Ivy_ObjFaninC1(pNode1)));
520 assert( !Ivy_IsComplement(pNode) );
523 pNode0 = Ivy_ObjFanin0(pNode);
524 pNode1 = Ivy_ObjFanin1(pNode);
527 if ( Ivy_ObjFaninId0(pNode0) == Ivy_ObjFaninId0(pNode1) && (Ivy_ObjFaninC0(pNode0) ^ Ivy_ObjFaninC0(pNode1)) )
530 if ( Ivy_ObjFaninC0(pNode0) )
532 *ppNodeT = Ivy_Not(Ivy_ObjChild1(pNode1));
533 *ppNodeE = Ivy_Not(Ivy_ObjChild1(pNode0));
534 return Ivy_ObjChild0(pNode1);
538 *ppNodeT = Ivy_Not(Ivy_ObjChild1(pNode0));
539 *ppNodeE = Ivy_Not(Ivy_ObjChild1(pNode1));
540 return Ivy_ObjChild0(pNode0);
544 else if ( Ivy_ObjFaninId0(pNode0) == Ivy_ObjFaninId1(pNode1) && (Ivy_ObjFaninC0(pNode0) ^ Ivy_ObjFaninC1(pNode1)) )
547 if ( Ivy_ObjFaninC0(pNode0) )
549 *ppNodeT = Ivy_Not(Ivy_ObjChild0(pNode1));
550 *ppNodeE = Ivy_Not(Ivy_ObjChild1(pNode0));
551 return Ivy_ObjChild1(pNode1);
555 *ppNodeT = Ivy_Not(Ivy_ObjChild1(pNode0));
556 *ppNodeE = Ivy_Not(Ivy_ObjChild0(pNode1));
557 return Ivy_ObjChild0(pNode0);
561 else if ( Ivy_ObjFaninId1(pNode0) == Ivy_ObjFaninId0(pNode1) && (Ivy_ObjFaninC1(pNode0) ^ Ivy_ObjFaninC0(pNode1)) )
564 if ( Ivy_ObjFaninC1(pNode0) )
566 *ppNodeT = Ivy_Not(Ivy_ObjChild1(pNode1));
567 *ppNodeE = Ivy_Not(Ivy_ObjChild0(pNode0));
568 return Ivy_ObjChild0(pNode1);
572 *ppNodeT = Ivy_Not(Ivy_ObjChild0(pNode0));
573 *ppNodeE = Ivy_Not(Ivy_ObjChild1(pNode1));
574 return Ivy_ObjChild1(pNode0);
578 else if ( Ivy_ObjFaninId1(pNode0) == Ivy_ObjFaninId1(pNode1) && (Ivy_ObjFaninC1(pNode0) ^ Ivy_ObjFaninC1(pNode1)) )
581 if ( Ivy_ObjFaninC1(pNode0) )
583 *ppNodeT = Ivy_Not(Ivy_ObjChild0(pNode1));
584 *ppNodeE = Ivy_Not(Ivy_ObjChild0(pNode0));
585 return Ivy_ObjChild1(pNode1);
589 *ppNodeT = Ivy_Not(Ivy_ObjChild0(pNode0));
590 *ppNodeE = Ivy_Not(Ivy_ObjChild0(pNode1));
591 return Ivy_ObjChild1(pNode0);
612 if ( pObj == NULL || !Ivy_ObjIsBuf( Ivy_Regular(pObj) ) )
614 pFanin =
Ivy_ObjReal( Ivy_ObjChild0(Ivy_Regular(pObj)) );
615 return Ivy_NotCond( pFanin, Ivy_IsComplement(pObj) );
632 int fShowFanouts = 0;
633 assert( !Ivy_IsComplement(pObj) );
634 printf(
"Node %5d : ", Ivy_ObjId(pObj) );
635 if ( Ivy_ObjIsConst1(pObj) )
636 printf(
"constant 1" );
637 else if ( Ivy_ObjIsPi(pObj) )
639 else if ( Ivy_ObjIsPo(pObj) )
641 else if ( Ivy_ObjIsLatch(pObj) )
642 printf(
"latch (%d%s)", Ivy_ObjFanin0(pObj)->Id, (Ivy_ObjFaninC0(pObj)?
"\'" :
" ") );
643 else if ( Ivy_ObjIsBuf(pObj) )
644 printf(
"buffer (%d%s)", Ivy_ObjFanin0(pObj)->Id, (Ivy_ObjFaninC0(pObj)?
"\'" :
" ") );
646 printf(
"AND( %5d%s, %5d%s )",
647 Ivy_ObjFanin0(pObj)->Id, (Ivy_ObjFaninC0(pObj)?
"\'" :
" "),
648 Ivy_ObjFanin1(pObj)->Id, (Ivy_ObjFaninC1(pObj)?
"\'" :
" ") );
649 printf(
" (refs = %3d)", Ivy_ObjRefs(pObj) );
655 vFanouts = Vec_PtrAlloc( 10 );
656 printf(
"\nFanouts:\n" );
660 printf(
"Node %5d : ", Ivy_ObjId(pFanout) );
661 if ( Ivy_ObjIsPo(pFanout) )
663 else if ( Ivy_ObjIsLatch(pFanout) )
664 printf(
"latch (%d%s)", Ivy_ObjFanin0(pFanout)->Id, (Ivy_ObjFaninC0(pFanout)?
"\'" :
" ") );
665 else if ( Ivy_ObjIsBuf(pFanout) )
666 printf(
"buffer (%d%s)", Ivy_ObjFanin0(pFanout)->Id, (Ivy_ObjFaninC0(pFanout)?
"\'" :
" ") );
668 printf(
"AND( %5d%s, %5d%s )",
669 Ivy_ObjFanin0(pFanout)->Id, (Ivy_ObjFaninC0(pFanout)?
"\'" :
" "),
670 Ivy_ObjFanin1(pFanout)->Id, (Ivy_ObjFaninC1(pFanout)?
"\'" :
" ") );
673 Vec_PtrFree( vFanouts );
678 if ( pObj->
pEquiv == NULL )
679 printf(
" HAIG node not given" );
681 printf(
" HAIG node = %d%s", Ivy_Regular(pObj->
pEquiv)->Id, (Ivy_IsComplement(pObj->
pEquiv)?
"\'" :
" ") );
684 if ( pObj->
pEquiv == NULL )
687 if ( Ivy_ObjRefs(pObj) > 0 )
690 printf(
" { %5d ", pObj->
Id );
692 for ( pTemp = pObj->
pEquiv; pTemp != pObj; pTemp = Ivy_Regular(pTemp->
pEquiv) )
693 printf(
" %5d%s", pTemp->
Id, (Ivy_IsComplement(pTemp->
pEquiv)?
"\'" :
" ") );
698 for ( pTemp = Ivy_Regular(pObj->
pEquiv); Ivy_ObjRefs(pTemp) == 0; pTemp = Ivy_Regular(pTemp->
pEquiv) );
699 assert( Ivy_ObjRefs(pTemp) > 0 );
700 printf(
" class of %d", pTemp->
Id );
721 printf(
" %d", pObj->
Id );
725 printf(
" %d", pObj->
Id );
727 printf(
"Latches: " );
729 printf(
" %d=%d%s", pObj->
Id, Ivy_ObjFanin0(pObj)->Id, (Ivy_ObjFaninC0(pObj)?
"\'" :
" ") );
735 Vec_IntFree( vNodes );
752 printf(
"Trying cut : {" );
753 for ( i = 0; i < pCut->
nSize; i++ )
754 printf(
" %6d(%d)", Ivy_LeafId(pCut->
pArray[i]), Ivy_LeafLat(pCut->
pArray[i]) );
781 printf(
"Trying cut : {" );
782 for ( i = 0; i < pCut->
nSize; i++ )
785 printf(
" %6d(%d)", Ivy_LeafId(pCut->
pArray[i]), Ivy_LeafLat(pCut->
pArray[i]) );
786 nLatches += Ivy_LeafLat(pCut->
pArray[i]);
791 printf(
"Latches = %d. ", nLatches );
794 vArray = Vec_PtrAlloc( 100 );
795 for ( i = 0; i < pCut->
nSize; i++ )
797 pObj = Ivy_ManObj(
p, Ivy_LeafId(pCut->
pArray[i]) );
800 if ( Ivy_ObjIsLatch(pFanout) )
807 Vec_PtrSize( vArray );
810 printf(
"Present = %d. ", nPresent );
811 if ( nLatches > nPresent )
812 printf(
"Clauses = %d. ", 2*(nLatches - nPresent) );
815 return ( nLatches > nPresent ) ? 2*(nLatches - nPresent) : 0;
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
void Extra_PrintBinary(FILE *pFile, unsigned Sign[], int nBits)
Vec_Int_t * Ivy_ManLatches(Ivy_Man_t *p)
int Ivy_CutTruthPrint(Ivy_Man_t *p, Ivy_Cut_t *pCut, unsigned uTruth)
int Ivy_ObjMffcLabel(Ivy_Man_t *p, Ivy_Obj_t *pNode)
void Ivy_ManCollectCut_rec(Ivy_Man_t *p, Ivy_Obj_t *pNode, Vec_Int_t *vNodes)
void Ivy_ManResetLevels(Ivy_Man_t *p)
Ivy_Obj_t * Ivy_ObjRecognizeMux(Ivy_Obj_t *pNode, Ivy_Obj_t **ppNodeT, Ivy_Obj_t **ppNodeE)
void Ivy_ManCutTruthOne(Ivy_Man_t *p, Ivy_Obj_t *pNode, Vec_Int_t *vTruth, int nWords)
int Ivy_CutTruthPrint2(Ivy_Man_t *p, Ivy_Cut_t *pCut, unsigned uTruth)
Ivy_Obj_t * Ivy_ObjReal(Ivy_Obj_t *pObj)
unsigned * Ivy_ObjGetTruthStore(int ObjNum, Vec_Int_t *vTruth)
int Ivy_ObjIsMuxType(Ivy_Obj_t *pNode)
int Ivy_ObjRefDeref(Ivy_Man_t *p, Ivy_Obj_t *pNode, int fReference, int fLabel)
unsigned * Ivy_ManCutTruth(Ivy_Man_t *p, Ivy_Obj_t *pRoot, Vec_Int_t *vLeaves, Vec_Int_t *vNodes, Vec_Int_t *vTruth)
void Ivy_ManPrintVerbose(Ivy_Man_t *p, int fHaig)
int Ivy_ObjLevelRNew(Ivy_Man_t *p, Ivy_Obj_t *pObj)
void Ivy_ManCollectCut(Ivy_Man_t *p, Ivy_Obj_t *pRoot, Vec_Int_t *vLeaves, Vec_Int_t *vNodes)
void Ivy_ObjUpdateLevel_rec(Ivy_Man_t *p, Ivy_Obj_t *pObj)
void Ivy_ObjPrintVerbose(Ivy_Man_t *p, Ivy_Obj_t *pObj, int fHaig)
void Ivy_ManCleanTravId(Ivy_Man_t *p)
int Ivy_ManResetLevels_rec(Ivy_Obj_t *pObj)
ABC_NAMESPACE_IMPL_START void Ivy_ManIncrementTravId(Ivy_Man_t *p)
DECLARATIONS ///.
void Ivy_ObjUpdateLevelR_rec(Ivy_Man_t *p, Ivy_Obj_t *pObj, int ReqNew)
int Ivy_ManLevels(Ivy_Man_t *p)
struct Ivy_Cut_t_ Ivy_Cut_t
#define Ivy_ManForEachCo(p, pObj, i)
typedefABC_NAMESPACE_HEADER_START struct Ivy_Man_t_ Ivy_Man_t
INCLUDES ///.
#define Ivy_ManForEachLatch(p, pObj, i)
Vec_Int_t * Ivy_ManDfsSeq(Ivy_Man_t *p, Vec_Int_t **pvLatches)
#define Ivy_ObjForEachFanout(p, pObj, vArray, pFanout, i)
#define Ivy_ManForEachObj(p, pObj, i)
#define IVY_MIN(a, b)
MACRO DEFINITIONS ///.
#define Ivy_ManForEachPo(p, pObj, i)
struct Ivy_Obj_t_ Ivy_Obj_t
#define Ivy_ManForEachNodeVec(p, vIds, pObj, i)
#define Ivy_ManForEachPi(p, pObj, i)
ITERATORS ///.
int pArray[IVY_CUT_INPUT]
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
#define Vec_IntForEachEntryStart(vVec, Entry, i, Start)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.