1 /****************************************************************************/
3 /* Chaine de CAO & VLSI Alliance */
5 /* Produit : TAS Version 5 */
6 /* Fichier : tas_drislo.c */
8 /* (c) copyright 1991-1998 Laboratoire LIP6 equipe ASIM */
9 /* Tous droits reserves */
10 /* Support : e-mail alliance-support@asim.lip6.fr */
12 /* Auteur(s) : Payam KIANI */
15 /****************************************************************************/
16 /* driver des fronts */
17 /****************************************************************************/
21 /****************************************************************************/
22 /* fonction tas_drislo() */
23 /* pour driver les fronts de signaux */
24 /****************************************************************************/
25 int tas_drislo(cnsfig
,ttvfig
)
37 file
= mbkfopen(cnsfig
->NAME
,"slo",WRITE_TEXT
) ;
39 file
= mbkfopen(ttvfig
->INFO
->FIGNAME
,"slo",WRITE_TEXT
) ;
46 sprintf(straux
,"%s.slo",cnsfig
->NAME
) ;
48 sprintf(straux
,"%s.slo",ttvfig
->INFO
->FIGNAME
) ;
49 tas_error(8,straux
,TAS_WARNING
) ;
54 /* entete du fichier ".slo" */
55 sprintf(buffer
,"List of slopes : %s.slo\n",cnsfig
->NAME
);
56 avt_printExecInfo(file
, "#", buffer
, "");
60 for(locon
= cnsfig
->LOCON
; locon
!= NULL
; locon
= locon
->NEXT
)
62 ptype_list
*user
= getptype(locon
->USER
,TAS_SLOPE_MAX
) ;
63 ptype_list
*usermin
= getptype(locon
->USER
,TAS_SLOPE_MIN
) ;
67 front_list
*slope
= (front_list
*)user
->DATA
;
69 fprintf(file
,"locon (%s)\t: FUPMAX = ",locon
->NAME
) ;
70 if(slope
->FUP
== TAS_NOFRONT
) fprintf(file
,"NO SLOPE") ;
71 else fprintf(file
,"%ld",slope
->FUP
) ;
72 fprintf(file
,"\tFDOWNMAX = ") ;
73 if(slope
->FDOWN
== TAS_NOFRONT
) fprintf(file
,"NO SLOPE ;\n") ;
74 else fprintf(file
,"%ld ;\n",slope
->FDOWN
) ;
76 if(TAS_CONTEXT
->TAS_FIND_MIN
== 'Y')
80 front_list
*slope
= (front_list
*)usermin
->DATA
;
82 fprintf(file
,"locon (%s)\t: FUPMIN = ",locon
->NAME
) ;
83 if(slope
->FUP
== TAS_NOFRONT
) fprintf(file
,"NO SLOPE") ;
84 else fprintf(file
,"%ld",slope
->FUP
) ;
85 fprintf(file
,"\tFDOWNMIN = ") ;
86 if(slope
->FDOWN
== TAS_NOFRONT
) fprintf(file
,"NO SLOPE ;\n") ;
87 else fprintf(file
,"%ld ;\n",slope
->FDOWN
) ;
91 for(cone
= cnsfig
->CONE
; cone
!= NULL
; cone
= cone
->NEXT
)
93 ptype_list
*user
= getptype(cone
->USER
,TAS_SLOPE_MAX
) ;
94 ptype_list
*usermin
= getptype(cone
->USER
,TAS_SLOPE_MIN
) ;
98 front_list
*slope
= (front_list
*)user
->DATA
;
100 fprintf(file
,"cone (%s)\t: FUPMAX = ",cone
->NAME
) ;
101 if(slope
->FUP
== TAS_NOFRONT
) fprintf(file
,"NO SLOPE") ;
102 else fprintf(file
,"%ld",slope
->FUP
) ;
103 fprintf(file
,"\tFDOWNMAX = ") ;
104 if(slope
->FDOWN
== TAS_NOFRONT
) fprintf(file
,"NO SLOPE ;\n") ;
105 else fprintf(file
,"%ld ;\n",slope
->FDOWN
) ;
107 if(TAS_CONTEXT
->TAS_FIND_MIN
== 'Y')
111 front_list
*slope
= (front_list
*)usermin
->DATA
;
113 fprintf(file
,"cone (%s)\t: FUPMIN = ",cone
->NAME
) ;
114 if(slope
->FUP
== TAS_NOFRONT
) fprintf(file
,"NO SLOPE") ;
115 else fprintf(file
,"%ld",slope
->FUP
) ;
116 fprintf(file
,"\tFDOWNMIN = ") ;
117 if(slope
->FDOWN
== TAS_NOFRONT
) fprintf(file
,"NO SLOPE ;\n") ;
118 else fprintf(file
,"%ld ;\n",slope
->FDOWN
) ;
121 for(incone
= cone
->INCONE
; incone
!= NULL
; incone
= incone
->NEXT
)
123 user
= getptype(incone
->USER
,TAS_SLOPE_MAX
) ;
124 usermin
= getptype(incone
->USER
,TAS_SLOPE_MIN
) ;
127 front_list
*slope
= (front_list
*)user
->DATA
;
129 fprintf(file
,"cone (%s)\t input (%s)\t: FUPMAX = ",cone
->NAME
,
130 ((incone
->TYPE
& CNS_EXT
) == CNS_EXT
) ? incone
->UEDGE
.LOCON
->NAME
:
131 incone
->UEDGE
.CONE
->NAME
) ;
132 if(slope
->FUP
== TAS_NOFRONT
) fprintf(file
,"NO SLOPE") ;
133 else fprintf(file
,"%ld",slope
->FUP
) ;
134 fprintf(file
,"\tFDOWNMAX = ") ;
135 if(slope
->FDOWN
== TAS_NOFRONT
) fprintf(file
,"NO SLOPE ;\n") ;
136 else fprintf(file
,"%ld ;\n",slope
->FDOWN
) ;
138 if(TAS_CONTEXT
->TAS_FIND_MIN
== 'Y')
142 front_list
*slope
= (front_list
*)usermin
->DATA
;
144 fprintf(file
,"cone (%s)\t input (%s)\t : FUPMIN = ",cone
->NAME
,
145 ((incone
->TYPE
& CNS_EXT
) == CNS_EXT
) ? incone
->UEDGE
.LOCON
->NAME
:
146 incone
->UEDGE
.CONE
->NAME
) ;
147 if(slope
->FUP
== TAS_NOFRONT
) fprintf(file
,"NO SLOPE") ;
148 else fprintf(file
,"%ld",slope
->FUP
) ;
149 fprintf(file
,"\tFDOWNMIN = ") ;
150 if(slope
->FDOWN
== TAS_NOFRONT
) fprintf(file
,"NO SLOPE ;\n") ;
151 else fprintf(file
,"%ld ;\n",slope
->FDOWN
) ;
157 else if(ttvfig
!= NULL
)
166 for(i
= 0 ; i
< ttvfig
->NBCONSIG
; i
++)
167 chain
= addchain(chain
,(void*)(*(ttvfig
->CONSIG
+ i
))) ;
169 for(i
= 0 ; i
< ttvfig
->NBNCSIG
; i
++)
170 chain
= addchain(chain
,(void*)(*(ttvfig
->NCSIG
+ i
))) ;
172 for(i
= 0 ; i
< ttvfig
->NBILCMDSIG
; i
++)
173 if(((*(ttvfig
->ILCMDSIG
+ i
))->ROOT
== ttvfig
) &&
174 (((*(ttvfig
->ILCMDSIG
+ i
))->TYPE
& (TTV_SIG_N
| TTV_SIG_C
)) == 0))
175 chain
= addchain(chain
,(void*)(*(ttvfig
->ILCMDSIG
+ i
))) ;
177 for(i
= 0 ; i
< ttvfig
->NBELCMDSIG
; i
++)
178 if(((*(ttvfig
->ELCMDSIG
+ i
))->ROOT
== ttvfig
) &&
179 (((*(ttvfig
->ELCMDSIG
+ i
))->TYPE
& (TTV_SIG_N
| TTV_SIG_C
)) == 0))
180 chain
= addchain(chain
,(void*)(*(ttvfig
->ELCMDSIG
+ i
))) ;
182 for(i
= 0 ; i
< ttvfig
->NBILATCHSIG
; i
++)
183 if(((*(ttvfig
->ILATCHSIG
+ i
))->ROOT
== ttvfig
) &&
184 (((*(ttvfig
->ILATCHSIG
+ i
))->TYPE
& (TTV_SIG_N
| TTV_SIG_C
)) == 0))
185 chain
= addchain(chain
,(void*)(*(ttvfig
->ILATCHSIG
+ i
))) ;
187 for(i
= 0 ; i
< ttvfig
->NBELATCHSIG
; i
++)
188 if(((*(ttvfig
->ELATCHSIG
+ i
))->ROOT
== ttvfig
) &&
189 (((*(ttvfig
->ELATCHSIG
+ i
))->TYPE
& (TTV_SIG_N
| TTV_SIG_C
)) == 0))
190 chain
= addchain(chain
,(void*)(*(ttvfig
->ELATCHSIG
+ i
))) ;
192 for(i
= 0 ; i
< ttvfig
->NBIPRESIG
; i
++)
193 if(((*(ttvfig
->IPRESIG
+ i
))->ROOT
== ttvfig
) &&
194 (((*(ttvfig
->IPRESIG
+ i
))->TYPE
& (TTV_SIG_N
| TTV_SIG_C
)) == 0))
195 chain
= addchain(chain
,(void*)(*(ttvfig
->IPRESIG
+ i
))) ;
197 for(i
= 0 ; i
< ttvfig
->NBEPRESIG
; i
++)
198 if(((*(ttvfig
->EPRESIG
+ i
))->ROOT
== ttvfig
) &&
199 (((*(ttvfig
->EPRESIG
+ i
))->TYPE
& (TTV_SIG_N
| TTV_SIG_C
)) == 0))
200 chain
= addchain(chain
,(void*)(*(ttvfig
->EPRESIG
+ i
))) ;
202 for(i
= 0 ; i
< ttvfig
->NBINTSIG
; i
++)
203 if((*(ttvfig
->INTSIG
+ i
))->ROOT
== ttvfig
)
204 chain
= addchain(chain
,(void*)(*(ttvfig
->INTSIG
+ i
))) ;
206 for(i
= 0 ; i
< ttvfig
->NBEXTSIG
; i
++)
207 if((*(ttvfig
->EXTSIG
+ i
))->ROOT
== ttvfig
)
208 chain
= addchain(chain
,(void*)(*(ttvfig
->EXTSIG
+ i
))) ;
210 for(i
= 0 ; i
< ttvfig
->NBESIG
; i
++)
211 if((*(ttvfig
->ESIG
+ i
))->ROOT
== ttvfig
)
212 chain
= addchain(chain
,(void*)(*(ttvfig
->ESIG
+ i
))) ;
214 if(ttvfig
->NBISIG
!= 0)
219 ttvsbloc_list
*ptsbloc
= ttvfig
->ISIG
;
220 nbfree
= (TTV_MAX_SBLOC
- (ttvfig
->NBISIG
% TTV_MAX_SBLOC
))
222 nbend
= ttvfig
->NBISIG
+ nbfree
;
223 for(i
= nbfree
; i
< nbend
; i
++)
225 j
= i
% TTV_MAX_SBLOC
;
226 if((j
== 0) && (i
!= 0)) ptsbloc
= ptsbloc
->NEXT
;
227 chain
= addchain(chain
,(void*)(ptsbloc
->SIG
+ j
)) ;
231 for(chainx
= chain
; chainx
!= NULL
; chainx
= chainx
->NEXT
)
233 ptsig
= (ttvsig_list
*)chainx
->DATA
;
234 if(TAS_CONTEXT
->TAS_FIND_MIN
== 'Y')
241 if(fclose(file
) != 0)
246 sprintf(straux
,"%s.slo",cnsfig
->NAME
) ;
248 sprintf(straux
,"%s.slo",ttvfig
->INFO
->FIGNAME
) ;
250 tas_error(10,straux
,TAS_WARNING
) ;
257 /****************************************************************************/
258 /* fonction tas_drivrcfile() */
259 /* driver les delais rc des portes */
260 /****************************************************************************/
261 int tas_drivrcfile(cnsfig
)
262 cnsfig_list
*cnsfig
;
268 delay_list
*delaymin
;
269 delay_list
*delaymax
;
283 file
= mbkfopen(TAS_CONTEXT
->TAS_RC_FILE
,"rc",WRITE_TEXT
) ;
291 sprintf(straux
,"%s.rc",TAS_CONTEXT
->TAS_RC_FILE
) ;
292 tas_error(8,straux
,TAS_WARNING
) ;
299 sprintf(buffer
,"List of interconnect delays : %s.rc\n",cnsfig
->NAME
);
300 avt_printExecInfo(file
, "#", buffer
, "");
302 fprintf(file
,"\n\n") ;
304 for(cone
= cnsfig
->CONE
; cone
!= NULL
; cone
= cone
->NEXT
)
308 for(incone
= cone
->INCONE
; incone
!= NULL
; incone
= incone
->NEXT
)
310 if((incone
->TYPE
& (CNS_FEEDBACK
| CNS_VDD
| CNS_VSS
|
311 CNS_BLEEDER
| TAS_PATH_INOUT
| TAS_EXT_IN
| TAS_EXT_OUT
)) != 0)
316 if((incone
->TYPE
& CNS_EXT
) == CNS_EXT
)
318 name1
= incone
->UEDGE
.LOCON
->NAME
;
319 if(incone
->UEDGE
.LOCON
->DIRECTION
== CNS_I
)
320 type1
= "CONNECTOR" ;
326 if((incone
->UEDGE
.CONE
->TYPE
& CNS_EXT
) == CNS_EXT
)
330 cl
=cns_get_cone_external_connectors(incone
->UEDGE
.CONE
);
331 // ptype = getptype(incone->UEDGE.CONE->USER,CNS_EXT) ;
332 if(cl
!=NULL
/*ptype != NULL*/)
333 if(((locon_list
*)cl
->DATA
)->DIRECTION
!= CNS_I
)
338 name1
= incone
->UEDGE
.CONE
->NAME
;
341 timemax
= TAS_NOTIME
;
342 timemin
= TAS_NOTIME
;
343 if((ptype
= getptype(incone
->USER
,TAS_DELAY_MIN
)) != NULL
)
345 delay
= (delay_list
*)ptype
->DATA
;
347 if(((delay
->RCLL
!= TAS_NOTIME
) && ((delay
->TPLH
!= TAS_NOTIME
) ||
348 (delay
->TPLL
!= TAS_NOTIME
) ||
349 ((incone
->TYPE
& CNS_COMMAND
) == CNS_COMMAND
))) ||
350 ((delay
->RCHH
!= TAS_NOTIME
) && ((delay
->TPHL
!= TAS_NOTIME
) ||
351 (delay
->TPHH
!= TAS_NOTIME
) ||
352 ((incone
->TYPE
& CNS_COMMAND
) == CNS_COMMAND
))))
354 if(delay
->RCLL
!= TAS_NOTIME
)
355 timemin
= delay
->RCLL
;
357 timemin
= delay
->RCHH
;
361 if((ptype
= getptype(incone
->USER
,TAS_DELAY_MAX
)) != NULL
)
363 delay
= (delay_list
*)ptype
->DATA
;
365 if(((delay
->RCLL
!= TAS_NOTIME
) && ((delay
->TPLH
!= TAS_NOTIME
) ||
366 (delay
->TPLL
!= TAS_NOTIME
) ||
367 ((incone
->TYPE
& CNS_COMMAND
) == CNS_COMMAND
))) ||
368 ((delay
->RCHH
!= TAS_NOTIME
) && ((delay
->TPHL
!= TAS_NOTIME
) ||
369 (delay
->TPHH
!= TAS_NOTIME
) ||
370 ((incone
->TYPE
& CNS_COMMAND
) == CNS_COMMAND
))))
372 if(delay
->RCLL
!= TAS_NOTIME
)
373 timemax
= delay
->RCLL
;
375 timemax
= delay
->RCHH
;
381 fprintf(file
,"%s %s %s %s ",type1
,name1
,type2
,name2
) ;
382 if(timemin
!= TAS_NOTIME
)
383 fprintf(file
,"TRCMIN=%ld ",timemin
) ;
384 if(timemax
!= TAS_NOTIME
)
385 fprintf(file
,"TRCMAX=%ld ",timemax
) ;
388 if((delaymin
!= NULL
) && ((incone
->TYPE
& CNS_COMMAND
) != CNS_COMMAND
))
391 ((delaymin
->TPLH
!= TAS_NOTIME
) || (delaymin
->TPLL
!= TAS_NOTIME
) ||
392 (delaymin
->TPHL
!= TAS_NOTIME
) || (delaymin
->TPHH
!= TAS_NOTIME
)))
394 fprintf(file
,"%s %s %s %s ",type1
,name1
,type2
,name2
) ;
397 if((delaymin
->SHH
!= TAS_NOS
) && (delaymin
->TPHH
!= TAS_NOTIME
))
398 fprintf(file
,"SUUMIN=%ld ",delaymin
->SHH
) ;
399 if((delaymin
->SLH
!= TAS_NOS
) && (delaymin
->TPLH
!= TAS_NOTIME
))
400 fprintf(file
,"SDUMIN=%ld ",delaymin
->SLH
) ;
401 if((delaymin
->SHL
!= TAS_NOS
) && (delaymin
->TPHL
!= TAS_NOTIME
))
402 fprintf(file
,"SUDMIN=%ld ",delaymin
->SHL
) ;
403 if((delaymin
->SLL
!= TAS_NOS
) && (delaymin
->TPLL
!= TAS_NOTIME
))
404 fprintf(file
,"SDDMIN=%ld ",delaymin
->SLL
) ;
405 if((delaymin
->RHH
!= TAS_NORES
) && (delaymin
->TPHH
!= TAS_NOTIME
))
406 fprintf(file
,"RUUMIN=%ld ",delaymin
->RHH
) ;
407 if((delaymin
->RLH
!= TAS_NORES
) && (delaymin
->TPLH
!= TAS_NOTIME
))
408 fprintf(file
,"RDUMIN=%ld ",delaymin
->RLH
) ;
409 if((delaymin
->RHL
!= TAS_NORES
) && (delaymin
->TPHL
!= TAS_NOTIME
))
410 fprintf(file
,"RUDMIN=%ld ",delaymin
->RHL
) ;
411 if((delaymin
->RLL
!= TAS_NORES
) && (delaymin
->TPLL
!= TAS_NOTIME
))
412 fprintf(file
,"RDDMIN=%ld ",delaymin
->RLL
) ;
415 if((delay
!= NULL
) && ((incone
->TYPE
& CNS_COMMAND
) != CNS_COMMAND
))
418 ((delay
->TPLH
!= TAS_NOTIME
) || (delay
->TPLL
!= TAS_NOTIME
) ||
419 (delay
->TPHL
!= TAS_NOTIME
) || (delay
->TPHH
!= TAS_NOTIME
)))
421 fprintf(file
,"%s %s %s %s ",type1
,name1
,type2
,name2
) ;
424 if((delay
->SHH
!= TAS_NOS
) && (delay
->TPHH
!= TAS_NOTIME
))
425 fprintf(file
,"SUUMAX=%ld ",delay
->SHH
) ;
426 if((delay
->SLH
!= TAS_NOS
) && (delay
->TPLH
!= TAS_NOTIME
))
427 fprintf(file
,"SDUMAX=%ld ",delay
->SLH
) ;
428 if((delay
->SHL
!= TAS_NOS
) && (delay
->TPHL
!= TAS_NOTIME
))
429 fprintf(file
,"SUDMAX=%ld ",delay
->SHL
) ;
430 if((delay
->SLL
!= TAS_NOS
) && (delay
->TPLL
!= TAS_NOTIME
))
431 fprintf(file
,"SDDMAX=%ld ",delay
->SLL
) ;
432 if((delay
->RHH
!= TAS_NORES
) && (delay
->TPHH
!= TAS_NOTIME
))
433 fprintf(file
,"RUUMAX=%ld ",delay
->RHH
) ;
434 if((delay
->RLH
!= TAS_NORES
) && (delay
->TPLH
!= TAS_NOTIME
))
435 fprintf(file
,"RDUMAX=%ld ",delay
->RLH
) ;
436 if((delay
->RHL
!= TAS_NORES
) && (delay
->TPHL
!= TAS_NOTIME
))
437 fprintf(file
,"RUDMAX=%ld ",delay
->RHL
) ;
438 if((delay
->RLL
!= TAS_NORES
) && (delay
->TPLL
!= TAS_NOTIME
))
439 fprintf(file
,"RDDMAX=%ld ",delay
->RLL
) ;
443 fprintf(file
,";\n") ;
445 timemax
= TAS_NOTIME
;
446 timemin
= TAS_NOTIME
;
448 if(((ptype
= getptype(incone
->USER
,TAS_DELAY_MINT
)) != NULL
) &&
451 delay
= (delay_list
*)ptype
->DATA
;
453 if(((delay
->RCLL
!= TAS_NOTIME
) && ((delaymin
->TPLH
!= TAS_NOTIME
) ||
454 (delaymin
->TPLL
!= TAS_NOTIME
) ||
455 ((incone
->TYPE
& CNS_COMMAND
) == CNS_COMMAND
))) ||
456 ((delay
->RCHH
!= TAS_NOTIME
) && ((delaymin
->TPHL
!= TAS_NOTIME
) ||
457 (delaymin
->TPHH
!= TAS_NOTIME
) ||
458 ((incone
->TYPE
& CNS_COMMAND
) == CNS_COMMAND
))))
460 if(delay
->RCLL
!= TAS_NOTIME
)
461 timemin
= delay
->RCLL
;
463 timemin
= delay
->RCHH
;
467 if(((ptype
= getptype(incone
->USER
,TAS_DELAY_MAXT
)) != NULL
) &&
470 delay
= (delay_list
*)ptype
->DATA
;
471 if(((delay
->RCLL
!= TAS_NOTIME
) && ((delaymax
->TPLH
!= TAS_NOTIME
) ||
472 (delaymax
->TPLL
!= TAS_NOTIME
) ||
473 ((incone
->TYPE
& CNS_COMMAND
) == CNS_COMMAND
))) ||
474 ((delay
->RCHH
!= TAS_NOTIME
) && ((delaymax
->TPHL
!= TAS_NOTIME
) ||
475 (delaymax
->TPHH
!= TAS_NOTIME
) ||
476 ((incone
->TYPE
& CNS_COMMAND
) == CNS_COMMAND
))))
478 if(delay
->RCLL
!= TAS_NOTIME
)
479 timemax
= delay
->RCLL
;
481 timemax
= delay
->RCHH
;
487 fprintf(file
,"CONNECTOR %s %s %s ",name1
,type2
,name2
) ;
488 if(timemin
!= TAS_NOTIME
)
489 fprintf(file
,"TRCMIN=%ld ",timemin
) ;
490 if(timemax
!= TAS_NOTIME
)
491 fprintf(file
,"TRCMAX=%ld ",timemax
) ;
492 fprintf(file
,";\n") ;
497 for(locon
= cnsfig
->LOCON
; locon
!= NULL
; locon
= locon
->NEXT
)
499 name2
= locon
->NAME
;
502 name1
= locon
->NAME
;
504 timemax
= TAS_NOTIME
;
505 timemin
= TAS_NOTIME
;
506 if((ptype
= getptype(locon
->USER
,TAS_DELAY_MIN
)) != NULL
)
508 delay
= (delay_list
*)ptype
->DATA
;
509 if((delay
->RCLL
!= TAS_NOTIME
) || (delay
->RCHH
!= TAS_NOTIME
))
511 if(delay
->RCLL
!= TAS_NOTIME
)
512 timemin
= delay
->RCLL
;
514 timemin
= delay
->RCHH
;
518 if((ptype
= getptype(locon
->USER
,TAS_DELAY_MAX
)) != NULL
)
520 delay
= (delay_list
*)ptype
->DATA
;
521 if((delay
->RCLL
!= TAS_NOTIME
) || (delay
->RCHH
!= TAS_NOTIME
))
523 if(delay
->RCLL
!= TAS_NOTIME
)
524 timemax
= delay
->RCLL
;
526 timemax
= delay
->RCHH
;
532 fprintf(file
,"%s %s %s %s ",type1
,name1
,type2
,name2
) ;
533 if(timemin
!= TAS_NOTIME
)
534 fprintf(file
,"TRCMIN=%ld ",timemin
) ;
535 if(timemax
!= TAS_NOTIME
)
536 fprintf(file
,"TRCMAX=%ld ",timemax
) ;
537 fprintf(file
,";\n") ;
541 if(fclose(file
) != 0)
545 sprintf(straux
,"%s.rc",TAS_CONTEXT
->TAS_RC_FILE
) ;
546 tas_error(10,straux
,TAS_WARNING
) ;