1 /**CFile****************************************************************
2
3 FileName [timTime.c]
4
5 SystemName [ABC: Logic synthesis and verification system.]
6
7 PackageName [Hierarchy/timing manager.]
8
9 Synopsis [Setting and resetting timing information of the boxes.]
10
11 Author [Alan Mishchenko]
12
13 Affiliation [UC Berkeley]
14
15 Date [Ver. 1.0. Started - April 28, 2007.]
16
17 Revision [$Id: timTime.c,v 1.00 2007/04/28 00:00:00 alanmi Exp $]
18
19 ***********************************************************************/
20
21 #include "timInt.h"
22
23 ABC_NAMESPACE_IMPL_START
24
25 ////////////////////////////////////////////////////////////////////////
26 /// DECLARATIONS ///
27 ////////////////////////////////////////////////////////////////////////
28
29 ////////////////////////////////////////////////////////////////////////
30 /// FUNCTION DEFINITIONS ///
31 ////////////////////////////////////////////////////////////////////////
32
33 /**Function*************************************************************
34
35 Synopsis [Initializes arrival time of the PI.]
36
37 Description []
38
39 SideEffects []
40
41 SeeAlso []
42
43 ***********************************************************************/
Tim_ManInitPiArrival(Tim_Man_t * p,int iPi,float Delay)44 void Tim_ManInitPiArrival( Tim_Man_t * p, int iPi, float Delay )
45 {
46 assert( iPi < p->nCis );
47 p->pCis[iPi].timeArr = Delay;
48 }
49
50 /**Function*************************************************************
51
52 Synopsis [Initializes required time of the PO.]
53
54 Description []
55
56 SideEffects []
57
58 SeeAlso []
59
60 ***********************************************************************/
Tim_ManInitPoRequired(Tim_Man_t * p,int iPo,float Delay)61 void Tim_ManInitPoRequired( Tim_Man_t * p, int iPo, float Delay )
62 {
63 assert( iPo < p->nCos );
64 p->pCos[iPo].timeReq = Delay;
65 }
66
67 /**Function*************************************************************
68
69 Synopsis [Sets arrival times of all PIs.]
70
71 Description []
72
73 SideEffects []
74
75 SeeAlso []
76
77 ***********************************************************************/
Tim_ManInitPiArrivalAll(Tim_Man_t * p,float Delay)78 void Tim_ManInitPiArrivalAll( Tim_Man_t * p, float Delay )
79 {
80 Tim_Obj_t * pObj;
81 int i;
82 Tim_ManForEachPi( p, pObj, i )
83 Tim_ManInitPiArrival( p, i, Delay );
84 }
85
86 /**Function*************************************************************
87
88 Synopsis [Sets required times of all POs.]
89
90 Description []
91
92 SideEffects []
93
94 SeeAlso []
95
96 ***********************************************************************/
Tim_ManInitPoRequiredAll(Tim_Man_t * p,float Delay)97 void Tim_ManInitPoRequiredAll( Tim_Man_t * p, float Delay )
98 {
99 Tim_Obj_t * pObj;
100 int i;
101 Tim_ManForEachPo( p, pObj, i )
102 Tim_ManSetCoRequired( p, i, Delay );
103 }
104
105 /**Function*************************************************************
106
107 Synopsis [Updates arrival time of the CO.]
108
109 Description []
110
111 SideEffects []
112
113 SeeAlso []
114
115 ***********************************************************************/
Tim_ManSetCoArrival(Tim_Man_t * p,int iCo,float Delay)116 void Tim_ManSetCoArrival( Tim_Man_t * p, int iCo, float Delay )
117 {
118 assert( iCo < p->nCos );
119 assert( !p->fUseTravId || p->pCos[iCo].TravId != p->nTravIds );
120 p->pCos[iCo].timeArr = Delay;
121 p->pCos[iCo].TravId = p->nTravIds;
122 }
123
124 /**Function*************************************************************
125
126 Synopsis [Updates required time of the CI.]
127
128 Description []
129
130 SideEffects []
131
132 SeeAlso []
133
134 ***********************************************************************/
Tim_ManSetCiRequired(Tim_Man_t * p,int iCi,float Delay)135 void Tim_ManSetCiRequired( Tim_Man_t * p, int iCi, float Delay )
136 {
137 assert( iCi < p->nCis );
138 assert( !p->fUseTravId || p->pCis[iCi].TravId != p->nTravIds );
139 p->pCis[iCi].timeReq = Delay;
140 p->pCis[iCi].TravId = p->nTravIds;
141 }
142
143 /**Function*************************************************************
144
145 Synopsis [Updates required time of the CO.]
146
147 Description []
148
149 SideEffects []
150
151 SeeAlso []
152
153 ***********************************************************************/
Tim_ManSetCoRequired(Tim_Man_t * p,int iCo,float Delay)154 void Tim_ManSetCoRequired( Tim_Man_t * p, int iCo, float Delay )
155 {
156 assert( iCo < p->nCos );
157 assert( !p->fUseTravId || !p->nTravIds || p->pCos[iCo].TravId != p->nTravIds );
158 p->pCos[iCo].timeReq = Delay;
159 p->pCos[iCo].TravId = p->nTravIds;
160 }
161
162
163 /**Function*************************************************************
164
165 Synopsis [Returns CO arrival time.]
166
167 Description []
168
169 SideEffects []
170
171 SeeAlso []
172
173 ***********************************************************************/
Tim_ManGetCiArrival(Tim_Man_t * p,int iCi)174 float Tim_ManGetCiArrival( Tim_Man_t * p, int iCi )
175 {
176 Tim_Box_t * pBox;
177 Tim_Obj_t * pObjThis, * pObj, * pObjRes;
178 float * pTable, * pDelays, DelayBest;
179 int i, k;
180 // consider the already processed PI
181 pObjThis = Tim_ManCi( p, iCi );
182 if ( p->fUseTravId && pObjThis->TravId == p->nTravIds )
183 return pObjThis->timeArr;
184 pObjThis->TravId = p->nTravIds;
185 // consider the main PI
186 pBox = Tim_ManCiBox( p, iCi );
187 if ( pBox == NULL )
188 return pObjThis->timeArr;
189 // update box timing
190 pBox->TravId = p->nTravIds;
191 // get the arrival times of the inputs of the box (POs)
192 if ( p->fUseTravId )
193 Tim_ManBoxForEachInput( p, pBox, pObj, i )
194 if ( pObj->TravId != p->nTravIds )
195 printf( "Tim_ManGetCiArrival(): Input arrival times of the box are not up to date!\n" );
196 // compute the arrival times for each output of the box (PIs)
197 pTable = Tim_ManBoxDelayTable( p, pBox->iBox );
198 Tim_ManBoxForEachOutput( p, pBox, pObjRes, i )
199 {
200 pDelays = pTable + 3 + i * pBox->nInputs;
201 DelayBest = -TIM_ETERNITY;
202 Tim_ManBoxForEachInput( p, pBox, pObj, k )
203 if ( pDelays[k] != -ABC_INFINITY )
204 DelayBest = Abc_MaxInt( DelayBest, pObj->timeArr + pDelays[k] );
205 pObjRes->timeArr = DelayBest;
206 pObjRes->TravId = p->nTravIds;
207 }
208 return pObjThis->timeArr;
209 }
210
211 /**Function*************************************************************
212
213 Synopsis [Returns CO required time.]
214
215 Description []
216
217 SideEffects []
218
219 SeeAlso []
220
221 ***********************************************************************/
Tim_ManGetCoRequired(Tim_Man_t * p,int iCo)222 float Tim_ManGetCoRequired( Tim_Man_t * p, int iCo )
223 {
224 Tim_Box_t * pBox;
225 Tim_Obj_t * pObjThis, * pObj, * pObjRes;
226 float * pTable, * pDelays, DelayBest;
227 int i, k;
228 // consider the already processed PO
229 pObjThis = Tim_ManCo( p, iCo );
230 if ( p->fUseTravId && pObjThis->TravId == p->nTravIds )
231 return pObjThis->timeReq;
232 pObjThis->TravId = p->nTravIds;
233 // consider the main PO
234 pBox = Tim_ManCoBox( p, iCo );
235 if ( pBox == NULL )
236 return pObjThis->timeReq;
237 // update box timing
238 pBox->TravId = p->nTravIds;
239 // get the required times of the outputs of the box (PIs)
240 if ( p->fUseTravId )
241 Tim_ManBoxForEachOutput( p, pBox, pObj, i )
242 if ( pObj->TravId != p->nTravIds )
243 printf( "Tim_ManGetCoRequired(): Output required times of output %d the box %d are not up to date!\n", i, pBox->iBox );
244 // compute the required times for each input of the box (POs)
245 pTable = Tim_ManBoxDelayTable( p, pBox->iBox );
246 Tim_ManBoxForEachInput( p, pBox, pObjRes, i )
247 {
248 DelayBest = TIM_ETERNITY;
249 Tim_ManBoxForEachOutput( p, pBox, pObj, k )
250 {
251 pDelays = pTable + 3 + k * pBox->nInputs;
252 if ( pDelays[k] != -ABC_INFINITY )
253 DelayBest = Abc_MinFloat( DelayBest, pObj->timeReq - pDelays[i] );
254 }
255 pObjRes->timeReq = DelayBest;
256 pObjRes->TravId = p->nTravIds;
257 }
258 return pObjThis->timeReq;
259 }
260
261 ////////////////////////////////////////////////////////////////////////
262 /// END OF FILE ///
263 ////////////////////////////////////////////////////////////////////////
264
265
266 ABC_NAMESPACE_IMPL_END
267
268