1 /****************************************************************************/
3 /* Chaine de CAO & VLSI AVERTEC */
5 /* Produit : AVERTEC global tools */
6 /* Fichier : power_API_util.c */
8 /* © copyright 2009 AVERTEC */
9 /* Tous droits reserves */
11 /* Auteur(s) : Olivier BICHAUT */
13 /****************************************************************************/
18 #include <sys/types.h>
34 #define API_USE_REAL_TYPES
35 #include "power_API.h"
36 #include "power_API_util.h"
38 void SwitchingPower (TimingFigure
*tf
)
40 chain_list
*chainevents
, *chain
, *chvcdsig
, *ch
, *chainsigs
, *chsig
/*, *chainsigs2, *chsig2 */;
43 ttvsig_list
*ttvsig
, *prevsig
;
44 ptype_list
*ptype
, *ptypenodevcdinfo
;
48 double nrjmax
, nrjtime
, nrjsig
, consototale
=0.0;
53 ttvtrans_vcd_power
*transvcdpower
, *tvp
;
55 ttvnode_vcd_info
*ttvnodevcdinfo
;
57 ptf
= mbkfopen( "toto4", "dat", WRITE_TEXT
);
59 vcd_goto_first_time ();
61 chainevents
= cdl_get_current_events();
63 for (chain
= chainevents
; chain
; chain
= chain
->NEXT
){
64 for (chvcdsig
= cdl_geteventsig (chain
); chvcdsig
; chvcdsig
= chvcdsig
->NEXT
){
65 // signame = cdl_geteventsig (chain);
66 signame
= (char*)chvcdsig
->DATA
;
67 name
= mbk_devect(signame
, "(", ")");
68 signame
= ttv_revect(name
);
69 value
= cdl_geteventval (chain
);
70 if(value
=='0' || value
=='1'){
72 chainsigs
= ttv_get_signals_from_netname(tf
, &htsig
, signame
);
73 for(chsig
= chainsigs
; chsig
; chsig
= chsig
->NEXT
){
75 ttvsig
= (ttvsig_list
*)chsig
->DATA
;
77 ttv_expfigsig (tf
, ttvsig
, ttvsig
->ROOT
->INFO
->LEVEL
, tf
->INFO
->LEVEL
, TTV_STS_DUAL
, TTV_FILE_DTX
);
79 node
= &ttvsig
->NODE
[0];
81 node
= &ttvsig
->NODE
[1];
82 if((ptypenodevcdinfo
= getptype(node
->USER
, TTV_NODE_VCD_INFO
)) != NULL
){
83 prevsig
= ((ttvnode_vcd_info
*)ptypenodevcdinfo
->DATA
)->PREVSIG
;
87 for(line
= node
->INLINE
; line
; line
= line
->NEXT
){
88 if(line
->NODE
->ROOT
== prevsig
){
89 modmax
= stm_getmodel( tf
->INFO
->FIGNAME
, line
->MDMAX
);
92 if((ptypenodevcdinfo
= getptype(line
->NODE
->USER
, TTV_NODE_VCD_INFO
)) != NULL
){
93 slope
= ((ttvnode_vcd_info
*)ptypenodevcdinfo
->DATA
)->SLOPE
;
95 if( line
->TYPE
& ( TTV_LINE_F
| TTV_LINE_E
| TTV_LINE_D
) )
96 search
= TTV_FIND_LINE
;
98 search
= TTV_FIND_PATH
;
99 ttv_getnodeslope(tf
,NULL
,line
->NODE
, &slew
,search
);
100 slope
= slew
/TTV_UNIT
;
103 nrjmax
+= stm_energy_eval (modmax
, ttvsig
->CAPA
, stm_mod_shrinkslew_thr2scm( modmax
, slope
));
109 fprintf(ptf
,"%ld %s %s %g\n", vcd_get_time(), prevsig
->NAME
, ttvsig
->NAME
, nrjmax
) ;
111 transvcdpower
= (ttvtrans_vcd_power
*)mbkalloc(sizeof (struct ttvtrans_vcd_power
));
112 transvcdpower
->NEXT
= NULL
;
113 transvcdpower
->PREV
= NULL
;
114 transvcdpower
->SIG
= ttvsig
;
115 transvcdpower
->TIME
= vcd_get_time ();
116 transvcdpower
->NRJ
= (float)nrjmax
;
117 if((ptype
= getptype(ttvsig
->USER
, TTV_SIG_VCDPOWER
)) != NULL
){
118 for(tvp
= (ttvtrans_vcd_power
*)ptype
->DATA
; tvp
->NEXT
; tvp
= tvp
->NEXT
);
119 transvcdpower
->PREV
= tvp
;
120 tvp
->NEXT
= transvcdpower
;
122 ttvsig
->USER
= addptype(ttvsig
->USER
, TTV_SIG_VCDPOWER
, transvcdpower
);
124 if((ptype
= getptype(ttvsig
->ROOT
->USER
, TTV_FIG_VCDPOWER
)) != NULL
){
125 ptype
->DATA
= (void*)addchain((chain_list
*)ptype
->DATA
, transvcdpower
);
127 ttvsig
->ROOT
->USER
= addptype(ttvsig
->ROOT
->USER
, TTV_FIG_VCDPOWER
, addchain(NULL
, transvcdpower
));
131 consototale
+= nrjmax
;
134 // fprintf(stdout, "%s : %c : %g\n", ttvsig->NAME, value, nrjmax);
136 // vcd_add_trans_nrj((trans_list*)chain->DATA, nrjsig);
140 vcd_add_nrj((float)nrjtime
);
141 for (chain
= chainevents
; chain
; chain
= chain
->NEXT
){
142 for (chvcdsig
= cdl_geteventsig (chain
); chvcdsig
; chvcdsig
= chvcdsig
->NEXT
){
143 // signame = cdl_geteventsig (chain);
144 signame
= (char*)chvcdsig
->DATA
;
145 name
= mbk_devect(signame
, "(", ")");
146 signame
= ttv_revect(name
);
147 value
= cdl_geteventval (chain
);
148 if(value
=='0' || value
=='1'){
149 chainsigs
= ttv_get_signals_from_netname(tf
, &htsig
, signame
);
150 for(chsig
= chainsigs
; chsig
; chsig
= chsig
->NEXT
){
151 ttvsig
= (ttvsig_list
*)chsig
->DATA
;
152 if(!ttvsig
) continue;
153 ttv_expfigsig (tf
, ttvsig
, ttvsig
->ROOT
->INFO
->LEVEL
, tf
->INFO
->LEVEL
, TTV_STS_DUAL
, TTV_FILE_DTX
);
155 node
= &ttvsig
->NODE
[0];
157 node
= &ttvsig
->NODE
[1];
158 ptype
= getptype (node
->USER
, TTV_NODE_DUALLINE
);
160 for (ch
= (chain_list
*)ptype
->DATA
; ch
; ch
= ch
->NEXT
) {
161 line
= (ttvline_list
*)ch
->DATA
;
162 if (((line
->TYPE
& TTV_LINE_U
) != TTV_LINE_U
) && ((line
->TYPE
& TTV_LINE_O
) != TTV_LINE_O
) && ((line
->TYPE
& TTV_LINE_RC
) != TTV_LINE_RC
)) {
163 if((ptypenodevcdinfo
= getptype(line
->ROOT
->USER
, TTV_NODE_VCD_INFO
)) != NULL
){
164 if((((ttvnode_vcd_info
*)ptypenodevcdinfo
->DATA
)->TIME
!= vcd_get_time())
165 || ((((ttvnode_vcd_info
*)ptypenodevcdinfo
->DATA
)->TIME
== vcd_get_time()) && (line
->FMAX
/TTV_UNIT
> ((ttvnode_vcd_info
*)ptypenodevcdinfo
->DATA
)->SLOPE
))){
166 ((ttvnode_vcd_info
*)ptypenodevcdinfo
->DATA
)->PREVSIG
= ttvsig
;
167 ((ttvnode_vcd_info
*)ptypenodevcdinfo
->DATA
)->SLOPE
= (float)(line
->FMAX
/TTV_UNIT
);
168 ((ttvnode_vcd_info
*)ptypenodevcdinfo
->DATA
)->TIME
= vcd_get_time();
171 ttvnodevcdinfo
= (ttvnode_vcd_info
*)mbkalloc(sizeof (struct ttvnode_vcd_info
));
172 ttvnodevcdinfo
->TIME
= vcd_get_time();
173 ttvnodevcdinfo
->PREVSIG
= ttvsig
;
174 ttvnodevcdinfo
->SLOPE
= (float)(line
->FMAX
/TTV_UNIT
);
175 line
->ROOT
->USER
= addptype(line
->ROOT
->USER
, TTV_NODE_VCD_INFO
, ttvnodevcdinfo
);
179 /* chainsigs2 = ttv_get_signals_from_netname(tf, &htsig, line->ROOT->ROOT->NETNAME);
180 for(chsig2 = chainsigs2; chsig2; chsig2 = chsig2->NEXT){
181 if((ptypeprevsig = getptype(((ttvsig_list*)chsig2->DATA)->USER, TTV_SIG_VCD_PREV_SIG)) != NULL){
182 ptypeprevsig->DATA = ttvsig;
184 ((ttvsig_list*)chsig2->DATA)->USER = addptype(((ttvsig_list*)chsig2->DATA)->USER, TTV_SIG_VCD_PREV_SIG, ttvsig);
186 if((ptslope = getptype(((ttvsig_list*)chsig2->DATA)->USER, TTV_SIG_VCD_SLOPE)) != NULL){
187 *(float *)&ptslope->DATA=(float)(line->FMAX/TTV_UNIT);
189 ptslope = ((ttvsig_list*)chsig2->DATA)->USER = addptype(((ttvsig_list*)chsig2->DATA)->USER, TTV_SIG_VCD_SLOPE, NULL);
190 *(float *)&ptslope->DATA=(float)(line->FMAX/TTV_UNIT);
200 test
= vcd_goto_next_time ();
202 if((ptype
= getptype(tf
->USER
, TTV_FIG_VCDPOWER
)) != NULL
) ptype
->DATA
= reverse((chain_list
*)ptype
->DATA
);
203 ttv_free_signals_from_netname(htsig
);
206 // fprintf(stdout, "\nCONSO TOTALE: %g\n\n", consototale);
210 void DisplaySwitchingPower (void)
215 float nrj
, total
= 0.0;
218 b
=Board_CreateBoard();
219 Board_SetSize(b
, 0, 10, 'l');
220 Board_SetSize(b
, 1, 10, 'l');
222 Board_SetValue(b
, 0, "Time Date");
223 Board_SetValue(b
, 1, "Switching Power");
224 Board_NewSeparation(b
);
226 for (i
= 1; i
<= vcd_get_max_index(); i
++){
228 date
= vcd_get_time_from_index(i
);
229 nrj
= vcd_get_nrj_from_index(i
);
230 sprintf(buf
,"%d", date
);
231 Board_SetValue(b
, 0, buf
);
232 sprintf(buf
,"%g", nrj
);
233 Board_SetValue(b
, 1, buf
);
237 Board_NewSeparation(b
);
239 Board_SetValue(b
, 0, "Total");
240 sprintf(buf
,"%g", total
);
241 Board_SetValue(b
, 1, buf
);
243 Board_Display(stdout
, b
, "");
249 void DisplaySwitchingPowerSignal (TimingFigure
*tf
, char *signame
)
251 ttvtrans_vcd_power
*trans
;
257 chain_list
*chainsigs
, *chsig
;
261 b
=Board_CreateBoard();
262 Board_SetSize(b
, 0, 10, 'l');
263 Board_SetSize(b
, 1, 10, 'l');
264 Board_NewSeparation(b
);
266 Board_SetValue(b
, 0, signame
);
267 Board_SetValue(b
, 1, "");
268 Board_NewSeparation(b
);
270 Board_SetValue(b
, 0, "Time Date");
271 Board_SetValue(b
, 1, "Switching Power");
272 Board_NewSeparation(b
);
274 chainsigs
= ttv_get_signals_from_netname(tf
, &htsig
, namealloc(signame
));
275 for(chsig
= chainsigs
; chsig
; chsig
= chsig
->NEXT
){
276 ttvsig
= (ttvsig_list
*)chsig
->DATA
;
277 if((ptype
= getptype(ttvsig
->USER
, TTV_SIG_VCDPOWER
)) != NULL
){
278 for(trans
= (ttvtrans_vcd_power
*)ptype
->DATA
; trans
; trans
= trans
->NEXT
){
282 sprintf(buf
,"%d", date
);
283 Board_SetValue(b
, 0, buf
);
284 sprintf(buf
,"%g", nrj
);
285 Board_SetValue(b
, 1, buf
);
289 Board_NewSeparation(b
);
290 Board_Display(stdout
, b
, "");
293 ttv_free_signals_from_netname(htsig
);
297 float GetSwitchingPowerSignal_sub (TimingFigure
*tf
, char *signame
, double interval_d
, double begindate_d
, double enddate_d
, char *plot
)
299 ttvtrans_vcd_power
*trans
;
302 long date
, prevdate
= -1;
303 double nrj
, sumnrj
, totalnrj
;
305 chain_list
*chainsigs
, *chsig
, *chain
;
317 begindate
= mbk_long_round(begindate_d
/(vcd_get_ts()));
319 interval
= mbk_long_round(interval_d
/(vcd_get_ts()));
322 enddate
= mbk_long_round(enddate_d
/(vcd_get_ts()));
324 btime
= begindate
+ interval
;
326 b
=Board_CreateBoard();
327 Board_SetSize(b
, 0, 10, 'l');
328 Board_SetSize(b
, 1, 10, 'l');
330 if(!strcmp(signame
, "*")){
331 if((ptype
= getptype(tf
->USER
, TTV_FIG_VCDPOWER
)) != NULL
){
334 for(chain
= (chain_list
*)ptype
->DATA
; chain
; chain
= chain
->NEXT
){
335 trans
= (ttvtrans_vcd_power
*)chain
->DATA
;
337 if((interval
== 1) && (date
== prevdate
)){
342 if(date
<= begindate
) continue;
343 if((btime
- interval
) < begindate
|| (enddate
> 0 && (btime
- interval
) > enddate
)){
349 }else if(((interval
== 1) || sumnrj
!= 0.0 || (sumnrj
== 0.0 && interval
!= 1))
350 && (chain
->NEXT
&& ((ttvtrans_vcd_power
*)chain
->NEXT
->DATA
)->TIME
!= date
)){
353 sprintf(buf
,"%ld", date
);
355 sprintf(buf
,"%ld", btime
- interval
/2);
357 Board_SetValue(b
, 0, buf
);
359 sprintf(buf
,"%g", nrj
);
361 sprintf(buf
,"%g", sumnrj
/ interval
);
363 Board_SetValue(b
, 1, buf
);
372 if(!chain
->NEXT
|| (enddate
> 0 && date
> enddate
)){
376 sprintf(buf
,"%ld", date
);
378 sprintf(buf
,"%ld", btime
- interval
/2);
381 Board_SetValue(b
, 0, buf
);
383 sprintf(buf
,"%g", nrj
);
385 sprintf(buf
,"%g", sumnrj
/ interval
);
387 Board_SetValue(b
, 1, buf
);
394 chainsigs
= ttv_get_signals_from_netname(tf
, &htsig
, namealloc(signame
));
395 for(chsig
= chainsigs
; chsig
; chsig
= chsig
->NEXT
){
396 ttvsig
= (ttvsig_list
*)chsig
->DATA
;
397 if((ptype
= getptype(ttvsig
->USER
, TTV_SIG_VCDPOWER
)) != NULL
){
398 for(trans
= (ttvtrans_vcd_power
*)ptype
->DATA
; trans
; trans
= trans
->NEXT
){
399 if(trans
->TIME
> timemax
)
400 timemax
= trans
->TIME
;
404 nbelem
= (long)(timemax
/ interval
) + 1;
405 nrjtab
= (float*)mbkalloc (nbelem
* sizeof (float));
406 memset(nrjtab
, 0, nbelem
* sizeof (float));
407 for(chsig
= chainsigs
; chsig
; chsig
= chsig
->NEXT
){
408 ttvsig
= (ttvsig_list
*)chsig
->DATA
;
409 if((ptype
= getptype(ttvsig
->USER
, TTV_SIG_VCDPOWER
)) != NULL
){
410 for(trans
= (ttvtrans_vcd_power
*)ptype
->DATA
; trans
; trans
= trans
->NEXT
){
413 nrjtab
[(long)(date
/ interval
)] += nrj
;
418 for(index
= 0; index
< nbelem
; index
++){
419 if((index
* interval
) < begindate
|| (enddate
> 0 && (index
* interval
) > enddate
) || (nrjtab
[index
] == 0 && interval
== 1)) continue;
422 sprintf(buf
,"%ld", index
);
424 sprintf(buf
,"%ld", index
* interval
+ interval
/2);
426 Board_SetValue(b
, 0, buf
);
427 sprintf(buf
,"%g", nrjtab
[index
] / interval
);
428 Board_SetValue(b
, 1, buf
);
429 totalnrj
+= nrjtab
[index
];
433 if(strcmp(plot
, "NULL")){
434 // sprintf(buf,"%s_%ld", signame, interval);
435 ptf
= mbkfopen( plot
, "plt", WRITE_TEXT
);
436 fprintf(ptf
,"set origin 0,0\n") ;
437 fprintf(ptf
,"set xrange [0.0:*]\n") ;
438 fprintf(ptf
,"set yrange [0.0:*]\n") ;
439 fprintf(ptf
,"set xlabel \"TIME (PS)\"\n") ;
441 fprintf(ptf
,"set ylabel \"ENERGY (J)\"\n") ;
442 fprintf(ptf
,"plot '%s.dat' with impulses\n", plot
) ;
444 fprintf(ptf
,"set ylabel \"POWER (W)\"\n") ;
445 fprintf(ptf
,"plot '%s.dat' with boxes\n", plot
) ;
447 fprintf(ptf
,"pause -1 'Hit CR to finish'\n") ;
450 ptf
= mbkfopen( plot
, "dat", WRITE_TEXT
);
451 Board_Display(ptf
, b
, "");
456 ttv_free_signals_from_netname(htsig
);
459 return totalnrj
/ interval
;