30static unsigned * Ivy_NodeCutElementary(
Vec_Int_t * vStore,
int nWords,
int NodeId );
52 static Ivy_Store_t CutStore, * pCutStore = &CutStore;
62 Ivy_NodeComputeVolume( pObj, nNodeLimit - 1, vNodes, vFront );
63 nNodes = Vec_PtrSize(vNodes);
67 Vec_VecExpand( vBitCuts, nNodes-1 );
68 Vec_VecClear( vBitCuts );
71 Vec_IntClear( vStore );
72 Vec_IntGrow( vStore, 64000 );
75 nWords = Extra_BitWordNum( nNodes );
78 assert( Ivy_ObjTravId(pLeaf) < nNodes );
80 pBitCut = Ivy_NodeCutElementary( vStore,
nWords, Ivy_ObjTravId(pLeaf) );
82 Vec_VecPush( vBitCuts, Ivy_ObjTravId(pLeaf), pBitCut );
89 vCuts = Vec_VecEntry( vBitCuts, Ivy_ObjTravId(pLeaf) );
90 if ( Vec_PtrSize(vCuts) > 0 )
93 pBitCut = Ivy_NodeCutElementary( vStore,
nWords, Ivy_ObjTravId(pLeaf) );
95 Vec_VecPush( vBitCuts, Ivy_ObjTravId(pLeaf), pBitCut );
97 vCuts0 = Vec_VecEntry( vBitCuts, Ivy_ObjTravId( Ivy_ObjFanin0(pLeaf) ) );
98 vCuts1 = Vec_VecEntry( vBitCuts, Ivy_ObjTravId( Ivy_ObjFanin1(pLeaf) ) );
99 assert( Vec_PtrSize(vCuts0) > 0 );
100 assert( Vec_PtrSize(vCuts1) > 0 );
102 Ivy_NodeFindCutsMerge( vCuts0, vCuts1, vCuts, nLeaves,
nWords, vStore );
106 pCutStore->
nCuts = 0;
109 vCuts = Vec_VecEntry( vBitCuts, Ivy_ObjTravId(pObj) );
116 for ( k = 0; k < nNodes; k++ )
117 if ( Extra_TruthHasBit(pBitCut, k) )
141unsigned * Ivy_NodeCutElementary(
Vec_Int_t * vStore,
int nWords,
int NodeId )
144 pBitCut = Vec_IntFetch( vStore,
nWords );
146 Extra_TruthSetBit( pBitCut, NodeId );
185 if ( Ivy_ObjIsCi(pObj) || Depth == 0 )
209 Vec_PtrPush( vNodes, pObj );
230 Vec_PtrClear( vFront );
233 Vec_PtrClear( vNodes );
236 pFanin = Ivy_ObjFanin0(pTemp);
240 Vec_PtrPush( vNodes, pFanin );
242 pFanin = Ivy_ObjFanin1(pTemp);
246 Vec_PtrPush( vNodes, pFanin );
250 nNodes = Vec_PtrSize( vNodes );
253 Vec_PtrPush( vNodes, pTemp );
261 Vec_PtrClear( vFront );
263 Vec_PtrPush( vFront, pTemp );
282 assert( Ivy_ObjIsNode(pObj) );
284 Vec_PtrClear( vNodes );
285 Vec_PtrClear( vFront );
288 Vec_PtrPush( vNodes, pObj );
289 Vec_PtrPush( vFront, pObj );
291 LevelMax = pObj->
Level;
297 if ( (
int)pLeaf->
Level == LevelMax )
304 if ( pPivot == NULL )
306 if ( --LevelMax == 0 )
312 Vec_PtrRemove( vFront, pPivot );
314 pFanin = Ivy_ObjFanin0(pPivot);
318 Vec_PtrPush( vNodes, pFanin );
319 Vec_PtrPush( vFront, pFanin );
321 pFanin = Ivy_ObjFanin1(pPivot);
322 if ( pFanin && !pFanin->
fMarkA )
325 Vec_PtrPush( vNodes, pFanin );
326 Vec_PtrPush( vFront, pFanin );
329 }
while ( Vec_PtrSize(vNodes) < nNodeLimit );
334 pFanin = (
Ivy_Obj_t *)Vec_PtrEntry( vNodes, 0 );
335 pPivot = (
Ivy_Obj_t *)Vec_PtrEntryLast( vNodes );
357static inline void Extra_TruthOrWords(
unsigned * pOut,
unsigned * pIn0,
unsigned * pIn1,
int nWords )
360 for ( w =
nWords-1; w >= 0; w-- )
361 pOut[w] = pIn0[w] | pIn1[w];
363static inline int Extra_TruthIsImplyWords(
unsigned * pIn1,
unsigned * pIn2,
int nWords )
366 for ( w =
nWords-1; w >= 0; w-- )
367 if ( pIn1[w] & ~pIn2[w] )
386 unsigned * pBitCut, * pBitCut0, * pBitCut1, * pBitCutTest;
387 int i, k, c, w, Counter;
394 for ( w = 0; w <
nWords; w++ )
396 Counter += Extra_WordCountOnes( pBitCut0[w] | pBitCut1[w] );
397 if ( Counter > nLeaves )
400 if ( Counter > nLeaves )
403 pBitCutTest = Vec_IntFetch( vStore,
nWords );
404 Extra_TruthOrWords( pBitCutTest, pBitCut0, pBitCut1,
nWords );
409 if ( Extra_TruthIsImplyWords( pBitCut, pBitCutTest,
nWords ) )
411 if ( Extra_TruthIsImplyWords( pBitCutTest, pBitCut,
nWords ) )
413 Vec_PtrWriteEntry( vCuts, w++, pBitCut );
415 if ( c != Vec_PtrSize(vCuts) )
417 Vec_PtrShrink( vCuts, w );
419 Vec_PtrPush( vCuts, pBitCutTest );
441 int i, nCutsCut, nCutsTotal, nNodeTotal, nNodeOver;
444 vNodes = Vec_PtrAlloc( 100 );
445 vFront = Vec_PtrAlloc( 100 );
446 vStore = Vec_IntAlloc( 100 );
447 vBitCuts = Vec_VecAlloc( 100 );
449 nNodeTotal = nNodeOver = 0;
450 nCutsTotal = -Ivy_ManNodeNum(
p);
453 if ( !Ivy_ObjIsNode(pObj) )
456 nCutsCut = pStore->
nCuts;
457 nCutsTotal += nCutsCut;
461 printf(
"Total cuts = %6d. Trivial = %6d. Nodes = %6d. Satur = %6d. ",
462 nCutsTotal, Ivy_ManPiNum(
p) + Ivy_ManNodeNum(
p), nNodeTotal, nNodeOver );
463 ABC_PRT(
"Time", Abc_Clock() - clk );
465 Vec_PtrFree( vNodes );
466 Vec_PtrFree( vFront );
467 Vec_IntFree( vStore );
468 Vec_VecFree( vBitCuts );
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
void Ivy_NodeComputeVolume2(Ivy_Obj_t *pObj, int nNodeLimit, Vec_Ptr_t *vNodes, Vec_Ptr_t *vFront)
void Ivy_NodeComputeVolumeTrav2_rec(Ivy_Obj_t *pObj, Vec_Ptr_t *vNodes)
Ivy_Store_t * Ivy_NodeFindCutsTravAll(Ivy_Man_t *p, Ivy_Obj_t *pObj, int nLeaves, int nNodeLimit, Vec_Ptr_t *vNodes, Vec_Ptr_t *vFront, Vec_Int_t *vStore, Vec_Vec_t *vBitCuts)
FUNCTION DEFINITIONS ///.
void Ivy_ManTestCutsTravAll(Ivy_Man_t *p)
void Ivy_NodeComputeVolumeTrav1_rec(Ivy_Obj_t *pObj, int Depth)
int Ivy_CompareNodesByLevel(Ivy_Obj_t **ppObj1, Ivy_Obj_t **ppObj2)
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 pArray[IVY_CUT_INPUT]
Ivy_Cut_t pCuts[IVY_CUT_LIMIT]
#define Vec_PtrForEachEntryReverse(Type, vVec, pEntry, i)
#define Vec_PtrForEachEntryStop(Type, vVec, pEntry, i, Stop)
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Vec_t_ Vec_Vec_t
INCLUDES ///.