From 865526f88094140c458a244fc8bb279bfa154fc1 Mon Sep 17 00:00:00 2001 From: Alan Mishchenko Date: Fri, 11 Apr 2014 12:20:36 -0700 Subject: New feature to optimize delay during mapping. --- src/map/if/if.h | 1 + src/map/if/ifDelay.c | 11 ++++++----- 2 files changed, 7 insertions(+), 5 deletions(-) (limited to 'src/map') diff --git a/src/map/if/if.h b/src/map/if/if.h index 7e0edaf8..cd1f7b8f 100644 --- a/src/map/if/if.h +++ b/src/map/if/if.h @@ -413,6 +413,7 @@ static inline word * If_CutTruthWR( If_Man_t * p, If_Cut_t * pCut ) { r static inline unsigned * If_CutTruthUR( If_Man_t * p, If_Cut_t * pCut) { return (unsigned *)If_CutTruthWR(p, pCut); } static inline word * If_CutTruthW( If_Man_t * p, If_Cut_t * pCut ) { if ( p->vTtMem == NULL ) return NULL; assert( pCut->iCutFunc >= 0 ); Abc_TtCopy( p->puTempW, If_CutTruthWR(p, pCut), p->nTruth6Words[pCut->nLeaves], If_CutTruthIsCompl(pCut) ); return p->puTempW; } static inline unsigned * If_CutTruth( If_Man_t * p, If_Cut_t * pCut ) { return (unsigned *)If_CutTruthW(p, pCut); } + static inline int If_CutDsdLit( If_Man_t * p, If_Cut_t * pCut ) { return Abc_Lit2LitL( Vec_IntArray(p->vTtDsds[pCut->nLeaves]), If_CutTruthLit(pCut) ); } static inline int If_CutDsdIsCompl( If_Man_t * p, If_Cut_t * pCut ) { return Abc_LitIsCompl( If_CutDsdLit(p, pCut) ); } static inline char * If_CutDsdPerm( If_Man_t * p, If_Cut_t * pCut ) { return Vec_StrEntryP( p->vTtPerms[pCut->nLeaves], Abc_Lit2Var(pCut->iCutFunc) * Abc_MaxInt(6, pCut->nLeaves) ); } diff --git a/src/map/if/ifDelay.c b/src/map/if/ifDelay.c index 433b4e4d..1c10d950 100644 --- a/src/map/if/ifDelay.c +++ b/src/map/if/ifDelay.c @@ -287,8 +287,9 @@ int If_CutLutBalancePinDelays( If_Man_t * p, If_Cut_t * pCut, char * pPerm ) } else { + char * pCutPerm = If_CutDsdPerm( p, pCut ); int LutSize = p->pPars->pLutStruct[0] - '0'; - int i, Delay, DelayMax; + int i, Delay, DelayMax = 0; assert( (If_CutLeaveNum(pCut) > LutSize) == (pCut->uMaskFunc > 0) ); for ( i = 0; i < If_CutLeaveNum(pCut); i++ ) { @@ -296,7 +297,7 @@ int If_CutLutBalancePinDelays( If_Man_t * p, If_Cut_t * pCut, char * pPerm ) pPerm[i] = 2; else pPerm[i] = 1; - Delay = (int)If_ObjCutBest(If_CutLeaf(p, pCut, i))->Delay; + Delay = (int)If_ObjCutBest(If_CutLeaf(p, pCut, pCutPerm[i]))->Delay; DelayMax = Abc_MaxInt( DelayMax, Delay + (int)pPerm[i] ); } return DelayMax; @@ -330,17 +331,17 @@ int If_CutLutBalanceEval( If_Man_t * p, If_Cut_t * pCut ) } else { + char * pCutPerm = If_CutDsdPerm( p, pCut ); int LutSize = p->pPars->pLutStruct[0] - '0'; int i, pTimes[IF_MAX_FUNC_LUTSIZE]; int DelayMax = 0, nLeafMax = 0; unsigned uLeafMask = 0; for ( i = 0; i < If_CutLeaveNum(pCut); i++ ) { - pTimes[i] = (int)If_ObjCutBest(If_CutLeaf(p, pCut, i))->Delay; - assert( DelayMax <= pTimes[i] ); + pTimes[i] = (int)If_ObjCutBest(If_CutLeaf(p, pCut, pCutPerm[i]))->Delay; if ( DelayMax < pTimes[i] ) DelayMax = pTimes[i], nLeafMax = 1, uLeafMask = (1 << (i << 2)); - else + else if ( DelayMax == pTimes[i] ) nLeafMax++, uLeafMask |= (1 << (i << 2)); } if ( If_CutLeaveNum(pCut) <= LutSize ) -- cgit v1.2.3