30static inline int Ivy_NodeCutHashValue(
int NodeId ) {
return 1 << (NodeId % 31); }
51 int nLatches, FaninLeaf, Cost;
55 pNode = Ivy_ManObj(
p, Ivy_LeafId(Leaf) );
57 if ( Ivy_ObjIsPi(pNode) || Ivy_ObjIsConst1(pNode) )
60 nLatches = Ivy_LeafLat(Leaf) + Ivy_ObjIsLatch(pNode);
64 FaninLeaf = Ivy_LeafCreate( Ivy_ObjFaninId0(pNode), nLatches );
65 Cost = FaninLeaf && (Vec_IntFind(vInside, FaninLeaf) == -1);
67 if ( Ivy_ObjIsLatch(pNode) || Ivy_ObjIsBuf(pNode) )
69 assert( Ivy_ObjIsNode(pNode) );
71 FaninLeaf = Ivy_LeafCreate( Ivy_ObjFaninId1(pNode), nLatches );
72 Cost += FaninLeaf && (Vec_IntFind(vInside, FaninLeaf) == -1);
93 int CostBest, CostCur, Leaf, LeafBest, Next, nLatches, i;
106 CostCur = Ivy_NodeGetLeafCostOne(
p, Leaf, vInside );
108 if ( CostBest > CostCur )
112 LeavesBest[0] = Leaf;
115 else if ( CostBest == CostCur )
116 LeavesBest[Counter++] = Leaf;
121 if ( CostBest == 99 )
126 if ( Vec_IntSize(vFront) - 1 + CostBest > nSizeLimit )
131printf(
"%d", Counter );
133 LeafBest = LeavesBest[rand() % Counter];
137 Vec_IntRemove( vFront, LeafBest );
141 pNode = Ivy_ManObj(
p, Ivy_LeafId(LeafBest) );
142 nLatches = Ivy_LeafLat(LeafBest) + Ivy_ObjIsLatch(pNode);
143 assert( Ivy_ObjIsNode(pNode) || Ivy_ObjIsLatch(pNode) || Ivy_ObjIsBuf(pNode) );
146 Next = Ivy_LeafCreate( Ivy_ObjFaninId0(pNode), nLatches );
147 if ( Next && Vec_IntFind(vInside, Next) == -1 )
150 Vec_IntPush( vFront, Next );
151 Vec_IntPush( vInside, Next );
155 if ( Ivy_ObjIsLatch(pNode) || Ivy_ObjIsBuf(pNode) )
157 assert( Ivy_ObjIsNode(pNode) );
160 Next = Ivy_LeafCreate( Ivy_ObjFaninId1(pNode), nLatches );
161 if ( Next && Vec_IntFind(vInside, Next) == -1 )
164 Vec_IntPush( vFront, Next );
165 Vec_IntPush( vInside, Next );
167 assert( Vec_IntSize(vFront) <= nSizeLimit );
185 assert( !Ivy_IsComplement(pRoot) );
186 assert( Ivy_ObjIsNode(pRoot) );
187 assert( Ivy_ObjFaninId0(pRoot) );
188 assert( Ivy_ObjFaninId1(pRoot) );
191 Vec_IntClear( vFront );
192 Vec_IntPush( vFront, Ivy_LeafCreate(Ivy_ObjFaninId0(pRoot), 0) );
193 Vec_IntPush( vFront, Ivy_LeafCreate(Ivy_ObjFaninId1(pRoot), 0) );
196 Vec_IntClear( vInside );
197 Vec_IntPush( vInside, Ivy_LeafCreate(pRoot->
Id, 0) );
198 Vec_IntPush( vInside, Ivy_LeafCreate(Ivy_ObjFaninId0(pRoot), 0) );
199 Vec_IntPush( vInside, Ivy_LeafCreate(Ivy_ObjFaninId1(pRoot), 0) );
203 assert( Vec_IntSize(vFront) <= nSize );
223 int RetValue0, RetValue1;
224 if ( pObj == pPivot )
226 Vec_PtrPushUnique( vLeaves, pObj );
227 Vec_PtrPushUnique( vVolume, pObj );
234 if ( Ivy_ObjIsCi(pObj) )
237 if ( Ivy_ObjIsBuf(pObj) )
242 Vec_PtrPushUnique( vVolume, pObj );
245 assert( Ivy_ObjIsNode(pObj) );
248 if ( !RetValue0 && !RetValue1 )
253 Vec_PtrPushUnique( vLeaves, Ivy_ObjFanin0(pObj) );
254 Vec_PtrPushUnique( vVolume, Ivy_ObjFanin0(pObj) );
258 Vec_PtrPushUnique( vLeaves, Ivy_ObjFanin1(pObj) );
259 Vec_PtrPushUnique( vVolume, Ivy_ObjFanin1(pObj) );
261 Vec_PtrPushUnique( vVolume, pObj );
282 if ( Ivy_ObjIsCi(pObj) )
285 if ( Ivy_ObjIsBuf(pObj) )
286 return !Ivy_ObjFanin0(pObj)->fMarkA;
288 Cost = (!Ivy_ObjFanin0(pObj)->fMarkA) + (!Ivy_ObjFanin1(pObj)->fMarkA);
307 Ivy_Obj_t * pFaninC, * pFanin0, * pFanin1, * pPivot;
308 int RetValue, LevelLimit, Lev, k;
309 assert( !Ivy_IsComplement(pRoot) );
311 Vec_PtrClear( vFront );
312 Vec_PtrClear( vVolume );
318 pFanin0 = Ivy_ObjFanin0(pRoot);
319 pFanin1 = Ivy_ObjFanin1(pRoot);
323 Vec_PtrPush( vFront, pFanin0 );
324 Vec_PtrPush( vVolume, pFanin0 );
327 Vec_PtrPush( vFront, pFanin1 );
328 Vec_PtrPush( vVolume, pFanin1 );
330 assert( Ivy_ObjLevel(pRoot) == Ivy_ObjLevelNew(pRoot) );
332 LevelLimit =
IVY_MAX( Ivy_ObjLevel(pRoot) - 10, 1 );
333 for ( Lev = Ivy_ObjLevel(pRoot) - 1; Lev >= LevelLimit; Lev-- )
339 if ( (
int)pObj->
Level == Lev )
341 if ( k == Vec_PtrSize(vFront) )
346 Vec_PtrRemove( vFront, pObj );
349 pFanin0 = Ivy_ObjFanin0(pObj);
352 Vec_PtrPush( vFront, pFanin0 );
353 Vec_PtrPush( vVolume, pFanin0 );
361 if ( Ivy_ObjIsBuf(pObj) )
372 pFanin1 = Ivy_ObjFanin1(pObj);
375 Vec_PtrPush( vFront, pFanin1 );
376 Vec_PtrPush( vVolume, pFanin1 );
396 if ( pPivot != NULL )
399 if ( pPivot == NULL )
403 Vec_PtrPush( vFront, pFaninC );
412 Vec_PtrClear( vLeaves );
413 Vec_PtrClear( vVolume );
429 if ( k == Vec_PtrSize(vLeaves) )
433 Vec_PtrRemove( vLeaves, pObj );
435 pFanin0 = Ivy_ObjFanin0(pObj);
439 Vec_PtrPush( vVolume, pFanin0 );
440 Vec_PtrPush( vLeaves, pFanin0 );
442 if ( Ivy_ObjIsBuf(pObj) )
445 pFanin1 = Ivy_ObjFanin1(pObj);
449 Vec_PtrPush( vVolume, pFanin1 );
450 Vec_PtrPush( vLeaves, pFanin1 );
473 Vec_Ptr_t * vFront, * vVolume, * vLeaves;
476 vFront = Vec_PtrAlloc( 100 );
477 vVolume = Vec_PtrAlloc( 100 );
478 vLeaves = Vec_PtrAlloc( 100 );
481 if ( !Ivy_ObjIsNode(pObj) )
488 if ( Ivy_ObjIsExor(pObj) )
494 printf(
"%d ", Vec_PtrSize(vLeaves) );
503 Vec_PtrFree( vFront );
504 Vec_PtrFree( vVolume );
505 Vec_PtrFree( vLeaves );
521static inline unsigned Ivy_NodeCutHash(
Ivy_Cut_t * pCut )
527 for ( i = 0; i < pCut->
nSize; i++ )
543static inline void Ivy_NodeCutShrink(
Ivy_Cut_t * pCut,
int iOld )
546 for ( i = k = 0; i < pCut->
nSize; i++ )
547 if ( pCut->
pArray[i] != iOld )
564static inline int Ivy_NodeCutExtend(
Ivy_Cut_t * pCut,
int iNew )
567 for ( i = 0; i < pCut->
nSize; i++ )
568 if ( pCut->
pArray[i] == iNew )
574 for ( i = pCut->
nSize - 1; i >= 0; i-- )
575 if ( pCut->
pArray[i] > iNew )
598static inline int Ivy_NodeCutPrescreen(
Ivy_Cut_t * pCut,
int Id0,
int Id1 )
603 for ( i = 0; i < pCut->
nSize; i++ )
620static inline int Ivy_NodeCutDeriveNew(
Ivy_Cut_t * pCut,
Ivy_Cut_t * pCutNew,
int IdOld,
int IdNew0,
int IdNew1 )
625 assert( IdNew0 < IdNew1 );
626 for ( i = k = 0; i < pCut->
nSize; i++ )
628 if ( pCut->
pArray[i] == IdOld )
630 if ( IdNew0 <= pCut->pArray[i] )
632 if ( IdNew0 < pCut->pArray[i] )
634 pCutNew->
pArray[ k++ ] = IdNew0;
635 uHash |= Ivy_NodeCutHashValue( IdNew0 );
639 if ( IdNew1 <= pCut->pArray[i] )
641 if ( IdNew1 < pCut->pArray[i] )
643 pCutNew->
pArray[ k++ ] = IdNew1;
644 uHash |= Ivy_NodeCutHashValue( IdNew1 );
649 uHash |= Ivy_NodeCutHashValue( pCut->
pArray[i] );
651 if ( IdNew0 < 0x7FFFFFFF )
653 pCutNew->
pArray[ k++ ] = IdNew0;
654 uHash |= Ivy_NodeCutHashValue( IdNew0 );
656 if ( IdNew1 < 0x7FFFFFFF )
658 pCutNew->
pArray[ k++ ] = IdNew1;
659 uHash |= Ivy_NodeCutHashValue( IdNew1 );
662 pCutNew->
uHash = uHash;
686 for ( i = 0; i < pCutStore->
nCuts; i++ )
688 pCut = pCutStore->
pCuts + i;
691 for ( k = 0; k < pCutNew->
nSize; k++ )
694 if ( k == pCutNew->
nSize )
719 for ( i = 0; i < pDom->
nSize; i++ )
721 for ( k = 0; k < pCut->
nSize; k++ )
724 if ( k == pCut->
nSize )
748 for ( i = 0; i < pCutStore->
nCuts; i++ )
750 pCut = pCutStore->
pCuts + i;
751 if ( pCut->
nSize == 0 )
757 for ( k = 0; k < pCutNew->
nSize; k++ )
760 if ( k == pCutNew->
nSize )
771 if ( Ivy_CutCheckDominance( pCut, pCutNew ) )
781 if ( Ivy_CutCheckDominance( pCutNew, pCut ) )
813 for ( i = k = 0; i < pCutStore->
nCuts; i++ )
815 pCut = pCutStore->
pCuts + i;
816 if ( pCut->
nSize == 0 )
818 pCutStore->
pCuts[k++] = *pCut;
820 pCutStore->
nCuts = k;
838 printf(
"%d : {", pCut->
nSize );
839 for ( i = 0; i < pCut->
nSize; i++ )
840 printf(
" %d", pCut->
pArray[i] );
858 printf(
"Node %d\n", pCutStore->
pCuts[0].
pArray[0] );
859 for ( i = 0; i < pCutStore->
nCuts; i++ )
876 if ( !Ivy_ObjIsBuf(pObj) )
878 return Ivy_ObjRealFanin( Ivy_ObjFanin0(pObj) );
894 static Ivy_Store_t CutStore, * pCutStore = &CutStore;
895 Ivy_Cut_t CutNew, * pCutNew = &CutNew, * pCut;
897 int i, k, iLeaf0, iLeaf1;
902 pCutStore->
nCuts = 0;
909 Ivy_NodeCutHash( pCutNew );
915 for ( i = 0; i < pCutStore->
nCuts; i++ )
918 pCut = pCutStore->
pCuts + i;
919 if ( pCut->nSize == 0 )
921 for ( k = 0; k < pCut->nSize; k++ )
923 pLeaf = Ivy_ManObj(
p, pCut->pArray[k] );
924 if ( Ivy_ObjIsCi(pLeaf) )
935 iLeaf0 = Ivy_ObjId( Ivy_ObjRealFanin(Ivy_ObjFanin0(pLeaf)) );
936 iLeaf1 = Ivy_ObjId( Ivy_ObjRealFanin(Ivy_ObjFanin1(pLeaf)) );
939 if ( !Ivy_NodeCutPrescreen( pCut, iLeaf0, iLeaf1 ) )
941 if ( iLeaf0 > iLeaf1 )
942 Ivy_NodeCutDeriveNew( pCut, pCutNew, pCut->
pArray[k], iLeaf1, iLeaf0 );
944 Ivy_NodeCutDeriveNew( pCut, pCutNew, pCut->
pArray[k], iLeaf0, iLeaf1 );
971 int i, nCutsCut, nCutsTotal, nNodeTotal, nNodeOver;
973 nNodeTotal = nNodeOver = 0;
974 nCutsTotal = -Ivy_ManNodeNum(
p);
977 if ( !Ivy_ObjIsNode(pObj) )
980 nCutsTotal += nCutsCut;
984 printf(
"Total cuts = %6d. Trivial = %6d. Nodes = %6d. Satur = %6d. ",
985 nCutsTotal, Ivy_ManPiNum(
p) + Ivy_ManNodeNum(
p), nNodeTotal, nNodeOver );
986 ABC_PRT(
"Time", Abc_Clock() - clk );
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
int Ivy_NodeCutFindOrAdd(Ivy_Store_t *pCutStore, Ivy_Cut_t *pCutNew)
int Ivy_ManSeqFindCut_int(Ivy_Man_t *p, Vec_Int_t *vFront, Vec_Int_t *vInside, int nSizeLimit)
int Ivy_NodeCutFindOrAddFilter(Ivy_Store_t *pCutStore, Ivy_Cut_t *pCutNew)
int Ivy_ManFindBoolCutCost(Ivy_Obj_t *pObj)
void Ivy_NodePrintCut(Ivy_Cut_t *pCut)
void Ivy_ManTestCutsBool(Ivy_Man_t *p)
void Ivy_ManSeqFindCut(Ivy_Man_t *p, Ivy_Obj_t *pRoot, Vec_Int_t *vFront, Vec_Int_t *vInside, int nSize)
int Ivy_ManFindBoolCut_rec(Ivy_Man_t *p, Ivy_Obj_t *pObj, Vec_Ptr_t *vLeaves, Vec_Ptr_t *vVolume, Ivy_Obj_t *pPivot)
void Ivy_ManTestCutsAll(Ivy_Man_t *p)
Ivy_Store_t * Ivy_NodeFindCutsAll(Ivy_Man_t *p, Ivy_Obj_t *pObj, int nLeaves)
int Ivy_ManFindBoolCut(Ivy_Man_t *p, Ivy_Obj_t *pRoot, Vec_Ptr_t *vFront, Vec_Ptr_t *vVolume, Vec_Ptr_t *vLeaves)
void Ivy_NodePrintCuts(Ivy_Store_t *pCutStore)
void Ivy_NodeCompactCuts(Ivy_Store_t *pCutStore)
struct Ivy_Cut_t_ Ivy_Cut_t
typedefABC_NAMESPACE_HEADER_START struct Ivy_Man_t_ Ivy_Man_t
INCLUDES ///.
#define Ivy_ManForEachObj(p, pObj, i)
struct Ivy_Store_t_ Ivy_Store_t
struct Ivy_Obj_t_ Ivy_Obj_t
int Ivy_ObjIsMuxType(Ivy_Obj_t *pObj)
Ivy_Obj_t * Ivy_ObjRecognizeMux(Ivy_Obj_t *pObj, Ivy_Obj_t **ppObjT, Ivy_Obj_t **ppObjE)
int pArray[IVY_CUT_INPUT]
Ivy_Cut_t pCuts[IVY_CUT_LIMIT]
#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 ///.