From 0f8b68aef8a5deedb477650c490daffe3726995e Mon Sep 17 00:00:00 2001 From: Alan Mishchenko Date: Tue, 6 Dec 2011 13:15:53 -0800 Subject: Performance bug fix in SOP balancing. --- src/base/abci/abcIf.c | 2 +- src/map/if/if.h | 5 +++++ src/map/if/ifMan.c | 4 ++++ src/map/if/ifTime.c | 60 +++++++++++++++++++++++++-------------------------- 4 files changed, 39 insertions(+), 32 deletions(-) diff --git a/src/base/abci/abcIf.c b/src/base/abci/abcIf.c index 6efa57b9..a61fde7c 100644 --- a/src/base/abci/abcIf.c +++ b/src/base/abci/abcIf.c @@ -404,7 +404,7 @@ Hop_Obj_t * Abc_NodeTruthToHop( Hop_Man_t * pMan, If_Man_t * p, If_Cut_t * pCut Vec_Wrd_t * vArray; vArray = If_CutDelaySopArray( p, pCut ); pResult = Abc_NodeTruthToHopInt( pMan, vArray, If_CutLeaveNum(pCut) ); - Vec_WrdFree( vArray ); +// Vec_WrdFree( vArray ); return pResult; } diff --git a/src/map/if/if.h b/src/map/if/if.h index 47a5498c..06a8147e 100644 --- a/src/map/if/if.h +++ b/src/map/if/if.h @@ -165,6 +165,11 @@ struct If_Man_t_ int nChoices; // the number of choice nodes Vec_Int_t * vSwitching; // switching activity of each node Vec_Int_t ** pDriverCuts; // temporary driver cuts + // SOP balancing + Vec_Int_t * vCover; // used to compute ISOP + Vec_Wrd_t * vAnds; // intermediate storage + Vec_Wrd_t * vOrGate; // intermediate storage + Vec_Wrd_t * vAndGate; // intermediate storage // sequential mapping Vec_Ptr_t * vLatchOrder; // topological ordering of latches Vec_Int_t * vLags; // sequentail lags of all nodes diff --git a/src/map/if/ifMan.c b/src/map/if/ifMan.c index f8b77e6d..6b058ee7 100644 --- a/src/map/if/ifMan.c +++ b/src/map/if/ifMan.c @@ -149,6 +149,10 @@ void If_ManStop( If_Man_t * p ) Vec_PtrFree( p->vObjs ); // Vec_PtrFree( p->vMapped ); Vec_PtrFree( p->vTemp ); + Vec_IntFreeP( &p->vCover ); + Vec_WrdFreeP( &p->vAnds ); + Vec_WrdFreeP( &p->vAndGate ); + Vec_WrdFreeP( &p->vOrGate ); if ( p->vObjsRev ) Vec_PtrFree( p->vObjsRev ); if ( p->vLatchOrder ) Vec_PtrFree( p->vLatchOrder ); if ( p->vLags ) Vec_IntFree( p->vLags ); diff --git a/src/map/if/ifTime.c b/src/map/if/ifTime.c index 48d1ff37..b901a363 100644 --- a/src/map/if/ifTime.c +++ b/src/map/if/ifTime.c @@ -166,35 +166,34 @@ If_And_t If_CutDelaySopCube( Vec_Wrd_t * vCube, Vec_Wrd_t * vAnds, int fOrGate ) ***********************************************************************/ Vec_Wrd_t * If_CutDelaySopAnds( If_Man_t * p, If_Cut_t * pCut, Vec_Int_t * vCover, int fCompl ) { - Vec_Wrd_t * vAnds, * vAndGate, * vOrGate; If_Obj_t * pLeaf; If_And_t Leaf; int i, k, Entry, Literal; - vAnds = Vec_WrdAlloc( 32 ); + Vec_WrdClear( p->vAnds ); if ( Vec_IntSize(vCover) == 0 ) // const 0 { assert( fCompl == 0 ); - return vAnds; + return p->vAnds; } if ( Vec_IntSize(vCover) == 1 && Vec_IntEntry(vCover, 0) == 0 ) // const 1 { assert( fCompl == 0 ); - Vec_WrdPush( vAnds, 0 ); - return vAnds; + Vec_WrdPush( p->vAnds, 0 ); + return p->vAnds; } If_CutForEachLeaf( p, pCut, pLeaf, k ) { If_AndClear( &Leaf ); Leaf.Id = k; Leaf.Delay = (int)If_ObjCutBest(pLeaf)->Delay; - Vec_WrdPush( vAnds, If_AndToWrd(Leaf) ); + Vec_WrdPush( p->vAnds, If_AndToWrd(Leaf) ); } // iterate through the cubes - vOrGate = Vec_WrdAlloc( 16 ); - vAndGate = Vec_WrdAlloc( 16 ); + Vec_WrdClear( p->vOrGate ); + Vec_WrdClear( p->vAndGate ); Vec_IntForEachEntry( vCover, Entry, i ) { - Vec_WrdClear( vAndGate ); + Vec_WrdClear( p->vAndGate ); If_CutForEachLeaf( p, pCut, pLeaf, k ) { Literal = 3 & (Entry >> (k << 1)); @@ -204,39 +203,37 @@ Vec_Wrd_t * If_CutDelaySopAnds( If_Man_t * p, If_Cut_t * pCut, Vec_Int_t * vCove Leaf.fCompl = 1; Leaf.Id = k; Leaf.Delay = (int)If_ObjCutBest(pLeaf)->Delay; - If_AndInsertSorted( vAndGate, Leaf ); + If_AndInsertSorted( p->vAndGate, Leaf ); } else if ( Literal == 2 ) // pos literal { If_AndClear( &Leaf ); Leaf.Id = k; Leaf.Delay = (int)If_ObjCutBest(pLeaf)->Delay; - If_AndInsertSorted( vAndGate, Leaf ); + If_AndInsertSorted( p->vAndGate, Leaf ); } else if ( Literal != 0 ) assert( 0 ); } - Leaf = If_CutDelaySopCube( vAndGate, vAnds, 0 ); - If_AndInsertSorted( vOrGate, Leaf ); + Leaf = If_CutDelaySopCube( p->vAndGate, p->vAnds, 0 ); + If_AndInsertSorted( p->vOrGate, Leaf ); } - Leaf = If_CutDelaySopCube( vOrGate, vAnds, 1 ); - Vec_WrdFree( vAndGate ); - Vec_WrdFree( vOrGate ); - if ( Vec_WrdSize(vAnds) == (int)pCut->nLeaves ) + Leaf = If_CutDelaySopCube( p->vOrGate, p->vAnds, 1 ); + if ( Vec_WrdSize(p->vAnds) == (int)pCut->nLeaves ) { // Extra_PrintBinary( stdout, If_CutTruth(pCut), 32 ); printf( "\n" ); assert( Leaf.Id < pCut->nLeaves ); Leaf.iFan0 = Leaf.iFan1 = Leaf.Id; - Leaf.Id = Vec_WrdSize(vAnds); - Vec_WrdPush( vAnds, If_AndToWrd(Leaf) ); + Leaf.Id = Vec_WrdSize(p->vAnds); + Vec_WrdPush( p->vAnds, If_AndToWrd(Leaf) ); } if ( fCompl ) { - Leaf = If_WrdToAnd( Vec_WrdPop(vAnds) ); + Leaf = If_WrdToAnd( Vec_WrdPop(p->vAnds) ); Leaf.fCompl ^= 1; - Vec_WrdPush( vAnds, If_AndToWrd(Leaf) ); + Vec_WrdPush( p->vAnds, If_AndToWrd(Leaf) ); } - return vAnds; + return p->vAnds; } /**Function************************************************************* @@ -252,18 +249,21 @@ Vec_Wrd_t * If_CutDelaySopAnds( If_Man_t * p, If_Cut_t * pCut, Vec_Int_t * vCove ***********************************************************************/ Vec_Wrd_t * If_CutDelaySopArray( If_Man_t * p, If_Cut_t * pCut ) { - Vec_Int_t * vCover; Vec_Wrd_t * vAnds; int RetValue; - vCover = Vec_IntAlloc(0); - RetValue = Kit_TruthIsop( If_CutTruth(pCut), If_CutLeaveNum(pCut), vCover, 1 ); - if ( RetValue == -1 ) + if ( p->vCover == NULL ) { - Vec_IntFree( vCover ); - return NULL; + p->vCover = Vec_IntAlloc(0); + p->vAnds = Vec_WrdAlloc(100); + p->vAndGate = Vec_WrdAlloc(100); + p->vOrGate = Vec_WrdAlloc(100); + } + RetValue = Kit_TruthIsop( If_CutTruth(pCut), If_CutLeaveNum(pCut), p->vCover, 1 ); + if ( RetValue == -1 ) + return NULL; assert( RetValue == 0 || RetValue == 1 ); - vAnds = If_CutDelaySopAnds( p, pCut, vCover, RetValue ^ pCut->fCompl ); + vAnds = If_CutDelaySopAnds( p, pCut, p->vCover, RetValue ^ pCut->fCompl ); /* if ( pCut->nLeaves <= 5 ) { @@ -289,7 +289,6 @@ Vec_Wrd_t * If_CutDelaySopArray( If_Man_t * p, If_Cut_t * pCut ) // printf( "Verification passed for %d vars.\n", pCut->nLeaves ); } */ - Vec_IntFree( vCover ); return vAnds; } @@ -386,7 +385,6 @@ int If_CutDelaySopCost( If_Man_t * p, If_Cut_t * pCut ) Delay = If_CutDelayLeafDepth( vAnds, i ); pCut->pPerm[i] = (char)(Delay == -IF_BIG_CHAR ? IF_BIG_CHAR : Delay); } -// Vec_WrdFree( vAnds ); // verify the delay // Delay = If_CutDelay( p, pObj, pCut ); // assert( (int)Leaf.Delay == Delay ); -- cgit v1.2.3