/**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->nTravIds || 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 ) if ( pDelays[k] != -ABC_INFINITY ) 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; if ( pDelays[k] != -ABC_INFINITY ) 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