From a819e33c6f4a3177fd164228b51b4b2b8448e294 Mon Sep 17 00:00:00 2001 From: Alan Mishchenko Date: Mon, 8 Aug 2016 12:36:10 -0700 Subject: Enabled delay computation for the cut output using cut inputs. --- src/map/if/if.h | 1 + src/map/if/ifMan.c | 2 ++ src/map/if/ifMap.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/map/if/if.h b/src/map/if/if.h index ca7e0411..5f86ef5c 100644 --- a/src/map/if/if.h +++ b/src/map/if/if.h @@ -265,6 +265,7 @@ struct If_Man_t_ int nCountNonDec[2]; Vec_Int_t * vCutData; // cut data storage int pArrTimeProfile[IF_MAX_FUNC_LUTSIZE]; + Vec_Ptr_t * vVisited; // timing manager Tim_Man_t * pManTim; diff --git a/src/map/if/ifMan.c b/src/map/if/ifMan.c index 80d1f429..8f5a5c48 100644 --- a/src/map/if/ifMan.c +++ b/src/map/if/ifMan.c @@ -61,6 +61,7 @@ If_Man_t * If_ManStart( If_Par_t * pPars ) p->vCos = Vec_PtrAlloc( 100 ); p->vObjs = Vec_PtrAlloc( 100 ); p->vTemp = Vec_PtrAlloc( 100 ); + p->vVisited = Vec_PtrAlloc( 100 ); // prepare the memory manager if ( p->pPars->fTruth ) { @@ -264,6 +265,7 @@ void If_ManStop( If_Man_t * p ) Vec_IntFreeP( &p->vCutData ); Vec_IntFreeP( &p->vPairRes ); Vec_StrFreeP( &p->vPairPerms ); + Vec_PtrFreeP( &p->vVisited ); if ( p->vPairHash ) Hash_IntManStop( p->vPairHash ); for ( i = 6; i <= Abc_MaxInt(6,p->pPars->nLutSize); i++ ) diff --git a/src/map/if/ifMap.c b/src/map/if/ifMap.c index f068c35d..27a2820d 100644 --- a/src/map/if/ifMap.c +++ b/src/map/if/ifMap.c @@ -35,6 +35,53 @@ extern int Abc_ExactDelayCost( word * pTruth, int nVars, int * pArrTimeProfil /// FUNCTION DEFINITIONS /// //////////////////////////////////////////////////////////////////////// +/**Function************************************************************* + + Synopsis [Compute delay of the cut's output in terms of logic levels.] + + Description [Uses the best arrival time of the fanins of the cut + to compute the arrival times of the output of the cut.] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +int If_ManCutAigDelay_rec( If_Man_t * p, If_Obj_t * pObj, Vec_Ptr_t * vVisited ) +{ + int Delay0, Delay1; + if ( pObj->fVisit ) + return pObj->iCopy; + if ( If_ObjIsCi(pObj) || If_ObjIsConst1(pObj) ) + return -1; + // store the node in the structure by level + assert( If_ObjIsAnd(pObj) ); + pObj->fVisit = 1; + Vec_PtrPush( vVisited, pObj ); + Delay0 = If_ManCutAigDelay_rec( p, pObj->pFanin0, vVisited ); + Delay1 = If_ManCutAigDelay_rec( p, pObj->pFanin1, vVisited ); + pObj->iCopy = (Delay0 >= 0 && Delay1 >= 0) ? 1 + Abc_MaxInt(Delay0, Delay1) : -1; + return pObj->iCopy; +} +int If_ManCutAigDelay( If_Man_t * p, If_Obj_t * pObj, If_Cut_t * pCut ) +{ + If_Obj_t * pLeaf; + int i, Delay; + Vec_PtrClear( p->vVisited ); + If_CutForEachLeaf( p, pCut, pLeaf, i ) + { + assert( pLeaf->fVisit == 0 ); + pLeaf->fVisit = 1; + Vec_PtrPush( p->vVisited, pLeaf ); + pLeaf->iCopy = If_ObjCutBest(pLeaf)->Delay; + } + Delay = If_ManCutAigDelay_rec( p, pObj, p->vVisited ); + Vec_PtrForEachEntry( If_Obj_t *, p->vVisited, pLeaf, i ) + pLeaf->fVisit = 0; +// assert( Delay <= (int)pObj->Level ); + return Delay; +} + /**Function************************************************************* Synopsis [Counts the number of 1s in the signature.] @@ -152,7 +199,7 @@ void If_ObjPerformMappingAnd( If_Man_t * p, If_Obj_t * pObj, int Mode, int fPrep { int Cost = 0; pCut->fUser = 1; - pCut->Delay = (float)Abc_ExactDelayCost( If_CutTruthW(p, pCut), If_CutLeaveNum(pCut), If_CutArrTimeProfile(p, pCut), If_CutPerm(pCut), &Cost, (int)pObj->Level ); + pCut->Delay = (float)Abc_ExactDelayCost( If_CutTruthW(p, pCut), If_CutLeaveNum(pCut), If_CutArrTimeProfile(p, pCut), If_CutPerm(pCut), &Cost, If_ManCutAigDelay(p, pObj, pCut) ); if ( Cost == ABC_INFINITY ) { for ( v = 0; v < If_CutLeaveNum(pCut); v++ ) @@ -376,7 +423,7 @@ void If_ObjPerformMappingAnd( If_Man_t * p, If_Obj_t * pObj, int Mode, int fPrep { int Cost = 0; pCut->fUser = 1; - pCut->Delay = (float)Abc_ExactDelayCost( If_CutTruthW(p, pCut), If_CutLeaveNum(pCut), If_CutArrTimeProfile(p, pCut), If_CutPerm(pCut), &Cost, (int)pObj->Level ); + pCut->Delay = (float)Abc_ExactDelayCost( If_CutTruthW(p, pCut), If_CutLeaveNum(pCut), If_CutArrTimeProfile(p, pCut), If_CutPerm(pCut), &Cost, If_ManCutAigDelay(p, pObj, pCut) ); if ( Cost == ABC_INFINITY ) { for ( v = 0; v < If_CutLeaveNum(pCut); v++ ) -- cgit v1.2.3