From 1f0e5533dc32c8c3543dece554a148815c7d49c2 Mon Sep 17 00:00:00 2001 From: Alan Mishchenko Date: Sun, 15 Jan 2012 09:15:10 -0800 Subject: Several small bug fixes in the mapper. --- src/base/abci/abcRec.c | 2 +- src/map/if/if.h | 4 ++-- src/map/if/ifMap.c | 5 ++++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/base/abci/abcRec.c b/src/base/abci/abcRec.c index 26992c81..52b52186 100644 --- a/src/base/abci/abcRec.c +++ b/src/base/abci/abcRec.c @@ -2243,8 +2243,8 @@ int If_CutDelayRecCost(If_Man_t* p, If_Cut_t* pCut) if ( !Kit_TruthIsEqualWithPhase( pTruthRec, pInOut, nLeaves ) ) { assert( 0 ); - return -1; s_pMan->nIfMapError++; + return -1; } // mark as user cut. pCut->fUser = 1; diff --git a/src/map/if/if.h b/src/map/if/if.h index 85de7026..ea830065 100644 --- a/src/map/if/if.h +++ b/src/map/if/if.h @@ -51,7 +51,7 @@ ABC_NAMESPACE_HEADER_START // a very large number #define IF_INFINITY 100000000 // the largest possible user cut cost -#define IF_COST_MAX ((1<<14)-1) +#define IF_COST_MAX 8191 // ((1<<13)-1) // object types typedef enum { @@ -216,7 +216,7 @@ struct If_Cut_t_ float Power; // the power flow float Delay; // delay of the cut unsigned uSign; // cut signature - unsigned Cost : 13; // the user's cost of the cut + unsigned Cost : 13; // the user's cost of the cut (related to IF_COST_MAX) unsigned fCompl : 1; // the complemented attribute unsigned fUser : 1; // using the user's area and delay unsigned fUseless: 1; // using the user's area and delay diff --git a/src/map/if/ifMap.c b/src/map/if/ifMap.c index a845f177..c6547fce 100644 --- a/src/map/if/ifMap.c +++ b/src/map/if/ifMap.c @@ -180,6 +180,7 @@ void If_ObjPerformMappingAnd( If_Man_t * p, If_Obj_t * pObj, int Mode, int fPrep If_ObjForEachCut( pObj->pFanin0, pCut0, i ) If_ObjForEachCut( pObj->pFanin1, pCut1, k ) { + // get the next free cut assert( pCutSet->nCuts <= pCutSet->nCutsMax ); pCut = pCutSet->ppCuts[pCutSet->nCuts]; @@ -227,11 +228,13 @@ void If_ObjPerformMappingAnd( If_Man_t * p, If_Obj_t * pObj, int Mode, int fPrep /// pCut->Delay = If_CutDelayLutStruct( p, pCut, p->pPars->pLutStruct, p->pPars->WireDelay ); // else if ( p->pPars->fDelayOpt ) if ( p->pPars->fUserRecLib ) - pCut->Delay = If_CutDelayRecCost(p, pCut); + pCut->Delay = If_CutDelayRecCost(p, pCut); else if (p->pPars->fDelayOpt) pCut->Delay = If_CutDelaySopCost(p, pCut); else pCut->Delay = If_CutDelay( p, pObj, pCut ); + if ( pCut->Cost == IF_COST_MAX ) + continue; // Abc_Print( 1, "%.2f ", pCut->Delay ); if ( Mode && pCut->Delay > pObj->Required + p->fEpsilon ) continue; -- cgit v1.2.3