diff options
Diffstat (limited to 'src/misc/tim/timTime.c')
-rw-r--r-- | src/misc/tim/timTime.c | 265 |
1 files changed, 265 insertions, 0 deletions
diff --git a/src/misc/tim/timTime.c b/src/misc/tim/timTime.c new file mode 100644 index 00000000..ddec4c62 --- /dev/null +++ b/src/misc/tim/timTime.c @@ -0,0 +1,265 @@ +/**CFile**************************************************************** + + FileName [timTime.c] + + SystemName [ABC: Logic synthesis and verification system.] + + PackageName [Hierarchy/timing manager.] + + Synopsis [Setting and resetting timing information of the boxes.] + + Author [Alan Mishchenko] + + Affiliation [UC Berkeley] + + Date [Ver. 1.0. Started - April 28, 2007.] + + Revision [$Id: timTime.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $] + +***********************************************************************/ + +#include "timInt.h" + +ABC_NAMESPACE_IMPL_START + +//////////////////////////////////////////////////////////////////////// +/// DECLARATIONS /// +//////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////// +/// FUNCTION DEFINITIONS /// +//////////////////////////////////////////////////////////////////////// + +/**Function************************************************************* + + Synopsis [Initializes arrival time of the PI.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Tim_ManInitPiArrival( Tim_Man_t * p, int iPi, float Delay ) +{ + assert( iPi < p->nCis ); + p->pCis[iPi].timeArr = Delay; +} + +/**Function************************************************************* + + Synopsis [Initializes required time of the PO.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Tim_ManInitPoRequired( Tim_Man_t * p, int iPo, float Delay ) +{ + assert( iPo < p->nCos ); + p->pCos[iPo].timeReq = Delay; +} + +/**Function************************************************************* + + Synopsis [Sets arrival times of all PIs.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Tim_ManInitPiArrivalAll( Tim_Man_t * p, float Delay ) +{ + Tim_Obj_t * pObj; + int i; + Tim_ManForEachPi( p, pObj, i ) + Tim_ManInitPiArrival( p, i, Delay ); +} + +/**Function************************************************************* + + Synopsis [Sets required times of all POs.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Tim_ManInitPoRequiredAll( Tim_Man_t * p, float Delay ) +{ + Tim_Obj_t * pObj; + int i; + Tim_ManForEachPo( p, pObj, i ) + Tim_ManSetCoRequired( p, i, Delay ); +} + +/**Function************************************************************* + + Synopsis [Updates arrival time of the CO.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Tim_ManSetCoArrival( Tim_Man_t * p, int iCo, float Delay ) +{ + assert( iCo < p->nCos ); + assert( !p->fUseTravId || p->pCos[iCo].TravId != p->nTravIds ); + p->pCos[iCo].timeArr = Delay; + p->pCos[iCo].TravId = p->nTravIds; +} + +/**Function************************************************************* + + Synopsis [Updates required time of the CI.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Tim_ManSetCiRequired( Tim_Man_t * p, int iCi, float Delay ) +{ + assert( iCi < p->nCis ); + assert( !p->fUseTravId || p->pCis[iCi].TravId != p->nTravIds ); + p->pCis[iCi].timeReq = Delay; + p->pCis[iCi].TravId = p->nTravIds; +} + +/**Function************************************************************* + + Synopsis [Updates required time of the CO.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +void Tim_ManSetCoRequired( Tim_Man_t * p, int iCo, float Delay ) +{ + assert( iCo < p->nCos ); + assert( !p->fUseTravId || p->pCos[iCo].TravId != p->nTravIds ); + p->pCos[iCo].timeReq = Delay; + p->pCos[iCo].TravId = p->nTravIds; +} + + +/**Function************************************************************* + + Synopsis [Returns CO arrival time.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +float Tim_ManGetCiArrival( Tim_Man_t * p, int iCi ) +{ + Tim_Box_t * pBox; + Tim_Obj_t * pObjThis, * pObj, * pObjRes; + float * pTable, * pDelays, DelayBest; + int i, k; + // consider the already processed PI + pObjThis = Tim_ManCi( p, iCi ); + if ( p->fUseTravId && pObjThis->TravId == p->nTravIds ) + return pObjThis->timeArr; + pObjThis->TravId = p->nTravIds; + // consider the main PI + pBox = Tim_ManCiBox( p, iCi ); + if ( pBox == NULL ) + return pObjThis->timeArr; + // update box timing + pBox->TravId = p->nTravIds; + // get the arrival times of the inputs of the box (POs) + if ( p->fUseTravId ) + Tim_ManBoxForEachInput( p, pBox, pObj, i ) + if ( pObj->TravId != p->nTravIds ) + printf( "Tim_ManGetCiArrival(): Input arrival times of the box are not up to date!\n" ); + // compute the arrival times for each output of the box (PIs) + pTable = Tim_ManBoxDelayTable( p, pBox->iBox ); + Tim_ManBoxForEachOutput( p, pBox, pObjRes, i ) + { + pDelays = pTable + 3 + i * pBox->nInputs; + DelayBest = -TIM_ETERNITY; + Tim_ManBoxForEachInput( p, pBox, pObj, k ) + DelayBest = Abc_MaxInt( DelayBest, pObj->timeArr + pDelays[k] ); + pObjRes->timeArr = DelayBest; + pObjRes->TravId = p->nTravIds; + } + return pObjThis->timeArr; +} + +/**Function************************************************************* + + Synopsis [Returns CO required time.] + + Description [] + + SideEffects [] + + SeeAlso [] + +***********************************************************************/ +float Tim_ManGetCoRequired( Tim_Man_t * p, int iCo ) +{ + Tim_Box_t * pBox; + Tim_Obj_t * pObjThis, * pObj, * pObjRes; + float * pTable, * pDelays, DelayBest; + int i, k; + // consider the already processed PO + pObjThis = Tim_ManCo( p, iCo ); + if ( p->fUseTravId && pObjThis->TravId == p->nTravIds ) + return pObjThis->timeReq; + pObjThis->TravId = p->nTravIds; + // consider the main PO + pBox = Tim_ManCoBox( p, iCo ); + if ( pBox == NULL ) + return pObjThis->timeReq; + // update box timing + pBox->TravId = p->nTravIds; + // get the required times of the outputs of the box (PIs) + if ( p->fUseTravId ) + Tim_ManBoxForEachOutput( p, pBox, pObj, i ) + if ( pObj->TravId != p->nTravIds ) + printf( "Tim_ManGetCoRequired(): Output required times of output %d the box %d are not up to date!\n", i, pBox->iBox ); + // compute the required times for each input of the box (POs) + pTable = Tim_ManBoxDelayTable( p, pBox->iBox ); + Tim_ManBoxForEachInput( p, pBox, pObjRes, i ) + { + DelayBest = TIM_ETERNITY; + Tim_ManBoxForEachOutput( p, pBox, pObj, k ) + { + pDelays = pTable + 3 + k * pBox->nInputs; + DelayBest = Abc_MinFloat( DelayBest, pObj->timeReq - pDelays[i] ); + } + pObjRes->timeReq = DelayBest; + pObjRes->TravId = p->nTravIds; + } + return pObjThis->timeReq; +} + +//////////////////////////////////////////////////////////////////////// +/// END OF FILE /// +//////////////////////////////////////////////////////////////////////// + + +ABC_NAMESPACE_IMPL_END + |