2 /****************************************************************************/
4 /* Chaine de CAO & VLSI Alliance */
6 /* Produit : TTV Version 1 */
7 /* Fichier : ttv_critic.c */
9 /* (c) copyright 1995-1998 Laboratoire LIP6 equipe ASIM */
10 /* Tous droits reserves */
11 /* Support : e-mail alliance-support@asim.lip6.fr */
13 /* Auteur(s) : Karim DIOURY */
15 /****************************************************************************/
16 /* recherche des chemins critique dans une ttvfig */
17 /****************************************************************************/
19 #define SPEED_UP_ACCESS_ALL
20 //#define SPEED_UP_ACCESS_CRITIC //not done yet
26 #define SAVE_ALL_LATCH_TAG 1
27 #define SAVE_ALL_INPUT_TAG 2
28 #define SAVE_ALL_TAG (SAVE_ALL_LATCH_TAG|SAVE_ALL_INPUT_TAG)
30 #define TTV_LOW_RATIO 0.8
31 #define TTV_HIGH_RATIO 1.2
33 chain_list
*TTV_FIFO_HEAD
= NULL
;
34 chain_list
*TTV_FIFO_UP
= NULL
;
35 chain_list
*TTV_FIFO_B
= NULL
;
36 chain_list
*TTV_FIFO_SAV
= NULL
;
37 char TTV_FIFO_NUM
= (char)0 ;
38 chain_list
*TTV_CHAIN_CLOCK
= NULL
;
39 static chain_list
*TTV_CHAIN_FREE
= NULL
;
40 static char TTV_FIND_ALLPATH
= 'N' ;
41 static char TTV_FIND_BUILD
= 'Y' ;
42 static long TTV_EXCLUDE_TYPE_START
=0, TTV_EXCLUDE_TYPE_END
=0;
43 static chain_list
*MARKED_SIG_LIST
=NULL
;
44 chain_list
*TTV_EXPLICIT_CLOCK_NODES
=NULL
, *TTV_EXPLICIT_START_NODES
=NULL
, *TTV_EXPLICIT_END_NODES
=NULL
;
45 int TTV_MARK_MODE
=0, TTV_QUIET_MODE
=1;
46 static int TTV_SEARCH_INFORMATIONS
;
47 static chain_list
*TTV_CHARAC_CRITIC_SLOPES_LIST
=NULL
, *TTV_CHARAC_CRITIC_CAPAS_LIST
=NULL
;
48 static chain_list
*TTV_CHARAC_CRITIC_RESULT_DELAYS
=NULL
, *TTV_CHARAC_CRITIC_RESULT_SLOPES
=NULL
, *TTV_CHARAC_CRITIC_RESULT_ENERGY
=NULL
;
49 static ttvevent_list
*TTV_SEARCH_FIRST_NODE
;
50 static chain_list
*TTV_CRITIC_PARA_SEARCH
=NULL
;
52 long TTV_MORE_SEARCH_OPTIONS
=0;
54 #define TTV_SEARCH_STEP_IN_CLOCK_PATH 1
55 static long TTV_SEARCH_STEP
=0;
57 void ttv_allocpathmodel_propagate (ttvfig_list
*ttvfig
, ttvfig_list
*insfig
, ttvevent_list
*node
, ttvevent_list
*root
, ttvpath_list
*path
, long type
);
62 ttvpath_list
*before_paths
;
65 static LOCAL_SORT_INFO inner_sort_info
, upper_sort_info
;
67 void ttv_set_ttv_getpath_clock_list(chain_list
*lst
)
72 void ttv_reset_search_informations()
74 TTV_SEARCH_INFORMATIONS
=0;
77 long ttv_get_search_informations()
79 return TTV_SEARCH_INFORMATIONS
;
82 void ttv_search_mode(int set
, long mask
)
85 TTV_MORE_SEARCH_OPTIONS
|=mask
;
87 TTV_MORE_SEARCH_OPTIONS
&=~mask
;
90 void ttv_activate_multi_cmd_critic_mode(int val
)
93 TTV_MORE_SEARCH_OPTIONS
|=TTV_MORE_OPTIONS_MULTIPLE_COMMAND_CRITIC_ACCESS
;
95 TTV_MORE_SEARCH_OPTIONS
&=~TTV_MORE_OPTIONS_MULTIPLE_COMMAND_CRITIC_ACCESS
;
98 void ttv_activate_multi_end_cmd_critic_mode(int val
)
101 TTV_MORE_SEARCH_OPTIONS
|=TTV_MORE_OPTIONS_DIFF_ENDING_CRITIC_COMMAND
;
103 TTV_MORE_SEARCH_OPTIONS
&=~TTV_MORE_OPTIONS_DIFF_ENDING_CRITIC_COMMAND
;
106 void ttv_activate_real_access_mode(int val
)
109 TTV_MORE_SEARCH_OPTIONS
|=TTV_MORE_OPTIONS_REAL_ACCESS
;
111 TTV_MORE_SEARCH_OPTIONS
&=~TTV_MORE_OPTIONS_REAL_ACCESS
;
114 void ttv_activate_path_and_access_mode(int val
)
117 TTV_MORE_SEARCH_OPTIONS
|=TTV_MORE_OPTIONS_PATH_AND_ACCESS
;
119 TTV_MORE_SEARCH_OPTIONS
&=~TTV_MORE_OPTIONS_PATH_AND_ACCESS
;
122 void ttv_activate_simple_critic(int val
)
125 TTV_MORE_SEARCH_OPTIONS
|=TTV_MORE_OPTIONS_SIMPLE_CRITIC
;
127 TTV_MORE_SEARCH_OPTIONS
&=~TTV_MORE_OPTIONS_SIMPLE_CRITIC
;
130 void ttv_activate_search_charac_mode(chain_list
*slopes_in
, chain_list
*capas_in
)
132 TTV_CHARAC_CRITIC_SLOPES_LIST
=slopes_in
;
133 TTV_CHARAC_CRITIC_CAPAS_LIST
=capas_in
;
134 TTV_CHARAC_CRITIC_RESULT_DELAYS
=NULL
;
137 void ttv_retreive_search_charac_results(chain_list
**delays
, chain_list
**slopes
, chain_list
**energy
)
139 *delays
=TTV_CHARAC_CRITIC_RESULT_DELAYS
;
140 *slopes
=TTV_CHARAC_CRITIC_RESULT_SLOPES
;
141 *energy
=TTV_CHARAC_CRITIC_RESULT_ENERGY
;
142 TTV_CHARAC_CRITIC_SLOPES_LIST
=NULL
;
143 TTV_CHARAC_CRITIC_CAPAS_LIST
=NULL
;
144 TTV_CHARAC_CRITIC_RESULT_DELAYS
=NULL
;
147 /* fonction qui test L<O<=R en modulo */
148 static inline int greater_lowerequal(char L
, char O
, char R
)
150 if (R
>L
) return L
<O
&& O
<=R
;
154 /* fonction qui test L>O>=R en modulo */
155 static inline int lower_greaterequal(char L
, char O
, char R
)
157 if (R
<L
) return R
<=O
&& O
<L
;
161 void ttv_set_search_exclude_type(long typestart
, long typeend
, long *oldstart
, long *oldend
)
163 *oldstart
=TTV_EXCLUDE_TYPE_START
;
164 *oldend
=TTV_EXCLUDE_TYPE_END
;
165 if (typestart
!=-1) TTV_EXCLUDE_TYPE_START
=typestart
;
166 if (typeend
!=-1) TTV_EXCLUDE_TYPE_END
=typeend
;
169 static chain_list
*namefromsig(ttvfig_list
*tvf
, chain_list
*sigs
)
175 ttv_getsigname(tvf
,buf
,(ttvsig_list
*)sigs
->DATA
);
176 cl
=addchain(cl
, namealloc(buf
));
182 int ttv_must_be_excluded(ttvsig_list
*tvs
, long excludeflag
, int exclude_not_clockcommand
)
184 if (exclude_not_clockcommand
&& (tvs
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
|TTV_SIG_Q
))==TTV_SIG_Q
&& getptype(tvs
->USER
, TTV_SIG_CLOCK
)==NULL
)
186 if (excludeflag
==0) return 0;
187 if ((tvs
->TYPE
& excludeflag
)!=0)
189 if ((tvs
->TYPE
& TTV_SIG_L
)==0) return 1;
190 excludeflag
&=TTV_SIG_LL
|TTV_SIG_LF
|TTV_SIG_LR
|TTV_SIG_LS
|TTV_SIG_LSL
;
191 excludeflag
&=~TTV_SIG_LL
;
192 if ((tvs
->TYPE
& excludeflag
)!=0) return 1;
193 // cas de ttv_sig_l tout seul
194 if ((tvs
->TYPE
& TTV_SIG_LF
)!=TTV_SIG_LF
195 && (tvs
->TYPE
& TTV_SIG_LR
)!=TTV_SIG_LR
196 && (tvs
->TYPE
& TTV_SIG_LS
)!=TTV_SIG_LS
197 && excludeflag
==0) return 1;
202 chain_list
*ttv_apply_exclude_flag(chain_list
*cl
, long excludeflag
, int exclude_not_clockcommand
)
204 chain_list
*newchain
;
205 if (excludeflag
==0 && exclude_not_clockcommand
==0) return cl
;
209 if (!ttv_must_be_excluded((ttvsig_list
*)cl
->DATA
, excludeflag
, exclude_not_clockcommand
))
210 newchain
=addchain(newchain
, cl
->DATA
);
216 static chain_list
*ttv_remove_connector_B(chain_list
*cl
)
218 chain_list
*newchain
;
223 tvs
=(ttvsig_list
*)cl
->DATA
;
224 if ((tvs
->TYPE
& TTV_SIG_CB
)!=TTV_SIG_CB
||
225 (tvs
->TYPE
& TTV_SIG_L
)==TTV_SIG_L
||
226 (tvs
->TYPE
& TTV_SIG_R
)==TTV_SIG_R
)
227 newchain
=addchain(newchain
, cl
->DATA
);
233 static void ttv_clean_critic_para_nodes()
236 while (TTV_CRITIC_PARA_SEARCH
!=NULL
)
238 tve
=(ttvevent_list
*)TTV_CRITIC_PARA_SEARCH
->DATA
;
239 tve
->USER
=testanddelptype(tve
->USER
, TTV_NODE_CRITIC_PARA_INFO
);
240 TTV_CRITIC_PARA_SEARCH
=delchain(TTV_CRITIC_PARA_SEARCH
, TTV_CRITIC_PARA_SEARCH
);
244 /*****************************************************************************/
245 /* function ttv_getinittime() */
248 /* dit ce que doit faire la recherche pour un connecteur */
249 /*****************************************************************************/
250 long ttv_getinittime(ttvfig_list
*ttvfig
,ttvevent_list
*event
, char phaseevent
, long type
, char phasefilter
, char *foundphase
)
255 if (TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_USE_DATA_START
) mode
|=1;
256 if (TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_USE_CLOCK_START
) mode
|=2;
258 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
259 stb_getdelayedge(stb_getstbfig(ttvfig
),event
,phaseevent
,&time
,NULL
, phasefilter
, mode
, foundphase
, NULL
) ;
261 stb_getdelayedge(stb_getstbfig(ttvfig
),event
,phaseevent
,NULL
,&time
, phasefilter
, mode
, NULL
, foundphase
) ;
263 if(time
== TTV_NOTIME
)
269 //----- fonction pour les marquages en vue de detection des boucles ----------
270 inline int ttv_isbypassednode(ttvevent_list
*ev
)
272 if (ev
->FIND
==NULL
|| (ev
->FIND
->TYPE
& TTV_FIND_BYPASS
)==0) return 0;
276 inline void ttv_bypassnode(ttvevent_list
*ev
)
278 ev
->FIND
->TYPE
|=TTV_FIND_BYPASS
;
281 inline void ttv_donotbypassnode(ttvevent_list
*ev
)
283 ev
->FIND
->TYPE
&=~TTV_FIND_BYPASS
;
286 static int ttv_check_node_on_path(ttvfig_list
*ttvfig
, ttvevent_list
*root
, ttvevent_list
*node
, long type
, ttvevent_list
*nodetofind
)
288 ttvevent_list
*nodex
;
293 if((type
& TTV_FIND_DUAL
) != TTV_FIND_DUAL
)
295 if (nodex
==nodetofind
) return 1;
296 if((nodex
->FIND
->OUTLINE
== NULL
) &&
297 ((ptype
= getptype(nodex
->USER
,TTV_NODE_LATCH
)) != NULL
))
299 nodex
= (ttvevent_list
*)ptype
->DATA
;
300 if (nodex
==nodetofind
) return 1;
303 while(nodex
->FIND
->OUTLINE
!= NULL
)
305 nodex
= nodex
->FIND
->OUTLINE
->ROOT
;
306 if((nodex
->FIND
->OUTLINE
== NULL
) &&
307 ((ptype
= getptype(nodex
->USER
,TTV_NODE_LATCH
)) != NULL
))
309 if (nodex
==nodetofind
) return 1;
310 nodex
= (ttvevent_list
*)ptype
->DATA
;
312 if(nodex
== root
) break ;
313 if (nodex
==nodetofind
) return 1;
318 if (nodex
==nodetofind
) return 1;
319 while(nodex
->FIND
->OUTLINE
!= NULL
)
321 nodex
= nodex
->FIND
->OUTLINE
->NODE
;
322 if(nodex
== root
) break ;
323 if (nodex
==nodetofind
) return 1;
330 /*****************************************************************************/
331 /* function ttv_transfertnodefindinfo() */
334 /* propagation de la recherche */
335 /*****************************************************************************/
338 #define THRU_FILTER_ACTIVE 1
339 //#define THRU_FILTER_NOCROSS 2
341 static int ttv_avoidmaxfilter(ttvevent_list
*tve
, int filter
, char *newval
)
344 if ((TTV_IgnoreMaxFilter
& 1)!=0 && (tve
->ROOT
->TYPE
& TTV_SIG_L
)!=0) ret
=1;
345 if ((TTV_IgnoreMaxFilter
& 2)!=0 && (tve
->ROOT
->TYPE
& TTV_SIG_R
)!=0) ret
=1;
346 if ((TTV_IgnoreMaxFilter
& 4)!=0 && filter
) ret
=1;
347 if (tve
->FIND
->FLAGS
& TTV_FINDSTRUCT_FLAGS_NOFILTERMAX
) ret
=1;
348 if (ret
==1) *newval
|=TTV_FINDSTRUCT_FLAGS_NOFILTERMAX
;
352 static int ttv_ckgenerated(long min
, long max
, stbck
*ck
, long dir
, char state
)
355 if ((dir
& TTV_NODE_UP
)!=0)
357 ckmin
=ck
->SUPMIN
, ckmax
=ck
->SUPMAX
;
358 if (state
=='d' && ck
->SUPMAX
<ck
->SDNMAX
) ckmin
+=ck
->PERIOD
, ckmax
+=ck
->PERIOD
;
362 ckmin
=ck
->SDNMIN
, ckmax
=ck
->SDNMAX
;
363 if (state
=='u' && ck
->SDNMAX
<ck
->SUPMAX
) ckmin
+=ck
->PERIOD
, ckmax
+=ck
->PERIOD
;
365 if (max
<ckmin
|| min
>ckmax
) return 0;
369 static ttvfind_stb_stuff
*ttv_getstb_stuff(ttvfind_stb_stuff
*tss
, int phase
)
371 while (tss
!=NULL
&& tss
->PHASE
!=phase
) tss
=tss
->NEXT
;
374 inline int ttv_transfertnodefindinfo(ttvfig
,node
,root
,line
,delay
,type
)
375 ttvfig_list
*ttvfig
;
376 ttvevent_list
*root
;
377 ttvevent_list
*node
;
382 ttvevent_list
*cmd
, *start
, *end
, *filterclock
;
383 stbfig_list
*stbfig
;
385 long crossdelay
=TTV_NOTIME
, crossdelayend
=TTV_NOTIME
, mindelay
, latchminslope
, startmin
, startmax
, endmax
, endmin
;
386 long time
, latchmaxclose
, tmpl
, move
=0, cdelay
=delay
;
387 char phase
, filterstate
, orgphase
=TTV_NO_PHASE
,cmdphase
;
388 int period_inc
, onfilternode
=0, filternocross
=0;
389 char nofiltermax
=0, forcedtransp
=0, flag
=0, aptss_flag
;
390 long ideal_crossdelay
=TTV_NOTIME
, ideal_crossdelayend
=TTV_NOTIME
;
393 ttvfind_stb_stuff dummy
[128], *activephase_tss
, *newtss
, *newtsslist
;
395 stbfig
= stb_getstbfig(ttvfig
) ;
396 if((type
& TTV_FIND_DUAL
) != TTV_FIND_DUAL
)
397 start
=node
, end
=root
;
400 start
=root
, end
=node
;
401 // if ((root->FIND->THRU_FILTER & THRU_FILTER_NOCROSS)!=0) return 0;
404 if ((root
->FIND
->FLAGS
& TTV_FINDSTRUCT_FLAGS_LAST_CROSSED_IS_PRECH
)!=0)
406 if (getptype(node
->ROOT
->USER
, TTV_SIG_CLOCK
)!=NULL
) return 0;
407 flag
|=TTV_FINDSTRUCT_FLAGS_LAST_CROSSED_IS_PRECH
;
410 if ((stbfig
!=NULL
&& (stbfig
->FLAGS
& STB_CLOCK_INFO_READY
)!=0 && stb_has_filter_directive(end
))
411 && ((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_DONT_FILTER_ENDING_NODE
)==0 || TTV_SEARCH_FIRST_NODE
!=end
))
416 if((root
->FIND
->FLAGS
& TTV_FINDSTRUCT_FLAGS_FORCEDTRANSPARENCY
)!= 0)
418 forcedtransp
=TTV_FINDSTRUCT_FLAGS_FORCEDTRANSPARENCY
;
419 if (node
->FIND
!= NULL
&& ttv_check_node_on_path(ttvfig
,TTV_SEARCH_FIRST_NODE
,root
,type
,node
)) return(0) ;
422 if(forcedtransp
==0 && ((root
->FIND
->FLAGS
& TTV_FINDSTRUCT_CROSS_ENABLED
)!=0 || (root
->FIND
->THRU_FILTER
& THRU_FILTER_ACTIVE
)!=0 || onfilternode
))
424 flag
|=TTV_FINDSTRUCT_CROSS_ENABLED
;
425 if(root
->FIND
!=NULL
&& node
->FIND
!= NULL
)
427 if((node
->FIND
->PERIODE
< root
->FIND
->PERIODE
) &&
428 ttv_check_node_on_path(ttvfig
,TTV_SEARCH_FIRST_NODE
,root
,type
,node
)
433 if ((root
->FIND
->FLAGS
& TTV_FINDSTRUCT_FLAGS_MUSTBECLOCK
)!=0)
435 if (stb_getstbnode(node
)->CK
==NULL
) return 0;
436 else flag
|=TTV_FINDSTRUCT_FLAGS_MUSTBECLOCK
;
437 if ((root
->FIND
->FLAGS
& TTV_FINDSTRUCT_FLAGS_ISIDEAL
)!=0) cdelay
=0, flag
|=TTV_FINDSTRUCT_FLAGS_ISIDEAL
;
442 if((type
& TTV_FIND_DUAL
) != TTV_FIND_DUAL
)
444 if ((line
->TYPE
& TTV_LINE_HZ
)!=0) return 0;
445 snode
=stb_getstbnode(node
);
446 ttv_initfindstb(&dummy
[0]);
448 for (phase
=0; phase
<stbfig
->PHASENUMBER
; phase
++)
452 stb_getdelayedge(stbfig
,node
,phase
,&time
,&mindelay
, phase
,0,NULL
,NULL
) ;
453 if (time
!=TTV_NOTIME
)
456 if((root
->ROOT
->TYPE
& TTV_SIG_LL
) == TTV_SIG_LL
457 || (root
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
)
459 if ((root
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
)
461 stb_geteventphase(stbfig
, root
,&cmdphase
,NULL
,NULL
,1,1) ;
466 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
467 cmd
= ttv_getlinecmd(ttvfig
,line
,TTV_LINE_CMDMAX
) ;
469 cmd
= ttv_getlinecmd(ttvfig
,line
,TTV_LINE_CMDMIN
) ;
471 cmdphase
=stb_getstbnode(cmd
)->CK
->CKINDEX
;
473 stb_geteventphase(stbfig
, root
,&cmdphase
,NULL
,NULL
,1,1) ;
475 // stb_geteventphase(stbfig,node,&phase,NULL,NULL,0,1) ;
476 stb_getlatchslope(stbfig
,root
,cmd
,NULL
,&latchminslope
,&latchmaxclose
,NULL
,NULL
,ADDACCESS
,phase
, &move
) ;
478 crossdelay
= latchminslope
- cdelay
;
479 crossdelayend
= latchmaxclose
- cdelay
;
480 ideal_crossdelay
= latchminslope
;
481 ideal_crossdelayend
= latchmaxclose
;
482 if ((activephase_tss
=ttv_getstb_stuff(root
->FIND
->STB
, cmdphase
))==NULL
)
483 activephase_tss
=&dummy
[0];
485 else if (onfilternode
)
488 stb_get_filter_directive_info(stbfig
, end
, phase
, &startmin
, &startmax
, &endmax
, &endmin
, &filterstate
, &move
, &filterclock
, &origedge
);
489 if (root
->FIND
->ORGPHASE
==TTV_NO_PHASE
)
490 stb_get_directive_setup_slope(stbfig
, stb_getstbnode(end
), &orgphase
, &tmptime
, 1);
491 ideal_crossdelay
=startmin
;
492 ideal_crossdelayend
=endmax
;
493 if ((activephase_tss
=ttv_getstb_stuff(root
->FIND
->STB
, origedge
.CTKCKINDEX
))==NULL
)
494 activephase_tss
=&dummy
[0];
495 if (activephase_tss
->IDEAL_CROSSDELAY
!=TTV_NOTIME
)
497 if (ideal_crossdelay
<activephase_tss
->IDEAL_CROSSDELAY
+move
) ideal_crossdelay
=activephase_tss
->IDEAL_CROSSDELAY
+move
;
498 if (ideal_crossdelayend
>activephase_tss
->IDEAL_NOMORECROSSDELAY
+move
) ideal_crossdelayend
=activephase_tss
->IDEAL_NOMORECROSSDELAY
+move
;
500 if (activephase_tss
->CROSSDELAY
!=TTV_NOTIME
)
502 if (startmin
<activephase_tss
->CROSSDELAY
+move
) startmin
=activephase_tss
->CROSSDELAY
+move
;
503 if (endmax
>activephase_tss
->NOMORECROSSDELAY
+move
) endmax
=activephase_tss
->NOMORECROSSDELAY
+move
;
505 crossdelay
= startmin
- cdelay
;
506 crossdelayend
= endmax
- cdelay
;
507 latchminslope
=startmin
;
508 latchmaxclose
=endmax
;
512 activephase_tss
=ttv_getstb_stuff(root
->FIND
->STB
, phase
);
513 if (activephase_tss
==NULL
) continue;
514 crossdelay
= activephase_tss
->CROSSDELAY
- cdelay
;
515 crossdelayend
= activephase_tss
->NOMORECROSSDELAY
- cdelay
;
516 latchminslope
=activephase_tss
->CROSSDELAY
;
517 latchmaxclose
=activephase_tss
->NOMORECROSSDELAY
;
518 ideal_crossdelay
=activephase_tss
->IDEAL_CROSSDELAY
;
519 ideal_crossdelayend
=activephase_tss
->IDEAL_NOMORECROSSDELAY
;
522 if(time
!= TTV_NOTIME
&& (time
< crossdelay
|| (!ttv_avoidmaxfilter(root
, onfilternode
,&nofiltermax
) && mindelay
>crossdelayend
)))
524 if (onfilternode
&& (n
=stb_getstbnode(node
))->CK
!=NULL
)
526 if (n
->CK
->ORIGINAL_CLOCK
!=NULL
&& getptype(n
->CK
->ORIGINAL_CLOCK
->ROOT
->USER
, STB_IDEAL_CLOCK
)!=NULL
)
528 if (ttv_ckgenerated(mindelay
+cdelay
, time
+cdelay
, &origedge
, root
->TYPE
, ' ')
529 && ((root
->FIND
->FLAGS
& TTV_FINDSTRUCT_FLAGS_MUSTBECLOCK
)!=0
530 || (!ideal
&& ttv_ckgenerated(crossdelay
+cdelay
-move
, crossdelayend
+cdelay
-move
, &origedge
, root
->TYPE
, filterstate
))
531 || (ideal
&& ttv_ckgenerated(ideal_crossdelay
-move
, ideal_crossdelayend
-move
, &origedge
, root
->TYPE
, filterstate
)))
534 if ((node
->TYPE
& TTV_NODE_UP
)!=0) mindelay
=n
->CK
->SUPMIN
, time
=n
->CK
->SUPMAX
;
535 else mindelay
=n
->CK
->SDNMIN
, time
=n
->CK
->SDNMAX
;
538 ideal_crossdelay
=mindelay
;
539 ideal_crossdelayend
=time
;
540 latchminslope
=crossdelay
+cdelay
;
541 latchmaxclose
=crossdelayend
+cdelay
;
542 flag
|=TTV_FINDSTRUCT_FLAGS_MUSTBECLOCK
;
543 if (ideal
) flag
|=TTV_FINDSTRUCT_FLAGS_ISIDEAL
;
552 // cas min : on cross un latch mais le delai min ne crosse pas
553 // on calcul un nouveau delai min qui cross
554 if((type
& TTV_FIND_MIN
) == TTV_FIND_MIN
)
556 if((root
->ROOT
->TYPE
& TTV_SIG_LL
) == TTV_SIG_LL
557 || (root
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
|| onfilternode
)
559 if (mindelay
+cdelay
<latchminslope
) mindelay
=latchminslope
-cdelay
;
561 else mindelay
=activephase_tss
->CROSSDELAY_MIN
-cdelay
;
565 if((root
->ROOT
->TYPE
& TTV_SIG_LL
) == TTV_SIG_LL
566 || (root
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
|| onfilternode
)
568 if (time
+cdelay
>latchmaxclose
&& !ttv_avoidmaxfilter(root
, onfilternode
,&nofiltermax
)) mindelay
=latchmaxclose
-cdelay
;
571 else mindelay
=activephase_tss
->CROSSDELAY_MIN
-cdelay
;
574 if((node
->ROOT
->TYPE
& TTV_SIG_L
) == TTV_SIG_L
575 || (node
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
)
577 // stb_geteventphase(stbfig,node,&phase,NULL,NULL,1,1) ;
579 if (!(activephase_tss
->PHASE
==phase
&& (stbfig
!=NULL
&& stbfig
->STABILITYMODE
& STB_STABILITY_LT
) !=0))
581 if((type
& TTV_FIND_DUAL
) != TTV_FIND_DUAL
)
583 if(greater_lowerequal(activephase_tss
->PHASE
, root
->FIND
->ORGPHASE
, phase
))
588 if(lower_greaterequal(activephase_tss
->PHASE
, root
->FIND
->ORGPHASE
, phase
))
594 newtss
=ttv_allocfindstb();
595 newtss
->PERIOD_CHANGE
=activephase_tss
->PERIOD_CHANGE
+move
;
596 newtss
->PHASE
= phase
;
597 newtss
->STARTPHASE
= activephase_tss
->STARTPHASE
; // don't care
598 newtss
->FLAGS
= aptss_flag
;
599 newtss
->CROSSDELAY
= crossdelay
;
600 newtss
->NOMORECROSSDELAY
= crossdelayend
;
601 newtss
->IDEAL_CROSSDELAY
= ideal_crossdelay
;
602 newtss
->IDEAL_NOMORECROSSDELAY
= ideal_crossdelayend
;
603 newtss
->CROSSDELAY_MIN
= mindelay
;
604 newtss
->NEXT
=newtsslist
;
609 else // ----------------DUAL ---------------
611 ttvfind_stb_stuff
*activephase_tsslist
;
612 if (root
->FIND
->OUTLINE
!=NULL
&& (root
->FIND
->OUTLINE
->TYPE
& TTV_LINE_HZ
)!=0) return 0;
613 if ((root
->FIND
->FLAGS
& TTV_FINDSTRUCT_FLAGS_ISIDEAL
)!=0) cdelay
=0, flag
|=TTV_FINDSTRUCT_FLAGS_ISIDEAL
;
615 if (root
->FIND
->STB
==NULL
)
618 n
=stb_getstbnode(TTV_SEARCH_FIRST_NODE
);
619 for (i
=0, j
=0; i
<stbfig
->PHASENUMBER
; i
++)
621 stb_getdelayedge(stbfig
,TTV_SEARCH_FIRST_NODE
,i
,&time
,&mindelay
, i
,0,NULL
,NULL
) ;
622 if (time
!=TTV_NOTIME
)
624 ttv_initfindstb(&dummy
[j
]);
625 dummy
[j
].PHASE
=dummy
[j
].STARTPHASE
=i
;
626 if (j
>0) dummy
[j
-1].NEXT
=&dummy
[j
];
630 if (j
==0) activephase_tsslist
=NULL
;
631 else activephase_tsslist
=&dummy
[0];
634 activephase_tsslist
=root
->FIND
->STB
;
636 for (activephase_tss
=activephase_tsslist
; activephase_tss
!=NULL
; activephase_tss
=activephase_tss
->NEXT
)
638 if (activephase_tss
->FLAGS
& TTV_TPS_FINDSTRUCT_THRU_FILTER_NOCROSS
) continue;
640 phase
=activephase_tss
->PHASE
;
641 if((node
->ROOT
->TYPE
& TTV_SIG_LL
) == TTV_SIG_LL
642 || (node
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
)
644 if (activephase_tss
->CROSSDELAY
!=TTV_NOTIME
)
645 crossdelay
=activephase_tss
->CROSSDELAY
, crossdelayend
=activephase_tss
->NOMORECROSSDELAY
;
648 stb_getdelayedge(stbfig
,TTV_SEARCH_FIRST_NODE
,activephase_tss
->STARTPHASE
,&time
,&mindelay
, activephase_tss
->STARTPHASE
,0,NULL
,NULL
) ;
649 // if (phase==TTV_NO_PHASE) stb_geteventphase(stbfig,TTV_SEARCH_FIRST_NODE,&phase,NULL,NULL,1,1) ;
650 if (getptype(TTV_SEARCH_FIRST_NODE
->ROOT
->USER
, STB_IDEAL_CLOCK
)!=NULL
) ideal
=1, cdelay
=0, flag
|=TTV_FINDSTRUCT_FLAGS_ISIDEAL
;
653 crossdelay
=mindelay
+root
->FIND
->DELAY
;
654 crossdelayend
=time
+root
->FIND
->DELAY
;
663 if ((node
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
)
665 stb_geteventphase(stbfig
, node
,&cmdphase
,NULL
,NULL
,1,1) ;
670 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
671 cmd
= ttv_getlinecmd(ttvfig
,line
,TTV_LINE_CMDMAX
) ;
673 cmd
= ttv_getlinecmd(ttvfig
,line
,TTV_LINE_CMDMIN
) ;
675 cmdphase
=stb_getstbnode(cmd
)->CK
->CKINDEX
;
677 stb_geteventphase(stbfig
, node
,&cmdphase
,NULL
,NULL
,1,1) ;
680 stb_getlatchslope(stbfig
,node
,cmd
,NULL
,&time
,&latchmaxclose
,NULL
,NULL
,ADDACCESS
,phase
,&move
) ;
681 // if (cmd!=NULL && (n=stb_getstbnode(cmd))!=NULL && n->CK!=NULL)
685 crossdelay
+= cdelay
;
686 crossdelayend
+= cdelay
;
687 if(crossdelayend
<=time
|| (!ttv_avoidmaxfilter(root
, onfilternode
,&nofiltermax
) && crossdelay
>=latchmaxclose
))
689 aptss_flag
|=TTV_TPS_FINDSTRUCT_THRU_FILTER_NOCROSS
;
692 tmpl
=activephase_tss
->CROSSDELAY_MIN
;
693 if ((type
& TTV_FIND_MIN
) == TTV_FIND_MIN
)
697 if (tmpl
==TTV_NOTIME
)
699 tmpl
+=time
-crossdelay
;
705 if (crossdelayend
>latchmaxclose
&& !ttv_avoidmaxfilter(root
, onfilternode
,&nofiltermax
))
707 if (tmpl
==TTV_NOTIME
)
709 tmpl
+=latchmaxclose
-crossdelayend
;
710 crossdelay
=latchmaxclose
;
715 else if (onfilternode
)
717 stb_get_filter_directive_info(stbfig
, end
, phase
, &startmin
, &startmax
, &endmax
, &endmin
, &filterstate
, &move
, &filterclock
, &origedge
);
718 stb_get_directive_setup_slope(stbfig
, stb_getstbnode(end
), &orgphase
, &time
, 1);
719 if (activephase_tss
->CROSSDELAY
!=TTV_NOTIME
)
720 crossdelay
=activephase_tss
->CROSSDELAY
, crossdelayend
=activephase_tss
->NOMORECROSSDELAY
;
723 stb_getdelayedge(stbfig
,TTV_SEARCH_FIRST_NODE
,activephase_tss
->STARTPHASE
,&time
,&mindelay
, activephase_tss
->STARTPHASE
,0,NULL
,NULL
) ;
724 if (getptype(TTV_SEARCH_FIRST_NODE
->ROOT
->USER
, STB_IDEAL_CLOCK
)!=NULL
) ideal
=1, cdelay
=0, flag
|=TTV_FINDSTRUCT_FLAGS_ISIDEAL
;
727 crossdelay
=mindelay
+root
->FIND
->DELAY
;
728 crossdelayend
=time
+root
->FIND
->DELAY
;
737 crossdelayend
+=cdelay
;
738 if(crossdelayend
<startmin
|| (!ttv_avoidmaxfilter(root
, onfilternode
,&nofiltermax
) && crossdelay
>endmax
))
740 if ((n
=stb_getstbnode(root
))->CK
!=NULL
&& ttv_ckgenerated(crossdelay
, crossdelayend
, &origedge
, node
->TYPE
, ' '))
742 flag
|=TTV_FINDSTRUCT_FLAGS_MUSTBECLOCK
;
744 endmax
=crossdelayend
;
749 if ((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_DONT_FILTER_ENDING_NODE
)==0)
752 aptss_flag
|=TTV_TPS_FINDSTRUCT_THRU_FILTER_NOCROSS
;
755 tmpl
=activephase_tss
->CROSSDELAY_MIN
;
756 if ((type
& TTV_FIND_MIN
) == TTV_FIND_MIN
)
758 if (crossdelay
<startmin
)
760 if (tmpl
==TTV_NOTIME
)
762 tmpl
+=startmin
-crossdelay
;
768 if (crossdelayend
>endmax
&& !ttv_avoidmaxfilter(root
, onfilternode
,&nofiltermax
))
770 if (tmpl
==TTV_NOTIME
)
772 tmpl
+=endmax
-crossdelayend
;
773 crossdelayend
=endmax
;
782 mindelay
=activephase_tss
->CROSSDELAY_MIN
;
783 if (activephase_tss
->CROSSDELAY
!=TTV_NOTIME
)
784 crossdelay
=activephase_tss
->CROSSDELAY
+cdelay
, crossdelayend
=activephase_tss
->NOMORECROSSDELAY
+cdelay
;
787 if((node
->ROOT
->TYPE
& TTV_SIG_L
) == TTV_SIG_L
788 || (node
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
)
790 // stb_geteventphase(stbfig,node,&phase,NULL,NULL,1,1) ;
792 if (!(activephase_tss
->PHASE
==phase
&& (stbfig
!=NULL
&& stbfig
->STABILITYMODE
& STB_STABILITY_LT
) !=0))
794 if((type
& TTV_FIND_DUAL
) != TTV_FIND_DUAL
)
796 if(greater_lowerequal(activephase_tss
->PHASE
, root
->FIND
->ORGPHASE
, phase
))
801 if(lower_greaterequal(activephase_tss
->PHASE
, root
->FIND
->ORGPHASE
, phase
))
807 newtss
=ttv_allocfindstb();
808 newtss
->PERIOD_CHANGE
=activephase_tss
->PERIOD_CHANGE
+move
;
809 newtss
->PHASE
= orgphase
;
810 newtss
->STARTPHASE
= activephase_tss
->STARTPHASE
;
811 newtss
->FLAGS
= aptss_flag
;
812 newtss
->CROSSDELAY
= crossdelay
- move
;
813 newtss
->NOMORECROSSDELAY
= crossdelayend
- move
;
814 newtss
->IDEAL_CROSSDELAY
= ideal_crossdelay
;
815 newtss
->IDEAL_NOMORECROSSDELAY
= ideal_crossdelayend
;
816 newtss
->CROSSDELAY_MIN
= mindelay
;
817 newtss
->NEXT
=newtsslist
;
822 if (newtsslist
!=NULL
)
825 node
->FIND
->DELAY
= root
->FIND
->DELAY
+ delay
;
826 node
->FIND
->OUTLINE
= line
;
827 node
->FIND
->PERIODE
= root
->FIND
->PERIODE
+ period_inc
;
828 node
->FIND
->THRU_FILTER
=filternocross
| (root
->FIND
->THRU_FILTER
|| onfilternode
?THRU_FILTER_ACTIVE
:0);
829 node
->FIND
->FLAGS
|=flag
|nofiltermax
|forcedtransp
;
830 node
->FIND
->ORGPHASE
=orgphase
!=TTV_NO_PHASE
?orgphase
:root
->FIND
->ORGPHASE
;
831 ttv_freefindstblist(node
->FIND
->STB
);
832 node
->FIND
->STB
=newtsslist
;
840 node
->FIND
->DELAY
= root
->FIND
->DELAY
+ delay
;
841 node
->FIND
->OUTLINE
= line
;
842 node
->FIND
->FLAGS
|=flag
|forcedtransp
;
843 ttv_freefindstblist(node
->FIND
->STB
);
844 node
->FIND
->STB
=NULL
;
851 static ttvevent_list
*ttv_findlatchcommand_notdual(ttvevent_list
*root
, ttvevent_list
*node
)
853 ttvevent_list
*nodex
;
858 if((nodex
->FIND
->OUTLINE
== NULL
) &&
859 ((ptype
= getptype(nodex
->USER
,TTV_NODE_LATCH
)) != NULL
)) return nodex
;
861 while(nodex
->FIND
->OUTLINE
!= NULL
)
864 nodex
= nodex
->FIND
->OUTLINE
->ROOT
;
865 if((nodex
->FIND
->OUTLINE
== NULL
) &&
866 ((ptype
= getptype(nodex
->USER
,TTV_NODE_LATCH
)) != NULL
)) return nodex
;
868 if((nodex
->ROOT
->TYPE
& TTV_SIG_L
)!=0) return node
;
869 if (nodex
== root
|| (nodex
->ROOT
->TYPE
& TTV_SIG_R
)!=0) return nodex
;
875 /*****************************************************************************/
876 /* function ttv_connectorsearchtype() */
878 /* ttvfig : figure principale */
879 /* ptsig : latch d'erreur */
880 /* type : type de recheche */
882 /* dit ce que doit faire la recherche pour un connecteur */
883 /*****************************************************************************/
884 inline long ttv_connectorsearchtype(ttvfig
,node
,type
)
885 ttvfig_list
*ttvfig
;
886 ttvevent_list
*node
;
891 switch(node
->ROOT
->TYPE
& TTV_SIG_TYPECON
)
894 res
= ((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
) ?
895 TTV_SIG_BEGINSEARCH
: TTV_SIG_ENDSEARCH
;
896 res
|= TTV_SIG_BEGINPATH
;
900 res
= ((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
) ?
901 TTV_SIG_ENDSEARCH
: TTV_SIG_BEGINSEARCH
;
902 res
|= TTV_SIG_ENDPATH
;
905 res
= ((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
) ?
906 TTV_SIG_BEGINSEARCH
|TTV_SIG_ENDSEARCH
|
907 TTV_SIG_BEGINPATH
|TTV_SIG_ENDPATH
:
908 TTV_SIG_BEGINSEARCH
|TTV_SIG_ENDSEARCH
|
909 TTV_SIG_BEGINPATH
|TTV_SIG_ENDPATH
;
910 if(ttv_islocononlyend(ttvfig
,node
,type
) == 0)
911 res
|= TTV_SIG_CROSS
;
914 res
= TTV_SIG_BEGINSEARCH
|TTV_SIG_ENDSEARCH
|
915 TTV_SIG_BEGINPATH
|TTV_SIG_ENDPATH
;
916 if(ttv_islocononlyend(ttvfig
,node
,type
) == 0)
917 res
|= TTV_SIG_CROSS
;
926 /*****************************************************************************/
927 /* function ttv_signalsearchtype() */
929 /* ttvfig : figure principale */
930 /* ptsig : latch d'erreur */
931 /* type : type de recheche */
933 /* dit ce que doit faire la recherche pour un signal donnee */
934 /*****************************************************************************/
935 inline long ttv_signalsearchtype(ttvfig
,node
,type
)
936 ttvfig_list
*ttvfig
;
937 ttvevent_list
*node
;
942 switch(node
->ROOT
->TYPE
& TTV_SIG_TYPEALL
)
945 res
= ttv_connectorsearchtype(ttvfig
,node
,type
) ;
948 res
= ((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
) ?
949 (TTV_SIG_ENDSEARCH
|TTV_SIG_CROSS
|TTV_SIG_ENDPATH
) :
950 (TTV_SIG_CROSS
|TTV_SIG_BEGINSEARCH
|TTV_SIG_ENDPATH
) ;
951 res
|= ttv_connectorsearchtype(ttvfig
,node
,type
) ;
954 res
= TTV_SIG_CROSS
;
957 res
= ((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
) ?
958 (TTV_SIG_ENDSEARCH
|TTV_SIG_CROSS
|TTV_SIG_ENDPATH
) :
959 (TTV_SIG_CROSS
|TTV_SIG_BEGINSEARCH
|TTV_SIG_ENDPATH
) ;
961 case (TTV_SIG_C
|TTV_SIG_B
) :
962 case (TTV_SIG_N
|TTV_SIG_B
) :
963 res
= TTV_SIG_BEGINSEARCH
|TTV_SIG_ENDSEARCH
|
964 TTV_SIG_BEGINPATH
|TTV_SIG_ENDPATH
;
965 if((type
& TTV_FIND_HIER
) != TTV_FIND_HIER
)
966 res
|= TTV_SIG_CROSS
;
969 res
= ((type
& (TTV_FIND_DUAL
|TTV_FIND_CMD
))!=0) ?
970 (TTV_SIG_ENDSEARCH
|TTV_SIG_CROSS
|TTV_SIG_ENDPATH
) :
971 (TTV_SIG_CROSS
|TTV_SIG_BEGINSEARCH
|TTV_SIG_ENDPATH
) ;
979 res
= TTV_SIG_BEGINSEARCH
|TTV_SIG_ENDSEARCH
|
980 TTV_SIG_BEGINPATH
|TTV_SIG_ENDPATH
;
981 if(ttv_iscrosslatch(ttvfig
,node
,type
) == 1)
982 res
|= TTV_SIG_CROSS
;
985 res
= TTV_SIG_BEGINSEARCH
|TTV_SIG_ENDSEARCH
|
986 TTV_SIG_BEGINPATH
|TTV_SIG_ENDPATH
|TTV_SIG_CROSS
;
989 res
= TTV_SIG_CROSS
;
991 res
= TTV_SIG_CROSS
;
994 if((node
->TYPE
& TTV_NODE_STOP
) == TTV_NODE_STOP
995 && (node
->ROOT
->TYPE
& (TTV_SIG_C
| TTV_SIG_L
| TTV_SIG_R
| TTV_SIG_B
))==0)
996 res
|=TTV_SIG_BEGINSEARCH
|TTV_SIG_ENDSEARCH
|
997 TTV_SIG_BEGINPATH
|TTV_SIG_ENDPATH
;
1003 /*****************************************************************************/
1004 /* function ttv_getnodeslope() */
1006 /* ttvfig : figure principale */
1007 /* ptsig : latch d'erreur */
1008 /* type : type de recheche */
1010 /* recherche le front d'entree d'yun chemin */
1011 /*****************************************************************************/
1012 long ttv_getnodeslope(ttvfig
,ttvins
,node
,sloperef
,type
)
1013 ttvfig_list
*ttvfig
;
1014 ttvfig_list
*ttvins
;
1015 ttvevent_list
*node
;
1019 ttvline_list
*line
;
1020 long slope
= TTV_NOSLOPE
;
1023 *sloperef
= TTV_NOSLOPE
;
1025 if (V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
>=1 && TTV_PROPAGATE_FORCED_SLOPE
!=TTV_NOTIME
)
1027 *sloperef
=TTV_PROPAGATE_FORCED_SLOPE
;
1031 if(((node
->ROOT
->TYPE
& TTV_SIG_CI
) == TTV_SIG_CI
) &&
1032 ((node
->ROOT
->TYPE
& TTV_SIG_CB
) != TTV_SIG_CB
))
1034 *sloperef
= (long)ttv_getnodeslew(node
,type
);
1040 ttvins
= node
->ROOT
->ROOT
;
1041 if((type
& TTV_FIND_PATH
) == TTV_FIND_PATH
)
1043 ttv_expfigsig(ttvfig
,node
->ROOT
,ttvins
->INFO
->LEVEL
,ttvfig
->INFO
->LEVEL
,
1044 TTV_STS_CL_PJT
, TTV_FILE_TTX
);
1045 line
= node
->INPATH
;
1049 ttv_expfigsig(ttvfig
,node
->ROOT
,ttvins
->INFO
->LEVEL
,ttvfig
->INFO
->LEVEL
,
1050 TTV_STS_CLS_FED
, TTV_FILE_DTX
);
1051 line
= node
->INLINE
;
1053 for(; line
; line
= line
->NEXT
)
1055 if((((line
->TYPE
& TTV_LINE_CONT
) == TTV_LINE_CONT
) &&
1056 ((line
->TYPE
& TTV_LINE_A
) != TTV_LINE_A
)) ||
1057 (((line
->TYPE
& (TTV_LINE_D
| TTV_LINE_T
)) != 0) &&
1058 (line
->FIG
!= ttvfig
)) ||
1059 (((line
->TYPE
& (TTV_LINE_P
| TTV_LINE_F
)) != 0) &&
1060 (line
->FIG
->INFO
->LEVEL
< ttvins
->INFO
->LEVEL
)))
1062 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
1064 slopex
= ttv_getslopemax(line
) ;
1065 if((slopex
> slope
) || (slope
== TTV_NOSLOPE
))
1067 slopex
= line
->FMAX
;
1068 if((slopex
> *sloperef
) || (*sloperef
== TTV_NOSLOPE
))
1069 *sloperef
= slopex
;
1073 slopex
= ttv_getslopemin(line
) ;
1074 if((slopex
< slope
) || (slope
== TTV_NOSLOPE
))
1076 slopex
= line
->FMIN
;
1077 if((slopex
< *sloperef
) || (*sloperef
== TTV_NOSLOPE
))
1078 *sloperef
= slopex
;
1083 if (*sloperef
== TTV_NOSLOPE
&& slope
==TTV_NOSLOPE
1084 && ((node
->ROOT
->TYPE
& TTV_SIG_B
)!=0
1085 || (node
->ROOT
->TYPE
& TTV_SIG_L
)!=0
1086 || (node
->ROOT
->TYPE
& TTV_SIG_R
)!=0
1089 slope
=*sloperef
=ttvfig
->INFO
->SLOPE
;
1091 if(*sloperef
== TTV_NOSLOPE
)
1092 *sloperef
= (long)0 ;
1093 return((slope
== TTV_NOSLOPE
) ? (long)0 : slope
) ;
1096 static void ttv_uncachenodelines(ttvfig_list
*ttvfig
,ttvfig_list
*ttvins
,ttvevent_list
*node
,long type
)
1099 ttvins
= node
->ROOT
->ROOT
;
1100 if((type
& TTV_FIND_PATH
) == TTV_FIND_PATH
)
1102 ttv_expfigsig(ttvfig
,node
->ROOT
,ttvins
->INFO
->LEVEL
,ttvfig
->INFO
->LEVEL
,
1103 TTV_STS_CL_PJT
, TTV_FILE_TTX
);
1107 ttv_expfigsig(ttvfig
,node
->ROOT
,ttvins
->INFO
->LEVEL
,ttvfig
->INFO
->LEVEL
,
1108 TTV_STS_CLS_FED
, TTV_FILE_DTX
);
1112 /*****************************************************************************/
1114 /* function ttv_islocononlyend() */
1116 /* ttvfig : figure principale */
1117 /* ptsig : latch d'erreur */
1118 /* type : type de recheche */
1120 /* dit si un connecteur ne doit pas être traversé */
1121 /*****************************************************************************/
1122 int ttv_islocononlyend(ttvfig
,node
,type
)
1123 ttvfig_list
*ttvfig
;
1124 ttvevent_list
*node
;
1127 if(((node
->ROOT
->TYPE
& TTV_SIG_CT
) != TTV_SIG_CT
) ||
1128 ((node
->TYPE
& TTV_NODE_ONLYEND
) != TTV_NODE_ONLYEND
))
1131 if(((node
->ROOT
->TYPE
& TTV_SIG_CT
) == TTV_SIG_CT
) &&
1132 ((node
->TYPE
& TTV_NODE_ONLYEND
) == TTV_NODE_ONLYEND
))
1136 #ifndef __ALL__WARNING_
1142 /*****************************************************************************/
1143 /* function ttv_islineonlyend() */
1145 /* ttvfig : figure principale */
1146 /* ptsig : latch d'erreur */
1147 /* type : type de recheche */
1149 /* dit si un connecteur ne doit pas être traversé */
1150 /*****************************************************************************/
1151 int ttv_islineonlyend(ttvfig
,line
,type
)
1152 ttvfig_list
*ttvfig
;
1153 ttvline_list
*line
;
1156 if(((line
->NODE
->ROOT
->TYPE
& TTV_SIG_N
) == TTV_SIG_N
) &&
1157 ((line
->ROOT
->ROOT
->TYPE
& TTV_SIG_N
) == TTV_SIG_N
) &&
1158 ((line
->NODE
->TYPE
& TTV_NODE_ONLYEND
) == TTV_NODE_ONLYEND
) &&
1159 ((line
->ROOT
->TYPE
& TTV_NODE_ONLYEND
) == TTV_NODE_ONLYEND
))
1164 #ifndef __ALL__WARNING_
1170 /*****************************************************************************/
1171 /* function ttv_monolatcherror() */
1173 /* ttvfig : figure principale */
1174 /* ptsig : latch d'erreur */
1176 /* erreur d'une chaine entre un meme latch */
1177 /*****************************************************************************/
1178 void ttv_monolatcherror(ttvfig
,ptsig
)
1179 ttvfig_list
*ttvfig
;
1180 ttvsig_list
*ptsig
;
1182 char message
[1024] ;
1185 sprintf(message
,"%s for latch %s",ttvfig
->INFO
->FIGNAME
,
1186 ttv_getsigname(ttvfig
,name
,ptsig
)) ;
1187 ttv_error(30,message
,TTV_WARNING
) ;
1190 /*****************************************************************************/
1191 /* function ttv_addhtpath() */
1194 /* ajoute et recherche un chemin dans une table */
1195 /*****************************************************************************/
1196 void ttv_addhtpath(htab
,node
,root
)
1198 ttvevent_list
*node
;
1199 ttvevent_list
*root
;
1202 unsigned long keyx
;
1204 int size
= (sizeof(void *)/2)*8 ;
1206 key
= (((unsigned long)root
) << size
) ;
1207 keyx
= (((unsigned long)node
) << size
) ;
1208 keyx
= (keyx
>> size
) ;
1213 *htab
= addht(100) ;
1216 else if((ptype
= ttv_gethtpath(*htab
,node
,root
)) == NULL
)
1218 ptype
= (ptype_list
*)gethtitem(*htab
,(void *)key
) ;
1219 if(ptype
== (ptype_list
*)EMPTYHT
)
1223 ptype
= addptype(ptype
,(long)node
,root
) ;
1224 addhtitem(*htab
,(void *)key
,(long)ptype
) ;
1227 /*****************************************************************************/
1228 /* function ttv_gethtpath() */
1231 /* recherche un chemin dans une table */
1232 /*****************************************************************************/
1233 ptype_list
*ttv_gethtpath(htab
,node
,root
)
1235 ttvevent_list
*node
;
1236 ttvevent_list
*root
;
1240 unsigned long keyx
;
1241 int size
= (sizeof(void *)/2)*8 ;
1243 key
= (((unsigned long)root
) << size
) ;
1244 keyx
= (((unsigned long)node
) << size
) ;
1245 keyx
= (keyx
>> size
) ;
1251 ptype
= (ptype_list
*)gethtitem(htab
,(void *)key
) ;
1253 if(ptype
== (ptype_list
*)EMPTYHT
)
1256 for(; ptype
!= NULL
; ptype
= ptype
->NEXT
)
1258 if((ptype
->TYPE
== (long)node
) && (ptype
->DATA
== (void *)root
))
1265 /*****************************************************************************/
1266 /* function ttv_delhtpath() */
1269 /* supprime une table de chemin */
1270 /*****************************************************************************/
1271 void ttv_delhtpath(htab
)
1280 scanhtkey( htab
, 1, &nextkey
, &nextitem
) ;
1281 while( nextitem
!= EMPTYHT
) {
1282 freeptype( (ptype_list
*)nextitem
) ;
1283 scanhtkey( htab
, 0, &nextkey
, &nextitem
) ;
1289 /*****************************************************************************/
1290 /* function ttv_filterpathhz() */
1292 /* path : liste de chemin */
1294 /* enleve les chemin qui ne sont pas des hz */
1295 /*****************************************************************************/
1296 ttvpath_list
*ttv_filterpathhz(path
,nbpath
,nb
,lsi
,type
)
1297 ttvpath_list
*path
;
1300 LOCAL_SORT_INFO
*lsi
;
1303 ttvpath_list
*ptpath
, *limit
=NULL
;
1304 ttvpath_list
*ptpathx
;
1305 ttvpath_list
*ptpaths
;
1306 ttvevent_list
*node
;
1307 ttvevent_list
*root
;
1310 int beforepath
=1, sortall
=0;
1312 if (lsi
!=NULL
&& *nbpath
>nb
)
1314 if (lsi
->before_paths
!=NULL
&& lsi
->before_paths
!=(void *)1)
1315 limit
=lsi
->before_paths
;
1320 for(ptpath
= path
; ptpath
!= NULL
; ptpath
= ptpath
->NEXT
)
1322 tvs
=ptpath
->ROOT
->ROOT
;
1323 if((ptpath
->TYPE
& TTV_FIND_HZ
) == TTV_FIND_HZ
)
1325 if (getptype(tvs
->USER
, TTV_SIG_DONE_PTYPE
)==NULL
)
1326 tvs
->USER
=addptype(tvs
->USER
, TTV_SIG_DONE_PTYPE
, NULL
);
1330 for(ptpath
= path
; ptpath
!= NULL
; ptpath
= ptpath
->NEXT
)
1332 tvs
=ptpath
->ROOT
->ROOT
;
1333 if((ptpath
->TYPE
& TTV_FIND_HZ
) != TTV_FIND_HZ
1334 && getptype(tvs
->USER
, TTV_SIG_DONE_PTYPE
)!=NULL
)
1335 ttv_addhtpath(&htab
,ptpath
->NODE
,ptpath
->ROOT
) ;
1338 for(ptpath
= path
; ptpath
!= NULL
; ptpath
= ptpathx
)
1340 tvs
=ptpath
->ROOT
->ROOT
;
1341 tvs
->USER
=testanddelptype(tvs
->USER
, TTV_SIG_DONE_PTYPE
);
1343 ptpathx
= ptpath
->NEXT
;
1344 node
= ptpath
->NODE
;
1345 root
= ((ptpath
->ROOT
->TYPE
& TTV_NODE_UP
) == TTV_NODE_UP
)
1346 ? ptpath
->ROOT
->ROOT
->NODE
1347 : ptpath
->ROOT
->ROOT
->NODE
+1 ;
1349 if(((ptpath
->TYPE
& TTV_FIND_HZ
) == TTV_FIND_HZ
) &&
1350 ((path
->ROOT
->ROOT
->TYPE
& TTV_SIG_R
) != TTV_SIG_R
) &&
1351 (ttv_gethtpath(htab
,node
,root
) != NULL
))
1359 ptpaths
->NEXT
= ptpath
->NEXT
;
1361 ptpath
->NEXT
= NULL
;
1362 ttv_freepathlist(ptpath
) ;
1363 if (nbpath
!=NULL
) (*nbpath
)--;
1364 if (lsi
!=NULL
&& beforepath
==1) sortall
=1;
1368 if (lsi
!=NULL
&& lsi
->paths
==limit
) beforepath
=0;
1371 ttv_delhtpath(htab
) ;
1373 path
= ttv_filterpath(path
,type
,nbpath
) ;
1375 if (sortall
|| (lsi
!=NULL
&& *nbpath
>nb
))
1378 path
= ttv_classpath(path
,type
) ;
1380 for(ptpath
=path
, i
=1; i
<nb
&& ptpath
!= NULL
; ptpath
= ptpath
->NEXT
, i
++) ;
1384 ttv_freepathlist(ptpath
->NEXT
) ;
1385 ptpath
->NEXT
= NULL
;
1386 path
=(ttvpath_list
*)reverse((chain_list
*)path
);
1396 /*****************************************************************************/
1397 /* function ttv_filterpath() */
1399 /* path : liste de chemin */
1400 /* type : type de chemin a filtrer */
1402 /* enleve les chemin qui ne sont pas dans le masque des fronts */
1403 /*****************************************************************************/
1404 ttvpath_list
*ttv_filterpath(path
,type
,nbpath
)
1405 ttvpath_list
*path
;
1409 ttvpath_list
*patht
;
1410 ttvpath_list
*pathtx
;
1411 ttvpath_list
*pathts
;
1412 ttvpath_list
*pathtss
;
1417 while(patht
!= NULL
)
1419 if((((patht
->NODE
->TYPE
& TTV_NODE_UP
) == TTV_NODE_UP
) &&
1420 ((patht
->ROOT
->TYPE
& TTV_NODE_UP
) == TTV_NODE_UP
) &&
1421 ((type
& TTV_FIND_NOT_UPUP
) == TTV_FIND_NOT_UPUP
)) ||
1422 (((patht
->NODE
->TYPE
& TTV_NODE_UP
) == TTV_NODE_UP
) &&
1423 ((patht
->ROOT
->TYPE
& TTV_NODE_DOWN
) == TTV_NODE_DOWN
) &&
1424 ((type
& TTV_FIND_NOT_UPDW
) == TTV_FIND_NOT_UPDW
)) ||
1425 (((patht
->NODE
->TYPE
& TTV_NODE_DOWN
) == TTV_NODE_DOWN
) &&
1426 ((patht
->ROOT
->TYPE
& TTV_NODE_UP
) == TTV_NODE_UP
) &&
1427 ((type
& TTV_FIND_NOT_DWUP
) == TTV_FIND_NOT_DWUP
)) ||
1428 (((patht
->NODE
->TYPE
& TTV_NODE_DOWN
) == TTV_NODE_DOWN
) &&
1429 ((patht
->ROOT
->TYPE
& TTV_NODE_DOWN
) == TTV_NODE_DOWN
) &&
1430 ((type
& TTV_FIND_NOT_DWDW
) == TTV_FIND_NOT_DWDW
)))
1437 pathtx
->NEXT
= pathts
;
1443 pathtss
->NEXT
= patht
->NEXT
;
1444 patht
= patht
->NEXT
;
1445 pathtx
->NEXT
= pathts
;
1448 if (nbpath
!=NULL
) (*nbpath
)--;
1453 patht
= patht
->NEXT
;
1457 ttv_freepathlist(pathts
) ;
1461 /*****************************************************************************/
1462 /* function ttv_pathcompar() */
1464 /* path1 : premier chemin */
1465 /* path2 : deuxieme chemin */
1467 /* compare deux chemin et retourne selon qsort */
1468 /*****************************************************************************/
1469 int ttv_pathcompar(path1
,path2
)
1470 ttvpath_list
**path1
;
1471 ttvpath_list
**path2
;
1473 if((*path1
)->DELAY
< (*path2
)->DELAY
)
1475 else if((*path1
)->DELAY
> (*path2
)->DELAY
)
1481 /*****************************************************************************/
1482 /* function ttv_classpath() */
1484 /* path : liste des chemins a classer */
1485 /* type : type de classement croissant ou decroissant */
1487 /* classe la liste des chemins dans l'ordre croissant suivant le type */
1488 /*****************************************************************************/
1489 ttvpath_list
*ttv_classpath(path
,type
)
1490 ttvpath_list
*path
;
1493 ttvpath_list
*pathx
;
1494 ttvpath_list
**pattab
;
1498 if((path
== NULL
) || ((type
& TTV_FIND_NOTCLASS
) == TTV_FIND_NOTCLASS
))
1501 for(pathx
= path
; pathx
!= NULL
; pathx
= pathx
->NEXT
)
1504 pattab
= (ttvpath_list
**)mbkalloc(nbpath
* sizeof(ttvpath_list
*)) ;
1508 for(nbpathx
= (long)0 ; nbpathx
< nbpath
; nbpathx
++)
1510 *(pattab
+ nbpathx
) = pathx
;
1511 pathx
= pathx
->NEXT
;
1514 qsort(pattab
,nbpath
,sizeof(ttvpath_list
*),(int (*)(const void*,const void*))ttv_pathcompar
) ;
1516 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
1519 path
= *(pattab
+ nbpath
-1) ;
1522 for(nbpathx
= (long)1 ; nbpathx
< nbpath
; nbpathx
++)
1524 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
1525 pathx
->NEXT
= *(pattab
+ nbpathx
) ;
1527 pathx
->NEXT
= *(pattab
+ (nbpath
- nbpathx
- 1)) ;
1528 pathx
= pathx
->NEXT
;
1531 pathx
->NEXT
= NULL
;
1538 /*****************************************************************************/
1539 /* function ttv_fifopush() */
1543 /* ajoute un noeud dans une fifo et le type TTV_FIND_INFIFO ne fait rien */
1544 /* si il est deja dans la fifo */
1545 /*****************************************************************************/
1546 void ttv_fifopush(node
)
1547 ttvevent_list
*node
;
1549 if(node
->FIND
== NULL
)
1551 ttv_allocfind(node
) ;
1552 node
->FIND
->FIFO
= TTV_FIFO_NUM
;
1554 else if(node
->FIND
->FIFO
!= TTV_FIFO_NUM
)
1556 ttv_allocfind(node
) ;
1557 node
->FIND
->FIFO
= TTV_FIFO_NUM
;
1560 if((node
->FIND
->TYPE
& TTV_FIND_INFIFO
) == TTV_FIND_INFIFO
) return ;
1562 node
->FIND
->TYPE
|= TTV_FIND_INFIFO
;
1564 if(TTV_FIFO_HEAD
== NULL
)
1566 TTV_FIFO_HEAD
= TTV_FIFO_UP
= TTV_FIFO_B
= addchain(TTV_FIFO_HEAD
,node
) ;
1568 else if((TTV_FIFO_HEAD
== TTV_FIFO_B
) && (TTV_FIFO_HEAD
->DATA
== NULL
))
1570 TTV_FIFO_B
->DATA
= (void *)node
;
1574 if(TTV_FIFO_B
->NEXT
!= NULL
)
1576 TTV_FIFO_B
= TTV_FIFO_B
->NEXT
;
1577 TTV_FIFO_B
->DATA
= (void *)node
;
1581 TTV_FIFO_B
->NEXT
= addchain(NULL
,node
) ;
1582 TTV_FIFO_B
= TTV_FIFO_B
->NEXT
;
1585 if(TTV_FIFO_UP
== NULL
) TTV_FIFO_UP
= TTV_FIFO_B
;
1588 /*****************************************************************************/
1589 /* function ttv_fifopop() */
1590 /* renvoie le noeud dans la fifo */
1591 /*****************************************************************************/
1592 ttvevent_list
*ttv_fifopop()
1594 ttvevent_list
*node
;
1596 if(TTV_FIFO_UP
== NULL
) return((ttvevent_list
*)NULL
);
1597 node
= (ttvevent_list
*)TTV_FIFO_UP
->DATA
;
1598 if(TTV_FIFO_UP
== TTV_FIFO_B
) TTV_FIFO_UP
= NULL
;
1599 else TTV_FIFO_UP
= TTV_FIFO_UP
->NEXT
;
1601 node
->FIND
->TYPE
&= TTV_FIND_OUTFIFO
;
1605 /*****************************************************************************/
1606 /* function ttv_fifoclean() */
1607 /* initialise la fifo */
1608 /*****************************************************************************/
1609 void ttv_fifoclean()
1612 ttvevent_list
*node
;
1613 ttvfind_list
*find
;
1616 for(chain
= TTV_FIFO_HEAD
; chain
!= TTV_FIFO_B
; chain
= chain
->NEXT
)
1618 node
= (ttvevent_list
*)chain
->DATA
;
1619 if(node
->FIND
!= NULL
)
1620 if(node
->FIND
->FIFO
== TTV_FIFO_NUM
)
1623 node
->FIND
= node
->FIND
->NEXT
;
1625 ttv_freefindlist(find
) ;
1627 if((node
->ROOT
->TYPE
& (TTV_SIG_Q
|TTV_SIG_B
|TTV_SIG_R
)) != 0)
1629 if(getptype(node
->USER
,TTV_NODE_LATCH
) != NULL
)
1630 node
->USER
= delptype(node
->USER
,TTV_NODE_LATCH
) ;
1632 chain
->DATA
= NULL
;
1637 else if(chain
->DATA
== NULL
)
1640 node
= (ttvevent_list
*)chain
->DATA
;
1641 if(node
->FIND
!= NULL
)
1642 if(node
->FIND
->FIFO
== TTV_FIFO_NUM
)
1645 node
->FIND
= node
->FIND
->NEXT
;
1647 ttv_freefindlist(find
) ;
1649 if((node
->ROOT
->TYPE
& (TTV_SIG_Q
|TTV_SIG_B
|TTV_SIG_R
)) != 0)
1651 if(getptype(node
->USER
,TTV_NODE_LATCH
) != NULL
)
1652 node
->USER
= delptype(node
->USER
,TTV_NODE_LATCH
) ;
1654 chain
->DATA
= NULL
;
1656 TTV_FIFO_B
= TTV_FIFO_HEAD
;
1657 TTV_FIFO_UP
= NULL
;
1660 /*****************************************************************************/
1661 /* function ttv_fifodelete() */
1662 /* detruit la fifo */
1663 /*****************************************************************************/
1664 void ttv_fifodelete()
1667 freechain(TTV_FIFO_HEAD
) ;
1668 TTV_FIFO_HEAD
= NULL
;
1669 TTV_FIFO_UP
= NULL
;
1673 /*****************************************************************************/
1674 /* function ttv_fifosave() */
1675 /* detruit la fifo */
1676 /*****************************************************************************/
1679 TTV_FIFO_SAV
= addchain(TTV_FIFO_SAV
,TTV_FIFO_HEAD
) ;
1680 TTV_FIFO_SAV
= addchain(TTV_FIFO_SAV
,TTV_FIFO_UP
) ;
1681 TTV_FIFO_SAV
= addchain(TTV_FIFO_SAV
,TTV_FIFO_B
) ;
1682 TTV_FIFO_HEAD
= NULL
;
1683 TTV_FIFO_UP
= NULL
;
1688 /*****************************************************************************/
1689 /* function ttv_fiforestore() */
1690 /* detruit la fifo */
1691 /*****************************************************************************/
1692 void ttv_fiforestore()
1695 TTV_FIFO_B
= (chain_list
*)TTV_FIFO_SAV
->DATA
;
1696 TTV_FIFO_SAV
= delchain(TTV_FIFO_SAV
,TTV_FIFO_SAV
) ;
1697 TTV_FIFO_UP
= (chain_list
*)TTV_FIFO_SAV
->DATA
;
1698 TTV_FIFO_SAV
= delchain(TTV_FIFO_SAV
,TTV_FIFO_SAV
) ;
1699 TTV_FIFO_HEAD
= (chain_list
*)TTV_FIFO_SAV
->DATA
;
1700 TTV_FIFO_SAV
= delchain(TTV_FIFO_SAV
,TTV_FIFO_SAV
) ;
1704 /*****************************************************************************/
1705 /* function ttv_getlatchaccess() */
1707 /* latch : latch de recherche */
1709 /* recherche les commandes d'un latch pour les access */
1710 /*****************************************************************************/
1711 ptype_list
*ttv_getlatchaccess_sub(ttvfig_list
*ttvfig
,ttvevent_list
*latch
,long type
, int withdataonly
)
1713 ttvline_list
*line
;
1714 ttvline_list
*ptline
;
1715 ttvevent_list
*event
;
1716 ptype_list
*cmdlist
= NULL
;
1721 if((type
& TTV_FIND_PATH
) == TTV_FIND_PATH
)
1722 line
= latch
->INPATH
;
1724 line
= latch
->INLINE
;
1726 for(; line
!= NULL
; line
= line
->NEXT
)
1728 if(((line
->TYPE
& (TTV_LINE_D
|TTV_LINE_T
)) != 0) &&
1729 (line
->FIG
!= ttvfig
))
1732 if((line
->TYPE
& TTV_LINE_A
) == TTV_LINE_A
)
1734 if (withdataonly
==0)
1736 if((line
->NODE
->TYPE
& TTV_NODE_MARQUE
) == TTV_NODE_MARQUE
)
1738 for(ptype
= cmdlist
; ptype
!= NULL
; ptype
= ptype
->NEXT
)
1740 if(ptype
->DATA
== line
->NODE
)
1742 if(ptype
->TYPE
!= (long)0)
1744 ptline
= (ttvline_list
*)ptype
->TYPE
;
1745 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
1747 if ((delay
=stb_gettruncatedaccess(ptline
->ROOT
, ptline
->NODE
, 1))==TTV_NOTIME
)
1748 delay
= ttv_getdelaymax(ptline
) ;
1752 if ((delay
=stb_gettruncatedaccess(ptline
->ROOT
, ptline
->NODE
, 0))==TTV_NOTIME
)
1753 delay
= ttv_getdelaymin(ptline
) ;
1761 if(((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
) &&
1762 ((delay
< ttv_getdelaymax(line
)) || (ptline
== NULL
)))
1764 ptype
->TYPE
= (long)line
;
1766 else if(((type
& TTV_FIND_MIN
) == TTV_FIND_MIN
) &&
1767 ((delay
< ttv_getdelaymin(line
)) || (ptline
== NULL
)))
1769 ptype
->TYPE
= (long)line
;
1777 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
1778 cmdlist
= addptype(cmdlist
,(long)line
,line
->NODE
) ;
1780 cmdlist
= addptype(cmdlist
,(long)line
,line
->NODE
) ;
1781 line
->NODE
->TYPE
|= TTV_NODE_MARQUE
;
1787 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
1788 event
= ttv_getlinecmd(ttvfig
,line
,TTV_LINE_CMDMAX
) ;
1790 event
= ttv_getlinecmd(ttvfig
,line
,TTV_LINE_CMDMIN
) ;
1793 if((event
->TYPE
& TTV_NODE_MARQUE
) != TTV_NODE_MARQUE
)
1795 cmdlist
= addptype(cmdlist
,(long)0,event
) ;
1796 event
->TYPE
|= TTV_NODE_MARQUE
;
1802 for(ptype
= cmdlist
; ptype
!= NULL
; ptype
= ptype
->NEXT
)
1804 ((ttvevent_list
*)ptype
->DATA
)->TYPE
&= ~(TTV_NODE_MARQUE
) ;
1809 ptype_list
*ttv_getlatchaccess(ttvfig_list
*ttvfig
,ttvevent_list
*latch
,long type
)
1811 return ttv_getlatchaccess_sub(ttvfig
, latch
, type
, 0);
1813 ptype_list
*ttv_getlatchdatacommands(ttvfig_list
*ttvfig
,ttvevent_list
*latch
,long type
)
1815 return ttv_getlatchaccess_sub(ttvfig
, latch
, type
, 1);
1818 ptype_list
*ttv_getlatchasynccmd(ttvfig_list
*ttvfig
,ttvevent_list
*latch
,long type
)
1820 ttvline_list
*line
;
1821 ttvline_list
*ptline
;
1822 ttvevent_list
*event
;
1823 ptype_list
*cmdlist
= NULL
;
1827 if ((latch
->ROOT
->TYPE
& TTV_SIG_L
)==0) return NULL
;
1829 if((type
& TTV_FIND_PATH
) == TTV_FIND_PATH
)
1830 line
= latch
->INPATH
;
1832 line
= latch
->INLINE
;
1834 for(; line
!= NULL
; line
= line
->NEXT
)
1836 if((line
->TYPE
& TTV_LINE_CONT
) == 0)
1838 if (ttv_getlinecmd(ttvfig
,line
,((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)?TTV_LINE_CMDMAX
:TTV_LINE_CMDMIN
)==NULL
)
1840 cmdlist
= addptype(cmdlist
,(long)line
,line
->NODE
) ;
1847 /*****************************************************************************/
1848 /* function ttv_getcommandaccess() */
1850 /* latch : latch de recherche */
1852 /* recherche les commandes d'un latch pour les access */
1853 /*****************************************************************************/
1854 ptype_list
*ttv_getcommandaccess(ttvfig
,command
,type
)
1855 ttvfig_list
*ttvfig
;
1856 ttvevent_list
*command
;
1859 ttvline_list
*line
;
1860 ttvline_list
*ptline
;
1861 ptype_list
*latchlist
= NULL
;
1867 if((type
& TTV_FIND_PATH
) == TTV_FIND_PATH
)
1868 ptype
= getptype(command
->USER
,TTV_NODE_DUALPATH
) ;
1870 ptype
= getptype(command
->USER
,TTV_NODE_DUALLINE
) ;
1875 chain
= (chain_list
*)ptype
->DATA
;
1877 for(; chain
!= NULL
; chain
= chain
->NEXT
)
1879 line
= (ttvline_list
*)chain
->DATA
;
1881 if(((line
->TYPE
& (TTV_LINE_D
|TTV_LINE_T
)) != 0) &&
1882 (line
->FIG
!= ttvfig
))
1885 if((line
->TYPE
& TTV_LINE_A
) == TTV_LINE_A
)
1887 if((line
->ROOT
->TYPE
& TTV_NODE_MARQUE
) == TTV_NODE_MARQUE
)
1889 for(ptype
= latchlist
; ptype
!= NULL
; ptype
= ptype
->NEXT
)
1891 if(ptype
->DATA
== line
->ROOT
)
1893 if(ptype
->TYPE
!= (long)0)
1895 ptline
= (ttvline_list
*)ptype
->TYPE
;
1896 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
1898 if ((delay
=stb_gettruncatedaccess(ptline
->ROOT
, ptline
->NODE
, 1))==TTV_NOTIME
)
1899 delay
= ttv_getdelaymax(ptline
) ;
1903 if ((delay
=stb_gettruncatedaccess(ptline
->ROOT
, ptline
->NODE
, 0))==TTV_NOTIME
)
1904 delay
= ttv_getdelaymin(ptline
) ;
1912 if(((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
) &&
1913 ((delay
< ttv_getdelaymax(line
)) || (ptline
== NULL
)))
1915 ptype
->TYPE
= (long)line
;
1917 else if(((type
& TTV_FIND_MIN
) == TTV_FIND_MIN
) &&
1918 ((delay
< ttv_getdelaymin(line
)) || (ptline
== NULL
)))
1920 ptype
->TYPE
= (long)line
;
1928 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
1929 latchlist
= addptype(latchlist
,(long)line
,line
->ROOT
) ;
1931 latchlist
= addptype(latchlist
,(long)line
,line
->ROOT
) ;
1932 line
->ROOT
->TYPE
|= TTV_NODE_MARQUE
;
1937 for(ptype
= latchlist
; ptype
!= NULL
; ptype
= ptype
->NEXT
)
1939 ((ttvevent_list
*)ptype
->DATA
)->TYPE
&= ~(TTV_NODE_MARQUE
) ;
1946 /*****************************************************************************/
1947 /* function ttv_findaccess() */
1949 /* head : ttvfig pere */
1950 /* ttvfig : ttvfig courante */
1951 /* root : noeud sortie */
1952 /* cmd : noeud command */
1953 /* type : type de recherche */
1954 /* level : niveau de la recherche */
1956 /* parcours en largeur pour retrouver les chemins finissant sur root */
1957 /* si level = 0 il faut chercher dans le niveau de ttvfig qui n'est pas la */
1959 /* si level = ttvfig->LEVEL la recherche est au niveau de la figure pere */
1960 /* si level < ttvfig->LEVEL la recherche est entre level et le figure pere */
1961 /* si level > ttvfig->LEVEL la recherche est entre ttvfig et level sans la */
1963 /*****************************************************************************/
1964 chain_list
*ttv_findaccess(head
,ttvfig
,root
,cmd
,type
,level
)
1966 ttvfig_list
*ttvfig
;
1967 ttvevent_list
*root
;
1968 ttvevent_list
*cmd
;
1972 chain_list
*chainin
;
1973 chain_list
*chainclock
;
1975 chainclock
= TTV_CHAIN_CLOCK
;
1976 TTV_CHAIN_CLOCK
= NULL
;
1977 TTV_FIND_BUILD
= 'N' ;
1979 chainin
= ttv_findpath(head
,ttvfig
,root
,cmd
,type
,level
) ;
1981 TTV_CHAIN_CLOCK
= chainclock
;
1983 TTV_FIND_BUILD
= 'Y' ;
1988 //----- fonction de marquage des noeuds sur le chemin de donnees des access ---
1989 // action==0 => demarquer , action==1 => marquer
1990 void ttv_markdatapath(ttvevent_list
*start
, ttvevent_list
*end
, long type
, int action
)
1992 ttvevent_list
*nodex
;
1993 if ((type
& TTV_FIND_DUAL
)!=TTV_FIND_DUAL
)
1996 if (action
==0) ttv_donotbypassnode(nodex
);
1997 else ttv_bypassnode(nodex
);
1998 while(nodex
->FIND
->OUTLINE
!= NULL
)
2000 nodex
= nodex
->FIND
->OUTLINE
->ROOT
;
2001 if (action
==0) ttv_donotbypassnode(nodex
);
2002 else ttv_bypassnode(nodex
);
2003 if(nodex
== end
) break ;
2009 if (action
==0) ttv_donotbypassnode(nodex
);
2010 else ttv_bypassnode(nodex
);
2011 while(nodex
->FIND
->OUTLINE
!= NULL
)
2013 nodex
= nodex
->FIND
->OUTLINE
->NODE
;
2014 if (action
==0) ttv_donotbypassnode(nodex
);
2015 else ttv_bypassnode(nodex
);
2016 if(nodex
== end
) break ;
2021 /*****************************************************************************/
2022 /* function ttv_findclockpath() */
2024 /* head : ttvfig pere */
2025 /* ttvfig : ttvfig courante */
2026 /* root : noeud sortie */
2027 /* type : type de recherche */
2028 /* level : niveau de la recherche */
2030 /* parcours en largeur pour retrouver les chemins finissant sur root */
2031 /* si level = 0 il faut chercher dans le niveau de ttvfig qui n'est pas la */
2033 /* si level = ttvfig->LEVEL la recherche est au niveau de la figure pere */
2034 /* si level < ttvfig->LEVEL la recherche est entre level et le figure pere */
2035 /* si level > ttvfig->LEVEL la recherche est entre ttvfig et level sans la */
2037 /*****************************************************************************/
2038 chain_list
*ttv_findclockpath(ttvfig_list
*head
,ttvfig_list
*ttvfig
,ttvevent_list
*root
,ttvevent_list
*end
,long type
,long level
, ttvevent_list
*thru_command
)
2040 chain_list
*chainclock
= NULL
;
2041 chain_list
*chainnext
;
2042 chain_list
*chainsav
;
2044 ptype_list
*cmdlist
;
2046 ptype_list
*ptypex
;
2047 ttvevent_list
*event
;
2048 ttvevent_list
*cmdevent
;
2049 ttvsig_list
*ptsig
;
2050 ttvline_list
*ptline
;
2054 if(TTV_CHAIN_CLOCK
== NULL
)
2057 if((((root
->ROOT
->TYPE
& (TTV_SIG_L
|TTV_SIG_B
)) != 0) &&
2058 ((type
& TTV_FIND_DUAL
) != TTV_FIND_DUAL
)) ||
2059 (((root
->ROOT
->TYPE
& (TTV_SIG_Q
|TTV_SIG_B
)) != 0) &&
2060 ((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)))
2063 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
2064 cmdlist
= ttv_getcommandaccess(ttvfig
,root
,type
) ;
2065 else if ((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_ADD_ASYNCHRONOUS_ACCESS
)!=0)
2066 cmdlist
=ttv_getlatchasynccmd(ttvfig
,root
,type
);
2068 cmdlist
= ttv_getlatchaccess(ttvfig
,root
,type
) ;
2073 ttv_markdatapath(root
, end
, type
, 1);
2075 if(V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
!=0 || (type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
|| (TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_ADD_ASYNCHRONOUS_ACCESS
)!=0)
2079 if ((type
& TTV_FIND_PATHDET
)==TTV_FIND_PATHDET
2080 || (type
& TTV_FIND_CRITIC
)==TTV_FIND_CRITIC
)
2084 for(ptype
= cmdlist
; ptype
!= NULL
; ptype
= ptype
->NEXT
)
2086 cmdevent
= (ttvevent_list
*)ptype
->DATA
;
2088 if (thru_command
!=NULL
&& cmdevent
!=thru_command
) continue;
2089 if (ttv_isbypassednode(cmdevent
)) continue;
2091 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
2092 stb_getstblatchaccess(stb_getstbfig(head
),root
,cmdevent
,NULL
,&delay
,&event
) ;
2094 stb_getstblatchaccess(stb_getstbfig(head
),root
,cmdevent
,&delay
,NULL
,&event
) ;
2096 if((delay
<= (long)0) || (event
== NULL
) || ttv_canbeinfalsepath(cmdevent
, 'o')|| ttv_canbeinfalsepath(end
, 'o'))
2105 for(ptype
= cmdlist
; ptype
!= NULL
; ptype
= ptype
->NEXT
)
2107 cmdevent
= (ttvevent_list
*)ptype
->DATA
;
2109 if (thru_command
!=NULL
&& cmdevent
!=thru_command
) continue;
2110 if (ttv_isbypassednode(cmdevent
)) continue;
2112 ttv_fifopush(cmdevent
) ;
2113 if(ptype
->TYPE
!= (long)0)
2115 ptline
= (ttvline_list
*)ptype
->TYPE
;
2116 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
2118 if ((delay
=stb_gettruncatedaccess(ptline
->ROOT
, ptline
->NODE
,1))==TTV_NOTIME
)
2119 delay
= ttv_getdelaymax(ptline
) ;
2123 if ((delay
=stb_gettruncatedaccess(ptline
->ROOT
, ptline
->NODE
, 0))==TTV_NOTIME
)
2124 delay
= ttv_getdelaymin(ptline
) ;
2132 if((ptypex
= getptype(cmdevent
->USER
,TTV_NODE_LATCH
)) == NULL
)
2134 if(cmdevent
->FIND
->DELAY
== TTV_NOTIME
)
2136 cmdevent
->USER
= addptype(cmdevent
->USER
,TTV_NODE_LATCH
,root
) ;
2137 cmdevent
->FIND
->DELAY
= delay
+ root
->FIND
->DELAY
;
2138 cmdevent
->FIND
->OUTLINE
= ptline
;
2142 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
2144 if(cmdevent
->FIND
->DELAY
< (delay
+ root
->FIND
->DELAY
))
2146 cmdevent
->FIND
->DELAY
= delay
+ root
->FIND
->DELAY
;
2147 cmdevent
->FIND
->OUTLINE
= ptline
;
2148 cmdevent
->USER
= addptype(cmdevent
->USER
,TTV_NODE_LATCH
,root
) ;
2153 if(cmdevent
->FIND
->DELAY
> (delay
+ root
->FIND
->DELAY
))
2155 cmdevent
->FIND
->DELAY
= delay
+ root
->FIND
->DELAY
;
2156 cmdevent
->FIND
->OUTLINE
= ptline
;
2157 cmdevent
->USER
= addptype(cmdevent
->USER
,TTV_NODE_LATCH
,root
) ;
2164 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
2166 if(cmdevent
->FIND
->DELAY
< (delay
+ root
->FIND
->DELAY
))
2168 cmdevent
->FIND
->DELAY
= delay
+ root
->FIND
->DELAY
;
2169 cmdevent
->FIND
->OUTLINE
= ptline
;
2170 ptypex
->DATA
= root
;
2175 if(cmdevent
->FIND
->DELAY
> (delay
+ root
->FIND
->DELAY
))
2177 cmdevent
->FIND
->DELAY
= delay
+ root
->FIND
->DELAY
;
2178 cmdevent
->FIND
->OUTLINE
= ptline
;
2179 ptypex
->DATA
= root
;
2184 if (find
=='Y') continue;
2186 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
2187 stb_getstblatchaccess(stb_getstbfig(head
),root
,cmdevent
,NULL
,&delay
,&event
) ;
2189 stb_getstblatchaccess(stb_getstbfig(head
),root
,cmdevent
,&delay
,NULL
,&event
) ;
2191 if((delay
> (long)0) && (event
!= NULL
))
2193 ttv_fifopush(event
) ;
2194 if((ptypex
= getptype(event
->USER
,TTV_NODE_CLOCK
)) == NULL
)
2196 chainclock
= addchain(chainclock
,(void *)event
) ;
2197 if(event
->FIND
->DELAY
== TTV_NOTIME
)
2199 event
->USER
= addptype(event
->USER
,TTV_NODE_CLOCK
,cmdevent
) ;
2200 event
->FIND
->DELAY
= delay
+ cmdevent
->FIND
->DELAY
;
2201 event
->FIND
->OUTLINE
= NULL
;
2205 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
2207 if(event
->FIND
->DELAY
< (delay
+ cmdevent
->FIND
->DELAY
))
2209 event
->FIND
->DELAY
= delay
+ cmdevent
->FIND
->DELAY
;
2210 event
->FIND
->OUTLINE
= NULL
;
2211 event
->USER
= addptype(event
->USER
,TTV_NODE_CLOCK
,root
) ;
2216 if(event
->FIND
->DELAY
> (delay
+ cmdevent
->FIND
->DELAY
))
2218 event
->FIND
->DELAY
= delay
+ cmdevent
->FIND
->DELAY
;
2219 event
->FIND
->OUTLINE
= NULL
;
2220 event
->USER
= addptype(event
->USER
,TTV_NODE_CLOCK
,root
) ;
2227 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
2229 if(event
->FIND
->DELAY
< (delay
+ cmdevent
->FIND
->DELAY
))
2231 event
->FIND
->DELAY
= delay
+ cmdevent
->FIND
->DELAY
;
2232 event
->FIND
->OUTLINE
= ptline
;
2233 ptypex
->DATA
= cmdevent
;
2238 if(event
->FIND
->DELAY
> (delay
+ cmdevent
->FIND
->DELAY
))
2240 event
->FIND
->DELAY
= delay
+ cmdevent
->FIND
->DELAY
;
2241 event
->FIND
->OUTLINE
= ptline
;
2242 ptypex
->DATA
= cmdevent
;
2252 freeptype(cmdlist
) ;
2254 else if((root
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
)
2257 ttv_markdatapath(root
, end
, type
, 1);
2260 ttv_fifopush(root
) ;
2261 if((ptype
= getptype(root
->USER
,TTV_NODE_LATCH
)) == NULL
)
2262 root
->USER
= addptype(root
->USER
,TTV_NODE_LATCH
,root
) ;
2264 ptype
->DATA
= (void *)root
;
2266 if(root
->FIND
->NEXT
!= NULL
)
2268 if(root
->FIND
->DELAY
== TTV_NOTIME
)
2270 if(root
->FIND
->NEXT
->DELAY
!= TTV_NOTIME
)
2272 root
->FIND
->DELAY
= root
->FIND
->NEXT
->DELAY
;
2273 root
->FIND
->OUTLINE
= root
->FIND
->NEXT
->OUTLINE
;
2282 TTV_SEARCH_STEP
|=TTV_SEARCH_STEP_IN_CLOCK_PATH
;
2283 chainclock
= ttv_findpath(head
,ttvfig
,root
,NULL
,type
& ~TTV_FIND_HZ
,level
) ;
2284 TTV_SEARCH_STEP
&=~TTV_SEARCH_STEP_IN_CLOCK_PATH
;
2287 if((type
& TTV_FIND_DUAL
) != TTV_FIND_DUAL
)
2289 for(chain
= TTV_CHAIN_CLOCK
; chain
!= NULL
; chain
= chain
->NEXT
)
2291 ptsig
= (ttvsig_list
*)chain
->DATA
;
2292 ptsig
->NODE
->TYPE
|= TTV_NODE_MARQUE
;
2293 (ptsig
->NODE
+1)->TYPE
|= TTV_NODE_MARQUE
;
2297 for(chain
= chainclock
; chain
!= NULL
; chain
= chainnext
)
2299 chainnext
= chain
->NEXT
;
2300 event
= (ttvevent_list
*)chain
->DATA
;
2301 if((event
->TYPE
& TTV_NODE_MARQUE
) != TTV_NODE_MARQUE
)
2303 event
->FIND
->TYPE
&= ~(TTV_FIND_BEGIN
) ;
2304 if(chainsav
== NULL
)
2306 chainclock
= chainnext
;
2307 chain
->NEXT
= NULL
;
2309 event
->USER
=testanddelptype(event
->USER
,TTV_NODE_CLOCK
);
2314 chainsav
->NEXT
= chain
->NEXT
;
2315 chain
->NEXT
= NULL
;
2323 for(chain
= TTV_CHAIN_CLOCK
; chain
!= NULL
; chain
= chain
->NEXT
)
2325 ptsig
= (ttvsig_list
*)chain
->DATA
;
2326 ptsig
->NODE
->TYPE
&= ~(TTV_NODE_MARQUE
) ;
2327 (ptsig
->NODE
+1)->TYPE
&= ~(TTV_NODE_MARQUE
) ;
2332 for(chain
= TTV_CHAIN_FREE
; chain
!= NULL
; chain
= chain
->NEXT
)
2333 ((ttvfig_list
*)chain
->DATA
)->STATUS
&= ~(TTV_STS_NOT_FREE
) ;
2335 freechain(TTV_CHAIN_FREE
) ;
2336 TTV_CHAIN_FREE
= NULL
;
2338 ttv_markdatapath(root
, end
, type
, 0);
2340 return(chainclock
) ;
2343 /*****************************************************************************/
2344 /* function ttv_iscrosslatch() */
2346 /* ttvfig : figure principale */
2348 /* doit-on traverser un latch */
2349 /*****************************************************************************/
2350 int ttv_iscrosslatch(ttvfig
,latch
,type
)
2351 ttvfig_list
*ttvfig
;
2352 ttvevent_list
*latch
;
2355 stbfig_list
*stbfig
;
2359 int maxpathpd
=V_INT_TAB
[__TTV_MAX_PATH_PERIOD
].VALUE
;
2362 if((((latch
->ROOT
->TYPE
& TTV_SIG_LL
) != TTV_SIG_LL
) &&
2363 ((latch
->ROOT
->TYPE
& TTV_SIG_R
) != TTV_SIG_R
)) ||
2364 (((type
& TTV_FIND_HZ
) == TTV_FIND_HZ
) &&
2365 ((latch
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
)))
2368 if (TTV_MaxPathPeriodPrecharge
!=0 && (latch
->ROOT
->TYPE
& TTV_SIG_R
) !=0)
2370 maxpathpd
=TTV_MaxPathPeriodPrecharge
;
2371 flags
=TTV_FINDSTRUCT_FLAGS_LAST_CROSSED_IS_PRECH
;
2374 if (ttv_testsigflag(latch
->ROOT
, TTV_SIG_FLAGS_DONTCROSS
))
2377 if (ttv_testsigflag(latch
->ROOT
, TTV_SIG_FLAGS_TRANSPARENT
))
2379 latch
->FIND
->FLAGS
|=TTV_FINDSTRUCT_FLAGS_FORCEDTRANSPARENCY
;
2380 latch
->FIND
->FLAGS
|=flags
;
2384 if(latch
->FIND
->PERIODE
>= maxpathpd
)
2387 if((stbfig
= stb_getstbfig(ttvfig
)) == NULL
)
2390 stb_geteventphase(stbfig
,latch
,&phase
,NULL
,NULL
,1,1) ;
2392 if(phase
== STB_NO_INDEX
)
2394 latch
->FIND
->FLAGS
|=flags
;
2398 stb_getstbdelta(stbfig
, latch
, &datamin
, &datamax
, NULL
);
2405 /* if(latch->FIND->ORGPHASE == TTV_NO_PHASE)
2407 latch->FIND->ORGPHASE = phase ;
2410 // latch->FIND->PHASE = phase ;
2411 latch
->FIND
->FLAGS
|=flags
|TTV_FINDSTRUCT_CROSS_ENABLED
;
2416 /*****************************************************************************/
2417 /* function ttv_findpath() */
2419 /* head : ttvfig pere */
2420 /* ttvfig : ttvfig courante */
2421 /* root : noeud sortie */
2422 /* cmd : noeud command */
2423 /* type : type de recherche */
2424 /* level : niveau de la recherche */
2426 /* parcours en largeur pour retrouver les chemins finissant sur root */
2427 /* si level = 0 il faut chercher dans le niveau de ttvfig qui n'est pas la */
2429 /* si level = ttvfig->LEVEL la recherche est au niveau de la figure pere */
2430 /* si level < ttvfig->LEVEL la recherche est entre level et le figure pere */
2431 /* si level > ttvfig->LEVEL la recherche est entre ttvfig et level sans la */
2433 /*****************************************************************************/
2434 chain_list
*ttv_findpath(head
,ttvfig
,root
,cmd
,type
,level
)
2436 ttvfig_list
*ttvfig
;
2437 ttvevent_list
*root
;
2438 ttvevent_list
*cmd
;
2442 ttvfig_list
*ttvfigx
;
2443 ttvfig_list
*ttvfigp
;
2444 ttvevent_list
*node
;
2445 ttvevent_list
*nodex
;
2446 ttvevent_list
*rootx
;
2448 chain_list
*in_gi
= NULL
;
2450 chain_list
*chainnfree
= NULL
;
2454 char typesigroot
= 'X' ;
2456 ttv_ssta_set_checkloadedstore(head
);
2458 if(((root
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
) ||
2459 ((root
->ROOT
->TYPE
& TTV_SIG_CZ
) == TTV_SIG_CZ
) ||
2460 ((root
->ROOT
->TYPE
& TTV_SIG_CT
) == TTV_SIG_CT
))
2462 if(((root
->ROOT
->TYPE
& TTV_SIG_LR
) == TTV_SIG_LR
) ||
2463 ((root
->ROOT
->TYPE
& TTV_SIG_LS
) == TTV_SIG_LS
))
2466 if((root
->FIND
== NULL
) ||
2467 (root
->FIND
->DELAY
== TTV_NOTIME
) ||
2468 (TTV_CHAIN_CLOCK
== NULL
))
2470 ttv_fifopush(root
) ;
2471 root
->FIND
->DELAY
= (long)0 ;
2474 if((type
& TTV_FIND_PATH
) == TTV_FIND_PATH
)
2476 status
= TTV_STS_L_J
;
2477 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
2478 status
|= TTV_STS_DUAL_J
;
2479 filetype
= TTV_FILE_TTX
;
2483 status
= TTV_STS_LS_E
;
2484 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
2485 status
|= TTV_STS_DUAL_E
;
2486 filetype
= TTV_FILE_DTX
;
2489 if((ttvfig
->INFO
->LEVEL
>= level
) && (level
!= (long)0))
2491 long statusx
= status
;
2493 if((type
& TTV_FIND_PATH
) == TTV_FIND_PATH
)
2495 statusx
|= TTV_STS_CL_PJT
;
2496 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
2497 statusx
|= (TTV_STS_DUAL_T
|TTV_STS_DUAL_P
|TTV_STS_DUAL_J
) ;
2501 statusx
|= TTV_STS_CLS_FED
;
2502 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
2503 statusx
|= (TTV_STS_DUAL_D
|TTV_STS_DUAL_F
|TTV_STS_DUAL_E
) ;
2505 if((ttvfig
->STATUS
& TTV_STS_NOT_FREE
) != TTV_STS_NOT_FREE
)
2507 chainnfree
= addchain(chainnfree
,(void *)ttvfig
) ;
2508 ttvfig
->STATUS
|= TTV_STS_NOT_FREE
;
2510 ttv_parsttvfig(ttvfig
,statusx
,filetype
) ;
2512 if(ttvfig
->INFO
->LEVEL
> level
)
2514 ttvfig
= root
->ROOT
->ROOT
;
2515 while(ttvfig
!= NULL
)
2517 if(ttvfig
->INFO
->LEVEL
>= level
) break ;
2518 ttvfig
= ttvfig
->ROOT
;
2520 level
= ttvfigp
->INFO
->LEVEL
;
2525 if(level
== (long)0)
2527 level
= ttvfig
->INFO
->LEVEL
;
2532 ttvfigx
= root
->ROOT
->ROOT
;
2533 while(ttvfigx
!= NULL
)
2535 long statusx
= status
;
2536 if(ttvfigx
->INFO
->LEVEL
> level
) break ;
2537 if(ttvfigx
->INFO
->LEVEL
>= ttvfig
->INFO
->LEVEL
)
2539 if((type
& TTV_FIND_PATH
) == TTV_FIND_PATH
)
2541 statusx
|= TTV_STS_P
;
2542 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
2543 statusx
|= TTV_STS_DUAL_P
;
2547 statusx
|= TTV_STS_F
;
2548 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
2549 statusx
|= TTV_STS_DUAL_F
;
2552 if((ttvfigx
->STATUS
& TTV_STS_NOT_FREE
) != TTV_STS_NOT_FREE
)
2554 chainnfree
= addchain(chainnfree
,(void *)ttvfigx
) ;
2555 ttvfigx
->STATUS
|= TTV_STS_NOT_FREE
;
2557 ttv_parsttvfig(ttvfigx
,statusx
,filetype
) ;
2558 ttvfigx
= ttvfigx
->ROOT
;
2561 while((node
= ttv_fifopop()) != NULL
)
2565 // if (TTV_MARK_MODE==TTV_MARK_MODE_USE && ??inf->CLOCK!=0?? && getptype(node->ROOT->USER, TTV_SIG_MARKED)==NULL) continue;
2566 if (((TTV_SEARCH_STEP
& TTV_SEARCH_STEP_IN_CLOCK_PATH
)!=0 || (TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_MUST_BE_CLOCK
)!=0) && ttv_testsigflag(node
->ROOT
, TTV_SIG_FLAGS_ISDATA
)) continue;
2568 if((node
->TYPE
& TTV_NODE_STOP
) == TTV_NODE_STOP
)
2571 (((type
& (TTV_FIND_HIER
|TTV_FIND_DUAL
)) != 0 || (node
->ROOT
->TYPE
& (TTV_SIG_CB
|TTV_SIG_L
|TTV_SIG_R
|TTV_SIG_B
|TTV_SIG_Q
)) != TTV_SIG_CB
)
2572 && ((type
& TTV_FIND_HIER
) == TTV_FIND_HIER
|| ((node
->ROOT
->TYPE
& (TTV_SIG_N
|TTV_SIG_L
|TTV_SIG_R
|TTV_SIG_B
|TTV_SIG_Q
)) != TTV_SIG_N
|| (TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_ENABLE_STOP_ON_TTV_SIG_N
)!=0))
2573 && ((node
->ROOT
->TYPE
& (TTV_SIG_C
| TTV_SIG_N
| TTV_SIG_Q
)) != TTV_SIG_Q
|| (type
& (TTV_FIND_DUAL
|TTV_FIND_CMD
)) != 0)))
2575 if((node
->FIND
->TYPE
& TTV_FIND_BEGIN
) != TTV_FIND_BEGIN
)
2577 in_gi
= addchain(in_gi
,(char *)node
) ;
2578 node
->FIND
->TYPE
|= TTV_FIND_BEGIN
;
2580 if( ((((node
->ROOT
->TYPE
& (TTV_SIG_CB
|TTV_SIG_L
|TTV_SIG_R
)) != TTV_SIG_CB
)
2581 && ((node
->ROOT
->TYPE
& (TTV_SIG_CT
|TTV_SIG_L
|TTV_SIG_R
)) != TTV_SIG_CT
)
2582 && ((node
->ROOT
->TYPE
& (TTV_SIG_N
|TTV_SIG_L
|TTV_SIG_R
)) != TTV_SIG_N
))
2584 ((type
& TTV_FIND_HIER
) == TTV_FIND_HIER
)
2585 ||(ttv_islocononlyend(ttvfig
,node
,type
) != 0))
2587 (((node
->ROOT
->TYPE
& (TTV_SIG_C
| TTV_SIG_N
| TTV_SIG_Q
)) != TTV_SIG_Q
)
2588 || ((type
& TTV_FIND_CMD
) != TTV_FIND_CMD
))
2589 //|| ((type & (TTV_FIND_DUAL|TTV_FIND_CMD)) != TTV_FIND_DUAL))
2590 && ((node
->ROOT
->TYPE
& (TTV_SIG_C
| TTV_SIG_N
| TTV_SIG_B
)) != TTV_SIG_B
))
2591 if((TTV_CHAIN_CLOCK
!= NULL
) || (TTV_FIND_BUILD
== 'Y') ||
2592 (ttv_iscrosslatch(head
,node
,type
) == 0))
2594 if (!((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_CROSS_STOP_NODE_IF_NONSTOP
)!=0 &&
2595 (node
->ROOT
->TYPE
& (TTV_SIG_C
| TTV_SIG_L
| TTV_SIG_R
| TTV_SIG_B
))==0))
2601 if(((((node
->ROOT
->TYPE
& TTV_SIG_BYPASSOUT
) != TTV_SIG_BYPASSOUT
) &&
2602 ((node
->TYPE
& TTV_NODE_BYPASSOUT
) != TTV_NODE_BYPASSOUT
)) ||
2603 ((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)) &&
2604 ((((node
->ROOT
->TYPE
& TTV_SIG_BYPASSIN
) != TTV_SIG_BYPASSIN
) &&
2605 ((node
->TYPE
& TTV_NODE_BYPASSIN
) != TTV_NODE_BYPASSIN
)) ||
2606 ((type
& TTV_FIND_DUAL
) != TTV_FIND_DUAL
)))
2608 if((type
& TTV_FIND_PATH
) == TTV_FIND_PATH
)
2610 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
2612 ptype
= getptype(node
->USER
,TTV_NODE_DUALPATH
) ;
2613 if(ptype
== NULL
) in
= NULL
;
2616 chain
= (chain_list
*)ptype
->DATA
;
2617 if(chain
== NULL
) in
= NULL
;
2618 else in
= (ttvline_list
*)chain
->DATA
;
2621 else in
= node
->INPATH
;
2625 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
2627 ptype
= getptype(node
->USER
,TTV_NODE_DUALLINE
) ;
2628 if(ptype
== NULL
) in
= NULL
;
2631 chain
= (chain_list
*)ptype
->DATA
;
2632 if(chain
== NULL
) in
= NULL
;
2633 else in
= (ttvline_list
*)chain
->DATA
;
2636 else in
= node
->INLINE
;
2641 if(((in
->TYPE
& TTV_LINE_CONT
) == TTV_LINE_CONT
) ||
2642 (((in
->TYPE
& TTV_LINE_RC
) == TTV_LINE_RC
) &&
2643 ((in
->TYPE
& (TTV_LINE_D
|TTV_LINE_T
)) != 0) &&
2644 (ttv_islineonlyend(ttvfig
,in
,type
) == 1)))
2646 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
2648 chain
= chain
->NEXT
;
2649 if(chain
== NULL
) in
= NULL
;
2650 else in
= (ttvline_list
*)chain
->DATA
;
2659 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
2663 if(((in
->TYPE
& TTV_LINE_RC
) == TTV_LINE_RC
) &&
2664 (node
->FIND
->OUTLINE
!= NULL
))
2666 if((node
->FIND
->OUTLINE
->TYPE
& TTV_LINE_RC
) == TTV_LINE_RC
)
2668 chain
= chain
->NEXT
;
2669 if(chain
== NULL
) in
= NULL
;
2670 else in
= (ttvline_list
*)chain
->DATA
;
2674 if(((nodex
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
) ||
2675 ((nodex
->ROOT
->TYPE
& TTV_SIG_CZ
) == TTV_SIG_CZ
) ||
2676 ((nodex
->ROOT
->TYPE
& TTV_SIG_CT
) == TTV_SIG_CT
))
2678 if((((in
->TYPE
& TTV_LINE_HZ
) == TTV_LINE_HZ
) &&
2679 ((type
& TTV_FIND_HZ
) != TTV_FIND_HZ
)) ||
2680 (((in
->TYPE
& TTV_LINE_HZ
) != TTV_LINE_HZ
) &&
2681 ((type
& TTV_FIND_HZ
) == TTV_FIND_HZ
)))
2683 chain
= chain
->NEXT
;
2684 if(chain
== NULL
) in
= NULL
;
2685 else in
= (ttvline_list
*)chain
->DATA
;
2689 else if((in
->TYPE
& TTV_LINE_HZ
) == TTV_LINE_HZ
)
2691 chain
= chain
->NEXT
;
2692 if(chain
== NULL
) in
= NULL
;
2693 else in
= (ttvline_list
*)chain
->DATA
;
2696 if((cmd
!= NULL
) && ((nodex
->ROOT
->TYPE
& TTV_SIG_L
) == TTV_SIG_L
))
2698 if(cmd
!= ttv_getlinecmd(head
,in
,((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)?TTV_LINE_CMDMAX
:TTV_LINE_CMDMIN
))
2700 chain
= chain
->NEXT
;
2701 if(chain
== NULL
) in
= NULL
;
2702 else in
= (ttvline_list
*)chain
->DATA
;
2706 if(((nodex
->ROOT
->TYPE
& TTV_SIG_LR
) == TTV_SIG_LR
) ||
2707 ((nodex
->ROOT
->TYPE
& TTV_SIG_LS
) == TTV_SIG_LS
))
2709 if((((in
->TYPE
& TTV_LINE_R
) == TTV_LINE_R
) &&
2710 ((type
& TTV_FIND_S
) == TTV_FIND_S
)) ||
2711 (((in
->TYPE
& TTV_LINE_S
) == TTV_LINE_S
) &&
2712 ((type
& TTV_FIND_R
) == TTV_FIND_R
)))
2714 chain
= chain
->NEXT
;
2715 if(chain
== NULL
) in
= NULL
;
2716 else in
= (ttvline_list
*)chain
->DATA
;
2725 if(((in
->TYPE
& TTV_LINE_RC
) == TTV_LINE_RC
) &&
2726 (node
->FIND
->OUTLINE
!= NULL
))
2728 if((node
->FIND
->OUTLINE
->TYPE
& TTV_LINE_RC
) == TTV_LINE_RC
)
2734 if((typesigroot
== 'R') ||
2735 ((rootx
->ROOT
->TYPE
& TTV_SIG_CZ
) == TTV_SIG_CZ
) ||
2736 ((rootx
->ROOT
->TYPE
& TTV_SIG_CT
) == TTV_SIG_CT
))
2738 if(((((in
->TYPE
& TTV_LINE_HZ
) == TTV_LINE_HZ
) &&
2739 ((type
& TTV_FIND_HZ
) != TTV_FIND_HZ
)) ||
2740 (((in
->TYPE
& TTV_LINE_HZ
) != TTV_LINE_HZ
) &&
2741 ((type
& TTV_FIND_HZ
) == TTV_FIND_HZ
))) &&
2743 ((rootx
->ROOT
->TYPE
& TTV_SIG_CZ
) == TTV_SIG_CZ
) ||
2744 ((rootx
->ROOT
->TYPE
& TTV_SIG_CT
) == TTV_SIG_CT
)))
2750 else if((in
->TYPE
& TTV_LINE_HZ
) == TTV_LINE_HZ
)
2755 if((cmd
!= NULL
|| (TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_ADD_ASYNCHRONOUS_PATHS
)!=0)
2756 && ((root
->ROOT
->TYPE
& TTV_SIG_L
) == TTV_SIG_L
)
2759 if(cmd
!= ttv_getlinecmd(head
,in
,((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)?TTV_LINE_CMDMAX
:TTV_LINE_CMDMIN
))
2765 if(typesigroot
== 'Z')
2767 if(((((in
->TYPE
& TTV_LINE_R
) == TTV_LINE_R
) &&
2768 ((type
& TTV_FIND_S
) == TTV_FIND_S
)) ||
2769 (((in
->TYPE
& TTV_LINE_S
) == TTV_LINE_S
) &&
2770 ((type
& TTV_FIND_R
) == TTV_FIND_R
))) && (rootx
== root
))
2778 if((((in
->TYPE
& TTV_LINE_DENPTMAX
) == TTV_LINE_DENPTMAX
) &&
2779 ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)) ||
2780 (((in
->TYPE
& TTV_LINE_DENPTMIN
) == TTV_LINE_DENPTMIN
) &&
2781 ((type
& TTV_FIND_MIN
) == TTV_FIND_MIN
)) ||
2782 (((in
->TYPE
& (TTV_LINE_T
| TTV_LINE_D
)) != 0) &&
2783 (ttvfigp
!= in
->FIG
)) ||
2784 (((in
->TYPE
& (TTV_LINE_J
| TTV_LINE_E
)) != 0) &&
2785 (level
< in
->FIG
->INFO
->LEVEL
)) ||
2786 (((in
->TYPE
& (TTV_LINE_F
| TTV_LINE_P
)) != 0) &&
2787 ((level
< in
->FIG
->INFO
->LEVEL
) || (ttvfig
->INFO
->LEVEL
> in
->FIG
->INFO
->LEVEL
))))
2789 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
2791 chain
= chain
->NEXT
;
2792 if(chain
== NULL
) in
= NULL
;
2793 else in
= (ttvline_list
*)chain
->DATA
;
2795 else in
= in
->NEXT
;
2799 if(node
->ROOT
->ROOT
!= nodex
->ROOT
->ROOT
)
2801 ttvfigx
= nodex
->ROOT
->ROOT
;
2802 while((ttvfigx
!= ttvfig
) && ((ttvfigx
->STATUS
&
2803 TTV_STS_NOT_FREE
) != TTV_STS_NOT_FREE
))
2805 if((ttvfigx
->STATUS
& TTV_STS_NOT_FREE
) != TTV_STS_NOT_FREE
)
2807 chainnfree
= addchain(chainnfree
,(void *)ttvfigx
) ;
2808 ttvfigx
->STATUS
|= TTV_STS_NOT_FREE
;
2810 ttv_parsttvfig(ttvfigx
,status
,filetype
) ;
2811 ttvfigx
= ttvfigx
->ROOT
;
2817 if (TTV_CHAIN_CLOCK
==NULL
)
2819 if(((root
->ROOT
->TYPE
& TTV_SIG_L
) == TTV_SIG_L
)
2820 || ((root
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
))
2822 if(((((nodex
->ROOT
->TYPE
& TTV_SIG_BYPASSIN
) != TTV_SIG_BYPASSIN
) &&
2823 ((nodex
->TYPE
& TTV_NODE_BYPASSIN
) != TTV_NODE_BYPASSIN
)) ||
2824 ((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)) &&
2825 ((((nodex
->ROOT
->TYPE
& TTV_SIG_BYPASSOUT
) != TTV_SIG_BYPASSOUT
) &&
2826 ((nodex
->TYPE
& TTV_NODE_BYPASSOUT
) != TTV_NODE_BYPASSOUT
)) ||
2827 ((type
& TTV_FIND_DUAL
) != TTV_FIND_DUAL
)))
2829 if((ptype
= getptype(root
->USER
,TTV_NODE_DELAYLOOP
)) == NULL
)
2831 ptype
= root
->USER
= addptype(root
->USER
,
2832 TTV_NODE_DELAYLOOP
,(void*)TTV_NOTIME
) ;
2834 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
2836 delay
= ttv_getdelaymax(in
) ;
2837 if(((node
->FIND
->DELAY
+ delay
) > (long)ptype
->DATA
) &&
2838 (delay
!= TTV_NOTIME
))
2840 ptype
->DATA
= (void *)(node
->FIND
->DELAY
+ delay
) ;
2841 nodex
->FIND
->OUTLINE
= in
;
2842 if((root
->FIND
->TYPE
& TTV_FIND_BEGIN
) != TTV_FIND_BEGIN
)
2844 in_gi
= addchain(in_gi
,(char *)root
) ;
2845 root
->FIND
->TYPE
|= TTV_FIND_BEGIN
;
2851 delay
= ttv_getdelaymin(in
) ;
2852 if((((node
->FIND
->DELAY
+ delay
) < (long)ptype
->DATA
) ||
2853 ((long)ptype
->DATA
== TTV_NOTIME
))
2854 && (delay
!= TTV_NOTIME
))
2856 ptype
->DATA
= (void *)(node
->FIND
->DELAY
+ delay
) ;
2857 nodex
->FIND
->OUTLINE
= in
;
2858 if((root
->FIND
->TYPE
& TTV_FIND_BEGIN
) != TTV_FIND_BEGIN
)
2860 in_gi
= addchain(in_gi
,(char *)root
) ;
2861 root
->FIND
->TYPE
|= TTV_FIND_BEGIN
;
2865 if((long)ptype
->DATA
== TTV_NOTIME
)
2866 ptype
= root
->USER
= delptype(root
->USER
,
2867 TTV_NODE_DELAYLOOP
) ;
2871 ttv_monolatcherror(ttvfig
,root
->ROOT
) ;
2873 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
2875 chain
= chain
->NEXT
;
2876 if(chain
== NULL
) in
= NULL
;
2877 else in
= (ttvline_list
*)chain
->DATA
;
2879 else in
= in
->NEXT
;
2883 if(((((nodex
->ROOT
->TYPE
& TTV_SIG_BYPASSIN
) != TTV_SIG_BYPASSIN
) &&
2884 ((nodex
->TYPE
& TTV_NODE_BYPASSIN
) != TTV_NODE_BYPASSIN
)) ||
2885 ((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)) &&
2886 ((((nodex
->ROOT
->TYPE
& TTV_SIG_BYPASSOUT
) != TTV_SIG_BYPASSOUT
) &&
2887 ((nodex
->TYPE
& TTV_NODE_BYPASSOUT
) != TTV_NODE_BYPASSOUT
)) ||
2888 ((type
& TTV_FIND_DUAL
) != TTV_FIND_DUAL
)))
2890 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
2892 delay
= ttv_getdelaymax(in
) ;
2893 if(delay
!= TTV_NOTIME
)
2895 if((nodex
->FIND
== NULL
) ||
2896 (!ttv_isbypassednode(nodex
) && ((nodex
->FIND
->FIFO
< node
->FIND
->FIFO
) ||
2897 ((node
->FIND
->DELAY
+ delay
) > nodex
->FIND
->DELAY
)))
2900 ttv_transfertnodefindinfo(head
,nodex
,node
,in
,delay
,type
) ;
2906 delay
= ttv_getdelaymin(in
) ;
2907 if(delay
!= TTV_NOTIME
)
2909 if((nodex
->FIND
== NULL
) ||
2910 (!ttv_isbypassednode(nodex
) && ((nodex
->FIND
->FIFO
< node
->FIND
->FIFO
) ||
2911 ((node
->FIND
->DELAY
+ delay
) < nodex
->FIND
->DELAY
)))
2914 ttv_transfertnodefindinfo(head
,nodex
,node
,in
,delay
,type
) ;
2919 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
2921 chain
= chain
->NEXT
;
2922 if(chain
== NULL
) in
= NULL
;
2923 else in
= (ttvline_list
*)chain
->DATA
;
2925 else in
= in
->NEXT
;
2930 if(TTV_CHAIN_CLOCK
== NULL
)
2932 for(chain
= chainnfree
; chain
!= NULL
; chain
= chain
->NEXT
)
2933 ((ttvfig_list
*)chain
->DATA
)->STATUS
&= ~(TTV_STS_NOT_FREE
) ;
2935 freechain(chainnfree
) ;
2936 TTV_CHAIN_FREE
= NULL
;
2940 TTV_CHAIN_FREE
= chainnfree
;
2943 if((type
& (TTV_FIND_DUAL
|TTV_FIND_HZ
)) == (TTV_FIND_DUAL
|TTV_FIND_HZ
))
2946 for(chain
= in_gi
; chain
!= NULL
; chain
= chain
->NEXT
)
2948 node
= (ttvevent_list
*)chain
->DATA
;
2949 if(((node
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
) ||
2950 ((node
->ROOT
->TYPE
& TTV_SIG_CZ
) == TTV_SIG_CZ
) ||
2951 ((node
->ROOT
->TYPE
& TTV_SIG_CT
) == TTV_SIG_CT
))
2952 chainnfree
= addchain(chainnfree
,(void*)node
) ;
2954 node
->FIND
->TYPE
&= ~(TTV_FIND_BEGIN
) ;
2957 in_gi
= chainnfree
;
2958 if((ptype
= getptype(root
->USER
,TTV_NODE_DELAYLOOP
)) != NULL
)
2960 root
->FIND
->DELAY
= (long)ptype
->DATA
;
2961 root
->USER
= delptype(root
->USER
,TTV_NODE_DELAYLOOP
) ;
2965 if((type
& (TTV_FIND_DUAL
|TTV_FIND_S
)) == (TTV_FIND_DUAL
|TTV_FIND_S
))
2968 for(chain
= in_gi
; chain
!= NULL
; chain
= chain
->NEXT
)
2970 node
= (ttvevent_list
*)chain
->DATA
;
2971 if(((node
->ROOT
->TYPE
& TTV_SIG_LR
) == TTV_SIG_LR
) ||
2972 ((node
->ROOT
->TYPE
& TTV_SIG_LS
) == TTV_SIG_LS
))
2973 chainnfree
= addchain(chainnfree
,(void*)node
) ;
2975 node
->FIND
->TYPE
&= ~(TTV_FIND_BEGIN
) ;
2978 in_gi
= chainnfree
;
2979 if((ptype
= getptype(root
->USER
,TTV_NODE_DELAYLOOP
)) != NULL
)
2981 root
->FIND
->DELAY
= (long)ptype
->DATA
;
2982 root
->USER
= delptype(root
->USER
,TTV_NODE_DELAYLOOP
) ;
2987 if((root
->FIND
->TYPE
& TTV_FIND_BEGIN
) == TTV_FIND_BEGIN
)
2989 if((ptype
= getptype(root
->USER
,TTV_NODE_DELAYLOOP
)) != NULL
)
2991 root
->FIND
->DELAY
= (long)ptype
->DATA
;
2992 root
->USER
= delptype(root
->USER
,TTV_NODE_DELAYLOOP
) ;
2996 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
2998 if(ttv_canbeinfalsepath(root
, 'i'))
3001 for(chain
= in_gi
; chain
!= NULL
; chain
= chain
->NEXT
)
3003 node
= (ttvevent_list
*)chain
->DATA
;
3004 if(ttv_canbeinfalsepath(node
, 'o'))
3007 if((ret
=ttv_isfalsepath(head
,root
,node
,type
,0,NULL
)) == 0)
3008 chainnfree
= addchain(chainnfree
,(void*)node
) ;
3011 node
->FIND
->TYPE
&= ~(TTV_FIND_BEGIN
) ;
3012 if (ret
==1) TTV_SEARCH_INFORMATIONS
|=TTV_SEARCH_INFORMATIONS_CRITIC_FALSEPATH
;
3017 chainnfree
= addchain(chainnfree
,(void*)node
) ;
3021 in_gi
= chainnfree
;
3026 if (!(TTV_SEARCH_STEP
& TTV_SEARCH_STEP_IN_CLOCK_PATH
))
3028 if(ttv_canbeinfalsepath(root
, 'o'))
3031 for(chain
= in_gi
; chain
!= NULL
; chain
= chain
->NEXT
)
3033 node
= (ttvevent_list
*)chain
->DATA
;
3034 if(ttv_canbeinfalsepath(node
, 'i'))
3037 if((ret
=ttv_isfalsepath(head
,node
,root
,type
,0,NULL
)) == 0)
3038 chainnfree
= addchain(chainnfree
,(void*)node
) ;
3041 node
->FIND
->TYPE
&= ~(TTV_FIND_BEGIN
) ;
3042 if (ret
==1) TTV_SEARCH_INFORMATIONS
|=TTV_SEARCH_INFORMATIONS_CRITIC_FALSEPATH
;
3047 chainnfree
= addchain(chainnfree
,(void*)node
) ;
3051 in_gi
= chainnfree
;
3056 ttvevent_list
*cmdev
;
3059 for(chain
= in_gi
; chain
!= NULL
; chain
= chain
->NEXT
)
3062 node
= (ttvevent_list
*)chain
->DATA
;
3063 if(ttv_canbeinfalsepath(node
, 'i'))
3065 // retreive the latch command
3066 cmdev
=ttv_findlatchcommand_notdual(root
, node
);
3067 if(cmdev
!=NULL
&& ttv_canbeinfalsepath(cmdev
, 'o'))
3070 if((ret
=ttv_isfalsepath(head
,node
,cmdev
,type
,0,NULL
))!=0)
3072 node
->FIND
->TYPE
&= ~(TTV_FIND_BEGIN
) ;
3073 if (ret
==1) TTV_SEARCH_INFORMATIONS
|=TTV_SEARCH_INFORMATIONS_CRITIC_FALSEPATH
;
3079 chainnfree
= addchain(chainnfree
,(void*)node
) ;
3082 in_gi
= chainnfree
;
3089 /*****************************************************************************/
3090 /* function ttv_getcritic() */
3092 /* ttvfig : ttvfig courante */
3093 /* figpath : ttvfig ou se trouve le chemin */
3094 /* root : noeud de depart */
3095 /* node : noeud d'arrive */
3096 /* type : type de recherche */
3098 /* construit le detail d'un chemin en fonction du type de temps max ou min */
3099 /*****************************************************************************/
3100 ttvcritic_list
*ttv_getcritic(ttvfig
,figpath
,root
,node
,latch
,cmdlatch
,type
)
3101 ttvfig_list
*ttvfig
;
3102 ttvfig_list
*figpath
;
3103 ttvevent_list
*root
;
3104 ttvevent_list
*node
;
3105 ttvevent_list
*latch
;
3106 ttvevent_list
*cmdlatch
;
3109 ttvfig_list
*ttvfigx
;
3110 ttvevent_list
*nodex
;
3111 ttvfig_list
*ttvfigsav
;
3113 chain_list
*chainx
;
3114 ttvcritic_list
*critic
= NULL
;
3119 if(((type
& TTV_FIND_PATH
) != TTV_FIND_PATH
) ||
3120 ((type
& TTV_FIND_LINE
) == TTV_FIND_LINE
))
3122 type
|= TTV_FIND_LINE
;
3123 type
&= ~(TTV_FIND_PATH
) ;
3126 if((type
& TTV_FIND_ACCESS
) == TTV_FIND_ACCESS
)
3128 type
&= ~(TTV_FIND_DUAL
) ;
3129 TTV_CHAIN_CLOCK
= addchain(TTV_CHAIN_CLOCK
,node
->ROOT
) ;
3134 levelroot
= ttv_getsiglevel(root
->ROOT
) ;
3135 if((latch
!= NULL
) && (node
!= latch
))
3136 levelnode
= ttv_getsiglevel(latch
->ROOT
) ;
3138 levelnode
= ttv_getsiglevel(node
->ROOT
) ;
3140 if(levelroot
> ttvfig
->INFO
->LEVEL
) levelroot
= ttvfig
->INFO
->LEVEL
;
3141 if(levelnode
> ttvfig
->INFO
->LEVEL
) levelnode
= ttvfig
->INFO
->LEVEL
;
3143 if(levelroot
> levelnode
) level
= levelnode
;
3144 else level
= levelroot
;
3146 for(ttvfigx
= root
->ROOT
->ROOT
; ttvfigx
!= NULL
; ttvfigx
= ttvfigx
->ROOT
)
3148 ttvfigx
->STATUS
|= TTV_STS_MARQUE
;
3149 if((ttvfigx
->INFO
->LEVEL
>= level
) || (ttvfigx
== ttvfig
)) break ;
3152 if((latch
!= NULL
) && (node
!= latch
))
3153 ttvfigx
= latch
->ROOT
->ROOT
;
3155 ttvfigx
= node
->ROOT
->ROOT
;
3157 for(; ttvfigx
!= NULL
; ttvfigx
= ttvfigx
->ROOT
)
3158 if((ttvfigx
->STATUS
& TTV_STS_MARQUE
) == TTV_STS_MARQUE
)
3161 ttvfigsav
= ttvfigx
;
3163 for(ttvfigx
= root
->ROOT
->ROOT
; ttvfigx
!= NULL
; ttvfigx
= ttvfigx
->ROOT
)
3165 ttvfigx
->STATUS
&= ~(TTV_STS_MARQUE
) ;
3166 if((ttvfigx
->INFO
->LEVEL
>= level
) || (ttvfigx
== ttvfig
)) break ;
3169 if(ttvfigsav
== NULL
)
3171 if((type
& TTV_FIND_ACCESS
) == TTV_FIND_ACCESS
)
3173 freechain(TTV_CHAIN_CLOCK
) ;
3174 TTV_CHAIN_CLOCK
= NULL
;
3179 if((level
< ttvfig
->INFO
->LEVEL
) && (level
== ttvfigsav
->INFO
->LEVEL
))
3183 else if((level
== ttvfig
->INFO
->LEVEL
) && (level
> ttvfigsav
->INFO
->LEVEL
))
3185 level
= ttvfigsav
->INFO
->LEVEL
;
3186 ttvfigsav
= ttvfig
;
3191 ttvfigsav
= figpath
;
3192 if(figpath
== ttvfig
)
3194 level
= figpath
->INFO
->LEVEL
;
3202 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
3209 TTV_SEARCH_FIRST_NODE
=root
;
3211 if((node
->ROOT
->TYPE
& (TTV_SIG_C
| TTV_SIG_L
| TTV_SIG_Q
| TTV_SIG_R
|
3212 TTV_SIG_N
|TTV_SIG_B
)) == 0)
3213 node
->TYPE
|= TTV_NODE_STOP
;
3215 if ((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_MOST_DIRECT_ACCESS
)==0 || (root
->ROOT
->TYPE
& (TTV_SIG_L
|TTV_SIG_B
))==0)
3216 chain
= ttv_findaccess(ttvfig
,ttvfigsav
,root
,NULL
,type
,level
) ;
3219 ttv_fifopush(root
) ;
3220 ttv_uncachenodelines(ttvfig
,ttvfigsav
,root
,type
);
3221 root
->FIND
->DELAY
= 0 ;
3222 chain
=addchain(NULL
, root
);
3226 for(chainx
= chain
; chainx
!= NULL
; chainx
= chainx
->NEXT
)
3228 ((ttvevent_list
*)chainx
->DATA
)->FIND
->TYPE
&= ~(TTV_FIND_BEGIN
) ;
3233 if((latch
!= NULL
) && (node
!= latch
))
3236 // BLINDAGE CORE si latch non trouve
3237 if (latch
->FIND
==NULL
)
3239 char buf0
[128], buf1
[128], buf2
[128], buf
[1024];
3240 if((type
& TTV_FIND_ACCESS
) == TTV_FIND_ACCESS
)
3242 freechain(TTV_CHAIN_CLOCK
) ;
3243 TTV_CHAIN_CLOCK
= NULL
;
3245 sprintf(buf
, "could not reach latch '%s' for path from '%s' to '%s'",
3246 ttv_getsigname(ttvfig
,buf2
,latch
->ROOT
),
3247 ttv_getsigname(ttvfig
,buf0
,node
->ROOT
),
3248 ttv_getsigname(ttvfig
,buf1
,root
->ROOT
));
3250 ttv_error(55,buf
,TTV_WARNING
) ;
3258 chain
= ttv_findclockpath(ttvfig
,ttvfig
,latch
,root
,type
|TTV_FIND_CRITIC
,1, cmdlatch
) ;
3261 for(chainx
= chain
; chainx
!= NULL
; chainx
= chainx
->NEXT
)
3263 if (chainx
->DATA
==node
) found
=1;
3264 ((ttvevent_list
*)chainx
->DATA
)->FIND
->TYPE
&= ~(TTV_FIND_BEGIN
) ;
3270 char buf0
[128], buf1
[128], buf
[1024], buf3
[128];
3273 sprintf(buf3
," thru latch '%s'",ttv_getsigname(ttvfig
,buf0
,latch
->ROOT
));
3274 sprintf(buf
, "could not reach clock '%s' for path from '%s' to '%s'%s",
3275 ttv_getsigname(ttvfig
,buf0
,node
->ROOT
),
3276 ttv_getsigname(ttvfig
,buf0
,node
->ROOT
),
3277 ttv_getsigname(ttvfig
,buf1
,root
->ROOT
),
3280 ttv_error(55,buf
,TTV_WARNING
) ;
3286 if((node
->ROOT
->TYPE
& (TTV_SIG_C
| TTV_SIG_L
| TTV_SIG_Q
| TTV_SIG_R
|
3287 TTV_SIG_N
|TTV_SIG_B
)) == 0)
3288 node
->TYPE
&= ~(TTV_NODE_STOP
) ;
3290 if((type
& TTV_FIND_ACCESS
) == TTV_FIND_ACCESS
)
3292 freechain(TTV_CHAIN_CLOCK
) ;
3293 TTV_CHAIN_CLOCK
= NULL
;
3296 // BLINDAGE CORE si node non trouve
3297 if (node
->FIND
==NULL
)
3299 char buf0
[128], buf1
[128], buf
[1024], buf3
[128];
3300 if((latch
!= NULL
) && (node
!= latch
))
3305 if (latch
==NULL
) strcpy(buf3
,"");
3306 else sprintf(buf3
," thru latch '%s'",ttv_getsigname(ttvfig
,buf0
,latch
->ROOT
));
3307 sprintf(buf
, "could not reach clock '%s' for path from '%s' to '%s'%s",
3308 ttv_getsigname(ttvfig
,buf0
,node
->ROOT
),
3309 ttv_getsigname(ttvfig
,buf0
,node
->ROOT
),
3310 ttv_getsigname(ttvfig
,buf1
,root
->ROOT
),
3313 ttv_error(55,buf
,TTV_WARNING
) ;
3319 if(node
->FIND
->OUTLINE
== NULL
&& getptype(node
->USER
,TTV_NODE_LATCH
)==NULL
)
3321 if((latch
!= NULL
) && (node
!= latch
))
3329 if (TTV_CHARAC_CRITIC_SLOPES_LIST
!=NULL
|| TTV_CHARAC_CRITIC_CAPAS_LIST
!=NULL
)
3331 if (TTV_CHARAC_CRITIC_RESULT_DELAYS
==NULL
)
3332 ttv_DoCharacPropagation(ttvfig
,figpath
,node
,root
,type
,TTV_CHARAC_CRITIC_SLOPES_LIST
,TTV_CHARAC_CRITIC_CAPAS_LIST
, &TTV_CHARAC_CRITIC_RESULT_DELAYS
, &TTV_CHARAC_CRITIC_RESULT_SLOPES
, &TTV_CHARAC_CRITIC_RESULT_ENERGY
,NULL
);
3336 critic
= ttv_savcritic(ttvfig
,figpath
,root
,node
,type
,0) ;
3338 if((latch
!= NULL
) && (node
!= latch
))
3350 static ttvpath_stb_stuff
*ttv_getcrossvalues_notdual(ttvfig_list
*tvf
, ttvevent_list
*tve
, long type
, int checkstart
)
3352 ttvfind_stb_stuff
*tss
;
3353 long startg
, start
=TTV_NOTIME
;
3355 ttvpath_stb_stuff
*tps
, *tpslist
=NULL
;
3357 for (tss
=tve
->FIND
->STB
; tss
!=NULL
; tss
=tss
->NEXT
)
3359 startg
= ttv_getinittime(tvf
,tve
,STB_NO_INDEX
,type
,startphase
=tss
->PHASE
,NULL
) ;
3360 start
=tss
->CROSSDELAY_MIN
;
3361 if (tss
->CROSSDELAY_MIN
!=TTV_NOTIME
3362 && ((checkstart
&& getptype(tve
->ROOT
->USER
, STB_IDEAL_CLOCK
)!=NULL
)
3363 || ((type
& TTV_FIND_MAX
)==TTV_FIND_MAX
&& start
>=startg
)
3364 || ((type
& TTV_FIND_MIN
)==TTV_FIND_MIN
&& start
<=startg
))
3367 if (start
==TTV_NOTIME
)
3370 tps
=ttv_allocpath_stb_stuff();
3373 tps
->STARTPHASE
=tss
->PHASE
;
3374 tps
->STARTTIME
=start
;
3375 tps
->PERIOD_CHANGE
=tss
->PERIOD_CHANGE
;
3381 static ttvpath_stb_stuff
*ttv_getcrossvalues_dual(ttvfig_list
*tvf
, ttvevent_list
*tve
, ttvevent_list
*startnode
, long type
, int *failed
)
3383 ttvfind_stb_stuff
*tss
;
3384 long startg
, crossmin
;
3386 ttvpath_stb_stuff
*tps
, *tpslist
=NULL
;
3387 ttvevent_list
*tvecheckev
;
3391 if ((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_DONT_FILTER_ENDING_NODE
)==0 && stb_has_filter_directive(tve
))
3394 tvecheckev
=tve
->FIND
->OUTLINE
->NODE
;
3396 for (tss
=tvecheckev
->FIND
->STB
; tss
!=NULL
; tss
=tss
->NEXT
)
3398 if ((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_DONT_FILTER_ENDING_NODE
)==0
3399 && (tss
->FLAGS
& TTV_TPS_FINDSTRUCT_THRU_FILTER_NOCROSS
)!=0) continue;
3400 startg
= ttv_getinittime(tvf
,startnode
,STB_NO_INDEX
,type
,startphase
=tss
->STARTPHASE
,NULL
) ;
3402 crossmin
=tss
->CROSSDELAY_MIN
;
3404 if (crossmin
!=TTV_NOTIME
)
3406 crossmin
=startg
+crossmin
;
3407 if ((type
& TTV_FIND_MAX
)==TTV_FIND_MAX
)
3409 if (crossmin
>=startg
) crossmin
=TTV_NOTIME
;
3410 if (crossmin
!=TTV_NOTIME
&& crossmin
<ttv_getinittime(tvf
,startnode
,STB_NO_INDEX
,TTV_FIND_MIN
,tss
->STARTPHASE
,NULL
)) continue;
3414 if (crossmin
<=startg
) crossmin
=TTV_NOTIME
;
3415 if (crossmin
!=TTV_NOTIME
&& crossmin
>ttv_getinittime(tvf
,startnode
,STB_NO_INDEX
,TTV_FIND_MAX
,tss
->STARTPHASE
,NULL
)) continue;
3418 if (crossmin
==TTV_NOTIME
) crossmin
=startg
;
3419 tps
=ttv_allocpath_stb_stuff();
3422 tps
->STARTPHASE
=tss
->STARTPHASE
;
3423 tps
->STARTTIME
=crossmin
;
3424 tps
->PERIOD_CHANGE
=tss
->PERIOD_CHANGE
;
3426 if (tvecheckev
->FIND
->STB
!=NULL
&& tpslist
==NULL
) *failed
=1;
3431 static ttvpath_stb_stuff
*ttv_getbestcrossvalues(ttvpath_stb_stuff
*tps
, long type
)
3433 ttvpath_stb_stuff
*best
=NULL
;
3438 || ((type
& TTV_FIND_MAX
)==TTV_FIND_MAX
&& best
->STARTTIME
<tps
->STARTTIME
)
3439 || ((type
& TTV_FIND_MIN
)==TTV_FIND_MIN
&& best
->STARTTIME
>tps
->STARTTIME
)
3446 static ttvpath_stb_stuff
*ttv_getphasecrossvalues(ttvpath_stb_stuff
*tps
, ttvevent_list
*cmd
)
3451 if (cmd
!=NULL
&& (n
=stb_getstbnode(cmd
))!=NULL
&& n
->CK
!=NULL
)
3452 cmdphase
=n
->CK
->CKINDEX
;
3454 cmdphase
=STB_NO_INDEX
;
3456 while (tps
!=NULL
&& tps
->STARTPHASE
!=cmdphase
) tps
=tps
->NEXT
;
3461 /*****************************************************************************/
3462 /* function ttv_savpath() */
3464 /* ttvfig : ttvfig courante */
3465 /* ttvins : figure instance */
3466 /* path : liste des chemins */
3467 /* root : signal source */
3468 /* node : signal destination */
3469 /* type : type de recherche */
3471 /* recherche tous les chemins entre ptsig et les signaux de mask */
3472 /*****************************************************************************/
3473 char ttv_getcmdphase(ttvevent_list
*cmd
)
3477 if (cmd
!=NULL
&& (stbnode
=stb_getstbnode(cmd
))!=NULL
&& stbnode
->CK
!=NULL
)
3478 return stbnode
->CK
->CKINDEX
;
3480 return STB_NO_INDEX
;
3483 ttvpath_list
*ttv_savpath(ttvfig
,ttvins
,path
,root
,node
,type
)
3484 ttvfig_list
*ttvfig
;
3485 ttvfig_list
*ttvins
;
3486 ttvpath_list
*path
;
3487 ttvevent_list
*root
;
3488 ttvevent_list
*node
;
3491 ttvevent_list
*nodex
;
3493 ttvfig_list
*ttvfigx
;
3494 ttvevent_list
*cmd
;
3495 ttvevent_list
*previous_node
;
3497 long delayref
= (long)0 ;
3498 long access
= (long)0 ;
3499 long refaccess
= (long)0 ;
3502 long startsref
= 0 ;
3505 long datamin
, crossmin
, per_change
=0, clockpathdelay
=0;
3506 ttvevent_list
*latch
= NULL
;
3507 ttvevent_list
*cmdlatch
= NULL
;
3508 ptype_list
*latchlist
= NULL
, crossvalues
;
3509 chain_list
*chainnode
;
3515 long lcrossmin
, oslope
;
3516 ttvline_list
*prevline
=NULL
;
3517 ttvpath_stb_stuff
*tps
, *best
, *tpslat
, *ptps
, *phaseinfo
;
3519 ttvfigx
= node
->ROOT
->ROOT
;
3520 sb
=stb_getstbfig(ttvfig
);
3526 if ((V_INT_TAB
[__TTV_MAX_PATH_PERIOD
].VALUE
>0 || TTV_MaxPathPeriodPrecharge
>0) && (type
& TTV_FIND_ALL
)==0) checkloop
=1;
3527 if((nodex
->FIND
->OUTLINE
== NULL
) &&
3528 ((ptype
= getptype(nodex
->USER
,TTV_NODE_CLOCK
)) != NULL
))
3530 delayref
+= ttv_GET_FINDDELAY(nodex
, 0) - ttv_GET_FINDDELAY((ttvevent_list
*)ptype
->DATA
, 0) ;
3531 nodex
= (ttvevent_list
*)ptype
->DATA
;
3532 ttvfigx
= nodex
->ROOT
->ROOT
;
3535 if((nodex
->FIND
->OUTLINE
== NULL
) &&
3536 ((ptype
= getptype(nodex
->USER
,TTV_NODE_LATCH
)) != NULL
))
3539 delayref
+= ttv_GET_FINDDELAY(nodex
, 0) - ttv_GET_FINDDELAY((ttvevent_list
*)ptype
->DATA
, 0) ;
3540 nodex
= (ttvevent_list
*)ptype
->DATA
;
3542 ttvfigx
= nodex
->ROOT
->ROOT
;
3545 while(nodex
->FIND
->OUTLINE
!= NULL
)
3547 if(nodex
->FIND
->OUTLINE
->FIG
->INFO
->LEVEL
> ttvfigx
->INFO
->LEVEL
)
3548 ttvfigx
= nodex
->FIND
->OUTLINE
->FIG
;
3550 delayref
+= ttv_GET_LINE_DELAY(nodex
->FIND
->OUTLINE
, type
, 1);
3554 nodex
->TYPE
|=TTV_NODE_MARQUE
;
3555 chainnode
=addchain(chainnode
, nodex
);
3557 if (TTV_MARK_MODE
==TTV_MARK_MODE_DO
)
3560 if (getptype(tvs
->USER
, TTV_SIG_MARKED
)==NULL
)
3562 tvs
->USER
=addptype(tvs
->USER
, TTV_SIG_MARKED
, NULL
);
3563 MARKED_SIG_LIST
=addchain(MARKED_SIG_LIST
, tvs
);
3566 if((nodex
->FIND
->OUTLINE
->TYPE
& TTV_LINE_A
) == TTV_LINE_A
3567 || (latch
==NULL
&& (nodex
->FIND
->OUTLINE
->ROOT
->ROOT
->TYPE
& TTV_SIG_L
)!=0 && (TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_ADD_ASYNCHRONOUS_ACCESS
)!=0))
3569 cmdlatch
= nodex
->FIND
->OUTLINE
->NODE
;
3570 latch
= nodex
->FIND
->OUTLINE
->ROOT
;
3571 ttvfigx
= latch
->ROOT
->ROOT
;
3572 refaccess
= ttv_GET_LINE_DELAY(nodex
->FIND
->OUTLINE
, type
, 1);
3573 access
= ttv_GET_FINDDELAY(nodex
->FIND
->OUTLINE
->NODE
, 0) - ttv_GET_FINDDELAY(nodex
->FIND
->OUTLINE
->ROOT
, 0);
3576 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
3578 if(nodex
->FIND
->OUTLINE
->NODE
== root
) break ;
3579 if((nodex
->FIND
->OUTLINE
->NODE
->TYPE
& TTV_NODE_MARQUE
) == TTV_NODE_MARQUE
)
3581 TTV_SEARCH_INFORMATIONS
|=TTV_SEARCH_INFORMATIONS_CRITIC_FALSEPATH
;
3582 for(chain
= chainnode
; chain
!= NULL
; chain
= chain
->NEXT
)
3583 ((ttvevent_list
*)chain
->DATA
)->TYPE
&= ~(TTV_NODE_MARQUE
) ;
3584 freechain(chainnode
) ;
3587 nodex
= nodex
->FIND
->OUTLINE
->NODE
;
3591 if(nodex
->FIND
->OUTLINE
->ROOT
== root
) break ;
3592 if((nodex
->FIND
->OUTLINE
->ROOT
->TYPE
& TTV_NODE_MARQUE
) == TTV_NODE_MARQUE
)
3594 TTV_SEARCH_INFORMATIONS
|=TTV_SEARCH_INFORMATIONS_CRITIC_FALSEPATH
;
3595 for(chain
= chainnode
; chain
!= NULL
; chain
= chain
->NEXT
)
3596 ((ttvevent_list
*)chain
->DATA
)->TYPE
&= ~(TTV_NODE_MARQUE
) ;
3597 freechain(chainnode
) ;
3600 prevline
=nodex
->FIND
->OUTLINE
;
3601 nodex
= nodex
->FIND
->OUTLINE
->ROOT
;
3604 if(((nodex
->FIND
->OUTLINE
== NULL
) ||
3605 ((nodex
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
)) &&
3606 ((ptype
= getptype(nodex
->USER
,TTV_NODE_LATCH
)) != NULL
))
3609 delayref
+= ttv_GET_FINDDELAY(nodex
, 0) - ttv_GET_FINDDELAY((ttvevent_list
*)ptype
->DATA
, 0) ;
3610 nodex
= (ttvevent_list
*)ptype
->DATA
;
3612 ttvfigx
= latch
->ROOT
->ROOT
;
3614 if((((nodex
->ROOT
->TYPE
& TTV_SIG_LL
) == TTV_SIG_LL
) ||
3615 ((nodex
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
)) && (nodex
!= latch
))
3619 if ((nodex
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
)
3620 stb_geteventphase(sb
, nodex
,&phase
,NULL
,NULL
,1,1) ;
3623 if ((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
&& node
->FIND
->OUTLINE
!=NULL
)
3624 cmd
= ttv_getlinecmd(ttvfig
,node
->FIND
->OUTLINE
,TTV_LINE_CMDMAX
) ;
3625 else if ((type
& TTV_FIND_DUAL
) != TTV_FIND_DUAL
&& prevline
!=NULL
)
3626 cmd
= ttv_getlinecmd(ttvfig
,prevline
,TTV_LINE_CMDMAX
) ;
3630 phase
=ttv_getcmdphase(cmd
);
3633 latchlist
= addptype(latchlist
,(long)phase
,nodex
) ;
3639 for(chain
= chainnode
; chain
!= NULL
; chain
= chain
->NEXT
)
3640 ((ttvevent_list
*)chain
->DATA
)->TYPE
&= ~(TTV_NODE_MARQUE
) ;
3641 freechain(chainnode
) ;
3644 if (TTV_MARK_MODE
==TTV_MARK_MODE_DO
) return path
;
3648 if((ttvfigx
!= ttvins
) && (ttvins
!= NULL
))
3651 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
3655 if((node
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
)
3657 previous_node
=node
->FIND
->OUTLINE
->NODE
;
3658 if(node
->FIND
->OUTLINE
->TYPE
& TTV_LINE_PR
) typer
= TTV_FIND_PR
;
3659 else if(node
->FIND
->OUTLINE
->TYPE
& TTV_LINE_EV
) typer
= TTV_FIND_EV
;
3661 if(((node
->ROOT
->TYPE
& TTV_SIG_LS
) == TTV_SIG_LS
) ||
3662 ((node
->ROOT
->TYPE
& TTV_SIG_LR
) == TTV_SIG_LR
))
3664 if(node
->FIND
->OUTLINE
->TYPE
& TTV_LINE_R
) typer
= TTV_FIND_R
;
3665 else if(node
->FIND
->OUTLINE
->TYPE
& TTV_LINE_S
) typer
= TTV_FIND_S
;
3668 tps
=ttv_getcrossvalues_dual(ttvfig
, node
, root
, type
, &failed
);
3669 if (failed
) return path
;
3670 best
=ttv_getbestcrossvalues(tps
, type
);
3673 start
= ttv_getinittime(ttvfig
,root
,STB_NO_INDEX
,type
,STB_NO_INDEX
,&phase
) ;
3674 crossmin
=TTV_NOTIME
;
3678 start
= ttv_getinittime(ttvfig
,root
,STB_NO_INDEX
,type
,best
->STARTPHASE
,&phase
) ;
3679 crossmin
=best
->STARTTIME
;
3681 starts
= ttv_getnodeslope(ttvfig
,ttvins
,root
,&startsref
,type
) ;
3685 stb_getstbdelta(sb
, latch
, &datamin
, &datamax
, cmdlatch
);
3686 if ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
3690 clockpathdelay
=ttv_GET_FINDDELAY(latch
, 0);
3691 // modif pour le crossmin non mis en dual raison: pas d'access en dual
3693 else data
= (long)0 ;
3695 if ((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_KEEP_PHASE_INFO
)!=0)
3698 ttv_freepathstblist(tps
);
3701 if ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
3703 if ((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_MOST_DIRECT_ACCESS
)==0)
3704 cmd
= ttv_getlinecmd(ttvfig
,node
->FIND
->OUTLINE
,TTV_LINE_CMDMAX
) ;
3705 oslope
=ttv_getslopemax(node
->FIND
->OUTLINE
);
3709 if ((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_MOST_DIRECT_ACCESS
)==0)
3710 cmd
= ttv_getlinecmd(ttvfig
,node
->FIND
->OUTLINE
,TTV_LINE_CMDMAX
) ;
3711 oslope
=ttv_getslopemin(node
->FIND
->OUTLINE
);
3715 // start = ttv_getinittime(ttvfig,root,STB_NO_INDEX,type,STB_NO_INDEX,&phase) ;
3717 /* if ((TTV_MORE_SEARCH_OPTIONS & TTV_MORE_OPTIONS_DONT_FILTER_ENDING_NODE)==0 && stb_has_filter_directive(node))
3718 crossmin=node->FIND->CROSSDELAY_MIN;
3720 crossmin=node->FIND->OUTLINE->NODE->FIND->CROSSDELAY_MIN;
3722 // per_change=node->FIND->PERIOD_CHANGE;
3724 if (crossmin!=TTV_NOTIME)
3726 if (crossmin>=start) crossmin=TTV_NOTIME;
3727 else crossmin=start+crossmin;
3728 if (crossmin!=TTV_NOTIME && crossmin<ttv_getinittime(ttvfig,root,STB_NO_INDEX,TTV_FIND_MIN,STB_NO_INDEX,NULL)) return path;
3731 path
= ttv_allocpath(path
,ttvfigx
,node
,root
,cmd
,
3732 latch
,cmdlatch
,latchlist
,data
,access
,refaccess
,
3733 type
|typer
,delayref
,ttv_GET_LINE_SLEW(node
->FIND
->OUTLINE
, type
, 1),
3734 ttv_GET_FINDDELAY(node
, 0),oslope
,
3735 start
,starts
,NULL
,NULL
, crossmin
,phase
,clockpathdelay
) ;
3739 for(nodex
= node
; nodex
->FIND
->OUTLINE
!= NULL
; nodex
= nodex
->FIND
->OUTLINE
->ROOT
)
3740 if(nodex
->FIND
->OUTLINE
->ROOT
== root
) break ;
3742 if(latchlist
!= NULL
)
3743 latchlist
= (ptype_list
*)reverse((chain_list
*)latchlist
) ;
3744 if((nodex
->FIND
->OUTLINE
== NULL
) &&
3745 ((ptype
= getptype(nodex
->USER
,TTV_NODE_CLOCK
)) != NULL
))
3747 nodex
= (ttvevent_list
*)ptype
->DATA
;
3748 for(; nodex
->FIND
->OUTLINE
!= NULL
; nodex
= nodex
->FIND
->OUTLINE
->ROOT
)
3749 if(nodex
->FIND
->OUTLINE
->ROOT
== root
) break ;
3751 if((nodex
->FIND
->OUTLINE
== NULL
) &&
3752 ((ptype
= getptype(nodex
->USER
,TTV_NODE_LATCH
)) != NULL
))
3754 nodex
= (ttvevent_list
*)ptype
->DATA
;
3755 for(; nodex
->FIND
->OUTLINE
!= NULL
; nodex
= nodex
->FIND
->OUTLINE
->ROOT
)
3756 if(nodex
->FIND
->OUTLINE
->ROOT
== root
) break ;
3759 if(nodex
->FIND
->OUTLINE
== NULL
) nodex
= node
;
3761 if((root
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
)
3763 previous_node
=nodex
;
3764 if(nodex
->FIND
->OUTLINE
->TYPE
& TTV_LINE_PR
) typer
= TTV_FIND_PR
;
3765 else if(nodex
->FIND
->OUTLINE
->TYPE
& TTV_LINE_EV
) typer
= TTV_FIND_EV
;
3768 if(((root
->ROOT
->TYPE
& TTV_SIG_LS
) == TTV_SIG_LS
) ||
3769 ((root
->ROOT
->TYPE
& TTV_SIG_LR
) == TTV_SIG_LR
))
3771 if(nodex
->FIND
->OUTLINE
->TYPE
& TTV_LINE_R
) typer
= TTV_FIND_R
;
3772 else if(nodex
->FIND
->OUTLINE
->TYPE
& TTV_LINE_S
) typer
= TTV_FIND_S
;
3774 // per_change=node->FIND->PERIOD_CHANGE;
3775 tps
=ttv_getcrossvalues_notdual(ttvfig
, node
, type
, 1);
3776 best
=ttv_getbestcrossvalues(tps
, type
);
3780 oldmode
=TTV_MORE_SEARCH_OPTIONS
;
3781 TTV_MORE_SEARCH_OPTIONS
&=~TTV_MORE_OPTIONS_USE_CLOCK_START
;
3782 TTV_MORE_SEARCH_OPTIONS
|=TTV_MORE_OPTIONS_USE_DATA_START
;
3784 stb_getstbdelta(sb
, latch
, &datamin
, &datamax
, cmdlatch
);
3787 if ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
3791 clockpathdelay
=ttv_GET_FINDDELAY(node
, 0)-ttv_GET_FINDDELAY(latch
, 0);
3792 tpslat
=ttv_getcrossvalues_notdual(ttvfig
, latch
, type
, 0);
3793 ptps
=ttv_getphasecrossvalues(tpslat
, cmdlatch
);
3795 lcrossmin
=ptps
->STARTTIME
;
3797 lcrossmin
=TTV_NOTIME
;
3798 if (lcrossmin
!=TTV_NOTIME
)
3800 phase
=ttv_getcmdphase(cmdlatch
);
3801 start
= ttv_getinittime(ttvfig
,latch
,STB_NO_INDEX
,type
,phase
,NULL
) ;
3802 if (lcrossmin
>=start
)
3803 lcrossmin
=TTV_NOTIME
;
3804 if (lcrossmin
!=TTV_NOTIME
)
3805 data
=data
-(start
-lcrossmin
); // lag qui cross
3807 TTV_MORE_SEARCH_OPTIONS
=oldmode
;
3808 if ((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_KEEP_PHASE_INFO
)!=0)
3811 ttv_freepathstblist(tpslat
);
3815 starts
= ttv_getnodeslope(ttvfig
,ttvins
,node
,&startsref
,type
) ;
3818 start
= ttv_getinittime(ttvfig
,node
,STB_NO_INDEX
,type
,STB_NO_INDEX
,&phase
) ;
3819 crossmin
=TTV_NOTIME
;
3823 start
= ttv_getinittime(ttvfig
,node
,STB_NO_INDEX
,type
,best
->STARTPHASE
,&phase
) ;
3824 crossmin
=best
->STARTTIME
;
3827 if ((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_KEEP_PHASE_INFO
)!=0 && latch
==NULL
)
3830 ttv_freepathstblist(tps
);
3832 if (node->FIND->CROSSDELAY_MIN!=TTV_NOTIME
3833 && (node->FIND->CROSSDELAY_MIN>=start
3834 || getptype(node->ROOT->USER, STB_IDEAL_CLOCK)!=NULL)
3835 ) node->FIND->CROSSDELAY_MIN=TTV_NOTIME;
3839 if ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
3841 if ((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_MOST_DIRECT_ACCESS
)==0)
3842 cmd
= ttv_getlinecmd(ttvfig
,nodex
->FIND
->OUTLINE
,TTV_LINE_CMDMAX
) ;
3843 oslope
=ttv_getslopemax(nodex
->FIND
->OUTLINE
);
3847 if ((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_MOST_DIRECT_ACCESS
)==0)
3848 cmd
= ttv_getlinecmd(ttvfig
,nodex
->FIND
->OUTLINE
,TTV_LINE_CMDMAX
) ;
3849 oslope
=ttv_getslopemin(nodex
->FIND
->OUTLINE
);
3851 path
= ttv_allocpath(path
,ttvfigx
,root
,node
,cmd
,
3852 latch
,cmdlatch
,latchlist
,data
,access
,refaccess
,
3853 type
|typer
,delayref
,ttv_GET_LINE_SLEW(nodex
->FIND
->OUTLINE
, type
, 1),
3854 ttv_GET_FINDDELAY(node
, 0),oslope
,
3855 start
,starts
,NULL
,NULL
, crossmin
,phase
,clockpathdelay
) ;
3858 path
->TTV_MORE_SEARCH_OPTIONS
=TTV_MORE_SEARCH_OPTIONS
;
3859 if (node
->FIND
->THRU_FILTER
) path
->TTV_MORE_SEARCH_OPTIONS
|=TTV_MORE_OPTIONS_FLAG_THRU_FILTER_FOUND
;
3860 if (V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
!=0) path
->TTV_MORE_SEARCH_OPTIONS
|=TTV_MORE_OPTIONS_FLAG_PROGATE_USED
;
3862 if (phaseinfo
!=NULL
)
3863 path
->USER
=addptype(path
->USER
, TTV_PATH_PHASE_INFO
, phaseinfo
);
3865 if (previous_node
!=NULL
)
3866 path
->USER
=addptype(path
->USER
, TTV_PATH_PREVIOUS_NODE
, previous_node
);
3867 /* if (per_change!=0)
3868 path->USER=addptype(path->USER, TTV_PATH_PERIOD_CHANGE, (void *)per_change);*/
3869 if (node
->FIND
->ORGPHASE
!=TTV_NO_PHASE
)
3870 path
->USER
=addptype(path
->USER
, TTV_PATH_OUTPUT_PHASE
, (void *)(long)node
->FIND
->ORGPHASE
);
3871 if((type
& TTV_FIND_CARAC
) == TTV_FIND_CARAC
)
3873 if (V_BOOL_TAB
[__TMA_CHARAC_PRECISION
].VALUE
)
3874 ttv_allocpathmodel_propagate(ttvfig
, ttvins
, node
, root
,path
,type
);
3876 ttv_allocpathmodel(ttvfig
,path
,type
) ;
3878 if((type
& TTV_FIND_PATHDET
) == TTV_FIND_PATHDET
|| (type
& TTV_FIND_ALL
)!=0)
3879 path
->CRITIC
= ttv_savcritic(ttvfig
,ttvins
,root
,node
,type
,1) ;
3883 /*****************************************************************************/
3884 /* function ttv_savcritic() */
3886 /* ttvfig : ttvfig courante */
3887 /* path : liste des chemins */
3888 /* root : signal source */
3889 /* node : signal destination */
3890 /* type : type de recherche */
3892 /* recherche tous les chemins entre ptsig et les signaux de mask */
3893 /*****************************************************************************/
3894 static inline char *getlinemodel(ttvline_list
*tl
, long type
)
3896 if (type
& TTV_FIND_MAX
)
3901 ttvcritic_list
*ttv_savcritic(ttvfig
,ttvins
,root
,node
,type
,ignorepropagate
)
3902 ttvfig_list
*ttvfig
;
3903 ttvfig_list
*ttvins
;
3904 ttvevent_list
*root
;
3905 ttvevent_list
*node
;
3907 int ignorepropagate
;
3909 ttvfig_list
*ttvfigx
;
3910 ttvevent_list
*nodex
, *cmdlatch
, *cmd
;
3911 ttvcritic_list
*critic
= NULL
;
3912 ttvline_list
*ptline
;
3922 long datamin
, lcrossmin
;
3925 chain_list
*line_list
;
3927 char *lastlinemodel
=NULL
;
3928 ttvline_list
*lastline
;
3930 ttvpath_stb_stuff
*tpslat
, *ptps
;
3933 sb
=stb_getstbfig(ttvfig
);
3934 type
&=~TTV_FIND_PATHDET
;
3936 if (!ignorepropagate
&& V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
>=1)
3937 line_list
=ttv_DoPropagation_PRECISION_LEVEL1(ttvfig
, ttvins
, node
, root
, type
);
3941 if((type
& TTV_FIND_DUAL
) != TTV_FIND_DUAL
)
3943 newslope
= (long)ttv_getnodeslope(ttvfig
,ttvins
,node
,&slope
,type
) ;
3944 typeline
= (long) 0 ;
3946 delay
= ttv_GET_FINDDELAY(node
, 0);
3947 olddelay
= (long) 0 ;
3948 start
= ttv_getinittime(ttvfig
,node
,STB_NO_INDEX
,type
,STB_NO_INDEX
,NULL
) ;
3950 if((nodex
->FIND
->OUTLINE
== NULL
) &&
3951 ((ptype
= getptype(nodex
->USER
,TTV_NODE_LATCH
)) != NULL
))
3953 critic
= ttv_alloccritic(critic
,ttvfig
,ttvfigx
,nodex
,type
|typeline
,
3954 data
,olddelay
+ start
,slope
,
3955 delay
- ttv_GET_FINDDELAY(nodex
, 0) + start
,newslope
,nodeflags
,lastlinemodel
,NULL
) ;
3958 olddelay
= ttv_GET_FINDDELAY(nodex
, 0) - ttv_GET_FINDDELAY((ttvevent_list
*)ptype
->DATA
, 0) ;
3960 nodex
= (ttvevent_list
*)ptype
->DATA
;
3963 stb_getstbdelta(sb
, nodex
, &datamin
, &datamax
, cmdlatch
);
3964 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
3969 oldmode
=TTV_MORE_SEARCH_OPTIONS
;
3970 TTV_MORE_SEARCH_OPTIONS
&=~TTV_MORE_OPTIONS_USE_CLOCK_START
;
3971 TTV_MORE_SEARCH_OPTIONS
|=TTV_MORE_OPTIONS_USE_DATA_START
;
3973 tpslat
=ttv_getcrossvalues_notdual(ttvfig
, nodex
, type
, 0);
3974 ptps
=ttv_getphasecrossvalues(tpslat
, cmdlatch
);
3976 lcrossmin
=ptps
->STARTTIME
;
3978 lcrossmin
=TTV_NOTIME
;
3980 ttv_freepathstblist(tpslat
);
3981 //lcrossmin=nodex->FIND->CROSSDELAY_MIN;
3982 if (lcrossmin
!=TTV_NOTIME
)
3984 phase
=ttv_getcmdphase(cmdlatch
);
3986 start0
= ttv_getinittime(ttvfig
,nodex
,STB_NO_INDEX
,type
,phase
,NULL
) ;
3987 if (((type
& TTV_FIND_MAX
)!=0 && lcrossmin
>=start0
)
3988 || ((type
& TTV_FIND_MIN
)!=0 && lcrossmin
<=start0
))
3989 lcrossmin
=TTV_NOTIME
;
3990 if (lcrossmin
!=TTV_NOTIME
)
3991 data
=data
-(start0
-lcrossmin
); // lag qui cross
3993 TTV_MORE_SEARCH_OPTIONS
=oldmode
;
3994 nodeflags
=TTV_NODE_FLAG_ISLATCH_ACCESS
;
3996 ptline
= nodex
->FIND
->OUTLINE
;
3997 while(nodex
->FIND
->OUTLINE
!= NULL
)
3999 if(((type
& TTV_FIND_LINE
) == TTV_FIND_LINE
) || (nodex
== node
))
4001 critic
= ttv_alloccritic(critic
,ttvfig
,ttvfigx
,nodex
,type
|typeline
,
4002 data
,olddelay
+ start
,slope
,
4003 delay
- ttv_GET_FINDDELAY(nodex
, 0) + start
,newslope
,nodeflags
,lastlinemodel
,lastline
) ;
4008 ttv_getmodelline(ptline
,&critic
->MODNAME
,&critic
->INSNAME
) ;
4009 ptline
= nodex
->FIND
->OUTLINE
;
4011 lastlinemodel
=getlinemodel(ptline
, type
);
4012 typeline
= TTV_LINETYPE(nodex
->FIND
->OUTLINE
) ;
4013 slope
= ttv_GET_LINE_SLEW(nodex
->FIND
->OUTLINE
, type
, 1) ;
4014 olddelay
= ttv_GET_LINE_DELAY(nodex
->FIND
->OUTLINE
, type
, 1) ;
4015 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
4016 newslope
= ttv_getslopemax(nodex
->FIND
->OUTLINE
) ;
4018 newslope
= ttv_getslopemin(nodex
->FIND
->OUTLINE
) ;
4020 if((nodex
->FIND
->OUTLINE
->TYPE
& TTV_LINE_A
) == TTV_LINE_A
4021 || ((nodex
->FIND
->OUTLINE
->ROOT
->ROOT
->TYPE
& TTV_SIG_R
)!=0 && getptype(nodex
->FIND
->OUTLINE
->ROOT
->USER
,TTV_NODE_LATCH
)!=NULL
))
4023 stb_getstbdelta(sb
, nodex
->FIND
->OUTLINE
->ROOT
, &datamin
, &datamax
, nodex
);
4024 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
4029 oldmode
=TTV_MORE_SEARCH_OPTIONS
;
4030 TTV_MORE_SEARCH_OPTIONS
&=~TTV_MORE_OPTIONS_USE_CLOCK_START
;
4031 TTV_MORE_SEARCH_OPTIONS
|=TTV_MORE_OPTIONS_USE_DATA_START
;
4033 tpslat
=ttv_getcrossvalues_notdual(ttvfig
, nodex
->FIND
->OUTLINE
->ROOT
, type
, 0);
4034 ptps
=ttv_getphasecrossvalues(tpslat
, nodex
);
4036 lcrossmin
=ptps
->STARTTIME
;
4038 lcrossmin
=TTV_NOTIME
;
4040 ttv_freepathstblist(tpslat
);
4042 // lcrossmin=nodex->FIND->OUTLINE->ROOT->FIND->CROSSDELAY_MIN;
4043 if (lcrossmin
!=TTV_NOTIME
)
4046 phase
=ttv_getcmdphase(nodex
);
4047 start0
= ttv_getinittime(ttvfig
,nodex
->FIND
->OUTLINE
->ROOT
,STB_NO_INDEX
,type
,phase
,NULL
) ;
4048 if (((type
& TTV_FIND_MAX
)!=0 && lcrossmin
>=start0
)
4049 || ((type
& TTV_FIND_MIN
)!=0 && lcrossmin
<=start0
))
4050 lcrossmin
=TTV_NOTIME
;
4051 if (lcrossmin
!=TTV_NOTIME
)
4052 data
=data
-(start0
-lcrossmin
); // lag qui cross
4054 TTV_MORE_SEARCH_OPTIONS
=oldmode
;
4055 nodeflags
=TTV_NODE_FLAG_ISLATCH_ACCESS
;
4058 delay
= ttv_GET_FINDDELAY(nodex
, 0);
4059 ttvfigx
= nodex
->FIND
->OUTLINE
->FIG
;
4060 nodex
= nodex
->FIND
->OUTLINE
->ROOT
;
4061 if((nodex
->FIND
->OUTLINE
== NULL
) &&
4062 ((ptype
= getptype(nodex
->USER
,TTV_NODE_LATCH
)) != NULL
))
4064 critic
= ttv_alloccritic(critic
,ttvfig
,ttvfigx
,nodex
,type
|typeline
,
4065 data
,olddelay
+ start
,slope
,
4066 delay
- ttv_GET_FINDDELAY(nodex
, 0) + start
,newslope
,nodeflags
,lastlinemodel
,lastline
) ;
4072 olddelay
= ttv_GET_FINDDELAY(nodex
, 0) - ttv_GET_FINDDELAY((ttvevent_list
*)ptype
->DATA
, 0) ;
4073 delay
= ttv_GET_FINDDELAY(nodex
, 0) ;
4075 nodex
= (ttvevent_list
*)ptype
->DATA
;
4076 stb_getstbdelta(sb
, nodex
, &datamin
, &datamax
, cmdlatch
);
4077 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
4082 oldmode
=TTV_MORE_SEARCH_OPTIONS
;
4083 TTV_MORE_SEARCH_OPTIONS
&=~TTV_MORE_OPTIONS_USE_CLOCK_START
;
4084 TTV_MORE_SEARCH_OPTIONS
|=TTV_MORE_OPTIONS_USE_DATA_START
;
4086 tpslat
=ttv_getcrossvalues_notdual(ttvfig
, nodex
, type
, 0);
4087 ptps
=ttv_getphasecrossvalues(tpslat
, cmdlatch
);
4089 lcrossmin
=ptps
->STARTTIME
;
4091 lcrossmin
=TTV_NOTIME
;
4093 ttv_freepathstblist(tpslat
);
4094 // lcrossmin=nodex->FIND->CROSSDELAY_MIN;
4095 if (lcrossmin
!=TTV_NOTIME
)
4097 phase
=ttv_getcmdphase(cmdlatch
);
4098 start0
= ttv_getinittime(ttvfig
,nodex
,STB_NO_INDEX
,type
,phase
,NULL
) ;
4099 if (((type
& TTV_FIND_MAX
)!=0 && lcrossmin
>=start0
)
4100 || ((type
& TTV_FIND_MIN
)!=0 && lcrossmin
<=start0
))
4101 lcrossmin
=TTV_NOTIME
;
4102 if (lcrossmin
!=TTV_NOTIME
)
4103 data
=data
-(start0
-lcrossmin
); // lag qui cross
4105 TTV_MORE_SEARCH_OPTIONS
=oldmode
;
4106 nodeflags
=TTV_NODE_FLAG_ISLATCH_ACCESS
;
4108 if(nodex
== root
) break ;
4110 critic
= ttv_alloccritic(critic
,ttvfig
,ttvfigx
,nodex
,type
|typeline
,
4111 data
,olddelay
+ start
,slope
,delay
+ start
,newslope
,nodeflags
,lastlinemodel
, ptline
) ;
4112 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
) cmd
= ttv_getlinecmd(ttvfig
,ptline
,TTV_LINE_CMDMAX
) ;
4113 else cmd
= ttv_getlinecmd(ttvfig
,ptline
,TTV_LINE_CMDMIN
) ;
4118 ttv_getmodelline(ptline
,&critic
->MODNAME
,&critic
->INSNAME
) ;
4119 critic
= ((ttvcritic_list
*)reverse((chain_list
*)critic
));
4123 start
= ttv_getinittime(ttvfig
,root
,STB_NO_INDEX
,type
,STB_NO_INDEX
,NULL
) ;
4124 while(nodex
->FIND
->OUTLINE
!= NULL
)
4126 slope
= ttv_GET_LINE_SLEW(nodex
->FIND
->OUTLINE
, type
, 1) ;
4127 olddelay
= ttv_GET_LINE_DELAY(nodex
->FIND
->OUTLINE
, type
, 1) ;
4128 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
4129 newslope
= ttv_getslopemax(nodex
->FIND
->OUTLINE
) ;
4131 newslope
= ttv_getslopemin(nodex
->FIND
->OUTLINE
) ;
4132 delay
= ttv_GET_FINDDELAY(nodex
->FIND
->OUTLINE
->NODE
, 0) ;
4133 ttvfigx
= nodex
->FIND
->OUTLINE
->FIG
;
4134 typeline
= TTV_LINETYPE(nodex
->FIND
->OUTLINE
) ;
4135 ptline
= nodex
->FIND
->OUTLINE
;
4136 if(((type
& TTV_FIND_LINE
) == TTV_FIND_LINE
) || (nodex
== node
))
4138 if(root
== nodex
->FIND
->OUTLINE
->NODE
)
4139 critic
= ttv_alloccritic(critic
,ttvfig
,ttvfigx
,nodex
,type
|typeline
,
4140 (long)0,olddelay
,slope
,ttv_GET_FINDDELAY(nodex
, 0),newslope
,nodeflags
,getlinemodel(ptline
, type
),ptline
) ;
4142 critic
= ttv_alloccritic(critic
,ttvfig
,ttvfigx
,nodex
,type
|typeline
,
4143 (long)0,olddelay
,slope
,ttv_GET_FINDDELAY(nodex
, 0)-delay
,newslope
,nodeflags
,getlinemodel(ptline
, type
),ptline
) ;
4146 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
) cmd
= ttv_getlinecmd(ttvfig
,ptline
,TTV_LINE_CMDMAX
) ;
4147 else cmd
= ttv_getlinecmd(ttvfig
,ptline
,TTV_LINE_CMDMIN
) ;
4152 ttv_getmodelline(ptline
,&critic
->MODNAME
,&critic
->INSNAME
) ;
4153 nodex
= nodex
->FIND
->OUTLINE
->NODE
;
4154 if(nodex
== root
) break ;
4156 newslope
= ttv_getnodeslope(ttvfig
,ttvins
,nodex
,&slope
,type
) ;
4157 critic
= ttv_alloccritic(critic
,ttvfig
,NULL
,nodex
,type
,
4158 (long)0,start
,slope
,ttv_GET_FINDDELAY(nodex
, 0) - delay
+ start
,newslope
,nodeflags
,getlinemodel(ptline
, type
),NULL
) ;
4160 ttv_getmodelline(ptline
,&critic
->MODNAME
,&critic
->INSNAME
) ;
4163 if (!ignorepropagate
&& V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
>=1)
4164 ttv_CleanPropagation_PRECISION_LEVEL1(line_list
);
4168 ttv_freecriticlist(critic
) ;
4172 if (critic
!=NULL
) critic
->NODE_FLAG
|=TTV_NODE_FLAG_FIRST_OF_DETAIL
;
4176 /*****************************************************************************/
4177 /* function ttv_keepnbpath() */
4179 /* path : liste des chemins */
4180 /* nb : nombre de chemin a garder */
4181 /* type : type de recherche */
4183 /* recherche le chemin le plus court ou le plus long d'une ttvfig */
4184 /*****************************************************************************/
4185 ttvpath_list
*ttv_keepnbpath(ttvpath_list
*path
,int nb
,int *nbpath
,long type
,LOCAL_SORT_INFO
*sort_info
, int dontcarehz
)
4187 ttvpath_list
*pathx
;
4188 ttvpath_list
*pathh
;
4189 ttvpath_list
*pathr
;
4190 ttvpath_list
*pathxx
;
4199 if((type
& (TTV_FIND_NOT_UPUP
|TTV_FIND_NOT_UPDW
|
4200 TTV_FIND_NOT_DWUP
|TTV_FIND_NOT_DWDW
)) != 0 &&
4201 (!dontcarehz
|| !((path
->ROOT
->ROOT
->TYPE
& TTV_SIG_CZ
) == TTV_SIG_CZ
|| (path
->ROOT
->ROOT
->TYPE
& TTV_SIG_CT
) == TTV_SIG_CT
)))
4203 pathxx
= path
->NEXT
;
4205 if((path
= ttv_filterpath(path
,type
,nbpath
)) != NULL
)
4207 path
->NEXT
= pathxx
;
4217 if(path
->NEXT
!= NULL
)
4223 pathx
= path
->NEXT
;
4224 path
->NEXT
= pathx
->NEXT
;
4225 pathx
->NEXT
= NULL
;
4226 ttv_freepathlist(pathx
) ;
4228 for(pathx
= path
->NEXT
; pathx
!= NULL
; pathx
= pathx
->NEXT
)
4230 if(((path
->DELAY
<= pathx
->DELAY
) &&
4231 ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)) ||
4232 ((path
->DELAY
>= pathx
->DELAY
) &&
4233 ((type
& TTV_FIND_MIN
) == TTV_FIND_MIN
)))
4241 pathx
->NEXT
= pathxx
->NEXT
;
4242 pathxx
->NEXT
= pathx
;
4250 if(((path
->DELAY
> path
->NEXT
->DELAY
) &&
4251 ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)) ||
4252 ((path
->DELAY
< path
->NEXT
->DELAY
) &&
4253 ((type
& TTV_FIND_MIN
) == TTV_FIND_MIN
)))
4255 pathx
= path
->NEXT
;
4256 path
->NEXT
= path
->NEXT
->NEXT
;
4257 pathx
->NEXT
= path
;
4259 sort_info
->before_paths
=(void *)1;
4262 sort_info
->before_paths
=NULL
;
4263 sort_info
->paths
= path
;
4267 else if(*nbpath
< nb
)
4271 path
= ttv_classpath(path
,((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
) ?
4272 TTV_FIND_MIN
: TTV_FIND_MAX
) ;
4275 else if(*nbpath
< (nb
+ nx
- 1))
4278 if(((path
->DELAY
> path
->NEXT
->DELAY
) &&
4279 ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)) ||
4280 ((path
->DELAY
< path
->NEXT
->DELAY
) &&
4281 ((type
& TTV_FIND_MIN
) == TTV_FIND_MIN
)))
4283 pathx
= path
->NEXT
;
4284 path
->NEXT
= path
->NEXT
->NEXT
;
4285 pathx
->NEXT
= path
;
4287 if (path
==sort_info
->paths
) sort_info
->paths
=path
->NEXT
;
4288 if (path
==sort_info
->before_paths
) sort_info
->before_paths
=path
->NEXT
;
4290 if (sort_info
->before_paths
==(void *)1) sort_info
->before_paths
=path
;
4296 if(((path
->DELAY
> path
->NEXT
->DELAY
) &&
4297 ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)) ||
4298 ((path
->DELAY
< path
->NEXT
->DELAY
) &&
4299 ((type
& TTV_FIND_MIN
) == TTV_FIND_MIN
)))
4301 pathx
= path
->NEXT
;
4302 path
->NEXT
= path
->NEXT
->NEXT
;
4303 pathx
->NEXT
= path
;
4305 if (path
==sort_info
->paths
) sort_info
->paths
=path
->NEXT
;
4306 if (path
==sort_info
->before_paths
) sort_info
->before_paths
=path
->NEXT
;
4308 if (sort_info
->before_paths
!=NULL
)
4310 pathxx
= path
->NEXT
;
4311 path
->NEXT
= sort_info
->paths
->NEXT
->NEXT
;
4312 sort_info
->paths
->NEXT
->NEXT
= pathxx
;
4313 pathxx
= sort_info
->paths
->NEXT
;
4314 sort_info
->paths
->NEXT
= path
;
4318 pathx
= sort_info
->paths
->NEXT
;
4319 sort_info
->paths
->NEXT
= NULL
;
4320 path
= ttv_classpath(path
,((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
) ?
4321 TTV_FIND_MIN
: TTV_FIND_MAX
) ;
4324 while(pathx
!= NULL
|| path
!= NULL
)
4329 if(((path
->DELAY
> pathx
->DELAY
) &&
4330 ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)) ||
4331 ((path
->DELAY
< pathx
->DELAY
) &&
4332 ((type
& TTV_FIND_MIN
) == TTV_FIND_MIN
)))
4335 pathx
= pathx
->NEXT
;
4336 pathxx
->NEXT
= NULL
;
4337 ttv_freepathlist(pathxx
) ;
4343 pathxx
->NEXT
= NULL
;
4344 ttv_freepathlist(pathxx
) ;
4349 if((path
!=NULL
) && ((pathx
== NULL
) || (((path
->DELAY
< pathx
->DELAY
) &&
4350 ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)) ||
4351 ((path
->DELAY
> pathx
->DELAY
) &&
4352 ((type
& TTV_FIND_MIN
) == TTV_FIND_MIN
)))))
4363 pathx
= pathx
->NEXT
;
4364 pathr
->NEXT
= NULL
;
4368 pathr
->NEXT
= pathx
;
4369 pathxx
= pathx
->NEXT
;
4370 pathx
->NEXT
= NULL
;
4387 /*****************************************************************************/
4388 /* function ttv_savpathlist() */
4390 /* path : list des chemins */
4391 /* root : evenement de debut */
4392 /* type : type de recherche */
4393 /* chainnode : liste des fins */
4395 /* construit la liste des chemins */
4396 /*****************************************************************************/
4397 ttvpath_list
*ttv_savpathlist(ttvfig
,figpath
,path
,root
,type
,level
,chainnode
,delaymax
,delaymin
,savall
,nb
,nbcur
)
4398 ttvfig_list
*ttvfig
;
4399 ttvfig_list
*figpath
;
4400 ttvpath_list
*path
;
4401 ttvevent_list
*root
;
4404 chain_list
*chainnode
;
4412 chain_list
*chainx
;
4413 chain_list
*chainin
;
4414 chain_list
*chainx2
, *line_list
, *thru_command_list
;
4415 ptype_list
*pt
, *ptype
, *ptypelatch
;
4418 ttvevent_list
*firstnode
, *possiblelatchnode
;
4421 if (((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_ONLYNOTHZ
)!=0 && (type
& TTV_FIND_HZ
)!=0)
4422 || ((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_ONLYHZ
)!=0 && (type
& TTV_FIND_HZ
)==0)) return path
;
4426 for(chain
= chainnode
; chain
!= NULL
; chain
= chain
->NEXT
)
4428 ttvevent_list
*node
= (ttvevent_list
*)chain
->DATA
;
4429 possiblelatchnode
=node
;
4430 node
->FIND
->TYPE
&= ~(TTV_FIND_BEGIN
) ;
4432 if((node
->ROOT
->TYPE
& (TTV_SIG_MASKOUT
| TTV_SIG_MASKIN
)) == 0)
4434 if ((node
->ROOT
->TYPE
& (TTV_SIG_R
|TTV_SIG_L
|TTV_SIG_B
))!=0 && ((savall
& SAVE_ALL_LATCH_TAG
)==0))
4436 if ((node
->ROOT
->TYPE
& (TTV_SIG_R
|TTV_SIG_L
|TTV_SIG_B
))==0 && ((savall
& SAVE_ALL_INPUT_TAG
)==0))
4440 if(TTV_CHAIN_CLOCK
==NULL
|| (type
& TTV_FIND_DUAL
) != TTV_FIND_DUAL
)
4442 if ((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_MULTIPLE_COMMAND_CRITIC_ACCESS
)!=0 && TTV_CHAIN_CLOCK
!=NULL
&& (node
->ROOT
->TYPE
& TTV_SIG_R
)==0)
4444 pt
=ttv_getlatchaccess(ttvfig
,node
,type
);
4445 thru_command_list
=NULL
;
4446 for (ptype
=pt
; ptype
!=NULL
; ptype
=ptype
->NEXT
)
4447 thru_command_list
=addchain(thru_command_list
, ptype
->DATA
);
4450 else thru_command_list
=addchain(NULL
, NULL
);
4452 while (thru_command_list
!=NULL
)
4454 if (TTV_CHAIN_CLOCK
!=NULL
)
4456 if ((node
->ROOT
->TYPE
& (TTV_SIG_R
|TTV_SIG_L
|TTV_SIG_B
))!=0)
4457 chainin
= ttv_findclockpath(ttvfig
,ttvfig
,node
,root
,type
,1,(ttvevent_list
*)thru_command_list
->DATA
) ;
4460 if ((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_REAL_ACCESS
)==0/*(savall & SAVE_ALL_LATCH_TAG)==0*/ || (TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_PATH_AND_ACCESS
)!=0) // pas de vrai access
4461 chainin
= addchain(NULL
,node
) ;
4466 else if ((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_REAL_ACCESS
)==0)
4467 chainin
= addchain(NULL
,node
) ;
4471 if (TTV_QUIET_MODE
==0 && chainin
==NULL
&& (node
->ROOT
->TYPE
& (TTV_SIG_B
|TTV_SIG_C
|TTV_SIG_Q
))==0)
4474 ttv_error(56,ttv_getsigname(ttvfig
,buf0
,node
->ROOT
),TTV_WARNING
);
4477 for(chainx
= chainin
; chainx
!= NULL
; chainx
= chainx
->NEXT
)
4479 ttvevent_list
*node
= (ttvevent_list
*)chainx
->DATA
;
4480 node
->FIND
->TYPE
&= ~(TTV_FIND_BEGIN
) ;
4482 if (TTV_CHAIN_CLOCK
!=NULL
&& (ret
=ttv_isfalsepath(ttvfig
,node
,root
,type
,0,possiblelatchnode
!=node
?possiblelatchnode
:NULL
))!=0)
4484 if (ret
==1) TTV_SEARCH_INFORMATIONS
|=TTV_SEARCH_INFORMATIONS_CRITIC_FALSEPATH
;
4488 // repropagate delay
4490 if (V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
==1 && nbcur
!=NULL
&& nb
!=-1 && path
!=NULL
&& *nbcur
>=nb
)
4492 if((path
->DELAY
>= node
->FIND
->DELAY
*TTV_HIGH_RATIO
&&
4493 (type
& TTV_FIND_MAX
) == TTV_FIND_MAX
) ||
4494 (path
->DELAY
<= node
->FIND
->DELAY
*TTV_LOW_RATIO
&&
4495 (type
& TTV_FIND_MIN
) == TTV_FIND_MIN
))
4497 if(getptype(node
->USER
,TTV_NODE_CLOCK
) != NULL
)
4498 node
->USER
= delptype(node
->USER
,TTV_NODE_CLOCK
) ;
4503 if (V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
>=1)
4504 line_list
=ttv_DoPropagation_PRECISION_LEVEL1(ttvfig
, figpath
, node
, root
, type
);
4506 if (nb!=-1 && nbcur!=NULL && path!=NULL && *nbcur>=nb)
4508 if((path->DELAY >= ttv_GET_FINDDELAY(node, 0) &&
4509 (type & TTV_FIND_MAX) == TTV_FIND_MAX) ||
4510 (path->DELAY <= ttv_GET_FINDDELAY(node, 0) &&
4511 (type & TTV_FIND_MIN) == TTV_FIND_MIN))
4513 if(getptype(node->USER,TTV_NODE_CLOCK) != NULL)
4514 node->USER = delptype(node->USER,TTV_NODE_CLOCK) ;
4520 if((ttv_GET_FINDDELAY(node
, 0) < delaymin
) || (ttv_GET_FINDDELAY(node
, 0) > delaymax
))
4522 if(getptype(node
->USER
,TTV_NODE_CLOCK
) != NULL
)
4523 node
->USER
= delptype(node
->USER
,TTV_NODE_CLOCK
) ;
4524 if (V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
>=1)
4525 ttv_CleanPropagation_PRECISION_LEVEL1(line_list
);
4529 path
= ttv_savpath(ttvfig
,figpath
,path
,root
,node
,type
) ;
4530 if (nbcur
!=NULL
) (*nbcur
)++;
4532 if(getptype(node
->USER
,TTV_NODE_CLOCK
) != NULL
)
4533 node
->USER
= delptype(node
->USER
,TTV_NODE_CLOCK
) ;
4534 if (V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
>=1)
4535 ttv_CleanPropagation_PRECISION_LEVEL1(line_list
);
4538 thru_command_list
=delchain(thru_command_list
, thru_command_list
);
4539 if (thru_command_list
!=NULL
) ttv_fifoclean() ;
4545 if ((firstnode
->ROOT
->TYPE
& (TTV_SIG_Q
|TTV_SIG_B
)) != 0)
4546 ptypelatch
=ttv_getcommandaccess(ttvfig
,firstnode
,type
) ;
4547 else if((firstnode
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
)
4548 ptypelatch
=addptype(NULL
, (long)NULL
, firstnode
);
4552 ttv_markdatapath(root
, node
, type
, 1);
4554 for(pt
= ptypelatch
; pt
!= NULL
; pt
= pt
->NEXT
)
4556 ttvevent_list
*node
= (ttvevent_list
*)pt
->DATA
;
4560 if ((firstnode
->ROOT
->TYPE
& TTV_SIG_R
) != 0)
4563 if((ptype
= getptype(node
->USER
,TTV_NODE_LATCH
)) == NULL
)
4564 node
->USER
= addptype(node
->USER
,TTV_NODE_LATCH
,firstnode
) ;
4566 ptype
->DATA
= (void *)node
;
4568 if(node
->FIND
->NEXT
!= NULL
)
4570 if(node
->FIND
->DELAY
== TTV_NOTIME
)
4572 if(node
->FIND
->NEXT
->DELAY
!= TTV_NOTIME
)
4574 node
->FIND
->DELAY
= node
->FIND
->NEXT
->DELAY
;
4575 node
->FIND
->OUTLINE
= node
->FIND
->NEXT
->OUTLINE
;
4582 if(pt
->TYPE
!= (long)0)
4584 line
= (ttvline_list
*)pt
->TYPE
;
4585 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
4587 if ((delay
=stb_gettruncatedaccess(line
->ROOT
, line
->NODE
, 1))==TTV_NOTIME
)
4588 delay
= ttv_getdelaymax(line
) ;
4592 if ((delay
=stb_gettruncatedaccess(line
->ROOT
, line
->NODE
, 0))==TTV_NOTIME
)
4593 delay
= ttv_getdelaymin(line
) ;
4601 if((ptype
= getptype(node
->USER
,TTV_NODE_LATCH
)) == NULL
)
4602 node
->USER
= addptype(node
->USER
,TTV_NODE_LATCH
,firstnode
) ;
4604 ptype
->DATA
= (void *)firstnode
;
4605 node
->FIND
->DELAY
= delay
+ firstnode
->FIND
->DELAY
;
4606 node
->FIND
->OUTLINE
= line
;
4609 chainin
= ttv_findpath(ttvfig
,ttvfig
,node
,NULL
,type
,1) ;
4611 for(chainx2
= chainin
; chainx2
!= NULL
; chainx2
= chainx2
->NEXT
)
4613 ttvevent_list
*node
= (ttvevent_list
*)chainx2
->DATA
;
4614 node
->FIND
->TYPE
&= ~(TTV_FIND_BEGIN
) ;
4616 if (V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
==1 && nbcur
!=NULL
&& nb
!=-1 && path
!=NULL
&& *nbcur
>=nb
)
4618 if((path
->DELAY
>= node
->FIND
->DELAY
*TTV_HIGH_RATIO
&&
4619 (type
& TTV_FIND_MAX
) == TTV_FIND_MAX
) ||
4620 (path
->DELAY
<= node
->FIND
->DELAY
*TTV_LOW_RATIO
&&
4621 (type
& TTV_FIND_MIN
) == TTV_FIND_MIN
))
4627 // repropagate delay
4628 if (V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
>=1)
4629 line_list
=ttv_DoPropagation_PRECISION_LEVEL1(ttvfig
, figpath
, node
, root
, type
);
4631 if((ttv_GET_FINDDELAY(node
, 0) < delaymin
) || (ttv_GET_FINDDELAY(node
, 0) > delaymax
))
4633 if (V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
>=1)
4634 ttv_CleanPropagation_PRECISION_LEVEL1(line_list
);
4638 path
= ttv_savpath(ttvfig
,figpath
,path
,root
,node
,type
) ;
4639 if (nbcur
!=NULL
) (*nbcur
)++;
4641 if (V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
>=1)
4642 ttv_CleanPropagation_PRECISION_LEVEL1(line_list
);
4646 ttv_markdatapath(root
, node
, type
, 0);
4647 freeptype(ptypelatch
);
4653 level
=0; // avoid warning
4658 /*****************************************************************************/
4659 /* function ttv_savallpath() */
4661 /* path : list des chemins */
4662 /* delaymax : temps maximum des chemin */
4663 /* delaymin : temps minimum des chemin */
4664 /* nb : nombre de chemin a garder */
4665 /* nb path : nombre de chemin Ren cours */
4666 /* type : type de recherche */
4667 /* chainnode : liste des fins */
4669 /* construit la liste des chemins */
4670 /*****************************************************************************/
4671 ttvpath_list
*ttv_savallpath(path
,nb
,nbpath
,type
,rpth
,savall
)
4672 ttvpath_list
*path
;
4676 ttvpath_list
*rpth
;
4679 ttvpath_list
*pathx
, *npath
;
4680 // chain_list *chain ;
4682 // if (path==NULL) { *nbpath=countchain((chain_list *)rpth); return rpth;}
4684 for(pathx
= rpth
; pathx
!= NULL
; pathx
= npath
)
4687 if((path
!= NULL
) && (nbpath
!= NULL
))
4691 if(((path
->DELAY
>= pathx
->DELAY
) &&
4692 ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)) ||
4693 ((path
->DELAY
<= pathx
->DELAY
) &&
4694 ((type
& TTV_FIND_MIN
) == TTV_FIND_MIN
)))
4696 pathx
->NEXT
= NULL
;
4697 ttv_freepathlist(pathx
) ;
4703 pathx
->NEXT
= path
;
4706 path
= ttv_keepnbpath(path
,nb
,nbpath
,type
,&upper_sort_info
,1) ;
4708 savall
=0; // avoid warning
4712 /*****************************************************************************/
4713 /* function ttv_savcriticpath() */
4715 /* ttvfig : ttvfig courante */
4716 /* ttvins : ttvfig instance */
4717 /* path : list des chemins */
4718 /* root : evenement de debut */
4719 /* delaymax : temps maximum des chemin */
4720 /* delaymin : temps minimum des chemin */
4721 /* nb : nombre de chemin a garder */
4722 /* nb path : nombre de chemin Ren cours */
4723 /* type : type de recherche */
4724 /* chainnode : liste des fins */
4726 /* construit la liste des chemins critic */
4727 /*****************************************************************************/
4728 ttvpath_list
*ttv_savcriticpath(ttvfig
,ttvins
,path
,root
,delaymax
,delaymin
,nb
,nbpath
,type
,level
,chainnode
,savall
)
4729 ttvfig_list
*ttvfig
;
4730 ttvfig_list
*ttvins
;
4731 ttvpath_list
*path
;
4732 ttvevent_list
*root
;
4739 chain_list
*chainnode
;
4742 ttvpath_list
*pathx
;
4743 ttvevent_list
*node
, *firstnode
, *node1
, *possiblelatchnode
;
4745 chain_list
*chainx
;
4746 chain_list
*chainin
;
4747 chain_list
*chainx2
, *line_list
, *thru_command_list
;
4748 ptype_list
*pt
, *ptype
, *ptypelatch
;
4753 if (((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_ONLYNOTHZ
)!=0 && (type
& TTV_FIND_HZ
)!=0)
4754 || ((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_ONLYHZ
)!=0 && (type
& TTV_FIND_HZ
)==0)) return path
;
4758 for(chain
= chainnode
; chain
!= NULL
; chain
= chain
->NEXT
)
4760 node
= (ttvevent_list
*)chain
->DATA
;
4761 possiblelatchnode
=node
;
4762 node
->FIND
->TYPE
&= ~(TTV_FIND_BEGIN
) ;
4764 if(((((node
->ROOT
->TYPE
& TTV_SIG_MASKIN
) != TTV_SIG_MASKIN
) &&
4765 ((type
& TTV_FIND_DUAL
) != TTV_FIND_DUAL
)) ||
4766 (((node
->ROOT
->TYPE
& TTV_SIG_MASKOUT
) != TTV_SIG_MASKOUT
) &&
4767 ((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
))))
4769 if ((node
->ROOT
->TYPE
& (TTV_SIG_R
|TTV_SIG_L
|TTV_SIG_B
))!=0 && ((savall
& SAVE_ALL_LATCH_TAG
)==0))
4771 if ((node
->ROOT
->TYPE
& (TTV_SIG_R
|TTV_SIG_L
|TTV_SIG_B
))==0 && ((savall
& SAVE_ALL_INPUT_TAG
)==0))
4775 if(TTV_CHAIN_CLOCK
==NULL
|| (type
& TTV_FIND_DUAL
) != TTV_FIND_DUAL
)
4777 if ((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_MULTIPLE_COMMAND_CRITIC_ACCESS
)!=0 && TTV_CHAIN_CLOCK
!=NULL
&& (node
->ROOT
->TYPE
& TTV_SIG_R
)==0)
4779 pt
=ttv_getlatchaccess(ttvfig
,node
,type
);
4780 thru_command_list
=NULL
;
4781 for (ptype
=pt
; ptype
!=NULL
; ptype
=ptype
->NEXT
)
4782 thru_command_list
=addchain(thru_command_list
, ptype
->DATA
);
4785 else thru_command_list
=addchain(NULL
, NULL
);
4789 while (thru_command_list
!=NULL
)
4791 if (TTV_CHAIN_CLOCK
!=NULL
)
4793 if ((node1
->ROOT
->TYPE
& (TTV_SIG_R
|TTV_SIG_L
|TTV_SIG_B
))!=0)
4794 chainin
= ttv_findclockpath(ttvfig
,ttvfig
,node1
,root
,type
,1,(ttvevent_list
*)thru_command_list
->DATA
) ;
4797 if ((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_REAL_ACCESS
)==0/*(savall & SAVE_ALL_LATCH_TAG)==0*/ || (TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_PATH_AND_ACCESS
)!=0) // pas de vrai access
4798 chainin
= addchain(NULL
,node1
) ;
4803 else if ((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_REAL_ACCESS
)==0)
4805 // --------- zinaps + ------------
4806 if(((((node1
->ROOT
->TYPE
& TTV_SIG_MASKIN
) != TTV_SIG_MASKIN
) &&
4807 ((type
& TTV_FIND_DUAL
) != TTV_FIND_DUAL
)) ||
4808 (((node1
->ROOT
->TYPE
& TTV_SIG_MASKOUT
) != TTV_SIG_MASKOUT
) &&
4809 ((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
))))
4811 thru_command_list
=delchain(thru_command_list
, thru_command_list
);
4814 // -------------------------------
4815 chainin
= addchain(NULL
,node1
) ;
4819 if (TTV_QUIET_MODE
==0 && chainin
==NULL
&& (node1
->ROOT
->TYPE
& (TTV_SIG_B
|TTV_SIG_C
|TTV_SIG_Q
))==0)
4822 ttv_error(56,ttv_getsigname(ttvfig
,buf0
,node1
->ROOT
),TTV_WARNING
);
4825 for(chainx
= chainin
; chainx
!= NULL
; chainx
= chainx
->NEXT
)
4827 ttvevent_list
*node
= (ttvevent_list
*)chainx
->DATA
;
4828 node
->FIND
->TYPE
&= ~(TTV_FIND_BEGIN
) ;
4830 // test des falsepaths pour les critic access
4832 /* if (TTV_CHAIN_CLOCK!=NULL)
4834 if((type & TTV_FIND_DUAL) == TTV_FIND_DUAL)
4835 abort=ttv_isfalsepath(ttvfig,root,node,type);
4837 abort=ttv_isfalsepath(ttvfig,node,root,type);
4840 if (TTV_CHAIN_CLOCK
!=NULL
&& (ret
=ttv_isfalsepath(ttvfig
,node
,root
,type
,0,possiblelatchnode
!=node
?possiblelatchnode
:NULL
))!=0)
4842 if (ret
==1) TTV_SEARCH_INFORMATIONS
|=TTV_SEARCH_INFORMATIONS_CRITIC_FALSEPATH
;
4846 if(abort
==0 && V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
==1 && path
!= NULL
&& *nbpath
>= nb
)
4848 if((path
->DELAY
>= node
->FIND
->DELAY
*TTV_HIGH_RATIO
&&
4849 (type
& TTV_FIND_MAX
) == TTV_FIND_MAX
) ||
4850 (path
->DELAY
<= node
->FIND
->DELAY
*TTV_LOW_RATIO
&&
4851 (type
& TTV_FIND_MIN
) == TTV_FIND_MIN
))
4853 if(getptype(node
->USER
,TTV_NODE_CLOCK
) != NULL
)
4854 node
->USER
= delptype(node
->USER
,TTV_NODE_CLOCK
) ;
4859 // repropagate delay
4860 if (!abort
&& V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
>=1)
4861 line_list
=ttv_DoPropagation_PRECISION_LEVEL1(ttvfig
, ttvins
, node
, root
, type
);
4863 if(abort
|| (ttv_GET_FINDDELAY(node
, 0) > delaymax
) || (ttv_GET_FINDDELAY(node
, 0) < delaymin
))
4865 if(getptype(node
->USER
,TTV_NODE_CLOCK
) != NULL
)
4866 node
->USER
= delptype(node
->USER
,TTV_NODE_CLOCK
) ;
4867 if (!abort
&& V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
>=1)
4868 ttv_CleanPropagation_PRECISION_LEVEL1(line_list
);
4876 if(((path
->DELAY
>= ttv_GET_FINDDELAY(node
, 0)) &&
4877 ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)) ||
4878 ((path
->DELAY
<= ttv_GET_FINDDELAY(node
, 0)) &&
4879 ((type
& TTV_FIND_MIN
) == TTV_FIND_MIN
)))
4881 if(getptype(node
->USER
,TTV_NODE_CLOCK
) != NULL
)
4882 node
->USER
= delptype(node
->USER
,TTV_NODE_CLOCK
) ;
4883 if (V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
>=1)
4884 ttv_CleanPropagation_PRECISION_LEVEL1(line_list
);
4891 path
= ttv_savpath(ttvfig
,ttvins
,path
,root
,node
,type
) ;
4893 if(getptype(node
->USER
,TTV_NODE_CLOCK
) != NULL
)
4894 node
->USER
= delptype(node
->USER
,TTV_NODE_CLOCK
) ;
4895 if (V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
>=1)
4896 ttv_CleanPropagation_PRECISION_LEVEL1(line_list
);
4901 path
= ttv_keepnbpath(path
,nb
,nbpath
,type
,&upper_sort_info
,1) ;
4903 freechain(chainin
) ;
4904 thru_command_list
=delchain(thru_command_list
, thru_command_list
);
4905 if (thru_command_list
!=NULL
) ttv_fifoclean() ;
4911 if ((firstnode
->ROOT
->TYPE
& (TTV_SIG_Q
|TTV_SIG_B
)) != 0)
4912 ptypelatch
=ttv_getcommandaccess(ttvfig
,firstnode
,type
) ;
4913 else if((firstnode
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
)
4914 ptypelatch
=addptype(NULL
, (long)NULL
, firstnode
);
4918 for(pt
= ptypelatch
; pt
!= NULL
; pt
= pt
->NEXT
)
4920 ttvevent_list
*node
= (ttvevent_list
*)pt
->DATA
;
4924 if ((firstnode
->ROOT
->TYPE
& TTV_SIG_R
) != 0)
4927 if((ptype
= getptype(node
->USER
,TTV_NODE_LATCH
)) == NULL
)
4928 node
->USER
= addptype(node
->USER
,TTV_NODE_LATCH
,firstnode
) ;
4930 ptype
->DATA
= (void *)node
;
4932 if(node
->FIND
->NEXT
!= NULL
)
4934 if(node
->FIND
->DELAY
== TTV_NOTIME
)
4936 if(node
->FIND
->NEXT
->DELAY
!= TTV_NOTIME
)
4938 node
->FIND
->DELAY
= node
->FIND
->NEXT
->DELAY
;
4939 node
->FIND
->OUTLINE
= node
->FIND
->NEXT
->OUTLINE
;
4946 if(pt
->TYPE
!= (long)0)
4948 line
= (ttvline_list
*)pt
->TYPE
;
4949 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
4951 if ((delay
=stb_gettruncatedaccess(line
->ROOT
, line
->NODE
, 1))==TTV_NOTIME
)
4952 delay
= ttv_getdelaymax(line
) ;
4956 if ((delay
=stb_gettruncatedaccess(line
->ROOT
, line
->NODE
, 0))==TTV_NOTIME
)
4957 delay
= ttv_getdelaymin(line
) ;
4965 if((ptype
= getptype(node
->USER
,TTV_NODE_LATCH
)) == NULL
)
4966 node
->USER
= addptype(node
->USER
,TTV_NODE_LATCH
,firstnode
) ;
4968 ptype
->DATA
= (void *)firstnode
;
4969 node
->FIND
->DELAY
= delay
+ firstnode
->FIND
->DELAY
;
4970 node
->FIND
->OUTLINE
= line
;
4973 chainin
= ttv_findpath(ttvfig
,ttvfig
,node
,NULL
,type
,1) ;
4975 for(chainx2
= chainin
; chainx2
!= NULL
; chainx2
= chainx2
->NEXT
)
4977 ttvevent_list
*node
= (ttvevent_list
*)chainx2
->DATA
;
4978 node
->FIND
->TYPE
&= ~(TTV_FIND_BEGIN
) ;
4980 if(V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
==1 && path
!= NULL
&& *nbpath
>= nb
)
4982 if((path
->DELAY
>= node
->FIND
->DELAY
*TTV_HIGH_RATIO
&&
4983 (type
& TTV_FIND_MAX
) == TTV_FIND_MAX
) ||
4984 (path
->DELAY
<= node
->FIND
->DELAY
*TTV_LOW_RATIO
&&
4985 (type
& TTV_FIND_MIN
) == TTV_FIND_MIN
))
4991 if (V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
>=1)
4992 line_list
=ttv_DoPropagation_PRECISION_LEVEL1(ttvfig
, ttvins
, node
, root
, type
);
4994 if((ttv_GET_FINDDELAY(node
, 0) > delaymax
) || (ttv_GET_FINDDELAY(node
, 0) < delaymin
))
4996 if (V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
>=1)
4997 ttv_CleanPropagation_PRECISION_LEVEL1(line_list
);
5005 if(((path
->DELAY
>= node
->FIND
->DELAY
) &&
5006 ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)) ||
5007 ((path
->DELAY
<= node
->FIND
->DELAY
) &&
5008 ((type
& TTV_FIND_MIN
) == TTV_FIND_MIN
)))
5010 if (V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
>=1)
5011 ttv_CleanPropagation_PRECISION_LEVEL1(line_list
);
5018 path
= ttv_savpath(ttvfig
,ttvins
,path
,root
,node
,type
) ;
5020 if (V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
>=1)
5021 ttv_CleanPropagation_PRECISION_LEVEL1(line_list
);
5026 path
= ttv_keepnbpath(path
,nb
,nbpath
,type
,&upper_sort_info
,1) ;
5029 freeptype(ptypelatch
);
5035 level
=0; // avoid warning
5039 static int computesavealltag(chain_list
*inputs
,int allinterm
)
5043 // if (TTV_MORE_SEARCH_OPTIONS & TTV_MORE_OPTIONS_REAL_ACCESS) return SAVE_ALL_TAG;
5045 if (allinterm
&& inputs
==NULL
) return SAVE_ALL_TAG
;
5047 if (TTV_CHAIN_CLOCK==NULL) return 0;
5049 while (inputs!=NULL)
5051 for (cl=TTV_CHAIN_CLOCK; cl!=NULL && cl->DATA!=inputs->DATA; cl=cl->NEXT) ;
5052 if (cl!=NULL) return SAVE_ALL_LATCH_TAG;
5053 inputs=inputs->NEXT;
5059 /*****************************************************************************/
5060 /* function ttv_findsigpath() */
5062 /*****************************************************************************/
5063 ttvpath_list
*ttv_findsigpath(ttvfig
,ttvins
,figsearch
,begin
,end
,cmd
,delaymax
,delaymin
,type
,level
,path
,searchtype
,nb
,nbcur
,savall
,pthz
)
5064 ttvfig_list
*ttvfig
;
5065 ttvfig_list
*ttvins
;
5066 ttvfig_list
*figsearch
;
5067 ttvevent_list
*begin
;
5068 ttvevent_list
*end
;
5069 ttvevent_list
*cmd
;
5074 ttvpath_list
*path
;
5082 chain_list
*chainpath
;
5083 ttvpath_list
*pth
, *rpth
;
5085 char typers
, filter
=0 ;
5088 mbk_comcheck( 0, 0, ttv_signtimingfigure(ttvfig
) );
5090 TTV_SEARCH_FIRST_NODE
=begin
;
5092 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
5094 if(TTV_FIND_ALLPATH
== 'N')
5095 chainpath
= ttv_findaccess(ttvfig
,figsearch
,begin
,cmd
,type
,level
) ;
5097 pth
= (ttvpath_list
*)ttv_findpara(ttvfig
,ttvins
,begin
,end
,delaymax
,delaymin
,type
,level
,NULL
,TTV_MAX_PATHNB
,savall
) ;
5102 if(TTV_FIND_ALLPATH
== 'N')
5103 for(chain
= chainpath
; chain
!= NULL
; chain
= chain
->NEXT
)
5105 tvs
=((ttvevent_list
*)chain
->DATA
)->ROOT
;
5106 if(((((tvs
->TYPE
& TTV_SIG_MASKIN
) != TTV_SIG_MASKIN
) &&
5107 ((type
& TTV_FIND_DUAL
) != TTV_FIND_DUAL
)) ||
5108 (((tvs
->TYPE
& TTV_SIG_MASKOUT
) != TTV_SIG_MASKOUT
) &&
5109 ((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)))) continue;
5111 if((tvs
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
|| (tvs
->TYPE
& TTV_SIG_CZ
) == TTV_SIG_CZ
|| (tvs
->TYPE
& TTV_SIG_CT
) == TTV_SIG_CT
)
5113 if ((tvs
->TYPE
& TTV_SIG_R
) != TTV_SIG_R
) filter
=1;
5116 if((tvs
->TYPE
& TTV_SIG_LR
)== TTV_SIG_LR
||
5117 (tvs
->TYPE
& TTV_SIG_LS
)== TTV_SIG_LS
)
5121 for(rpth
= pth
; rpth
!= NULL
; rpth
= rpth
->NEXT
)
5123 if(((rpth
->ROOT
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
) || ((rpth
->ROOT
->ROOT
->TYPE
& TTV_SIG_CZ
) == TTV_SIG_CZ
) || ((rpth
->ROOT
->ROOT
->TYPE
& TTV_SIG_CT
) == TTV_SIG_CT
))
5125 if ((rpth
->ROOT
->ROOT
->TYPE
& TTV_SIG_R
) != TTV_SIG_R
) filter
=1;
5128 if(((rpth
->ROOT
->ROOT
->TYPE
& TTV_SIG_LR
) == TTV_SIG_LR
) ||
5129 ((rpth
->ROOT
->ROOT
->TYPE
& TTV_SIG_LS
) == TTV_SIG_LS
))
5135 if(TTV_FIND_ALLPATH
== 'N')
5137 for(chain
= chainpath
; chain
!= NULL
; chain
= chain
->NEXT
)
5139 ttvevent_list
*node
= (ttvevent_list
*)chain
->DATA
;
5140 node
->FIND
->TYPE
&= ~(TTV_FIND_BEGIN
) ;
5142 freechain(chainpath
) ;
5146 ttv_freepathlist(rpth
) ;
5149 if(TTV_FIND_ALLPATH
== 'N')
5150 chainpath
= ttv_findaccess(ttvfig
,figsearch
,begin
,cmd
,type
|TTV_FIND_R
,level
) ;
5152 pth
= (ttvpath_list
*)ttv_findpara(ttvfig
,ttvins
,begin
,end
,delaymax
,delaymin
,type
|TTV_FIND_R
,level
,NULL
,(typehz
=='Y')?TTV_MAX_PATHNB
:nb
,savall
) ;
5157 if(((begin
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
) ||
5158 ((begin
->ROOT
->TYPE
& TTV_SIG_CZ
) == TTV_SIG_CZ
) ||
5159 ((begin
->ROOT
->TYPE
& TTV_SIG_CT
) == TTV_SIG_CT
))
5161 if ((begin
->ROOT
->TYPE
& TTV_SIG_R
) != TTV_SIG_R
) filter
=1;
5167 if(((begin
->ROOT
->TYPE
& TTV_SIG_LS
) == TTV_SIG_LS
) ||
5168 ((begin
->ROOT
->TYPE
& TTV_SIG_LR
) == TTV_SIG_LR
))
5171 if(TTV_FIND_ALLPATH
== 'N')
5173 if ((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_MOST_DIRECT_ACCESS
)==0)
5174 chainpath
= ttv_findaccess(ttvfig
,figsearch
,begin
,cmd
,type
|TTV_FIND_R
,level
) ;
5177 ttv_fifopush(begin
) ;
5178 ttv_uncachenodelines(ttvfig
,figsearch
,begin
, type
);
5179 begin
->FIND
->DELAY
= 0 ;
5180 chainpath
=addchain(NULL
, begin
);
5184 pth
= (ttvpath_list
*)ttv_findpara(ttvfig
,ttvins
,begin
,end
,delaymax
,delaymin
,type
|TTV_FIND_R
,level
,NULL
,(filter
)?TTV_MAX_PATHNB
:nb
,savall
) ;
5188 if(TTV_FIND_ALLPATH
== 'N')
5190 if ((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_MOST_DIRECT_ACCESS
)==0 || (begin
->ROOT
->TYPE
& (TTV_SIG_L
|TTV_SIG_B
))==0)
5191 chainpath
= ttv_findaccess(ttvfig
,figsearch
,begin
,cmd
,type
,level
) ;
5194 ttv_fifopush(begin
) ;
5195 ttv_uncachenodelines(ttvfig
,figsearch
,begin
, type
);
5196 begin
->FIND
->DELAY
= 0 ;
5197 chainpath
=addchain(NULL
, begin
);
5201 pth
= (ttvpath_list
*)ttv_findpara(ttvfig
,ttvins
,begin
,end
,delaymax
,delaymin
,type
,level
,NULL
,(filter
)?TTV_MAX_PATHNB
:nb
,savall
) ;
5206 if(TTV_FIND_ALLPATH
== 'N')
5208 if(searchtype
== TTV_SEARCH_PATH
)
5209 path
= ttv_savpathlist(ttvfig
,ttvins
,path
,begin
,(typers
== 'Y') ? type
|TTV_FIND_R
: type
,level
,chainpath
,delaymax
,delaymin
,savall
,((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
|| typehz
=='Y')?TTV_MAX_PATHNB
:nb
,nbcur
) ;
5211 path
= ttv_savcriticpath(ttvfig
,ttvins
,path
,begin
,delaymax
,delaymin
,(filter
)?TTV_MAX_PATHNB
:nb
,nbcur
,(typers
== 'Y') ? type
|TTV_FIND_R
: type
,level
,chainpath
,savall
) ;
5212 freechain(chainpath
) ;
5216 path
= ttv_savallpath(path
,(filter
)?TTV_MAX_PATHNB
:nb
,nbcur
,(typers
== 'Y') ? type
|TTV_FIND_R
: type
,pth
,savall
) ;
5223 if(TTV_FIND_ALLPATH
== 'N')
5224 chainpath
= ttv_findaccess(ttvfig
,figsearch
,begin
,cmd
,type
|TTV_FIND_S
,level
) ;
5226 pth
= (ttvpath_list
*)ttv_findpara(ttvfig
,ttvins
,begin
,end
,delaymax
,delaymin
,type
|TTV_FIND_S
,level
,NULL
,(filter
)?TTV_MAX_PATHNB
:nb
,savall
) ;
5227 if(TTV_FIND_ALLPATH
== 'N')
5229 if(searchtype
== TTV_SEARCH_PATH
)
5230 path
= ttv_savpathlist(ttvfig
,ttvins
,path
,begin
,type
|TTV_FIND_S
,level
,chainpath
,delaymax
,delaymin
,savall
,((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
|| filter
)?TTV_MAX_PATHNB
:nb
,nbcur
) ;
5232 path
= ttv_savcriticpath(ttvfig
,ttvins
,path
,begin
,delaymax
,delaymin
,(filter
)?TTV_MAX_PATHNB
:nb
,nbcur
,type
|TTV_FIND_S
,level
,chainpath
,savall
) ;
5233 freechain(chainpath
) ;
5237 path
= ttv_savallpath(path
,(filter
)?TTV_MAX_PATHNB
:nb
,nbcur
,type
|TTV_FIND_S
,pth
,savall
) ;
5244 if (filter
) *pthz
= 'Y' ;
5245 if(TTV_FIND_ALLPATH
== 'N')
5247 chainpath
= ttv_findaccess(ttvfig
,figsearch
,begin
,cmd
,type
|TTV_FIND_HZ
,level
) ;
5250 pth
= (ttvpath_list
*)ttv_findpara(ttvfig
,ttvins
,begin
,end
,delaymax
,delaymin
,type
|TTV_FIND_HZ
,level
,NULL
,(filter
)?TTV_MAX_PATHNB
:nb
,savall
) ;
5251 if(TTV_FIND_ALLPATH
== 'N')
5253 if(searchtype
== TTV_SEARCH_PATH
)
5254 path
= ttv_savpathlist(ttvfig
,ttvins
,path
,begin
,type
|TTV_FIND_HZ
,level
,chainpath
,delaymax
,delaymin
,savall
,((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
|| typehz
=='Y')?TTV_MAX_PATHNB
:nb
,nbcur
) ;
5256 path
= ttv_savcriticpath(ttvfig
,ttvins
,path
,begin
,delaymax
,delaymin
,(filter
)?TTV_MAX_PATHNB
:nb
,nbcur
,type
|TTV_FIND_HZ
,level
,chainpath
,savall
) ;
5257 freechain(chainpath
) ;
5261 path
= ttv_savallpath(path
,(filter
)?TTV_MAX_PATHNB
:nb
,nbcur
,type
|TTV_FIND_HZ
,pth
,savall
) ;
5269 /*****************************************************************************/
5270 /* function ttv_getcriticpath() */
5272 /* ttvfig : ttvfig courante */
5273 /* maskin : list de masques pour les entrees */
5274 /* maskout : list de masques pour les sorties */
5275 /* delaymax : temps maximum des chemin */
5276 /* delaymin : temps maximum des chemin */
5277 /* nb : nombre de chemin a garder */
5278 /* type : type de recherche */
5280 /* recherche le chemin le plus court ou le plus long d'une ttvfig */
5281 /*****************************************************************************/
5282 ttvpath_list
*ttv_getcriticpath(ttvfig
,figpath
,maskin
,maskout
,delaymax
,delaymin
,nb
,type
)
5283 ttvfig_list
*ttvfig
;
5284 ttvfig_list
*figpath
;
5285 chain_list
*maskin
;
5286 chain_list
*maskout
;
5292 ttvfig_list
*ttvins
;
5293 ttvsig_list
*ptsig
;
5294 chain_list
*chainx
, *event_to_retry
, *chc
, *chainc
;
5295 chain_list
*chaininx
;
5296 chain_list
*chaininsav
;
5297 chain_list
*chainfig
;
5298 chain_list
*chainfigsav
;
5299 chain_list
*chainfigdel
;
5300 ttvpath_list
*path
= NULL
, *pathx
, *npathx
, *prevpathx
;
5302 long level
, searchsigtype
;
5303 // int nbx = 1 ; changed zinaps
5305 int i
, savealltag
, allfailed
;
5308 if(((type
& TTV_FIND_PATH
) == TTV_FIND_PATH
) ||
5309 ((type
& TTV_FIND_LINE
) != TTV_FIND_LINE
))
5311 type
&= ~(TTV_FIND_LINE
| TTV_FIND_HIER
) ;
5312 type
|= TTV_FIND_PATH
;
5315 type
&= ~(TTV_FIND_HIER
) ;
5317 if(nb
<= 0) nb
= 1 ;
5320 chainfigsav
= reverse(ttv_getttvfiglist(ttvfig
)) ;
5322 chainfigsav
= addchain(NULL
,figpath
) ;
5324 if((type
& TTV_FIND_DUAL
) != TTV_FIND_DUAL
)
5326 if (TTV_EXPLICIT_START_NODES
==NULL
)
5327 chaininsav
= ttv_getsigbytype_and_netname(ttvfig
,figpath
,TTV_SIG_C
|TTV_SIG_L
|TTV_SIG_R
|TTV_SIG_B
/*|TTV_SIG_Q*/,maskin
) ;
5329 chaininsav
= dupchainlst(TTV_EXPLICIT_START_NODES
);
5330 chaininsav
= ttv_apply_exclude_flag(chaininsav
, TTV_EXCLUDE_TYPE_START
, 0/*1*/);
5331 chaininsav
= ttv_remove_connector_B(chaininsav
);
5335 if (TTV_EXPLICIT_END_NODES
==NULL
)
5336 chaininsav
= ttv_getsigbytype_and_netname(ttvfig
,figpath
,TTV_SIG_C
|TTV_SIG_Q
|TTV_SIG_L
|TTV_SIG_R
|TTV_SIG_B
,maskout
) ;
5338 chaininsav
= dupchainlst(TTV_EXPLICIT_END_NODES
);
5339 chaininsav
= ttv_apply_exclude_flag(chaininsav
, TTV_EXCLUDE_TYPE_END
, 0);
5341 if ((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_DONT_FILTER_ENDING_NODE
)!=0 && stb_getstbfig(ttvfig
)!=NULL
)
5343 // not possible for filter in dual mode
5344 for (chain
=chaininsav
; chain
!=NULL
; chain
=chain
->NEXT
)
5346 if (stb_has_filter_directive(((ttvsig_list
*)chain
->DATA
)->NODE
)
5347 || stb_has_filter_directive(((ttvsig_list
*)chain
->DATA
)->NODE
+1)) break;
5351 // revert back to not dual mode
5352 freechain(chaininsav
);
5353 if (TTV_EXPLICIT_START_NODES
==NULL
)
5354 chaininsav
= ttv_getsigbytype_and_netname(ttvfig
,figpath
,TTV_SIG_C
|TTV_SIG_L
|TTV_SIG_R
|TTV_SIG_B
/*|TTV_SIG_Q*/,maskin
) ;
5356 chaininsav
= dupchainlst(TTV_EXPLICIT_START_NODES
);
5357 chaininsav
= ttv_apply_exclude_flag(chaininsav
, TTV_EXCLUDE_TYPE_START
, 0/*1*/);
5358 chaininsav
= ttv_remove_connector_B(chaininsav
);
5359 type
&=~TTV_FIND_DUAL
;
5364 // calcul si on doit ignorer le maskin pour les latchs des access
5365 savealltag
=computesavealltag(chaininsav
, 0);
5367 for(chaininx
= chaininsav
; chaininx
!= NULL
; chaininx
= chaininx
->NEXT
)
5369 if((type
& TTV_FIND_DUAL
) != TTV_FIND_DUAL
)
5370 ((ttvsig_list
*)chaininx
->DATA
)->TYPE
|= TTV_SIG_MASKIN
;
5372 ((ttvsig_list
*)chaininx
->DATA
)->TYPE
|= TTV_SIG_MASKOUT
;
5375 chainfigdel
= chainfigsav
;
5376 for(chainfig
= chainfigsav
; chainfig
!= NULL
; chainfig
= chainfig
->NEXT
)
5378 ttvins
= (ttvfig_list
*)chainfig
->DATA
;
5379 if(((ttvins
->STATUS
& TTV_STS_MODEL
) != TTV_STS_MODEL
) &&
5380 (maskin
== NULL
) && (maskout
== NULL
))
5383 if(ttvins
== ttvfig
)
5384 level
= ttvfig
->INFO
->LEVEL
;
5388 if((type
& TTV_FIND_DUAL
) != TTV_FIND_DUAL
)
5390 if (TTV_EXPLICIT_END_NODES
==NULL
)
5391 chain
= ttv_getsigbytype_and_netname(ttvfig
,ttvins
,TTV_SIG_C
|TTV_SIG_Q
|TTV_SIG_L
|TTV_SIG_R
|TTV_SIG_B
,maskout
) ;
5393 chain
=dupchainlst(TTV_EXPLICIT_END_NODES
);
5394 chain
= ttv_apply_exclude_flag(chain
, TTV_EXCLUDE_TYPE_END
, 0);
5398 searchsigtype
=TTV_SIG_C
|TTV_SIG_L
|TTV_SIG_R
|TTV_SIG_B
/*|TTV_SIG_Q*/;
5399 // if (TTV_MORE_SEARCH_OPTIONS & TTV_MORE_OPTIONS_ENABLE_START_ON_TTV_SIG_Q) searchsigtype|=TTV_SIG_Q;
5400 if (TTV_EXPLICIT_START_NODES
==NULL
)
5401 chain
= ttv_getsigbytype_and_netname(ttvfig
,ttvins
,searchsigtype
,maskin
) ;
5403 chain
=dupchainlst(TTV_EXPLICIT_START_NODES
);
5404 chain
= ttv_apply_exclude_flag(chain
, TTV_EXCLUDE_TYPE_START
, 0/*1*/);
5405 chain
= ttv_remove_connector_B(chain
);
5408 event_to_retry
=NULL
;
5410 for(chainx
= chain
; chainx
!= NULL
; chainx
= chainx
->NEXT
)
5412 ptsig
= (ttvsig_list
*)chainx
->DATA
;
5413 if((ptsig
->TYPE
& TTV_SIG_C
) == TTV_SIG_C
)
5414 if((((ptsig
->TYPE
& TTV_SIG_CO
) != TTV_SIG_CO
) &&
5415 ((type
& TTV_FIND_DUAL
) != TTV_FIND_DUAL
)) ||
5416 (((ptsig
->TYPE
& TTV_SIG_CI
) != TTV_SIG_CI
) &&
5417 ((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)))
5420 if((type
& TTV_FIND_DUAL
) != TTV_FIND_DUAL
&& (TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_DIFF_ENDING_CRITIC_COMMAND
))
5421 chainc
= ttv_getlrcmd(ttvfig
,ptsig
) ;
5426 chainc
= addchain(chainc
,NULL
) ;
5429 for(chc
= chainc
; chc
!= NULL
; chc
= chc
->NEXT
)
5433 for(i
= 0 ; i
< 2 ; i
++)
5435 if((((((type
& (TTV_FIND_NOT_UPUP
|TTV_FIND_NOT_UPDW
)) == (TTV_FIND_NOT_UPUP
|TTV_FIND_NOT_UPDW
)) && (i
== 1)) ||
5436 (((type
& (TTV_FIND_NOT_DWUP
|TTV_FIND_NOT_DWDW
)) == (TTV_FIND_NOT_DWUP
|TTV_FIND_NOT_DWDW
)) && (i
== 0)))
5437 && ((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)) ||
5438 (((((type
& (TTV_FIND_NOT_UPUP
|TTV_FIND_NOT_DWUP
)) == (TTV_FIND_NOT_UPUP
|TTV_FIND_NOT_DWUP
)) && (i
== 1)) ||
5439 (((type
& (TTV_FIND_NOT_UPDW
|TTV_FIND_NOT_DWDW
)) == (TTV_FIND_NOT_UPDW
|TTV_FIND_NOT_DWDW
)) && (i
== 0)))
5440 && ((type
& TTV_FIND_DUAL
) != TTV_FIND_DUAL
)
5441 && (ptsig
->TYPE
& (TTV_SIG_CT
|TTV_SIG_CZ
))==0 // pour le filtrage HZ
5444 TTV_SEARCH_INFORMATIONS
&=~TTV_SEARCH_INFORMATIONS_CRITIC_FALSEPATH
;
5445 path
= (ttvpath_list
*)ttv_findsigpath(ttvfig
,ttvins
,ttvins
,ptsig
->NODE
+i
,NULL
,(ttvevent_list
*)chc
->DATA
,delaymax
,delaymin
,type
,level
,path
,TTV_SEARCH_CRITICPATH
,nb
,&nbx
,savealltag
,&typehz
) ;
5446 if (TTV_SEARCH_INFORMATIONS
& TTV_SEARCH_INFORMATIONS_CRITIC_FALSEPATH
)
5448 event_to_retry
=addchain(event_to_retry
, ptsig
->NODE
+i
);
5452 // pour le filtre des HZ il faut les 2 events, donc on recherhera les // pour les 2 events
5456 event_to_retry
=addchain(event_to_retry
, ptsig
->NODE
+1);
5461 event_to_retry
=addchain(event_to_retry
, ptsig
->NODE
);
5466 if (allfailed
==3) break;
5472 path
= ttv_filterpathhz(path
,&nbx
, nb
,&upper_sort_info
, type
) ;
5478 if (event_to_retry
!=NULL
)
5480 int r_nbx
, retried_nbx
=0;
5481 ttvpath_list
*retried_list
=NULL
;
5485 // remove signal to retry from the list
5486 for (chain
=event_to_retry
; chain
!=NULL
; chain
=chain
->NEXT
)
5487 ((ttvevent_list
*)chain
->DATA
)->TYPE
|=TTV_NODE_MARQUE
;
5489 for (pathx
=path
; pathx
!=NULL
; pathx
=npathx
)
5492 if ((type
& TTV_FIND_DUAL
)!=0) tve
=pathx
->NODE
; else tve
=pathx
->ROOT
;
5493 if (tve
->TYPE
& TTV_NODE_MARQUE
)
5495 if (pathx
==path
) path
=npathx
; else prevpathx
->NEXT
=npathx
;
5497 ttv_freepathlist(pathx
);
5500 else prevpathx
=pathx
;
5502 for (chain
=event_to_retry
; chain
!=NULL
; chain
=chain
->NEXT
)
5503 ((ttvevent_list
*)chain
->DATA
)->TYPE
&=~TTV_NODE_MARQUE
;
5505 TTV_FIND_ALLPATH
='Y';
5506 if ((type
& TTV_FIND_ACCESS
)==0) TTV_MORE_SEARCH_OPTIONS
|=TTV_MORE_OPTIONS_CRITIC_PARA_SEARCH
;
5508 while (event_to_retry
!=NULL
)
5510 tve
= (ttvevent_list
*)event_to_retry
->DATA
;
5512 if((type
& TTV_FIND_DUAL
) != TTV_FIND_DUAL
&& (TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_DIFF_ENDING_CRITIC_COMMAND
))
5513 chainc
= ttv_getlrcmd(ttvfig
,tve
->ROOT
) ;
5518 chainc
= addchain(chainc
,NULL
) ;
5521 for(chc
= chainc
; chc
!= NULL
; chc
= chc
->NEXT
)
5525 pathx
= (ttvpath_list
*)ttv_findsigpath(ttvfig
,ttvins
,ttvins
,tve
,NULL
,(ttvevent_list
*)chc
->DATA
,delaymax
,delaymin
,type
|TTV_FIND_ALL
,level
,pathx
,TTV_SEARCH_CRITICPATH
,nb
,&r_nbx
,savealltag
,&typehz
) ;
5528 if (event_to_retry
->NEXT
!=NULL
&& tve
->ROOT
==((ttvevent_list
*)event_to_retry
->NEXT
->DATA
)->ROOT
) // test normalement vrai
5530 tve
= (ttvevent_list
*)event_to_retry
->NEXT
->DATA
;
5531 pathx
= (ttvpath_list
*)ttv_findsigpath(ttvfig
,ttvins
,ttvins
,tve
,(ttvevent_list
*)chc
->DATA
,NULL
,delaymax
,delaymin
,type
|TTV_FIND_ALL
,level
,pathx
,TTV_SEARCH_CRITICPATH
,nb
,&r_nbx
,savealltag
,&typehz
) ;
5532 event_to_retry
=delchain(event_to_retry
, event_to_retry
);
5535 pathx
= ttv_filterpathhz(pathx
,&r_nbx
, nb
, NULL
, type
) ;
5539 pathx
=ttv_keep_critic_paths(pathx
, &r_nbx
, type
, (TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_MULTIPLE_COMMAND_CRITIC_ACCESS
)!=0?1:0);
5543 retried_list
=ttv_mergepathlists(retried_list
, retried_nbx
, pathx
, r_nbx
, nb
, type
, &retried_nbx
);
5548 if (typehz
== 'Y' && event_to_retry
->NEXT
!=NULL
&& tve
->ROOT
==((ttvevent_list
*)event_to_retry
->NEXT
->DATA
)->ROOT
)
5549 event_to_retry
=delchain(event_to_retry
, event_to_retry
);
5550 event_to_retry
=delchain(event_to_retry
, event_to_retry
);
5552 TTV_FIND_ALLPATH
='N';
5553 TTV_MORE_SEARCH_OPTIONS
&=~TTV_MORE_OPTIONS_CRITIC_PARA_SEARCH
;
5555 // merge to previous list
5556 path
=ttv_mergepathlists(path
, nbx
, retried_list
, retried_nbx
, nb
, type
, &nbx
);
5558 TTV_SEARCH_INFORMATIONS
&=~TTV_SEARCH_INFORMATIONS_CRITIC_FALSEPATH
;
5561 if((type
& TTV_FIND_PATH
) == TTV_FIND_PATH
)
5562 ttv_addinfreelist(ttvins
,TTV_STS_P
) ;
5564 ttv_addinfreelist(ttvins
,TTV_STS_F
) ;
5567 for(chaininx
= chaininsav
; chaininx
!= NULL
; chaininx
= chaininx
->NEXT
)
5569 ((ttvsig_list
*)chaininx
->DATA
)->TYPE
&= ~(TTV_SIG_MASKIN
|TTV_SIG_MASKOUT
) ;
5571 freechain(chaininsav
) ;
5572 freechain(chainfigsav
) ;
5574 ttv_delinfreelist(NULL
,NULL
) ;
5576 pathx
=ttv_classpath(path
,type
);
5577 for(path
=pathx
, i
=1; i
<nb
&& path
!= NULL
; path
= path
->NEXT
, i
++) ;
5581 ttv_freepathlist(path
->NEXT
) ;
5587 /*****************************************************************************/
5588 /* function ttv_getcriticaccess() */
5590 /* ttvfig : ttvfig courante */
5591 /* maskin : list de masques pour les entrees */
5592 /* maskout : list de masques pour les sorties */
5593 /* delaymax : temps maximum des chemin */
5594 /* delaymin : temps maximum des chemin */
5595 /* nb : nombre de chemin a garder */
5596 /* type : type de recherche */
5598 /* recherche le temps d'acces le plus court ou le plus long d'une ttvfig */
5599 /*****************************************************************************/
5600 ttvpath_list
*ttv_getcriticaccess(ttvfig
,figpath
,maskin
,maskout
,maskclock
,delaymax
,delaymin
,nb
,type
)
5601 ttvfig_list
*ttvfig
;
5602 ttvfig_list
*figpath
;
5603 chain_list
*maskin
;
5604 chain_list
*maskout
;
5605 chain_list
*maskclock
;
5611 ttvpath_list
*path
;
5612 #ifdef SPEED_UP_ACCESS_CRITIC
5614 chain_list
*clknames
;
5616 chain_list
*chainclock
;
5618 if (TTV_EXPLICIT_CLOCK_NODES
==NULL
)
5620 if(maskclock
== NULL
)
5621 chainclock
= ttv_getclocksiglist(ttvfig
) ;
5623 chainclock
= ttv_getsigbytype_and_netname(ttvfig
,NULL
,TTV_SIG_C
|TTV_SIG_L
|TTV_SIG_B
,maskclock
) ;
5626 chainclock
=dupchainlst(TTV_EXPLICIT_CLOCK_NODES
);
5628 #ifdef SPEED_UP_ACCESS_CRITIC
5629 // speed up all access
5630 clknames
=namefromsig(ttvfig
, chainclock
);
5633 long save0
, save1
, save2
;
5634 ttv_set_search_exclude_type(0, 0, &save0
, &save1
);
5635 save2
=TTV_MORE_SEARCH_OPTIONS
;
5636 TTV_MORE_SEARCH_OPTIONS
=0;
5637 subtype
=type
& (TTV_FIND_PATH
|TTV_FIND_LINE
|TTV_FIND_MIN
|TTV_FIND_MAX
);
5638 TTV_MARK_MODE
=TTV_MARK_MODE_DO
;
5639 ttv_getcriticpath(ttvfig
,figpath
,clknames
,NULL
,delaymax
,delaymin
,LONG_MAX
,TTV_FIND_DUAL
|subtype
) ;
5641 TTV_MARK_MODE
=TTV_MARK_MODE_USE
;
5642 freechain(clknames
);
5643 ttv_set_search_exclude_type(save0
, save1
, &save0
, &save1
);
5644 TTV_MORE_SEARCH_OPTIONS
=save2
;
5647 TTV_CHAIN_CLOCK
= chainclock
;
5648 path
= ttv_getcriticpath(ttvfig
,figpath
,maskin
,maskout
,delaymax
,delaymin
,nb
,type
|TTV_FIND_ACCESS
) ;
5650 #ifdef SPEED_UP_ACCESS_CRITIC
5651 ttv_FreeMarkedSigList();
5655 freechain(TTV_CHAIN_CLOCK
) ;
5656 TTV_CHAIN_CLOCK
= NULL
;
5660 /*****************************************************************************/
5661 /* function ttv_getpath() */
5663 /* ttvfig : ttvfig courante */
5664 /* figpath : figure de recherche d'un chemin */
5665 /* ptsig : signal de depart de la recherche */
5666 /* mask : list de masques pour les entrees ou sorties */
5667 /* delaymax : temps maximum des chemin */
5668 /* delaymin : temps maximum des chemin */
5669 /* type : type de recherche */
5671 /* recherche tous les chemins entre ptsig et les signaux de mask */
5672 /*****************************************************************************/
5673 ttvpath_list
*ttv_getpath(ttvfig
,figpath
,ptsig
,mask
,delaymax
,delaymin
,type
)
5674 ttvfig_list
*ttvfig
;
5675 ttvfig_list
*figpath
;
5676 ttvsig_list
*ptsig
;
5682 ttvfig_list
*ttvfigx
;
5683 ttvfig_list
*ttvfigsav
;
5684 ttvpath_list
*path
= NULL
;
5685 chain_list
*chainin
;
5687 chain_list
*chainpath
;
5688 chain_list
*chainc
, *event_to_retry
;
5692 long level
= (long)0 ;
5697 if(((type
& TTV_FIND_PATH
) == TTV_FIND_PATH
) ||
5698 ((type
& TTV_FIND_LINE
) != TTV_FIND_LINE
))
5700 type
&= ~(TTV_FIND_LINE
| TTV_FIND_HIER
) ;
5701 type
|= TTV_FIND_PATH
;
5704 type
&= ~(TTV_FIND_HIER
) ;
5708 levelsig
= ttv_getsiglevel(ptsig
) ;
5710 if(levelsig
== ttvfig
->INFO
->LEVEL
)
5712 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
5713 typesig
= TTV_SIG_C
|TTV_SIG_Q
|TTV_SIG_L
|TTV_SIG_R
|TTV_SIG_B
;
5715 typesig
= TTV_SIG_C
|TTV_SIG_L
|TTV_SIG_R
|TTV_SIG_B
|TTV_SIG_Q
;
5719 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
5720 typesig
= TTV_SIG_Q
|TTV_SIG_L
|TTV_SIG_R
|TTV_SIG_B
;
5722 typesig
= TTV_SIG_L
|TTV_SIG_R
|TTV_SIG_B
|TTV_SIG_Q
;
5725 if((type
& TTV_FIND_SIG
) != TTV_FIND_SIG
)
5729 if ((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
) excludemask
=TTV_EXCLUDE_TYPE_END
; else excludemask
=TTV_EXCLUDE_TYPE_START
, exclQK
=1;
5730 chainin
= ttv_getsigbytype_and_netname(ttvfig
,NULL
,typesig
,mask
) ;
5731 chainin
= ttv_apply_exclude_flag(chainin
, excludemask
, exclQK
);
5736 for(chain
= mask
; chain
!= NULL
; chain
= chain
->NEXT
)
5738 chainin
= addchain(chainin
,chain
->DATA
) ;
5742 if((type
& TTV_FIND_DUAL
) != TTV_FIND_DUAL
)
5743 chainin
= ttv_remove_connector_B(chainin
);
5745 for(chain
= chainin
; chain
!= NULL
; chain
= chain
->NEXT
)
5747 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
5748 ((ttvsig_list
*)chain
->DATA
)->TYPE
|= TTV_SIG_MASKOUT
;
5750 ((ttvsig_list
*)chain
->DATA
)->TYPE
|= TTV_SIG_MASKIN
;
5751 if((levelend
= ttv_getsiglevel((ttvsig_list
*)chain
->DATA
)) > level
)
5757 // calcul si on doit ignorer le maskin pour les latchs des access
5758 savealltag
=computesavealltag(chainin
, 0);
5760 if((levelend
< ttvfig
->INFO
->LEVEL
) && (levelsig
== ttvfig
->INFO
->LEVEL
))
5763 for(chain
= chainin
; chain
!= NULL
; chain
= chain
->NEXT
)
5765 if((((ttvsig_list
*)chain
->DATA
)->TYPE
& TTV_SIG_C
) != TTV_SIG_C
)
5766 chainpath
= addchain(chainpath
,chain
->DATA
) ;
5769 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
5770 ((ttvsig_list
*)chain
->DATA
)->TYPE
&= ~(TTV_SIG_MASKOUT
) ;
5772 ((ttvsig_list
*)chain
->DATA
)->TYPE
&= ~(TTV_SIG_MASKIN
) ;
5775 freechain(chainin
) ;
5776 chainin
= chainpath
;
5779 if(levelsig
> ttvfig
->INFO
->LEVEL
) levelsig
= ttvfig
->INFO
->LEVEL
;
5780 if(levelend
> ttvfig
->INFO
->LEVEL
) levelend
= ttvfig
->INFO
->LEVEL
;
5782 if(levelsig
> levelend
) level
= levelend
;
5783 else level
= levelsig
;
5785 for(ttvfigx
= ptsig
->ROOT
; ttvfigx
!= NULL
; ttvfigx
= ttvfigx
->ROOT
)
5787 ttvfigx
->STATUS
|= TTV_STS_MARQUE
;
5788 if((ttvfigx
->INFO
->LEVEL
>= level
) || (ttvfigx
== ttvfig
)) break ;
5791 ttvfigsav
= ttvfig
;
5793 for(chain
= chainin
; chain
!= NULL
; chain
= chain
->NEXT
)
5795 for(ttvfigx
= ((ttvsig_list
*)chain
->DATA
)->ROOT
;
5796 ttvfigx
!= NULL
; ttvfigx
= ttvfigx
->ROOT
)
5798 if((ttvfigx
->STATUS
& TTV_STS_MARQUE
) == TTV_STS_MARQUE
)
5802 if(ttvfigx
->INFO
->LEVEL
< ttvfigsav
->INFO
->LEVEL
) ttvfigsav
= ttvfigx
;
5803 if(ttvfigsav
== ptsig
->ROOT
)
5807 for(ttvfigx
= ptsig
->ROOT
; ttvfigx
!= NULL
; ttvfigx
= ttvfigx
->ROOT
)
5809 ttvfigx
->STATUS
&= ~(TTV_STS_MARQUE
) ;
5810 if((ttvfigx
->INFO
->LEVEL
>= level
) || (ttvfigx
== ttvfig
)) break ;
5816 savealltag
=computesavealltag(chainin
, 1);
5819 if((figpath
== NULL
) && (mask
!= NULL
))
5821 if((level
< ttvfig
->INFO
->LEVEL
) && (level
== ttvfigsav
->INFO
->LEVEL
))
5825 else if((level
== ttvfig
->INFO
->LEVEL
) && (level
> ttvfigsav
->INFO
->LEVEL
))
5827 level
= ttvfigsav
->INFO
->LEVEL
;
5828 ttvfigsav
= ttvfig
;
5831 else if((figpath
== NULL
) && (mask
== NULL
))
5833 level
= ptsig
->ROOT
->INFO
->LEVEL
;
5834 ttvfigsav
= ttvfig
;
5838 ttvfigsav
= figpath
;
5839 if(figpath
== ttvfig
)
5841 level
= figpath
->INFO
->LEVEL
;
5849 if((type
& TTV_FIND_DUAL
) != TTV_FIND_DUAL
)
5850 chainc
= ttv_getlrcmd(ttvfig
,ptsig
) ;
5854 if(chainc
== NULL
|| (TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_ADD_ASYNCHRONOUS_PATHS
)!=0)
5855 chainc
= addchain(chainc
,NULL
) ;
5858 for(chc
= chainc
; chc
!= NULL
; chc
= chc
->NEXT
)
5860 event_to_retry
=NULL
;
5861 if ((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
&& (ptsig
->TYPE
& TTV_SIG_CB
)==TTV_SIG_CB
) continue;
5862 for(i
= 0 ; i
< 2 ; i
++)
5864 if((((((type
& (TTV_FIND_NOT_UPUP
|TTV_FIND_NOT_UPDW
)) == (TTV_FIND_NOT_UPUP
|TTV_FIND_NOT_UPDW
)) && (i
== 1)) ||
5865 (((type
& (TTV_FIND_NOT_DWUP
|TTV_FIND_NOT_DWDW
)) == (TTV_FIND_NOT_DWUP
|TTV_FIND_NOT_DWDW
)) && (i
== 0)))
5866 && ((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)) ||
5867 (((((type
& (TTV_FIND_NOT_UPUP
|TTV_FIND_NOT_DWUP
)) == (TTV_FIND_NOT_UPUP
|TTV_FIND_NOT_DWUP
)) && (i
== 1)) ||
5868 (((type
& (TTV_FIND_NOT_UPDW
|TTV_FIND_NOT_DWDW
)) == (TTV_FIND_NOT_UPDW
|TTV_FIND_NOT_DWDW
)) && (i
== 0)))
5869 && ((type
& TTV_FIND_DUAL
) != TTV_FIND_DUAL
)
5870 && (ptsig
->TYPE
& (TTV_SIG_CT
|TTV_SIG_CZ
))==0 // pour le filtrage HZ
5873 TTV_SEARCH_INFORMATIONS
&=~TTV_SEARCH_INFORMATIONS_CRITIC_FALSEPATH
;
5874 path
= (ttvpath_list
*)ttv_findsigpath(ttvfig
,figpath
,ttvfigsav
,ptsig
->NODE
+i
,NULL
,(ttvevent_list
*)chc
->DATA
,delaymax
,delaymin
,type
,level
,path
,TTV_SEARCH_PATH
,TTV_MAX_PATHNB
,NULL
, savealltag
,&typehz
) ;
5875 if (TTV_SEARCH_INFORMATIONS
& TTV_SEARCH_INFORMATIONS_CRITIC_FALSEPATH
)
5877 event_to_retry
=addchain(event_to_retry
, ptsig
->NODE
+i
);
5880 // pour le filtre des HZ il faut les 2 events, donc on recherhera les // pour les 2 events
5883 event_to_retry
=addchain(event_to_retry
, ptsig
->NODE
+1);
5888 event_to_retry
=addchain(event_to_retry
, ptsig
->NODE
);
5893 if (event_to_retry
!=NULL
)
5895 int r_nbx
, retried_nbx
=0;
5896 ttvpath_list
*retried_list
=NULL
;
5898 ttvpath_list
*pathx
, *npathx
, *prevpathx
;
5900 // remove signal to retry from the list
5901 for (chain
=event_to_retry
; chain
!=NULL
; chain
=chain
->NEXT
)
5902 ((ttvevent_list
*)chain
->DATA
)->TYPE
|=TTV_NODE_MARQUE
;
5904 for (pathx
=path
; pathx
!=NULL
; pathx
=npathx
)
5907 if ((type
& TTV_FIND_DUAL
)!=0) tve
=pathx
->NODE
; else tve
=pathx
->ROOT
;
5908 if (pathx
->CMD
==chc
->DATA
&& tve
->TYPE
& TTV_NODE_MARQUE
)
5910 if (pathx
==path
) path
=npathx
; else prevpathx
->NEXT
=npathx
;
5912 ttv_freepathlist(pathx
);
5914 else prevpathx
=pathx
;
5916 for (chain
=event_to_retry
; chain
!=NULL
; chain
=chain
->NEXT
)
5917 ((ttvevent_list
*)chain
->DATA
)->TYPE
&=~TTV_NODE_MARQUE
;
5919 TTV_FIND_ALLPATH
='Y';
5920 if ((type
& TTV_FIND_ACCESS
)==0) TTV_MORE_SEARCH_OPTIONS
|=TTV_MORE_OPTIONS_CRITIC_PARA_SEARCH
;
5921 while (event_to_retry
!=NULL
)
5923 tve
= (ttvevent_list
*)event_to_retry
->DATA
;
5928 pathx
= (ttvpath_list
*)ttv_findsigpath(ttvfig
,figpath
,ttvfigsav
,tve
,NULL
,(ttvevent_list
*)chc
->DATA
,delaymax
,delaymin
,type
|TTV_FIND_ALL
,level
,pathx
,TTV_SEARCH_PATH
,TTV_MAX_PATHNB
,NULL
, savealltag
,&typehz
) ;
5932 if (event_to_retry
->NEXT
!=NULL
&& tve
->ROOT
==((ttvevent_list
*)event_to_retry
->NEXT
->DATA
)->ROOT
) // test normalement vrai
5934 event_to_retry
=delchain(event_to_retry
, event_to_retry
);
5935 tve
= (ttvevent_list
*)event_to_retry
->DATA
;
5936 pathx
= (ttvpath_list
*)ttv_findsigpath(ttvfig
,figpath
,ttvfigsav
,tve
,NULL
,(ttvevent_list
*)chc
->DATA
,delaymax
,delaymin
,type
|TTV_FIND_ALL
,level
,pathx
,TTV_SEARCH_PATH
,TTV_MAX_PATHNB
,NULL
, savealltag
,&typehz
) ;
5939 pathx
= ttv_filterpathhz(pathx
,NULL
, TTV_MAX_PATHNB
, NULL
, type
) ;
5943 pathx
=ttv_keep_critic_paths(pathx
, &r_nbx
, type
, (TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_MULTIPLE_COMMAND_CRITIC_ACCESS
)!=0?1:0);
5947 retried_list
=ttv_mergepathlists(retried_list
, retried_nbx
, pathx
, r_nbx
, TTV_MAX_PATHNB
, type
, &retried_nbx
);
5949 event_to_retry
=delchain(event_to_retry
, event_to_retry
);
5951 TTV_FIND_ALLPATH
='N';
5952 TTV_MORE_SEARCH_OPTIONS
&=~TTV_MORE_OPTIONS_CRITIC_PARA_SEARCH
;
5954 // merge to previous list
5955 path
=ttv_mergepathlists(path
, countchain((chain_list
*)path
), retried_list
, retried_nbx
, TTV_MAX_PATHNB
, type
, &r_nbx
);
5957 TTV_SEARCH_INFORMATIONS
&=~TTV_SEARCH_INFORMATIONS_CRITIC_FALSEPATH
;
5961 for(chain
= chainin
; chain
!= NULL
; chain
= chain
->NEXT
)
5962 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
5963 ((ttvsig_list
*)chain
->DATA
)->TYPE
&= ~(TTV_SIG_MASKOUT
) ;
5965 ((ttvsig_list
*)chain
->DATA
)->TYPE
&= ~(TTV_SIG_MASKIN
) ;
5967 freechain(chainin
) ;
5970 path
= ttv_filterpathhz(path
,NULL
,0,NULL
,0) ;
5972 if((type
& (TTV_FIND_NOT_UPUP
|TTV_FIND_NOT_UPDW
|
5973 TTV_FIND_NOT_DWUP
|TTV_FIND_NOT_DWDW
)) != 0)
5974 path
= ttv_filterpath(path
,type
,NULL
) ;
5976 if((type
& TTV_FIND_NOTCLASS
) == TTV_FIND_NOTCLASS
)
5979 return(ttv_classpath(path
,type
)) ;
5982 /*****************************************************************************/
5983 /* function ttv_getpathnocross() */
5985 /* ttvfig : ttvfig courante */
5986 /* figpath : figure de recherche d'un chemin */
5987 /* ptsig : signal de depart de la recherche */
5988 /* mask : list de masques pour les entrees ou sorties */
5989 /* delaymax : temps maximum des chemin */
5990 /* delaymin : temps maximum des chemin */
5991 /* type : type de recherche */
5993 /* recherche tous les chemins entre ptsig et les signaux de mask */
5994 /*****************************************************************************/
5995 ttvpath_list
*ttv_getpathnocross(ttvfig
,figpath
,ptsig
,mask
,delaymax
,delaymin
,type
)
5996 ttvfig_list
*ttvfig
;
5997 ttvfig_list
*figpath
;
5998 ttvsig_list
*ptsig
;
6004 ttvpath_list
*path
;
6005 int maxperiod
, savmpd
;
6007 maxperiod
= V_INT_TAB
[__TTV_MAX_PATH_PERIOD
].VALUE
;
6008 savmpd
=TTV_MaxPathPeriodPrecharge
;
6009 V_INT_TAB
[__TTV_MAX_PATH_PERIOD
].VALUE
= 0 ;
6010 TTV_MaxPathPeriodPrecharge
=0;
6012 path
= ttv_getpath(ttvfig
,figpath
,ptsig
,mask
,delaymax
,delaymin
,type
) ;
6014 TTV_MaxPathPeriodPrecharge
=savmpd
;
6015 V_INT_TAB
[__TTV_MAX_PATH_PERIOD
].VALUE
= maxperiod
;
6020 /*****************************************************************************/
6021 /* function ttv_getaccessnocross() */
6023 /* ttvfig : ttvfig courante */
6024 /* figpath : figure de recherche d'un chemin */
6025 /* ptsig : signal de depart de la recherche */
6026 /* mask : list de masques pour les entrees ou sorties */
6027 /* delaymax : temps maximum des chemin */
6028 /* delaymin : temps maximum des chemin */
6029 /* type : type de recherche */
6031 /* recherche tous les chemins entre ptsig et les signaux de mask */
6032 /*****************************************************************************/
6033 ttvpath_list
*ttv_getaccessnocross(ttvfig
,figpath
,ptsig
,mask
,delaymax
,delaymin
,type
)
6034 ttvfig_list
*ttvfig
;
6035 ttvfig_list
*figpath
;
6036 ttvsig_list
*ptsig
;
6042 ttvpath_list
*path
;
6043 int maxperiod
, savmpd
;
6045 maxperiod
= V_INT_TAB
[__TTV_MAX_PATH_PERIOD
].VALUE
;
6046 savmpd
=TTV_MaxPathPeriodPrecharge
;
6047 V_INT_TAB
[__TTV_MAX_PATH_PERIOD
].VALUE
= 0 ;
6048 TTV_MaxPathPeriodPrecharge
=0;
6050 path
= ttv_getaccess(ttvfig
,figpath
,ptsig
,mask
,NULL
,delaymax
,delaymin
,type
) ;
6052 TTV_MaxPathPeriodPrecharge
=savmpd
;
6053 V_INT_TAB
[__TTV_MAX_PATH_PERIOD
].VALUE
= maxperiod
;
6058 /*****************************************************************************/
6059 /* function ttv_getpathsig() */
6061 /* ttvfig : ttvfig courante */
6062 /* figpath : figure de recherche d'un chemin */
6063 /* ptsig : signal de depart de la recherche */
6064 /* mask : list de masques pour les entrees ou sorties */
6065 /* delaymax : temps maximum des chemin */
6066 /* delaymin : temps maximum des chemin */
6067 /* type : type de recherche */
6069 /* recherche tous les chemins pour un signal */
6070 /*****************************************************************************/
6071 ttvpath_list
*ttv_getpathsig(ttvfig
,figpath
,ptsig
,mask
,delaymax
,delaymin
,type
)
6072 ttvfig_list
*ttvfig
;
6073 ttvfig_list
*figpath
;
6074 ttvsig_list
*ptsig
;
6080 ttvpath_list
*path
;
6082 TTV_FIND_ALLPATH
= 'Y' ;
6083 path
= ttv_getpath(ttvfig
,figpath
,ptsig
,mask
,delaymax
,delaymin
,type
|TTV_FIND_ALL
) ;
6084 TTV_FIND_ALLPATH
= 'N' ;
6088 ttvpath_list
*ttv_getpathsignocross(ttvfig
,figpath
,ptsig
,mask
,delaymax
,delaymin
,type
)
6089 ttvfig_list
*ttvfig
;
6090 ttvfig_list
*figpath
;
6091 ttvsig_list
*ptsig
;
6097 ttvpath_list
*path
;
6098 int maxperiod
, savmpd
;
6100 maxperiod
= V_INT_TAB
[__TTV_MAX_PATH_PERIOD
].VALUE
;
6101 savmpd
=TTV_MaxPathPeriodPrecharge
;
6103 V_INT_TAB
[__TTV_MAX_PATH_PERIOD
].VALUE
= 0 ;
6104 TTV_MaxPathPeriodPrecharge
=0;
6106 TTV_FIND_ALLPATH
= 'Y' ;
6107 path
= ttv_getpath(ttvfig
,figpath
,ptsig
,mask
,delaymax
,delaymin
,type
|TTV_FIND_ALL
) ;
6108 TTV_FIND_ALLPATH
= 'N' ;
6110 TTV_MaxPathPeriodPrecharge
=savmpd
;
6112 V_INT_TAB
[__TTV_MAX_PATH_PERIOD
].VALUE
= maxperiod
;
6117 ttvpath_list
*ttv_getaccesssignocross(ttvfig
,figpath
,ptsig
,mask
,delaymax
,delaymin
,type
)
6118 ttvfig_list
*ttvfig
;
6119 ttvfig_list
*figpath
;
6120 ttvsig_list
*ptsig
;
6126 ttvpath_list
*path
;
6127 int maxperiod
, savmpd
;
6129 maxperiod
= V_INT_TAB
[__TTV_MAX_PATH_PERIOD
].VALUE
;
6130 savmpd
=TTV_MaxPathPeriodPrecharge
;
6132 V_INT_TAB
[__TTV_MAX_PATH_PERIOD
].VALUE
= 0 ;
6133 TTV_MaxPathPeriodPrecharge
=0;
6135 TTV_FIND_ALLPATH
= 'Y' ;
6136 path
= ttv_getaccess(ttvfig
,figpath
,ptsig
,mask
,NULL
,delaymax
,delaymin
,type
|TTV_FIND_ALL
) ;
6137 TTV_FIND_ALLPATH
= 'N' ;
6139 TTV_MaxPathPeriodPrecharge
=savmpd
;
6141 V_INT_TAB
[__TTV_MAX_PATH_PERIOD
].VALUE
= maxperiod
;
6147 /*****************************************************************************/
6148 /* function ttv_getaccess() */
6150 /* ttvfig : ttvfig courante */
6151 /* figpath : figure de recherche d'un chemin */
6152 /* ptsig : signal de depart de la recherche */
6153 /* mask : list de masques pour les entrees ou sorties */
6154 /* delaymax : temps maximum des chemin */
6155 /* delaymin : temps maximum des chemin */
6156 /* type : type de recherche */
6158 /* recherche tous les temps d'acces pour les extramitees */
6159 /*****************************************************************************/
6160 ttvpath_list
*ttv_getaccess(ttvfig
,figpath
,ptsig
,mask
,maskclock
,delaymax
,delaymin
,type
)
6161 ttvfig_list
*ttvfig
;
6162 ttvfig_list
*figpath
;
6163 ttvsig_list
*ptsig
;
6165 chain_list
*maskclock
;
6170 ttvpath_list
*path
;
6171 #ifdef SPEED_UP_ACCESS_CRITIC
6173 chain_list
*clknames
;
6175 chain_list
*chainclock
;
6177 if (TTV_EXPLICIT_CLOCK_NODES
==NULL
)
6179 if(maskclock
== NULL
)
6180 chainclock
= ttv_getclocksiglist(ttvfig
) ;
6183 if((type
& TTV_FIND_SIG
) != TTV_FIND_SIG
)
6184 chainclock
= ttv_getsigbytype_and_netname(ttvfig
,NULL
,TTV_SIG_C
|TTV_SIG_L
|TTV_SIG_B
,maskclock
) ;
6186 chainclock
= maskclock
;
6190 chainclock
=dupchainlst(TTV_EXPLICIT_CLOCK_NODES
);
6192 #ifdef SPEED_UP_ACCESS_CRITIC
6194 clknames
=namefromsig(ttvfig
, chainclock
);
6197 long save0
, save1
, save2
;
6198 ttv_set_search_exclude_type(0, 0, &save0
, &save1
);
6199 save2
=TTV_MORE_SEARCH_OPTIONS
;
6200 TTV_MORE_SEARCH_OPTIONS
=0;
6201 subtype
=type
& (TTV_FIND_PATH
|TTV_FIND_LINE
|TTV_FIND_MIN
|TTV_FIND_MAX
);
6202 TTV_MARK_MODE
=TTV_MARK_MODE_DO
;
6203 ttv_getcriticpath(ttvfig
,figpath
,clknames
,NULL
,delaymax
,delaymin
,LONG_MAX
,TTV_FIND_DUAL
|subtype
) ;
6205 TTV_MARK_MODE
=TTV_MARK_MODE_USE
;
6206 freechain(clknames
);
6207 ttv_set_search_exclude_type(save0
, save1
, &save0
, &save1
);
6208 TTV_MORE_SEARCH_OPTIONS
=save2
;
6211 TTV_CHAIN_CLOCK
= chainclock
;
6213 path
= ttv_getpath(ttvfig
,figpath
,ptsig
,mask
,delaymax
,delaymin
,type
|TTV_FIND_ACCESS
) ;
6215 #ifdef SPEED_UP_ACCESS_CRITIC
6216 ttv_FreeMarkedSigList();
6220 if(maskclock
==NULL
|| (type
& TTV_FIND_SIG
) != TTV_FIND_SIG
)
6221 freechain(TTV_CHAIN_CLOCK
) ;
6222 TTV_CHAIN_CLOCK
= NULL
;
6226 /*****************************************************************************/
6227 /* function ttv_getsigaccess() */
6229 /* ttvfig : ttvfig courante */
6230 /* figpath : figure de recherche d'un chemin */
6231 /* ptsig : signal de depart de la recherche */
6232 /* mask : list de masques pour les entrees ou sorties */
6233 /* delaymax : temps maximum des chemin */
6234 /* delaymin : temps maximum des chemin */
6235 /* type : type de recherche */
6237 /* recherche tous les temps d'acces pour les latchs */
6238 /*****************************************************************************/
6239 ttvpath_list
*ttv_getsigaccess(ttvfig
,figpath
,ptsig
,mask
,maskclock
,delaymax
,delaymin
,type
)
6240 ttvfig_list
*ttvfig
;
6241 ttvfig_list
*figpath
;
6242 ttvsig_list
*ptsig
;
6244 chain_list
*maskclock
;
6249 ttvpath_list
*path
;
6251 chain_list
*clknames
, *chainclock
;
6253 TTV_FIND_ALLPATH
= 'Y' ;
6254 if (TTV_EXPLICIT_CLOCK_NODES
==NULL
)
6256 if(maskclock
== NULL
)
6257 chainclock
= ttv_getclocksiglist(ttvfig
) ;
6260 if((type
& TTV_FIND_SIG
) != TTV_FIND_SIG
)
6261 chainclock
= ttv_getsigbytype_and_netname(ttvfig
,NULL
,TTV_SIG_C
|TTV_SIG_L
|TTV_SIG_B
,maskclock
) ;
6263 chainclock
= maskclock
;
6267 chainclock
=dupchainlst(TTV_EXPLICIT_CLOCK_NODES
);
6269 #ifdef SPEED_UP_ACCESS_ALL
6271 clknames
=namefromsig(ttvfig
, chainclock
);
6274 long saveprec
=V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
;
6275 long save0
, save1
, save2
;
6276 chain_list
*savestartnode
=TTV_EXPLICIT_START_NODES
;
6277 ttv_set_search_exclude_type(0, 0, &save0
, &save1
);
6278 save2
=TTV_MORE_SEARCH_OPTIONS
;
6279 TTV_MORE_SEARCH_OPTIONS
=0;
6280 V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
=0;
6281 subtype
=type
& (TTV_FIND_PATH
|TTV_FIND_LINE
|TTV_FIND_MIN
|TTV_FIND_MAX
);
6282 TTV_MARK_MODE
=TTV_MARK_MODE_DO
;
6283 TTV_EXPLICIT_START_NODES
=chainclock
;
6284 ttv_getcriticpath(ttvfig
,figpath
,clknames
,NULL
,delaymax
,delaymin
,INT_MAX
,TTV_FIND_DUAL
|TTV_FIND_ALL
|subtype
) ;
6285 TTV_EXPLICIT_START_NODES
=savestartnode
;
6286 freechain(clknames
);
6287 ttv_set_search_exclude_type(save0
, save1
, &save0
, &save1
);
6288 TTV_MORE_SEARCH_OPTIONS
=save2
;
6289 V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
=saveprec
;
6290 TTV_MARK_MODE
=TTV_MARK_MODE_USE
;
6294 TTV_CHAIN_CLOCK
= chainclock
;
6296 path
= ttv_getpath(ttvfig
,figpath
,ptsig
,mask
,delaymax
,delaymin
,type
|TTV_FIND_ALL
|TTV_FIND_ACCESS
) ;
6298 #ifdef SPEED_UP_ACCESS_ALL
6299 ttv_FreeMarkedSigList();
6303 if(maskclock
==NULL
|| (type
& TTV_FIND_SIG
) != TTV_FIND_SIG
)
6304 freechain(TTV_CHAIN_CLOCK
) ;
6305 TTV_CHAIN_CLOCK
= NULL
;
6306 TTV_FIND_ALLPATH
= 'N' ;
6310 /*****************************************************************************/
6311 /* function ttv_getallpath () */
6313 /* ttvfig : ttvfig courante */
6314 /* maskin : list de masques pour les entrees */
6315 /* maskout : list de masques pour les sorties */
6316 /* delaymax : temps maximum des chemin */
6317 /* delaymin : temps maximum des chemin */
6318 /* nb : nombre de chemin a garder */
6319 /* type : type de recherche */
6321 /* recherche tout les chemins d'une ttvfig */
6322 /*****************************************************************************/
6323 ttvpath_list
*ttv_getallpath(ttvfig
,figpath
,maskin
,maskout
,delaymax
,delaymin
,nb
,type
)
6324 ttvfig_list
*ttvfig
;
6325 ttvfig_list
*figpath
;
6326 chain_list
*maskin
;
6327 chain_list
*maskout
;
6333 ttvpath_list
*path
;
6335 TTV_FIND_ALLPATH
= 'Y' ;
6336 path
= ttv_getcriticpath(ttvfig
,figpath
,maskin
,maskout
,delaymax
,delaymin
,nb
,type
|TTV_FIND_ALL
) ;
6337 TTV_FIND_ALLPATH
= 'N' ;
6341 /*****************************************************************************/
6342 /* function ttv_getallaccess() */
6344 /* ttvfig : ttvfig courante */
6345 /* maskin : list de masques pour les entrees */
6346 /* maskout : list de masques pour les sorties */
6347 /* delaymax : temps maximum des chemin */
6348 /* delaymin : temps maximum des chemin */
6349 /* nb : nombre de chemin a garder */
6350 /* type : type de recherche */
6352 /* recherche tout les temps d'acces d'une ttvfig */
6353 /*****************************************************************************/
6354 ttvpath_list
*ttv_getallaccess(ttvfig
,figpath
,maskin
,maskout
,maskclock
,delaymax
,delaymin
,nb
,type
)
6355 ttvfig_list
*ttvfig
;
6356 ttvfig_list
*figpath
;
6357 chain_list
*maskin
;
6358 chain_list
*maskout
;
6359 chain_list
*maskclock
;
6365 ttvpath_list
*path
;
6367 chain_list
*clknames
, *chainclock
;
6369 TTV_FIND_ALLPATH
= 'Y' ;
6371 if (TTV_EXPLICIT_CLOCK_NODES
==NULL
)
6373 if(maskclock
== NULL
)
6374 chainclock
= ttv_getclocksiglist(ttvfig
) ;
6376 chainclock
= ttv_getsigbytype_and_netname(ttvfig
,NULL
,TTV_SIG_C
|TTV_SIG_L
|TTV_SIG_B
,maskclock
) ;
6379 chainclock
=dupchainlst(TTV_EXPLICIT_CLOCK_NODES
);
6381 #ifdef SPEED_UP_ACCESS_ALL
6383 clknames
=namefromsig(ttvfig
, chainclock
);
6386 long saveprec
=V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
;
6387 long save0
, save1
, save2
;
6388 chain_list
*savestartnode
=TTV_EXPLICIT_START_NODES
;
6389 ttv_set_search_exclude_type(0, 0, &save0
, &save1
);
6390 save2
=TTV_MORE_SEARCH_OPTIONS
;
6391 TTV_MORE_SEARCH_OPTIONS
=0;
6392 V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
=0;
6393 subtype
=type
& (TTV_FIND_PATH
|TTV_FIND_LINE
|TTV_FIND_MIN
|TTV_FIND_MAX
);
6394 TTV_MARK_MODE
=TTV_MARK_MODE_DO
;
6395 TTV_EXPLICIT_START_NODES
=chainclock
;
6396 ttv_getcriticpath(ttvfig
,figpath
,clknames
,NULL
,delaymax
,delaymin
,INT_MAX
,TTV_FIND_DUAL
|TTV_FIND_ALL
|subtype
) ;
6397 TTV_EXPLICIT_START_NODES
=savestartnode
;
6398 freechain(clknames
);
6399 ttv_set_search_exclude_type(save0
, save1
, &save0
, &save1
);
6400 TTV_MORE_SEARCH_OPTIONS
=save2
;
6401 V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
=saveprec
;
6402 TTV_MARK_MODE
=TTV_MARK_MODE_USE
;
6405 TTV_CHAIN_CLOCK
= chainclock
;
6406 path
= ttv_getcriticpath(ttvfig
,figpath
,maskin
,maskout
,delaymax
,delaymin
,nb
,type
|TTV_FIND_ALL
|TTV_FIND_ACCESS
) ;
6408 #ifdef SPEED_UP_ACCESS_ALL
6409 ttv_FreeMarkedSigList();
6413 freechain(TTV_CHAIN_CLOCK
) ;
6414 TTV_CHAIN_CLOCK
= NULL
;
6415 TTV_FIND_ALLPATH
= 'N' ;
6419 /*****************************************************************************/
6420 /* function ttv_testparamask() */
6422 /* inf : argument de la recherche de chemin parallele */
6424 /* test le mask pour la recherche de chemin parallele */
6425 /*****************************************************************************/
6426 int ttv_testparamask(inf
)
6429 ttvevent_list
*nodex
;
6431 chain_list
*chainx
;
6432 chain_list
*chainxx
;
6434 if (((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_ONLYNOTHZ
)!=0 && (inf
->TYPE
& TTV_FIND_HZ
)!=0)
6435 || ((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_ONLYHZ
)!=0 && (inf
->TYPE
& TTV_FIND_HZ
)==0)) return 0;
6437 if((ttv_GET_FINDDELAY(inf
->CURNODE
, 0) > inf
->MAX
) || (ttv_GET_FINDDELAY(inf
->CURNODE
, 0) < inf
->MIN
))
6440 if((inf
->CLOCK
== 1) && (TTV_CHAIN_CLOCK
!= NULL
))
6442 for(chain
= TTV_CHAIN_CLOCK
; chain
!= NULL
; chain
= chain
->NEXT
)
6444 if((ttvsig_list
*)chain
->DATA
== inf
->CURNODE
->ROOT
)
6451 if((inf
->TYPE
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
6453 if(ttv_isfalsepath(inf
->FIG
,inf
->ROOT
,inf
->CURNODE
,inf
->TYPE
,0,inf
->LATCH
) != 0)
6458 if(ttv_isfalsepath(inf
->FIG
,inf
->CURNODE
,inf
->ROOT
,inf
->TYPE
,0,inf
->LATCH
) != 0)
6466 ttvevent_list
*cmdev
;
6467 // on check si le chemin de clock est valid : on est en mode non dual normalement
6468 cmdev
=ttv_findlatchcommand_notdual(inf
->ROOT
,inf
->CURNODE
);
6469 if (cmdev
!=NULL
&& ttv_isfalsepath(inf
->FIG
,inf
->CURNODE
,cmdev
,inf
->TYPE
& ~TTV_FIND_HZ
,0,NULL
) != 0)
6473 if((inf
->MASK
== NULL
) ||
6474 ((inf
->TYPE
& (TTV_FIND_MASKAND
|TTV_FIND_MASKOR
|TTV_FIND_MASKNOT
)) == 0))
6477 if((inf
->TYPE
& TTV_FIND_MASKAND
) == TTV_FIND_MASKAND
)
6480 for(chainx
= inf
->MASK
; chainx
!= NULL
; chainx
= chainx
->NEXT
)
6481 chain
= addchain(chain
,chainx
->DATA
) ;
6484 nodex
= inf
->CURNODE
;
6486 while(nodex
->FIND
->OUTLINE
!= NULL
)
6488 if((inf
->TYPE
& TTV_FIND_MASKAND
) == TTV_FIND_MASKAND
)
6490 for(chainx
= chain
; chainx
!= NULL
; chainx
= chainx
->NEXT
)
6492 chainxx
= chainx
->NEXT
;
6493 chainx
->NEXT
= NULL
;
6494 if(chainx
->DATA
!= NULL
)
6495 if(ttv_testmask(inf
->FIG
,nodex
->ROOT
,chainx
) == 1)
6496 chainx
->DATA
= NULL
;
6497 chainx
->NEXT
= chainxx
;
6500 else if((inf
->TYPE
& TTV_FIND_MASKOR
) == TTV_FIND_MASKOR
)
6502 if(ttv_testmask(inf
->FIG
,nodex
->ROOT
,inf
->MASK
) == 1)
6505 else if((inf
->TYPE
& TTV_FIND_MASKNOT
) == TTV_FIND_MASKNOT
)
6507 if(ttv_testmask(inf
->FIG
,nodex
->ROOT
,inf
->MASK
) == 1)
6510 if((inf
->TYPE
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
6512 nodex
= nodex
->FIND
->OUTLINE
->NODE
;
6513 if(nodex
== inf
->ROOT
) break ;
6517 nodex
= nodex
->FIND
->OUTLINE
->ROOT
;
6518 if(nodex
== inf
->ROOT
) break ;
6522 if((inf
->TYPE
& TTV_FIND_MASKAND
) == TTV_FIND_MASKAND
)
6524 for(chainx
= chain
; chainx
!= NULL
; chainx
= chainx
->NEXT
)
6526 chainxx
= chainx
->NEXT
;
6527 chainx
->NEXT
= NULL
;
6528 if(chainx
->DATA
!= NULL
)
6529 if(ttv_testmask(inf
->FIG
,nodex
->ROOT
,chainx
) == 1)
6530 chainx
->DATA
= NULL
;
6531 chainx
->NEXT
= chainxx
;
6533 for(chainx
= chain
; chainx
!= NULL
; chainx
= chainx
->NEXT
)
6535 if(chainx
->DATA
!= NULL
)
6542 else if((inf
->TYPE
& TTV_FIND_MASKOR
) == TTV_FIND_MASKOR
)
6544 if(ttv_testmask(inf
->FIG
,nodex
->ROOT
,inf
->MASK
) == 1)
6547 else if((inf
->TYPE
& TTV_FIND_MASKNOT
) == TTV_FIND_MASKNOT
)
6549 if(ttv_testmask(inf
->FIG
,nodex
->ROOT
,inf
->MASK
) == 1)
6553 if((inf
->TYPE
& TTV_FIND_MASKNOT
) == TTV_FIND_MASKNOT
)
6559 /*****************************************************************************/
6560 /* function ttv_findpara() */
6562 /* ttvfig : ttvfig courante */
6563 /* figpath : niveau minimum de recherche */
6564 /* root : noeud de depart de la recherche */
6565 /* node : noeud d'arrivee de la recherche */
6566 /* max : borne superieur de recherche */
6567 /* min : borne inferieur de recherche */
6568 /* type : type de recherche */
6569 /* level : niveau de la recherche */
6570 /* mask : mask de rechercher */
6572 /* fonction de chemin parallele */
6573 /* renvoie le liste des details ou la liste des chemins suivant le type */
6574 /*****************************************************************************/
6575 void *ttv_findpara(ttvfig
,figpath
,root
,node
,max
,min
,type
,level
,mask
,nb
,saveall
)
6576 ttvfig_list
*ttvfig
;
6577 ttvfig_list
*figpath
;
6578 ttvevent_list
*root
;
6579 ttvevent_list
*node
;
6588 ttvfig_list
*ttvfigx
;
6592 ttv_ssta_set_checkloadedstore(ttvfig
);
6595 figpath
= root
->ROOT
->ROOT
;
6598 info
.INS
= figpath
;
6602 info
.CURNODE
= NULL
;
6606 info
.LEVEL
= level
;
6610 info
.LIST
.CHAIN
= NULL
; // initialise aussi info.LIST.PATHS
6611 info
.CHAINFIG
= NULL
;
6613 info
.CLOCKTAB
= NULL
;
6614 info
.SAVEALL
= saveall
;
6616 if(level
== ttvfig
->INFO
->LEVEL
)
6618 ttvfig
->STATUS
|= TTV_STS_NOT_FREE
;
6619 info
.CHAINFIG
= addchain(info
.CHAINFIG
,ttvfig
) ;
6620 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
6621 ttv_parsttvfig(ttvfig
,TTV_STS_DENOTINPT
|TTV_STS_CLS_FED
|TTV_STS_DUAL_D
|
6622 TTV_STS_DUAL_E
|TTV_STS_DUAL_F
,TTV_FILE_DTX
) ;
6624 ttv_parsttvfig(ttvfig
,TTV_STS_DENOTINPT
|TTV_STS_CLS_FED
,TTV_FILE_DTX
) ;
6627 ttvfigx
= root
->ROOT
->ROOT
;
6628 while(ttvfigx
!= NULL
)
6630 ttvfigx
->STATUS
|= TTV_STS_NOT_FREE
;
6631 info
.CHAINFIG
= addchain(info
.CHAINFIG
,ttvfigx
) ;
6632 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
6634 if(ttvfigx
->INFO
->LEVEL
>= figpath
->INFO
->LEVEL
)
6635 ttv_parsttvfig(ttvfigx
,TTV_STS_DENOTINPT
|TTV_STS_LS_FE
|TTV_STS_DUAL_E
|
6636 TTV_STS_DUAL_F
,TTV_FILE_DTX
) ;
6638 ttv_parsttvfig(ttvfigx
,TTV_STS_DENOTINPT
|TTV_STS_LS_E
|TTV_STS_DUAL_E
,
6643 if(ttvfigx
->INFO
->LEVEL
>= figpath
->INFO
->LEVEL
)
6644 ttv_parsttvfig(ttvfigx
,TTV_STS_DENOTINPT
|TTV_STS_LS_FE
,TTV_FILE_DTX
) ;
6646 ttv_parsttvfig(ttvfigx
,TTV_STS_DENOTINPT
|TTV_STS_LS_E
,TTV_FILE_DTX
) ;
6648 if(ttvfigx
->INFO
->LEVEL
>= level
) break ;
6649 ttvfigx
= ttvfigx
->ROOT
;
6652 ttv_fifopush(root
) ;
6653 root
->FIND
->DELAY
= (long)0 ;
6655 ttv_bypassnode(root
);
6657 if ((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_MOST_DIRECT_ACCESS
)==0 || (root
->ROOT
->TYPE
& (TTV_SIG_L
|TTV_SIG_B
))==0)
6658 ttv_findp(root
,&info
) ;
6660 ttv_findpclock(root
,&info
) ;
6662 ttv_clean_critic_para_nodes();
6663 ttv_donotbypassnode(root
);
6665 if((info
.NBPATH
> info
.NBMAX
) &&
6666 ((info
.TYPE
& TTV_FIND_CRITIC
) != TTV_FIND_CRITIC
))
6667 ttv_reduceparapath(&info
,1) ;
6669 for(chain
= info
.CHAINFIG
; chain
!= NULL
; chain
= chain
->NEXT
)
6670 ((ttvfig_list
*)chain
->DATA
)->STATUS
&= ~(TTV_STS_NOT_FREE
) ;
6672 freechain(info
.CHAINFIG
) ;
6674 if ((info.TYPE & TTV_FIND_CRITIC) != TTV_FIND_CRITIC)
6676 for (pth=info.LIST.PATHS, info.LIST.CHAIN=NULL; pth!=NULL; pth=npth)
6680 info.LIST.CHAIN=addchain(info.LIST.CHAIN, pth);
6682 info.LIST.CHAIN=reverse(info.LIST.CHAIN);
6685 return(info
.LIST
.CHAIN
) ;
6688 /*****************************************************************************/
6689 /* function ttv_reduceparapath() */
6691 /* root : noeud courant de la recherche */
6692 /* inf : information sur la recherche */
6693 /* force=1 => pas d'ajout de path, juste reduire */
6694 /* force=0 => ajout de path et reduction si necessaire */
6696 /* fonction recursive de construction de chemin parallele */
6697 /* renvoie le liste des details ou la liste des chemins suivant le type */
6698 /*****************************************************************************/
6699 ttvpath_list
*ttv_reduceparapath(inf
,force
)
6703 ttvpath_list
*pathx
, *npathx
;
6708 ttvpath_list
*path
;
6709 ttvpath_list
*pathhead
;
6712 pathhead
= ttv_classpath(inf
->LIST
.PATHS
,inf
->TYPE
) ;
6714 for(path
= pathhead
, nb
= 1 ; nb
< inf
->NBMAX
&& path
!= NULL
; path
= path
->NEXT
, nb
++) ;
6718 ttv_freepathlist(path
->NEXT
) ;
6721 if((inf
->TYPE
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
6723 if(inf
->MIN
< path
->DELAY
)
6724 inf
->MIN
= path
->DELAY
;
6728 if(inf
->MAX
> path
->DELAY
)
6729 inf
->MAX
= path
->DELAY
;
6733 inf
->LIST
.PATHS
= pathhead
;
6734 inf
->NBPATH
= inf
->NBMAX
;
6738 pathx
=inf
->LIST
.PATHS
;
6741 if(pathx
->LATCH
== NULL
)
6743 if(((((pathx
->NODE
->ROOT
->TYPE
& TTV_SIG_MASKIN
) != TTV_SIG_MASKIN
) &&
6744 ((inf
->TYPE
& TTV_FIND_DUAL
) != TTV_FIND_DUAL
)) ||
6745 (((pathx
->ROOT
->ROOT
->TYPE
& TTV_SIG_MASKOUT
) != TTV_SIG_MASKOUT
) &&
6746 ((inf
->TYPE
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
))) && ((inf
->SAVEALL
& SAVE_ALL_INPUT_TAG
)==0))
6748 pathx
->NEXT
= NULL
;
6749 ttv_freepathlist(pathx
) ;
6750 inf
->LIST
.PATHS
=npathx
;
6751 return inf
->LIST
.PATHS
;
6756 if(((pathx
->LATCH
->ROOT
->TYPE
& TTV_SIG_MASKIN
) != TTV_SIG_MASKIN
) &&
6757 ((inf
->SAVEALL
& SAVE_ALL_LATCH_TAG
)== 0))
6759 pathx
->NEXT
= NULL
;
6760 ttv_freepathlist(pathx
) ;
6761 inf
->LIST
.PATHS
=npathx
;
6762 return inf
->LIST
.PATHS
;
6766 if(inf
->NBPATH
>= inf
->NBMAX
&&
6767 (((npathx
->DELAY
>= pathx
->DELAY
) &&
6768 ((inf
->TYPE
& TTV_FIND_MAX
) == TTV_FIND_MAX
)) ||
6769 ((npathx
->DELAY
<= pathx
->DELAY
) &&
6770 ((inf
->TYPE
& TTV_FIND_MIN
) == TTV_FIND_MIN
))))
6772 pathx
->NEXT
= NULL
;
6773 ttv_freepathlist(pathx
) ;
6774 inf
->LIST
.PATHS
= npathx
;
6777 inf
->LIST
.PATHS
= ttv_keepnbpath(inf
->LIST
.PATHS
,inf
->NBMAX
, &inf
->NBPATH
,inf
->TYPE
, &inner_sort_info
,1) ;
6780 return(inf
->LIST
.PATHS
) ;
6783 int ttv_check_insertability(ttvevent_list
*event
, ttvinfopara
*inf
)
6785 ttvfig_list
*ttvfigx
;
6786 ttvfigx
= event
->ROOT
->ROOT
;
6787 if((ttvfigx
->INFO
->LEVEL
>= inf
->INS
->INFO
->LEVEL
) && (ttvfigx
->INFO
->LEVEL
<= inf
->LEVEL
))
6789 if((inf
->TYPE
& TTV_FIND_CRITIC
) != TTV_FIND_CRITIC
)
6791 if(inf
->NBPATH
>= inf
->NBMAX
&&
6792 ((inf
->LIST
.PATHS
->DELAY
>= inf
->CURNODE
->FIND
->DELAY
*TTV_HIGH_RATIO
&&
6793 (inf
->TYPE
& TTV_FIND_MAX
) == TTV_FIND_MAX
) ||
6794 (inf
->LIST
.PATHS
->DELAY
<= inf
->CURNODE
->FIND
->DELAY
*TTV_LOW_RATIO
&&
6795 (inf
->TYPE
& TTV_FIND_MIN
) == TTV_FIND_MIN
)))
6804 /*****************************************************************************/
6805 /* function ttv_savparapath() */
6807 /* root : noeud courant de la recherche */
6808 /* inf : information sur la recherche */
6810 /* recherche les access */
6811 /*****************************************************************************/
6812 void ttv_savparapath(event
,inf
)
6813 ttvevent_list
*event
;
6816 ttvfig_list
*ttvfigx
;
6817 ttvcritic_list
*critic
;
6819 chain_list
*chainnode
, *chain
;
6820 ttvevent_list
*eventstart
=event
;
6823 if (TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_CRITIC_PARA_SEARCH
)
6825 if ((ptype
=getptype(inf
->CURNODE
->USER
, TTV_NODE_CRITIC_PARA_INFO
))!=NULL
)
6827 if (((inf
->TYPE
& TTV_FIND_MAX
)!=0 && (long)ptype
->DATA
>inf
->CURNODE
->FIND
->DELAY
)
6828 || ((inf
->TYPE
& TTV_FIND_MIN
)!=0 && (long)ptype
->DATA
<inf
->CURNODE
->FIND
->DELAY
))
6833 ttvfigx
= event
->ROOT
->ROOT
;
6834 if((event
->FIND
->OUTLINE
== NULL
) &&
6835 ((ptype
= getptype(event
->USER
,TTV_NODE_LATCH
)) != NULL
))
6837 event
= (ttvevent_list
*)ptype
->DATA
;
6841 while(event
->FIND
->OUTLINE
!= NULL
)
6843 if(event
->FIND
->OUTLINE
->FIG
->INFO
->LEVEL
> ttvfigx
->INFO
->LEVEL
)
6844 ttvfigx
= event
->FIND
->OUTLINE
->FIG
;
6846 if (TTV_MARK_MODE
==TTV_MARK_MODE_DO
)
6849 if (getptype(tvs
->USER
, TTV_SIG_MARKED
)==NULL
)
6851 tvs
->USER
=addptype(tvs
->USER
, TTV_SIG_MARKED
, NULL
);
6852 MARKED_SIG_LIST
=addchain(MARKED_SIG_LIST
, tvs
);
6856 if((inf
->TYPE
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
6858 if(event
->FIND
->OUTLINE
->NODE
== inf
->ROOT
) break ;
6859 // zinaps : pour eviter les boucles
6860 if((event
->FIND
->OUTLINE
->NODE
->TYPE
& TTV_NODE_MARQUE
) == TTV_NODE_MARQUE
)
6862 char buf0
[128], buf1
[128], buf2
[128], buf
[1024];
6863 sprintf(buf
, "from '%s' to '%s' on node '%s'",
6864 ttv_getsigname(inf
->FIG
,buf0
,inf
->ROOT
->ROOT
),
6865 ttv_getsigname(inf
->FIG
,buf1
,eventstart
->ROOT
),
6866 ttv_getsigname(inf
->FIG
,buf2
,event
->FIND
->OUTLINE
->NODE
->ROOT
));
6868 ttv_error(54,buf
,TTV_WARNING
) ;
6869 for(chain
= chainnode
; chain
!= NULL
; chain
= chain
->NEXT
)
6870 ((ttvevent_list
*)chain
->DATA
)->TYPE
&= ~(TTV_NODE_MARQUE
) ;
6871 freechain(chainnode
) ;
6874 event
= event
->FIND
->OUTLINE
->NODE
;
6878 if(event
->FIND
->OUTLINE
->ROOT
== inf
->ROOT
) break ;
6880 // zinaps : pour eviter les boucles
6881 if((event
->FIND
->OUTLINE
->ROOT
->TYPE
& TTV_NODE_MARQUE
) == TTV_NODE_MARQUE
)
6883 char buf0
[128], buf1
[128], buf2
[128], buf
[1024];
6884 sprintf(buf
, "from '%s' to '%s' on node '%s'",
6885 ttv_getsigname(inf
->FIG
,buf0
,eventstart
->ROOT
),
6886 ttv_getsigname(inf
->FIG
,buf1
,inf
->ROOT
->ROOT
),
6887 ttv_getsigname(inf
->FIG
,buf2
,event
->FIND
->OUTLINE
->ROOT
->ROOT
));
6888 ttv_error(54,buf
,TTV_WARNING
) ;
6889 for(chain
= chainnode
; chain
!= NULL
; chain
= chain
->NEXT
)
6890 ((ttvevent_list
*)chain
->DATA
)->TYPE
&= ~(TTV_NODE_MARQUE
) ;
6891 freechain(chainnode
) ;
6895 event
= event
->FIND
->OUTLINE
->ROOT
;
6897 if((event
->FIND
->OUTLINE
== NULL
) &&
6898 ((ptype
= getptype(event
->USER
,TTV_NODE_LATCH
)) != NULL
))
6900 event
= (ttvevent_list
*)ptype
->DATA
;
6904 if (TTV_MARK_MODE
==TTV_MARK_MODE_DO
) return;
6906 if((ttvfigx
->INFO
->LEVEL
>= inf
->INS
->INFO
->LEVEL
) && (ttvfigx
->INFO
->LEVEL
<= inf
->LEVEL
))
6908 if((inf
->TYPE
& TTV_FIND_CRITIC
) == TTV_FIND_CRITIC
)
6910 if (TTV_CHARAC_CRITIC_SLOPES_LIST
!=NULL
|| TTV_CHARAC_CRITIC_CAPAS_LIST
!=NULL
)
6912 if (TTV_CHARAC_CRITIC_RESULT_DELAYS
==NULL
)
6913 ttv_DoCharacPropagation(inf
->FIG
,inf
->INS
,inf
->CURNODE
,inf
->ROOT
,inf
->TYPE
,TTV_CHARAC_CRITIC_SLOPES_LIST
,TTV_CHARAC_CRITIC_CAPAS_LIST
, &TTV_CHARAC_CRITIC_RESULT_DELAYS
, &TTV_CHARAC_CRITIC_RESULT_SLOPES
, &TTV_CHARAC_CRITIC_RESULT_ENERGY
, NULL
);
6917 critic
= ttv_savcritic(inf
->FIG
,inf
->INS
,inf
->ROOT
,inf
->CURNODE
,inf
->TYPE
,1) ;
6921 inf
->LIST
.CHAIN
= addchain(inf
->LIST
.CHAIN
,critic
) ;
6926 // est-ce que l'on doit garder le path?
6927 if(!(inf
->NBPATH
>= inf
->NBMAX
&&
6928 (((inf
->LIST
.PATHS
->DELAY
>= ttv_GET_FINDDELAY(inf
->CURNODE
, 0)) &&
6929 ((inf
->TYPE
& TTV_FIND_MAX
) == TTV_FIND_MAX
)) ||
6930 ((inf
->LIST
.PATHS
->DELAY
<= ttv_GET_FINDDELAY(inf
->CURNODE
, 0)) &&
6931 ((inf
->TYPE
& TTV_FIND_MIN
) == TTV_FIND_MIN
)))))
6933 void *old
=inf
->LIST
.PATHS
;
6934 inf
->LIST
.PATHS
=ttv_savpath(inf
->FIG
,NULL
,inf
->LIST
.PATHS
,inf
->ROOT
,inf
->CURNODE
,inf
->TYPE
);
6935 if ((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_CRITIC_PARA_SEARCH
)!=0 && old
!=inf
->LIST
.PATHS
)
6937 if ((ptype
=getptype(inf
->CURNODE
->USER
, TTV_NODE_CRITIC_PARA_INFO
))!=NULL
)
6938 ptype
->DATA
=(void *)inf
->CURNODE
->FIND
->DELAY
;
6941 inf
->CURNODE
->USER
=addptype(inf
->CURNODE
->USER
, TTV_NODE_CRITIC_PARA_INFO
, (void *)inf
->CURNODE
->FIND
->DELAY
);
6942 TTV_CRITIC_PARA_SEARCH
=addchain(TTV_CRITIC_PARA_SEARCH
, inf
->CURNODE
);
6945 ttv_reduceparapath(inf
,0) ;
6951 /*****************************************************************************/
6952 /* function ttv_findpclock() */
6954 /* root : noeud courant de la recherche */
6955 /* inf : information sur la recherche */
6957 /* recherche les access */
6958 /*****************************************************************************/
6960 static int TTV_NB_FOUND
=0;
6962 void ttv_findpclock(event
,inf
)
6963 ttvevent_list
*event
;
6966 ptype_list
*cmdlist
;
6968 ptype_list
*ptypex
;
6969 ttvevent_list
*cmdevent
;
6970 ttvline_list
*ptline
;
6971 chain_list
*line_list
;
6974 long search
, insert
;
6978 if ((TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_ADD_ASYNCHRONOUS_ACCESS
)!=0)
6979 cmdlist
=ttv_getlatchasynccmd(inf
->FIG
,event
,inf
->TYPE
);
6981 cmdlist
= ttv_getlatchaccess(inf
->FIG
,event
,inf
->TYPE
) ;
6983 for(ptype
= cmdlist
; ptype
!= NULL
; ptype
= ptype
->NEXT
)
6985 cmdevent
= (ttvevent_list
*)ptype
->DATA
;
6987 if (ttv_isbypassednode(cmdevent
)) continue;
6991 if(ptype
->TYPE
!= (long)0)
6993 ptline
= (ttvline_list
*)ptype
->TYPE
;
6994 if((inf
->TYPE
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
6996 if ((delay
=stb_gettruncatedaccess(ptline
->ROOT
, ptline
->NODE
, 1))==TTV_NOTIME
)
6997 delay
= ttv_getdelaymax(ptline
);
7001 if ((delay
=stb_gettruncatedaccess(ptline
->ROOT
, ptline
->NODE
, 0))==TTV_NOTIME
)
7002 delay
= ttv_getdelaymin(ptline
) ;
7010 ttv_fifopush(cmdevent
) ;
7011 if((ptypex
= getptype(cmdevent
->USER
,TTV_NODE_LATCH
)) == NULL
)
7013 cmdevent
->USER
= addptype(cmdevent
->USER
,TTV_NODE_LATCH
,event
) ;
7014 cmdevent
->FIND
->DELAY
= delay
+ event
->FIND
->DELAY
;
7018 ptypex
->DATA
= event
;
7019 cmdevent
->FIND
->DELAY
= delay
+ event
->FIND
->DELAY
;
7021 cmdevent
->FIND
->OUTLINE
= ptline
;
7022 inf
->CURNODE
= cmdevent
;
7026 if(((cmdevent
== inf
->NODE
) ||
7027 ((inf
->NODE
== NULL
) &&
7028 (((search
= ttv_signalsearchtype(inf
->FIG
,cmdevent
,inf
->TYPE
)) & TTV_SIG_ENDSEARCH
) == TTV_SIG_ENDSEARCH
))))
7030 if(!(V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
==1 && (insert
=ttv_check_insertability(cmdevent
, inf
))==0))
7032 if (V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
>=1)
7033 line_list
=ttv_DoPropagation_PRECISION_LEVEL1(inf
->FIG
, NULL
, inf
->CURNODE
, inf
->ROOT
, inf
->TYPE
);
7035 if (ttv_testparamask(inf
) != 0)
7038 ttv_savparapath(cmdevent
,inf
) ;
7042 if (V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
>=1)
7043 ttv_CleanPropagation_PRECISION_LEVEL1(line_list
);
7045 else if (V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
==1 && insert
==0 && ttv_testparamask(inf
)!=0) TTV_NB_FOUND
++;
7047 if(condtrue
==0 && (((inf
->CURNODE
!= inf
->NODE
) && (inf
->NODE
!= NULL
)) ||
7048 ((inf
->NODE
== NULL
) && ((search
& TTV_SIG_CROSS
) == TTV_SIG_CROSS
))))
7050 ttv_findp(cmdevent
,inf
) ;
7057 if (TTV_QUIET_MODE
==0 && (inf
->TYPE
& TTV_FIND_CRITIC
)!=TTV_FIND_CRITIC
&& TTV_NB_FOUND
==0 && (event
->ROOT
->TYPE
& (TTV_SIG_B
|TTV_SIG_C
|TTV_SIG_Q
))==0)
7060 ttv_error(56,ttv_getsigname(inf
->FIG
,buf0
,event
->ROOT
),TTV_WARNING
);
7063 freeptype(cmdlist
) ;
7066 /*****************************************************************************/
7067 /* function ttv_findp() */
7069 /* root : noeud courant de la recherche */
7070 /* inf : information sur la recherche */
7072 /* fonction recursive de construction de chemin parallele */
7073 /* renvoie le liste des details ou la liste des chemins suivant le type */
7074 /*****************************************************************************/
7075 void ttv_findp(root
,inf
)
7076 ttvevent_list
*root
;
7079 static ttvfig_list
*ttvfigx
;
7080 static ptype_list
*ptype
;
7083 static chain_list
*line_list
;
7085 ttvevent_list
*nodex
;
7089 if (TTV_MARK_MODE
==TTV_MARK_MODE_USE
&& inf
->CLOCK
!=0 && getptype(root
->ROOT
->USER
, TTV_SIG_MARKED
)==NULL
) return;
7090 if ((inf
->CLOCK
!=0 || (TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_MUST_BE_CLOCK
)!=0) && ttv_testsigflag(root
->ROOT
, TTV_SIG_FLAGS_ISDATA
)) return;
7092 if((inf
->TYPE
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
7094 if(((root
->ROOT
->TYPE
& TTV_SIG_BYPASSIN
) == TTV_SIG_BYPASSIN
) ||
7095 ((root
->TYPE
& TTV_NODE_BYPASSIN
) == TTV_NODE_BYPASSIN
))
7097 ptype
= getptype(root
->USER
,TTV_NODE_DUALLINE
) ;
7098 if(ptype
== NULL
) in
= NULL
;
7101 chain
= (chain_list
*)ptype
->DATA
;
7102 if(chain
== NULL
) in
= NULL
;
7103 else in
= (ttvline_list
*)chain
->DATA
;
7108 if(((root
->ROOT
->TYPE
& TTV_SIG_BYPASSOUT
) == TTV_SIG_BYPASSOUT
) ||
7109 ((root
->TYPE
& TTV_NODE_BYPASSOUT
) == TTV_NODE_BYPASSOUT
))
7116 if(((in
->TYPE
& TTV_LINE_CONT
) == TTV_LINE_CONT
) ||
7117 (((in
->TYPE
& TTV_LINE_RC
) == TTV_LINE_RC
) &&
7118 ((in
->TYPE
& (TTV_LINE_D
|TTV_LINE_T
)) != 0) &&
7119 (ttv_islineonlyend(inf
->FIG
,in
,inf
->TYPE
) == 1)))
7121 if((inf
->TYPE
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
7123 chain
= chain
->NEXT
;
7124 if(chain
== NULL
) in
= NULL
;
7125 else in
= (ttvline_list
*)chain
->DATA
;
7131 if((((inf
->TYPE
& TTV_FIND_MAX
) == TTV_FIND_MAX
) && (in
->VALMAX
== TTV_NOTIME
))
7132 ||(((inf
->TYPE
& TTV_FIND_MIN
) == TTV_FIND_MIN
) && (in
->VALMIN
== TTV_NOTIME
)))
7135 if((inf
->TYPE
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
7137 chain
= chain
->NEXT
;
7138 if(chain
== NULL
) in
= NULL
;
7139 else in
= (ttvline_list
*)chain
->DATA
;
7145 if((inf
->TYPE
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
7148 if(((nodex
->ROOT
->TYPE
& TTV_SIG_BYPASSOUT
) == TTV_SIG_BYPASSOUT
) ||
7149 ((nodex
->TYPE
& TTV_NODE_BYPASSOUT
) == TTV_NODE_BYPASSOUT
))
7151 chain
= chain
->NEXT
;
7152 if(chain
== NULL
) in
= NULL
;
7153 else in
= (ttvline_list
*)chain
->DATA
;
7156 if(((in
->TYPE
& TTV_LINE_RC
) == TTV_LINE_RC
) &&
7157 (root
->FIND
->OUTLINE
!= NULL
))
7159 if((root
->FIND
->OUTLINE
->TYPE
& TTV_LINE_RC
) == TTV_LINE_RC
)
7161 chain
= chain
->NEXT
;
7162 if(chain
== NULL
) in
= NULL
;
7163 else in
= (ttvline_list
*)chain
->DATA
;
7167 if(((nodex
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
) ||
7168 ((nodex
->ROOT
->TYPE
& TTV_SIG_CZ
) == TTV_SIG_CZ
) ||
7169 ((nodex
->ROOT
->TYPE
& TTV_SIG_CT
) == TTV_SIG_CT
))
7171 if(inf
->CLOCK
|| ((((in
->TYPE
& TTV_LINE_HZ
) == TTV_LINE_HZ
) &&
7172 ((inf
->TYPE
& TTV_FIND_HZ
) != TTV_FIND_HZ
)) ||
7173 (((in
->TYPE
& TTV_LINE_HZ
) != TTV_LINE_HZ
) &&
7174 ((inf
->TYPE
& TTV_FIND_HZ
) == TTV_FIND_HZ
))))
7176 chain
= chain
->NEXT
;
7177 if(chain
== NULL
) in
= NULL
;
7178 else in
= (ttvline_list
*)chain
->DATA
;
7182 if(((nodex
->ROOT
->TYPE
& TTV_SIG_LR
) == TTV_SIG_LR
) ||
7183 ((nodex
->ROOT
->TYPE
& TTV_SIG_LS
) == TTV_SIG_LS
))
7185 if((((in
->TYPE
& TTV_LINE_R
) == TTV_LINE_R
) &&
7186 ((inf
->TYPE
& TTV_FIND_S
) == TTV_FIND_S
)) ||
7187 (((in
->TYPE
& TTV_LINE_S
) == TTV_LINE_S
) &&
7188 ((inf
->TYPE
& TTV_FIND_R
) == TTV_FIND_R
)))
7190 chain
= chain
->NEXT
;
7191 if(chain
== NULL
) in
= NULL
;
7192 else in
= (ttvline_list
*)chain
->DATA
;
7200 if(((nodex
->ROOT
->TYPE
& TTV_SIG_BYPASSIN
) == TTV_SIG_BYPASSIN
) ||
7201 ((nodex
->TYPE
& TTV_NODE_BYPASSIN
) == TTV_NODE_BYPASSIN
))
7206 if(((in
->TYPE
& TTV_LINE_RC
) == TTV_LINE_RC
) &&
7207 (root
->FIND
->OUTLINE
!= NULL
))
7209 if((root
->FIND
->OUTLINE
->TYPE
& TTV_LINE_RC
) == TTV_LINE_RC
)
7215 if(((root
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
) ||
7216 ((root
->ROOT
->TYPE
& TTV_SIG_CZ
) == TTV_SIG_CZ
) ||
7217 ((root
->ROOT
->TYPE
& TTV_SIG_CT
) == TTV_SIG_CT
))
7219 if (inf
->CLOCK
&& (in
->TYPE
& TTV_LINE_HZ
) == TTV_LINE_HZ
)
7224 if(!inf
->CLOCK
&& ((((in
->TYPE
& TTV_LINE_HZ
) == TTV_LINE_HZ
) &&
7225 ((inf
->TYPE
& TTV_FIND_HZ
) != TTV_FIND_HZ
)) ||
7226 (((in
->TYPE
& TTV_LINE_HZ
) != TTV_LINE_HZ
) &&
7227 ((inf
->TYPE
& TTV_FIND_HZ
) == TTV_FIND_HZ
))))
7233 if(((root
->ROOT
->TYPE
& TTV_SIG_LR
) == TTV_SIG_LR
) ||
7234 ((root
->ROOT
->TYPE
& TTV_SIG_LS
) == TTV_SIG_LS
))
7236 if((((in
->TYPE
& TTV_LINE_R
) == TTV_LINE_R
) &&
7237 ((inf
->TYPE
& TTV_FIND_S
) == TTV_FIND_S
)) ||
7238 (((in
->TYPE
& TTV_LINE_S
) == TTV_LINE_S
) &&
7239 ((inf
->TYPE
& TTV_FIND_R
) == TTV_FIND_R
)))
7247 if((((in
->TYPE
& TTV_LINE_D
) == TTV_LINE_D
) &&
7248 ((inf
->FIG
!= in
->FIG
) || (inf
->FIG
->INFO
->LEVEL
> inf
->LEVEL
))) ||
7249 (((in
->TYPE
& TTV_LINE_E
) == TTV_LINE_E
) && (inf
->LEVEL
< in
->FIG
->INFO
->LEVEL
)) ||
7250 (((in
->TYPE
& TTV_LINE_F
) == TTV_LINE_F
) && ((inf
->LEVEL
< in
->FIG
->INFO
->LEVEL
) ||
7251 (inf
->INS
->INFO
->LEVEL
> in
->FIG
->INFO
->LEVEL
))))
7253 if((inf
->TYPE
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
7255 chain
= chain
->NEXT
;
7256 if(chain
== NULL
) in
= NULL
;
7257 else in
= (ttvline_list
*)chain
->DATA
;
7259 else in
= in
->NEXT
;
7264 if((((nodex->TYPE & TTV_NODE_STOP) == TTV_NODE_STOP) &&
7265 (((((((nodex->ROOT->TYPE & (TTV_SIG_CB|TTV_SIG_L|TTV_SIG_R))
7267 ((nodex->ROOT->TYPE & (TTV_SIG_CT|TTV_SIG_L|TTV_SIG_R))
7269 (ttv_islocononlyend(inf->FIG,nodex,inf->TYPE) != 0))) &&
7270 ((nodex->ROOT->TYPE & (TTV_SIG_N|TTV_SIG_L|TTV_SIG_R)) != TTV_SIG_N)) &&
7271 ((nodex->ROOT->TYPE & TTV_SIG_Q) != TTV_SIG_Q) &&
7272 ((nodex->ROOT->TYPE & TTV_SIG_B) != TTV_SIG_B))) &&
7273 ((nodex != inf->NODE) && (inf->NODE != NULL) &&
7274 (TTV_CHAIN_CLOCK == NULL) &&
7275 (ttv_iscrosslatch(inf->FIG,nodex,inf->TYPE) == 0)))
7277 if((inf->TYPE & TTV_FIND_DUAL) == TTV_FIND_DUAL)
7279 chain = chain->NEXT ;
7280 if(chain == NULL) in = NULL ;
7281 else in = (ttvline_list *)chain->DATA ;
7283 else in = in->NEXT ;
7288 if(root
->ROOT
->ROOT
!= nodex
->ROOT
->ROOT
)
7290 ttvfigx
= nodex
->ROOT
->ROOT
;
7291 while((ttvfigx
!= inf
->FIG
) && ((ttvfigx
->STATUS
&
7292 TTV_STS_NOT_FREE
) != TTV_STS_NOT_FREE
))
7294 ttvfigx
->STATUS
|= TTV_STS_NOT_FREE
;
7295 inf
->CHAINFIG
= addchain(inf
->CHAINFIG
,ttvfigx
) ;
7296 if((inf
->TYPE
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
7297 ttv_parsttvfig(ttvfigx
,TTV_STS_DENOTINPT
|TTV_STS_LS_E
|TTV_STS_DUAL_E
,
7300 ttv_parsttvfig(ttvfigx
,TTV_STS_DENOTINPT
|TTV_STS_LS_E
,TTV_FILE_DTX
) ;
7301 ttvfigx
= ttvfigx
->ROOT
;
7305 if((inf
->TYPE
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
7306 delay
= ttv_getdelaymax(in
) ;
7308 delay
= ttv_getdelaymin(in
) ;
7310 if (/*inf->CLOCK!=0 && */ttv_isbypassednode(nodex
)) abort
=1; else abort
=0;
7312 if(abort
|| ttv_transfertnodefindinfo(inf
->FIG
,nodex
,root
,in
,delay
,inf
->TYPE
) == 0)
7314 if((inf
->TYPE
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
7316 chain
= chain
->NEXT
;
7317 if(chain
== NULL
) in
= NULL
;
7318 else in
= (ttvline_list
*)chain
->DATA
;
7320 else in
= in
->NEXT
;
7324 search
= ttv_signalsearchtype(inf
->FIG
,nodex
,inf
->TYPE
) ;
7326 inf
->CURNODE
= nodex
;
7328 if((TTV_CHAIN_CLOCK
!= NULL
) &&
7329 ((nodex
->ROOT
->TYPE
& (TTV_SIG_B
|TTV_SIG_L
|TTV_SIG_R
)) != 0) && (inf
->CLOCK
== 0))
7332 // on check si le chemin de data est un falsepath
7333 if (ttv_canbeinfalsepath(nodex
, 'i') && ttv_canbeinfalsepath(inf
->ROOT
, 'o') && ttv_isfalsepath(inf
->FIG
,nodex
, inf
->ROOT
,inf
->TYPE
,0,NULL
))
7338 ttv_bypassnode(nodex
);
7339 if((nodex
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
)
7343 ttvfind_stb_stuff
*savetss
;
7345 savetss
=inf
->CURNODE
->FIND
->STB
;
7346 oldphase
=inf
->CURNODE
->FIND
->ORGPHASE
;
7347 oldflags
=inf
->CURNODE
->FIND
->FLAGS
;
7348 inf
->CURNODE
->FIND
->FLAGS
&=~TTV_FINDSTRUCT_CROSS_ENABLED
;
7349 inf
->CURNODE
->FIND
->STB
=NULL
;
7350 inf
->CURNODE
->FIND
->ORGPHASE
=TTV_NO_PHASE
;
7351 nodex
->USER
= addptype(nodex
->USER
,TTV_NODE_LATCH
,nodex
) ;
7352 ttv_findp(inf
->CURNODE
,inf
) ;
7353 nodex
->USER
= delptype(nodex
->USER
,TTV_NODE_LATCH
) ;
7354 inf
->CURNODE
= nodex
;
7355 inf
->CURNODE
->FIND
->ORGPHASE
=oldphase
;
7356 inf
->CURNODE
->FIND
->STB
=savetss
;
7357 inf
->CURNODE
->FIND
->FLAGS
=oldflags
;
7362 ttv_findpclock(nodex
,inf
) ;
7363 inf
->CURNODE
= nodex
;
7365 ttv_donotbypassnode(nodex
);
7368 else if(((nodex
== inf
->NODE
) ||
7369 ((inf
->NODE
== NULL
) &&
7370 ((search
& TTV_SIG_ENDSEARCH
) == TTV_SIG_ENDSEARCH
))))
7372 if ((TTV_CHAIN_CLOCK
== NULL
&& (TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_REAL_ACCESS
)==0)
7374 || (inf
->CLOCK
==0 && (TTV_MORE_SEARCH_OPTIONS
& TTV_MORE_OPTIONS_REAL_ACCESS
)==0))
7376 // PS: j'utilise 'abort' dans la fonction recursive mais ca
7377 // aurait plutot du etre une nouvelle variable 'insert'
7378 if(!(V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
==1 && (abort
=ttv_check_insertability(nodex
, inf
))==0))
7381 if (V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
>=1)
7382 line_list
=ttv_DoPropagation_PRECISION_LEVEL1(inf
->FIG
, NULL
, inf
->CURNODE
, inf
->ROOT
, inf
->TYPE
);
7384 if (ttv_testparamask(inf
) != 0)
7387 ttv_savparapath(nodex
,inf
) ;
7388 inf
->ROOT
->FIND
->DELAY
= (long)0 ;
7391 if (V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
>=1)
7392 ttv_CleanPropagation_PRECISION_LEVEL1(line_list
);
7394 else if (V_INT_TAB
[__TTV_PRECISION_LEVEL
].VALUE
==1 && abort
==0 && ttv_testparamask(inf
)!=0) TTV_NB_FOUND
++;
7397 if((((inf
->CURNODE
!= inf
->NODE
) && (inf
->NODE
!= NULL
)) ||
7398 (inf
->NODE
== NULL
)) && ((search
& TTV_SIG_CROSS
) == TTV_SIG_CROSS
))
7400 /* if (inf->CLOCK==0)*/ ttv_bypassnode(nodex
);
7401 ttv_findp(inf
->CURNODE
,inf
) ;
7402 /* if (inf->CLOCK==0)*/ ttv_donotbypassnode(nodex
);
7406 inf
->ROOT
->FIND
->DELAY
= (long)0 ;
7408 if((inf
->TYPE
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
7410 chain
= chain
->NEXT
;
7411 if(chain
== NULL
) in
= NULL
;
7412 else in
= (ttvline_list
*)chain
->DATA
;
7414 else in
= in
->NEXT
;
7418 /*****************************************************************************/
7419 /* function ttv_getcriticpara() */
7421 /* ttvfig : ttvfig courante */
7422 /* figpath : figure de recherche d'un chemin */
7423 /* root : noeud de depart de la recherche */
7424 /* root : noeud d'arrivee de la recherche */
7425 /* delay : borne superieur de recherche */
7426 /* type : type de recherche */
7427 /* mask : mask de rechercher */
7429 /* recherche les detail d'un chemin parallele entre deux noeuds */
7430 /* qui ont un delai particuliers */
7431 /*****************************************************************************/
7432 chain_list
*ttv_getcriticpara(ttvfig_list
*ttvfig
,ttvfig_list
*figpath
,ttvevent_list
*root
,ttvevent_list
*node
,long delay
, long type
, chain_list
*mask
, long moreopt
)
7434 ttvfig_list
*ttvfigx
;
7435 ttvevent_list
*nodex
;
7439 long levelnode
, comptag
;
7441 if((type
& TTV_FIND_ACCESS
) == TTV_FIND_ACCESS
)
7443 type
&= ~(TTV_FIND_DUAL
) ;
7445 TTV_CHAIN_CLOCK
= ttv_getclocksiglist(ttvfig
) ;
7447 TTV_CHAIN_CLOCK
= addchain(TTV_CHAIN_CLOCK
,node
->ROOT
) ;
7450 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
7459 level
= figpath
->INFO
->LEVEL
;
7463 levelroot
= ttv_getsiglevel(root
->ROOT
) ;
7464 levelnode
= ttv_getsiglevel(node
->ROOT
) ;
7465 if(levelroot
> ttvfig
->INFO
->LEVEL
) levelroot
= ttvfig
->INFO
->LEVEL
;
7466 if(levelnode
> ttvfig
->INFO
->LEVEL
) levelnode
= ttvfig
->INFO
->LEVEL
;
7467 if(levelroot
> levelnode
) level
= levelnode
;
7468 else level
= levelroot
;
7470 for(ttvfigx
= root
->ROOT
->ROOT
; ttvfigx
!= NULL
; ttvfigx
= ttvfigx
->ROOT
)
7472 ttvfigx
->STATUS
|= TTV_STS_MARQUE
;
7473 if((ttvfigx
->INFO
->LEVEL
>= level
) || (ttvfigx
== ttvfig
)) break ;
7476 for(ttvfigx
= node
->ROOT
->ROOT
; ttvfigx
!= NULL
; ttvfigx
= ttvfigx
->ROOT
)
7477 if((ttvfigx
->STATUS
& TTV_STS_MARQUE
) == TTV_STS_MARQUE
)
7482 for(ttvfigx
= root
->ROOT
->ROOT
; ttvfigx
!= NULL
; ttvfigx
= ttvfigx
->ROOT
)
7484 ttvfigx
->STATUS
&= ~(TTV_STS_MARQUE
) ;
7485 if((ttvfigx
->INFO
->LEVEL
>= level
) || (ttvfigx
== ttvfig
)) break ;
7489 if (node
!=NULL
) chain
=addchain(NULL
, node
);
7491 comptag
=computesavealltag(chain
, 0);
7494 if (moreopt
& TTV_MORE_OPTIONS_CRITIC_PARA_SEARCH
)
7495 TTV_MORE_SEARCH_OPTIONS
|=TTV_MORE_OPTIONS_CRITIC_PARA_SEARCH
;
7496 TTV_SEARCH_FIRST_NODE
=root
;
7497 chain
= (chain_list
*)ttv_findpara(ttvfig
,figpath
,root
,node
,delay
,delay
,
7498 type
|TTV_FIND_CRITIC
,level
,mask
,0,comptag
) ;
7500 TTV_MORE_SEARCH_OPTIONS
&=~TTV_MORE_OPTIONS_CRITIC_PARA_SEARCH
;
7502 if((type
& TTV_FIND_ACCESS
) == TTV_FIND_ACCESS
)
7504 freechain(TTV_CHAIN_CLOCK
) ;
7505 TTV_CHAIN_CLOCK
= NULL
;
7511 /*****************************************************************************/
7512 /* function ttv_freecriticpara() */
7514 /* pthead : liste des details de chemin parallele */
7516 /* libere les details d'un chemin parallele */
7517 /*****************************************************************************/
7518 int ttv_freecriticpara(pthead
)
7519 chain_list
*pthead
;
7523 if(pthead
== NULL
) return(0) ;
7525 for(chain
= pthead
; chain
!= NULL
; chain
= chain
->NEXT
)
7527 ttv_freecriticlist((ttvcritic_list
*)chain
->DATA
) ;
7535 /*****************************************************************************/
7536 /* function ttv_getpara() */
7538 /* ttvfig : ttvfig courante */
7539 /* figpath : figure de recherche d'un chemin */
7540 /* root : noeud de depart de la recherche */
7541 /* root : noeud d'arrivee de la recherche */
7542 /* delaymax : borne superieur de recherche */
7543 /* delaymin : borne inferieur de recherche */
7544 /* type : type de recherche */
7545 /* mask : mask de rechercher */
7547 /* recherche de chemin parrallele entre deux noeuds particuliers */
7548 /*****************************************************************************/
7549 ttvpath_list
*ttv_getpara(ttvfig
,figpath
,root
,node
,max
,min
,type
,mask
,nb
)
7550 ttvfig_list
*ttvfig
;
7551 ttvfig_list
*figpath
;
7552 ttvevent_list
*root
;
7553 ttvevent_list
*node
;
7560 ttvfig_list
*ttvfigx
;
7561 ttvevent_list
*nodex
;
7562 ttvpath_list
*path
;
7563 // chain_list *chain ;
7564 // chain_list *chainx ;
7569 if((type
& TTV_FIND_ACCESS
) == TTV_FIND_ACCESS
)
7571 type
&= ~(TTV_FIND_DUAL
) ;
7572 TTV_CHAIN_CLOCK
= addchain(TTV_CHAIN_CLOCK
,node
->ROOT
) ;
7575 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
7584 level
= figpath
->INFO
->LEVEL
;
7588 levelroot
= ttv_getsiglevel(root
->ROOT
) ;
7589 levelnode
= ttv_getsiglevel(node
->ROOT
) ;
7590 if(levelroot
> ttvfig
->INFO
->LEVEL
) levelroot
= ttvfig
->INFO
->LEVEL
;
7591 if(levelnode
> ttvfig
->INFO
->LEVEL
) levelnode
= ttvfig
->INFO
->LEVEL
;
7592 if(levelroot
> levelnode
) level
= levelnode
;
7593 else level
= levelroot
;
7595 for(ttvfigx
= root
->ROOT
->ROOT
; ttvfigx
!= NULL
; ttvfigx
= ttvfigx
->ROOT
)
7597 ttvfigx
->STATUS
|= TTV_STS_MARQUE
;
7598 if((ttvfigx
->INFO
->LEVEL
>= level
) || (ttvfigx
== ttvfig
)) break ;
7601 for(ttvfigx
= node
->ROOT
->ROOT
; ttvfigx
!= NULL
; ttvfigx
= ttvfigx
->ROOT
)
7602 if((ttvfigx
->STATUS
& TTV_STS_MARQUE
) == TTV_STS_MARQUE
)
7607 for(ttvfigx
= root
->ROOT
->ROOT
; ttvfigx
!= NULL
; ttvfigx
= ttvfigx
->ROOT
)
7609 ttvfigx
->STATUS
&= ~(TTV_STS_MARQUE
) ;
7610 if((ttvfigx
->INFO
->LEVEL
>= level
) || (ttvfigx
== ttvfig
)) break ;
7616 if((type
& TTV_FIND_ACCESS
) == TTV_FIND_ACCESS
)
7618 freechain(TTV_CHAIN_CLOCK
) ;
7619 TTV_CHAIN_CLOCK
= NULL
;
7624 path
= (ttvpath_list
*)ttv_findpara(ttvfig
,figpath
,root
,node
,
7625 max
,min
,type
,level
,mask
,nb
,SAVE_ALL_TAG
) ;
7628 if((type
& TTV_FIND_ACCESS
) == TTV_FIND_ACCESS
)
7630 freechain(TTV_CHAIN_CLOCK
) ;
7631 TTV_CHAIN_CLOCK
= NULL
;
7634 if((type
& TTV_FIND_NOTCLASS
) == TTV_FIND_NOTCLASS
)
7637 return(ttv_classpath(path
,type
)) ;
7640 /*****************************************************************************/
7641 /* function ttv_getdelay() */
7643 /* ttvfig : ttvfig courante */
7644 /* maskin : list de masques pour les entrees */
7645 /* maskout : list de masques pour les sorties */
7646 /* delaymax : temps maximum des delais */
7647 /* delaymin : temps maximum des delais */
7648 /* type : type de recherche */
7650 /* recherche les delais d'une figure */
7651 /*****************************************************************************/
7652 chain_list
*ttv_getdelay(ttvfig
,figpath
,maskin
,maskout
,delaymax
,delaymin
,type
)
7653 ttvfig_list
*ttvfig
;
7654 ttvfig_list
*figpath
;
7655 chain_list
*maskin
;
7656 chain_list
*maskout
;
7661 ttvlbloc_list
*ptlbloc
[3] ;
7662 ttvline_list
*ptline
;
7663 ttvpath_list
*path
= NULL
;
7664 ttvpath_list
*pathx
;
7665 ttvcritic_list
*critic
;
7666 ttvevent_list
*cmd
;
7667 chain_list
*delaylist
= NULL
;
7679 if(figpath
== ttvfig
)
7680 ttv_parsttvfig(figpath
,TTV_STS_CLS_FED
,TTV_FILE_DTX
) ;
7682 ttv_parsttvfig(figpath
,TTV_STS_LS_FE
,TTV_FILE_DTX
) ;
7684 ptlbloc
[0] = figpath
->FBLOC
;
7685 ptlbloc
[1] = figpath
->EBLOC
;
7687 if(figpath
== ttvfig
)
7688 ptlbloc
[2] = figpath
->DBLOC
;
7692 for(i
= 0 ; i
< 3 ; i
++)
7693 for( ; ptlbloc
[i
] != NULL
; ptlbloc
[i
] = ptlbloc
[i
]->NEXT
)
7695 for(j
= 0 ; j
< TTV_MAX_LBLOC
; j
++)
7697 ptline
= ptlbloc
[i
]->LINE
+ j
;
7698 if((ptline
->TYPE
& TTV_LINE_FR
) == TTV_LINE_FR
)
7701 if((ptline
->TYPE
& TTV_LINE_CONT
) == TTV_LINE_CONT
)
7704 if((((ptline
->TYPE
& TTV_LINE_RC
) == TTV_LINE_RC
) &&
7705 ((type
& TTV_FIND_RC
) != TTV_FIND_RC
)) ||
7706 (((ptline
->TYPE
& TTV_LINE_RC
) != TTV_LINE_RC
) &&
7707 ((type
& TTV_FIND_GATE
) != TTV_FIND_GATE
)))
7710 if((((ptline
->NODE
->TYPE
& TTV_NODE_UP
) == TTV_NODE_UP
) &&
7711 ((ptline
->ROOT
->TYPE
& TTV_NODE_UP
) == TTV_NODE_UP
) &&
7712 ((type
& TTV_FIND_NOT_UPUP
) == TTV_FIND_NOT_UPUP
)) ||
7713 (((ptline
->NODE
->TYPE
& TTV_NODE_UP
) == TTV_NODE_UP
) &&
7714 ((ptline
->ROOT
->TYPE
& TTV_NODE_DOWN
) == TTV_NODE_DOWN
) &&
7715 ((type
& TTV_FIND_NOT_UPDW
) == TTV_FIND_NOT_UPDW
)) ||
7716 (((ptline
->NODE
->TYPE
& TTV_NODE_DOWN
) == TTV_NODE_DOWN
) &&
7717 ((ptline
->ROOT
->TYPE
& TTV_NODE_UP
) == TTV_NODE_UP
) &&
7718 ((type
& TTV_FIND_NOT_DWUP
) == TTV_FIND_NOT_DWUP
)) ||
7719 (((ptline
->NODE
->TYPE
& TTV_NODE_DOWN
) == TTV_NODE_DOWN
) &&
7720 ((ptline
->ROOT
->TYPE
& TTV_NODE_DOWN
) == TTV_NODE_DOWN
) &&
7721 ((type
& TTV_FIND_NOT_DWDW
) == TTV_FIND_NOT_DWDW
)))
7724 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
7726 if((delay
= ptline
->VALMAX
) == TTV_NOTIME
)
7728 newdelay
= ttv_getdelaymax(ptline
) ;
7729 slope
= ptline
->FMAX
;
7730 newslope
= ttv_getslopemax(ptline
) ;
7731 cmd
= ttv_getlinecmd(ttvfig
,ptline
,TTV_LINE_CMDMAX
) ;
7735 if((delay
= ptline
->VALMIN
) == TTV_NOTIME
)
7737 newdelay
= ttv_getdelaymin(ptline
) ;
7738 slope
= ptline
->FMIN
;
7739 newslope
= ttv_getslopemin(ptline
) ;
7740 cmd
= ttv_getlinecmd(ttvfig
,ptline
,TTV_LINE_CMDMIN
) ;
7743 if((newdelay
>= delaymin
) && (newdelay
<= delaymax
) &&
7744 ((ttv_testmask(ttvfig
,ptline
->NODE
->ROOT
,maskin
) == 1) ||
7745 (maskin
== NULL
)) &&
7746 ((ttv_testmask(ttvfig
,ptline
->ROOT
->ROOT
,maskout
) == 1) ||
7749 if((ptline
->TYPE
& TTV_LINE_R
) == TTV_LINE_R
)
7750 typer
= TTV_FIND_R
;
7751 else if((ptline
->TYPE
& TTV_LINE_S
) == TTV_LINE_S
)
7752 typer
= TTV_FIND_S
;
7753 else if((ptline
->TYPE
& TTV_LINE_PR
) == TTV_LINE_PR
)
7754 typer
= TTV_FIND_PR
;
7755 else if((ptline
->TYPE
& TTV_LINE_EV
) == TTV_LINE_EV
)
7756 typer
= TTV_FIND_EV
;
7757 else typer
= (long)0 ;
7758 if((ptline
->TYPE
& TTV_LINE_RC
) == TTV_LINE_RC
)
7759 typer
|= TTV_FIND_RC
;
7760 if((ptline
->TYPE
& TTV_LINE_HZ
) == TTV_LINE_HZ
)
7761 typer
|= TTV_FIND_HZ
;
7762 if((ptline
->TYPE
& TTV_LINE_R
) == TTV_LINE_R
)
7763 typer
|= TTV_FIND_R
;
7764 if((ptline
->TYPE
& TTV_LINE_S
) == TTV_LINE_S
)
7765 typer
|= TTV_FIND_S
;
7766 path
= ttv_allocpath(path
,figpath
,ptline
->ROOT
,ptline
->NODE
,cmd
,
7767 NULL
,NULL
,NULL
,(long)0,(long)0,(long)0,type
|typer
,
7769 newdelay
,newslope
,(long)0,(long)0,NULL
,NULL
,0,STB_NO_INDEX
,0) ;
7770 ttv_getmodelline(ptline
,(char **)(&path
->MD
),(char **)(&path
->MF
)) ;
7775 if((type
& TTV_FIND_NOTCLASS
) != TTV_FIND_NOTCLASS
)
7776 path
= ttv_classpath(path
,type
) ;
7778 for(pathx
= path
; pathx
!= NULL
; pathx
= pathx
->NEXT
)
7781 critic
= ttv_alloccritic(critic
,ttvfig
,pathx
->FIG
,pathx
->ROOT
,pathx
->TYPE
,
7782 (long)0,pathx
->REFDELAY
,pathx
->REFSLOPE
,pathx
->DELAY
,pathx
->SLOPE
,0,NULL
,NULL
) ;
7783 critic
->MODNAME
= (char *)pathx
->MD
;
7784 critic
->INSNAME
= (char *)pathx
->MF
;
7785 critic
= ttv_alloccritic(critic
,ttvfig
,pathx
->FIG
,pathx
->NODE
,pathx
->TYPE
,
7786 (long)0,(long)0,(long)0,(long)0,(long)0,0,NULL
,NULL
) ;
7787 critic
->MODNAME
= (char *)pathx
->MD
;
7788 critic
->INSNAME
= (char *)pathx
->MF
;
7789 delaylist
= addchain(delaylist
,(void *)critic
) ;
7794 ttv_freepathlist(path
) ;
7796 return(reverse(delaylist
)) ;
7799 /*****************************************************************************/
7800 /* function ttv_getconstraint() */
7802 /* ttvfig : ttvfig courante */
7803 /* figpath : figure hierarchique ou null */
7804 /* ptsig : signal ou l'on veut la contraintes L ou B */
7805 /* type : max min access or setup ou hold */
7806 /* file : fichier dtx ou ttx elais */
7808 /* recherche les delais d'une figure */
7809 /*****************************************************************************/
7810 chain_list
*ttv_getconstraint(ttvfig_list
*ttvfig
,ttvfig_list
*figpath
,ttvsig_list
*ptsig
,long type
,long file
,int avoiddir
)
7812 ttvline_list
*ptline
;
7815 ttvpath_list
*path
= NULL
;
7816 ttvpath_list
*pathx
;
7817 ttvcritic_list
*critic
;
7818 chain_list
*delaylist
= NULL
;
7830 level
= figpath
->INFO
->LEVEL
;
7832 if((type
& (TTV_FIND_SETUP
|TTV_FIND_HOLD
)) != 0)
7834 if((file
& TTV_FILE_DTX
) == TTV_FILE_DTX
)
7835 dual
= TTV_STS_DUAL_F
|TTV_STS_DUAL_E
|TTV_STS_DUAL_D
;
7837 dual
= TTV_STS_DUAL_P
|TTV_STS_DUAL_J
|TTV_STS_DUAL_T
;
7842 if((file
& TTV_FILE_DTX
) == TTV_FILE_DTX
)
7843 ttv_expfigsig(ttvfig
,ptsig
,level
,ttvfig
->INFO
->LEVEL
,
7844 TTV_STS_CLS_FED
|dual
, TTV_FILE_DTX
);
7846 ttv_expfigsig(ttvfig
,ptsig
,level
,ttvfig
->INFO
->LEVEL
,
7847 TTV_STS_CL_PJT
|dual
, TTV_FILE_TTX
);
7850 if((type
& TTV_FIND_ACCESS
) == TTV_FIND_ACCESS
)
7851 for(i
= 0 ; i
< 2 ; i
++)
7853 if (i
==avoiddir
) continue;
7854 if((file
& TTV_FILE_DTX
) == TTV_FILE_DTX
)
7855 ptline
= (ptsig
->NODE
+ i
)->INLINE
;
7857 ptline
= (ptsig
->NODE
+ i
)->INPATH
;
7859 for(; ptline
!= NULL
; ptline
= ptline
->NEXT
)
7861 if((ptline
->TYPE
& TTV_LINE_A
) != TTV_LINE_A
)
7864 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
7866 if((delay
= ptline
->VALMAX
) == TTV_NOTIME
)
7868 newdelay
= ttv_getdelaymax(ptline
) ;
7869 slope
= ptline
->FMAX
;
7870 newslope
= ttv_getslopemax(ptline
) ;
7874 if((delay
= ptline
->VALMIN
) == TTV_NOTIME
)
7876 newdelay
= ttv_getdelaymin(ptline
) ;
7877 slope
= ptline
->FMIN
;
7878 newslope
= ttv_getslopemin(ptline
) ;
7881 path
= ttv_allocpath(path
,figpath
,ptline
->ROOT
,ptline
->NODE
,NULL
,
7882 NULL
,NULL
,NULL
,(long)0,(long)0,(long)0,
7883 type
&= ~(TTV_FIND_SETUP
|TTV_FIND_HOLD
),
7885 newdelay
,newslope
,(long)0,(long)0,NULL
,NULL
,0,STB_NO_INDEX
,0) ;
7889 if((type
& (TTV_FIND_SETUP
|TTV_FIND_HOLD
)) != 0)
7890 for(i
= 0 ; i
< 2 ; i
++)
7892 if (i
==avoiddir
) continue;
7893 if((file
& TTV_FILE_DTX
) == TTV_FILE_DTX
)
7894 ptype
= getptype((ptsig
->NODE
+i
)->USER
,TTV_NODE_DUALLINE
) ;
7896 ptype
= getptype((ptsig
->NODE
+i
)->USER
,TTV_NODE_DUALPATH
) ;
7898 if(ptype
== NULL
) chain
= NULL
;
7901 chain
= (chain_list
*)ptype
->DATA
;
7904 for(; chain
!= NULL
; chain
= chain
->NEXT
)
7906 ptline
= (ttvline_list
*)chain
->DATA
;
7908 if((ptline
->TYPE
& (TTV_LINE_U
|TTV_LINE_O
)) == 0)
7911 if((((ptline
->TYPE
& TTV_LINE_U
) == TTV_LINE_U
) &&
7912 ((type
& TTV_FIND_SETUP
) != TTV_FIND_SETUP
)) ||
7913 (((ptline
->TYPE
& TTV_LINE_O
) == TTV_LINE_O
) &&
7914 ((type
& TTV_FIND_HOLD
) != TTV_FIND_HOLD
)))
7917 if((delay
= ptline
->VALMAX
) == TTV_NOTIME
)
7920 newdelay
= ttv_getdelaymax(ptline
) ;
7922 slope
= ptline
->FMAX
;
7923 newslope
= ttv_getslopemax(ptline
) ;
7925 path
= ttv_allocpath(path
,figpath
,ptline
->ROOT
,ptline
->NODE
,NULL
,
7926 NULL
,NULL
,NULL
,(long)0,(long)0,(long)0,
7927 ((ptline
->TYPE
& TTV_LINE_U
) == TTV_LINE_U
) ?
7928 (type
&= ~(TTV_FIND_ACCESS
|TTV_FIND_HOLD
)):
7929 (type
&= ~(TTV_FIND_ACCESS
|TTV_FIND_SETUP
)),
7931 newdelay
,newslope
,(long)0,(long)0,NULL
,NULL
,0,STB_NO_INDEX
,0) ;
7935 if((type
& TTV_FIND_NOTCLASS
) != TTV_FIND_NOTCLASS
)
7936 path
= ttv_classpath(path
,type
) ;
7938 for(pathx
= path
; pathx
!= NULL
; pathx
= pathx
->NEXT
)
7941 critic
= ttv_alloccritic(critic
,ttvfig
,pathx
->FIG
,pathx
->ROOT
,pathx
->TYPE
,
7942 (long)0,pathx
->REFDELAY
,pathx
->REFSLOPE
,pathx
->DELAY
,pathx
->SLOPE
,0,NULL
,NULL
) ;
7943 critic
= ttv_alloccritic(critic
,ttvfig
,pathx
->FIG
,pathx
->NODE
,pathx
->TYPE
,
7944 (long)0,(long)0,(long)0,(long)0,(long)0,0,NULL
,NULL
) ;
7945 delaylist
= addchain(delaylist
,(void *)critic
) ;
7948 ttv_freepathlist(path
) ;
7950 return(reverse(delaylist
)) ;
7953 long ttv_getconstraintquick(ttvfig_list
*ttvfig
,ttvfig_list
*figpath
,ttvevent_list
*tve
,ttvevent_list
*cmd
,long type
, ttvline_list
**rline
)
7955 ttvline_list
*ptline
;
7962 level
= figpath
->INFO
->LEVEL
;
7966 if((type
& TTV_FIND_ACCESS
) == TTV_FIND_ACCESS
)
7968 if((type
& TTV_FIND_LINE
) == TTV_FIND_LINE
)
7969 ttv_expfigsig(ttvfig
,tve
->ROOT
,level
,ttvfig
->INFO
->LEVEL
,
7970 TTV_STS_CLS_FED
, TTV_FILE_DTX
);
7972 ttv_expfigsig(ttvfig
,tve
->ROOT
,level
,ttvfig
->INFO
->LEVEL
,
7973 TTV_STS_CL_PJT
, TTV_FILE_TTX
);
7974 if((type
& TTV_FIND_LINE
) == TTV_FIND_LINE
)
7975 ptline
= tve
->INLINE
;
7977 ptline
= tve
->INPATH
;
7979 for(; ptline
!= NULL
; ptline
= ptline
->NEXT
)
7981 if((ptline
->TYPE
& TTV_LINE_A
) == TTV_LINE_A
&& ptline
->NODE
==cmd
)
7983 if ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
7984 return ttv_getdelaymax(ptline
) ;
7986 return ttv_getdelaymin(ptline
) ;
7991 if((type
& (TTV_FIND_SETUP
|TTV_FIND_HOLD
)) != 0)
7993 if((type
& TTV_FIND_LINE
) == TTV_FIND_LINE
)
7994 ttv_expfigsig(ttvfig
,cmd
->ROOT
,level
,ttvfig
->INFO
->LEVEL
,
7995 TTV_STS_CLS_FED
, TTV_FILE_DTX
);
7997 ttv_expfigsig(ttvfig
,cmd
->ROOT
,level
,ttvfig
->INFO
->LEVEL
,
7998 TTV_STS_CL_PJT
, TTV_FILE_TTX
);
8000 if((type
& TTV_FIND_LINE
) == TTV_FIND_LINE
)
8001 ptline
= cmd
->INLINE
;
8003 ptline
= cmd
->INPATH
;
8005 for(; ptline
!= NULL
; ptline
= ptline
->NEXT
)
8007 if((((ptline
->TYPE
& TTV_LINE_U
) == TTV_LINE_U
) &&
8008 ((type
& TTV_FIND_SETUP
) != TTV_FIND_SETUP
)) ||
8009 (((ptline
->TYPE
& TTV_LINE_O
) == TTV_LINE_O
) &&
8010 ((type
& TTV_FIND_HOLD
) != TTV_FIND_HOLD
)))
8013 if(ptline
->NODE
==tve
)
8016 if ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
8017 return ttv_getdelaymax(ptline
) ;
8019 return ttv_getdelaymin(ptline
) ;
8027 float ttv_getline_vt(ttvfig_list
*ttvfig
,ttvfig_list
*figpath
,ttvevent_list
*tve
,ttvevent_list
*cmd
,long type
)
8029 ttvline_list
*ptline
;
8032 char *stm_modelname
=NULL
;
8034 timing_model
*tmg_model
;
8039 level
= figpath
->INFO
->LEVEL
;
8041 if((type
& TTV_FIND_LINE
) == TTV_FIND_LINE
)
8042 ttv_expfigsig(ttvfig
,tve
->ROOT
,level
,ttvfig
->INFO
->LEVEL
,
8043 TTV_STS_CLS_FED
, TTV_FILE_DTX
);
8045 ttv_expfigsig(ttvfig
,tve
->ROOT
,level
,ttvfig
->INFO
->LEVEL
,
8046 TTV_STS_CL_PJT
, TTV_FILE_TTX
);
8048 if((type
& TTV_FIND_LINE
) == TTV_FIND_LINE
)
8049 ptline
= tve
->INLINE
;
8051 ptline
= tve
->INPATH
;
8053 for(; ptline
!= NULL
; ptline
= ptline
->NEXT
)
8055 if((ptline
->TYPE
& TTV_LINE_A
) == TTV_LINE_A
&& ptline
->NODE
==cmd
)
8057 if ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
8058 stm_modelname
=ptline
->MDMAX
;
8060 stm_modelname
=ptline
->MDMIN
;
8065 if (stm_modelname
!=NULL
&& (tmg_model
= stm_getmodel (ptline
->FIG
->INSNAME
,stm_modelname
))) {
8066 vth
= stm_mod_vt (tmg_model
);
8072 /*****************************************************************************/
8073 /* function ttv_freedelaylist() */
8075 /* pthead : liste des delais */
8077 /* libere les delais */
8078 /*****************************************************************************/
8079 int ttv_freedelaylist(pthead
)
8080 chain_list
*pthead
;
8082 return(ttv_freecriticpara(pthead
)) ;
8085 /*****************************************************************************/
8086 /* function ttv_getnodeslew() */
8087 /*****************************************************************************/
8088 long ttv_getnodeslew(node
, type
)
8089 ttvevent_list
* node
;
8092 ttvdelay_list
*delay
;
8093 long slew
= TTV_NOSLOPE
;
8096 if((delay
= ttv_getnodedelay(node
)) != NULL
){
8097 if ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
8104 if ((pt
=getptype(node
->USER
, TTV_NODE_UTD_INPUT_SLOPE
))!=NULL
)
8105 slew
= (long)pt
->DATA
;
8107 slew
= node
->ROOT
->ROOT
->INFO
->SLOPE
;
8112 /*****************************************************************************/
8113 /* function ttv_allocpathmodel() */
8115 /* ttvfig : ttvfig courante */
8116 /* inchain : liste des entrees */
8117 /* goal : noeud sortie */
8118 /* type : type de recherche */
8120 /* construit les chemins a partir du parcours en largeur du graphe */
8121 /*****************************************************************************/
8122 //#define CAPASUPMODE
8123 static float ttv_getnodecapa(lofig_list
*lofig
, ttvevent_list
*tve
, long type
)
8128 double rmin
, c1min
, c2min
, rmax
, c1max
, c2max
;
8129 locon_list
*locon
=NULL
;
8135 c1max
= ttv_get_signal_capa(tve
->ROOT
) / 1000.0 ;
8138 c1min
= ttv_get_signal_capa(tve
->ROOT
) / 1000.0 ;
8141 typemax
= RCX_CAPALOAD
;
8142 typemin
= RCX_CAPALOAD
;
8146 locon
= rcx_gethtrcxcon(NULL
,lofig
,tve
->ROOT
->NAME
) ;
8148 if((locon
== NULL
) || (locon
->PNODE
== NULL
) ||
8149 ((ptrcx
= getrcx(locon
->SIG
)) == NULL
))
8151 c1max
= ttv_get_signal_capa(tve
->ROOT
) / 1000.0 ;
8154 c1min
= ttv_get_signal_capa(tve
->ROOT
) / 1000.0 ;
8157 typemax
= RCX_CAPALOAD
;
8158 typemin
= RCX_CAPALOAD
;
8162 if( rcx_crosstalkactive( RCX_QUERY
) != RCX_NOCROSSTALK
) {
8163 slope
.F0MAX
= ttv_getslopenode( tve
->ROOT
->ROOT
,
8164 tve
->ROOT
->ROOT
->INFO
->LEVEL
,
8172 slope
.FCCMAX
= ttv_getslopenode( tve
->ROOT
->ROOT
,
8173 tve
->ROOT
->ROOT
->INFO
->LEVEL
,
8183 slope
.F0MAX
= -1.0 ;
8184 slope
.FCCMAX
= -1.0 ;
8187 slope
.SENS
= ((tve
->TYPE
& TTV_NODE_UP
) == TTV_NODE_UP
)
8188 ? TRC_SLOPE_UP
: TRC_SLOPE_DOWN
;
8191 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
) {
8192 typemax
= rcx_rcnload( lofig
,
8195 &rmax
, &c1max
, &c2max
,
8202 typemin
= rcx_rcnload( lofig
,
8205 &rmin
, &c1min
, &c2min
,
8214 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
) {
8215 capa
= ((typemax
==RCX_CAPALOAD
) ? c1max
*1000.0 : (c1max
+c2max
)*1000.0);
8217 capa
= ((typemin
==RCX_CAPALOAD
) ? c1min
*1000.0 : (c1min
+c2min
)*1000.0);
8224 static void ttv_getaxisvalues(ht
*htslope
, ht
*htcapa
, char *namein
, char *nameout
, chain_list
**slope_axis
, chain_list
**capa_axis
)
8227 stm_carac
*caracslope
= NULL
;
8228 stm_carac
*caraccapa
= NULL
;
8230 *slope_axis
=*capa_axis
=NULL
;
8231 if(namein
&& htslope
)
8233 caracslope
= (stm_carac
*)gethtitem (htslope
, namein
) ;
8234 if ((long)caracslope
== EMPTYHT
)
8235 caracslope
= (stm_carac
*)gethtitem (htslope
, namealloc ("default")) ;
8236 if ((long)caracslope
== EMPTYHT
)
8237 *slope_axis
=addchain(*slope_axis
, (void *)TTV_NOTIME
) ;
8240 for (i
= 0 ; i
< caracslope
->NVALUES
; i
++)
8241 *slope_axis
=addchain(*slope_axis
, (void *)mbk_long_round(caracslope
->VALUES
[i
]*TTV_UNIT
));
8244 *slope_axis
=NULL
; //addchain(*slope_axis, (void *)TTV_NOTIME) ;
8246 if(nameout
&& htcapa
)
8248 caraccapa
= (stm_carac
*)gethtitem (htcapa
, nameout
) ;
8249 if ((long)caraccapa
== EMPTYHT
)
8250 caraccapa
= (stm_carac
*)gethtitem (htcapa
, namealloc ("default")) ;
8251 if ((long)caraccapa
== EMPTYHT
)
8252 *capa_axis
=addchain(*capa_axis
, NULL
), *(float *)&(*capa_axis
)->DATA
=-1;
8255 for (i
= 0 ; i
< caraccapa
->NVALUES
; i
++)
8256 *capa_axis
=addchain(*capa_axis
, NULL
), *(float *)&(*capa_axis
)->DATA
=caraccapa
->VALUES
[i
];
8259 *capa_axis
=NULL
; //addchain(*capa_axis, NULL), *(float *)&(*capa_axis)->DATA=-1;
8261 *slope_axis
=reverse(*slope_axis
);
8262 *capa_axis
=reverse(*capa_axis
);
8265 chain_list
*ttv_getconnectoraxis(ttvfig_list
*ttvfig
, int slope
, char *name
)
8267 ht
*htslope_axis
= NULL
;
8268 ht
*htcapa_axis
= NULL
;
8269 chain_list
*res0
, *res1
;
8272 if ((ptype
= getptype(ttvfig
->USER
, TTV_FIG_SAXIS
)) != NULL
)
8273 htslope_axis
= (ht
*)ptype
->DATA
;
8274 if ((ptype
= getptype(ttvfig
->USER
, TTV_FIG_CAXIS
)) != NULL
)
8275 htcapa_axis
= (ht
*)ptype
->DATA
;
8277 ttv_getaxisvalues(htslope_axis
, htcapa_axis
, slope
?name
:NULL
, slope
?NULL
:name
, &res0
, &res1
);
8278 if (slope
) return res0
;
8282 void ttv_allocpathmodel_propagate (ttvfig_list
*ttvfig
, ttvfig_list
*insfig
, ttvevent_list
*node
, ttvevent_list
*root
, ttvpath_list
*path
, long type
)
8284 chain_list
*input_slope
, *output_capa
, *real_output_capa
, *res_slope
, *res_delay
, *res_energy
, *cl
, *ch
;
8286 ht
*htslope_axis
= NULL
;
8287 ht
*htcapa_axis
= NULL
;
8288 int nbs
, nbc
, i
, j
, doref
;
8289 timing_model
*delay_model
= NULL
, *md
;
8290 timing_model
*slope_model
= NULL
;
8292 ttvline_list
*line
, *tl
;
8293 long inslope
, delta
;
8294 float *ft
, sigcapa
=0, fl
, factor
;
8296 if ((ptype
= getptype(ttvfig
->USER
, TTV_FIG_SAXIS
)) != NULL
)
8297 htslope_axis
= (ht
*)ptype
->DATA
;
8298 if ((ptype
= getptype(ttvfig
->USER
, TTV_FIG_CAXIS
)) != NULL
)
8299 htcapa_axis
= (ht
*)ptype
->DATA
;
8301 ttv_getaxisvalues(htslope_axis
, htcapa_axis
, path
->NODE
->ROOT
->NETNAME
, path
->ROOT
->ROOT
->NETNAME
, &input_slope
, &output_capa
);
8303 ch
=ttv_BuildLineList(ttvfig
, root
, node
, type
, &doref
);
8304 line
=(ttvline_list
*)ch
->DATA
;
8305 if (input_slope
==NULL
)
8307 if ((line
->NODE
->ROOT
->TYPE
& TTV_SIG_C
)!=0)
8309 ttv_getnodeslope(ttvfig
, insfig
, line
->NODE
, &inslope
, type
);
8310 ft
= stm_dyna_slews (STM_DEF_AXIS_BASE
, inslope
);
8311 nbs
= STM_DEF_AXIS_BASE
* 2 + 1;
8312 for (i
=0; i
<nbs
; i
++) input_slope
=addchain(input_slope
, (void *)mbk_long_round(ft
[i
]));
8314 input_slope
=reverse(input_slope
);
8316 else input_slope
=addchain(input_slope
, (void *)TTV_NOTIME
) ;
8318 else if ((line
->NODE
->ROOT
->TYPE
& TTV_SIG_C
)==0)
8320 freechain(input_slope
);
8321 input_slope
=addchain(NULL
, (void *)TTV_NOTIME
) ;
8325 for (cl
=ch
; cl
!=NULL
; cl
=cl
->NEXT
)
8326 if (((tl
=(ttvline_list
*)cl
->DATA
)->TYPE
& TTV_LINE_RC
)==0) line
=tl
;
8328 if ((tl
->ROOT
->ROOT
->TYPE
& TTV_SIG_C
)!=0)
8330 lofig
= ttv_getrcxlofig (ttvfig
);
8331 sigcapa
=ttv_get_signal_capa(tl
->ROOT
->ROOT
); //ttv_getnodecapa(lofig,tl->ROOT,type);
8333 if (output_capa
==NULL
)
8335 if ((tl
->ROOT
->ROOT
->TYPE
& TTV_SIG_C
)!=0)
8337 if (line
!=NULL
) md
=stm_getmodel (ttvfig
->INFO
->FIGNAME
, line
->MDMAX
); else md
=NULL
;
8338 ft
= stm_dyna_loads (STM_DEF_AXIS_BASE
, stm_mod_vf(md
)/stm_mod_imax(md
), sigcapa
);
8339 nbc
= STM_DEF_AXIS_BASE
* 2 + 1;
8340 for (i
=0; i
<nbc
; i
++) output_capa
=addchain(output_capa
, NULL
), *(float *)&output_capa
->DATA
=ft
[i
];
8342 output_capa
=reverse(output_capa
);
8344 else output_capa
=addchain(output_capa
, NULL
), *(float *)&output_capa
->DATA
=-1;
8346 else if ((tl
->ROOT
->ROOT
->TYPE
& TTV_SIG_C
)==0)
8348 freechain(output_capa
);
8349 output_capa
=addchain(NULL
, NULL
), *(float *)&output_capa
->DATA
=-1;
8353 real_output_capa
=dupchainlst(output_capa
);
8354 if (V_BOOL_TAB
[__TMA_DRIVECAPAOUT
].VALUE
)
8356 for (cl
=real_output_capa
; cl
!=NULL
; cl
=cl
->NEXT
)
8358 fl
=*(float *)&cl
->DATA
;
8364 avt_errmsg( TTV_ERRMSG
, "059", AVT_WARNING
, *(float *)&cl
->DATA
, tl
->ROOT
->ROOT
->NAME
, sigcapa
);
8367 *(float *)&cl
->DATA
=fl
;
8371 // ttv_experim_setstopaftergate1(1);
8372 ttv_DoCharacPropagation(ttvfig
, insfig
, node
, root
, type
, input_slope
, real_output_capa
, &res_delay
, &res_slope
, &res_energy
, ch
);
8373 // ttv_experim_setstopaftergate1(0);
8375 freechain(real_output_capa
);
8377 nbs
=countchain(input_slope
);
8378 nbc
=countchain(output_capa
);
8382 delay_model
= stm_mod_create_table (NULL
, nbc
, 0, STM_LOAD
, STM_NOTYPE
);
8383 slope_model
= stm_mod_create_table (NULL
, nbc
, 0, STM_LOAD
, STM_NOTYPE
);
8384 for (cl
=output_capa
, i
=0; i
<nbc
; i
++, cl
=cl
->NEXT
)
8386 stm_modtbl_setXrangeval(delay_model
->UMODEL
.TABLE
, i
, *(float *)&cl
->DATA
);
8387 stm_modtbl_setXrangeval(slope_model
->UMODEL
.TABLE
, i
, *(float *)&cl
->DATA
);
8389 for (cl
=res_delay
, i
=0; cl
!=NULL
; cl
=cl
->NEXT
, i
++) stm_modtbl_set1Dval (delay_model
->UMODEL
.TABLE
, i
, ((long)cl
->DATA
)/TTV_UNIT
);
8390 for (cl
=res_slope
, i
=0; cl
!=NULL
; cl
=cl
->NEXT
, i
++) stm_modtbl_set1Dval (slope_model
->UMODEL
.TABLE
, i
, ((long)cl
->DATA
)/TTV_UNIT
);
8394 delay_model
= stm_mod_create_table (NULL
, nbs
, 0, STM_INPUT_SLEW
, STM_NOTYPE
);
8395 slope_model
= stm_mod_create_table (NULL
, nbs
, 0, STM_INPUT_SLEW
, STM_NOTYPE
);
8396 for (cl
=input_slope
, i
=0; i
<nbs
; i
++, cl
=cl
->NEXT
)
8398 stm_modtbl_setXrangeval(delay_model
->UMODEL
.TABLE
, i
, ((long)cl
->DATA
)/TTV_UNIT
);
8399 stm_modtbl_setXrangeval(slope_model
->UMODEL
.TABLE
, i
, ((long)cl
->DATA
)/TTV_UNIT
);
8401 for (cl
=res_delay
, i
=0; cl
!=NULL
; cl
=cl
->NEXT
, i
++) stm_modtbl_set1Dval (delay_model
->UMODEL
.TABLE
, i
, ((long)cl
->DATA
)/TTV_UNIT
);
8402 for (cl
=res_slope
, i
=0; cl
!=NULL
; cl
=cl
->NEXT
, i
++) stm_modtbl_set1Dval (slope_model
->UMODEL
.TABLE
, i
, ((long)cl
->DATA
)/TTV_UNIT
);
8406 delay_model
= stm_mod_create_table (NULL
, nbs
, nbc
, STM_INPUT_SLEW
, STM_LOAD
);
8407 slope_model
= stm_mod_create_table (NULL
, nbs
, nbc
, STM_INPUT_SLEW
, STM_LOAD
);
8408 for (cl
=input_slope
, i
=0; i
<nbs
; i
++, cl
=cl
->NEXT
)
8410 stm_modtbl_setXrangeval(delay_model
->UMODEL
.TABLE
, i
, ((long)cl
->DATA
)/TTV_UNIT
);
8411 stm_modtbl_setXrangeval(slope_model
->UMODEL
.TABLE
, i
, ((long)cl
->DATA
)/TTV_UNIT
);
8413 for (cl
=output_capa
, i
=0; i
<nbc
; i
++, cl
=cl
->NEXT
)
8415 stm_modtbl_setYrangeval(delay_model
->UMODEL
.TABLE
, i
, *(float *)&cl
->DATA
);
8416 stm_modtbl_setYrangeval(slope_model
->UMODEL
.TABLE
, i
, *(float *)&cl
->DATA
);
8418 for (cl
=res_delay
, ch
=res_slope
, i
=0; i
<nbs
; i
++)
8419 for (j
=0; j
<nbc
; j
++, cl
=cl
->NEXT
, ch
=ch
->NEXT
)
8421 stm_modtbl_set2Dval(delay_model
->UMODEL
.TABLE
, i
, j
, ((long)cl
->DATA
)/TTV_UNIT
);
8422 stm_modtbl_set2Dval(slope_model
->UMODEL
.TABLE
, i
, j
, ((long)ch
->DATA
)/TTV_UNIT
);
8426 if (ttv_get_path_margins_info(ttvfig
, path
, &factor
, &delta
))
8427 stm_modtbl_scale_and_add_val(delay_model
->UMODEL
.TABLE
, delta
/TTV_UNIT
, factor
);
8428 path
->MF
=slope_model
;
8429 path
->MD
=delay_model
;
8431 freechain(input_slope
);
8432 freechain(output_capa
);
8433 freechain(res_delay
);
8434 freechain(res_slope
);
8435 freechain(res_energy
);
8441 void ttv_allocpathmodel (ttvfig
, path
, type
)
8442 ttvfig_list
*ttvfig
;
8446 ttvevent_list
*start
;
8448 ttvline_list
*start_line
;
8449 ttvline_list
*start_line_rc
;
8450 ttvline_list
*end_line
;
8451 ttvline_list
*end_line_rc
;
8453 ttvline_list
*ptlineforslew
= NULL
;
8454 timing_model
*mindelay
= NULL
;
8455 timing_model
*moutdelay
= NULL
;
8456 timing_model
*moutslope
= NULL
;
8457 timing_model
*minslope
= NULL
;
8458 timing_model
*modelindelay
;
8459 timing_model
*modelinslope
;
8460 timing_model
*modeloutdelay
;
8461 timing_model
*modeloutslope
;
8463 int i
, /*j,*/ ns
, nl
, ns_slew
;
8464 float inslew_min
, inslew_max
, slew
, load
, capa
, nodeslew
, factor
;
8465 long dmin
, dmax
, fmin
, fmax
;
8471 double rmin
, c1min
, c2min
, rmax
, c1max
, c2max
;
8472 locon_list
*locon
=NULL
;
8476 ht
*htslope_axis
= NULL
;
8477 ht
*htcapa_axis
= NULL
;
8481 if ((ptype
= getptype(ttvfig
->USER
, TTV_FIG_SAXIS
)) != NULL
)
8482 htslope_axis
= (ht
*)ptype
->DATA
;
8483 if ((ptype
= getptype(ttvfig
->USER
, TTV_FIG_CAXIS
)) != NULL
)
8484 htcapa_axis
= (ht
*)ptype
->DATA
;
8487 lofig
= ttv_getrcxlofig (ttvfig
);
8492 nodeslew
= (float)ttv_getnodeslew(start
, type
);
8494 /* start_line_rc, start_line, end_line, end_line_rc, delay */
8496 if ((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
) {
8497 line
= end
->FIND
->OUTLINE
;
8499 if ((line
->TYPE
& (TTV_LINE_D
| TTV_LINE_T
)) && ((line
->TYPE
& TTV_LINE_RC
) == TTV_LINE_RC
) && ((line
->ROOT
->ROOT
->TYPE
& TTV_SIG_C
) == TTV_SIG_C
)) {
8500 if (line
->NODE
->FIND
->OUTLINE
) {
8502 line
= line
->NODE
->FIND
->OUTLINE
;
8512 start_line_rc
= NULL
;
8516 ptlineforslew
= end_line
->NODE
->FIND
->OUTLINE
;
8519 line
= start
->FIND
->OUTLINE
;
8521 if ((line
->TYPE
& (TTV_LINE_D
| TTV_LINE_T
)) && ((line
->TYPE
& TTV_LINE_RC
) == TTV_LINE_RC
) && ((line
->NODE
->ROOT
->TYPE
& TTV_SIG_C
) == TTV_SIG_C
)) {
8522 if (line
->ROOT
->FIND
->OUTLINE
) {
8523 start_line_rc
= line
;
8524 line
= line
->ROOT
->FIND
->OUTLINE
;
8527 start_line_rc
= line
;
8532 start_line_rc
= NULL
;
8542 if ((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
) {
8543 if (line
->NODE
== start
) {
8544 if (line
->TYPE
& (TTV_LINE_D
| TTV_LINE_T
)) start_line
= line
;
8548 if ((line
->TYPE
& (TTV_LINE_D
| TTV_LINE_T
)) && line
->NODE
->FIND
->OUTLINE
) {
8549 if ((line
->NODE
->FIND
->OUTLINE
->NODE
== start
) && ((line
->NODE
->FIND
->OUTLINE
->TYPE
& TTV_LINE_RC
) == TTV_LINE_RC
)) {
8550 start_line_rc
= line
->NODE
->FIND
->OUTLINE
;
8555 if ((line
->ROOT
!= end
) || ((line
->ROOT
== end
) && ((line
->ROOT
->ROOT
->TYPE
& TTV_SIG_C
) != TTV_SIG_C
))) {
8556 if(!end_line_rc
|| (end_line_rc
&& (end_line_rc
->NODE
->FIND
->OUTLINE
!= line
))){
8557 if ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
) {
8558 delay
+= ttv_getdelaymax (line
);
8559 inslew_max
= ttv_getslopemax (line
);
8562 delay
+= ttv_getdelaymin (line
);
8563 inslew_min
= ttv_getslopemin (line
);
8569 if (line
->ROOT
== end
) {
8570 if (line
->TYPE
& (TTV_LINE_D
| TTV_LINE_T
)) end_line
= line
;
8571 if ((line
->ROOT
->ROOT
->TYPE
& TTV_SIG_C
) != TTV_SIG_C
){
8572 if ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
) {
8573 delay
+= ttv_getdelaymax (line
);
8574 inslew_max
= ttv_getslopemax (line
);
8577 delay
+= ttv_getdelaymin (line
);
8578 inslew_min
= ttv_getslopemin (line
);
8584 if ((line
->TYPE
& (TTV_LINE_D
| TTV_LINE_T
)) && line
->ROOT
->FIND
->OUTLINE
) {
8585 if ((line
->ROOT
->FIND
->OUTLINE
->ROOT
== end
) && ((line
->ROOT
->FIND
->OUTLINE
->TYPE
& TTV_LINE_RC
) == TTV_LINE_RC
)) {
8586 end_line_rc
= line
->ROOT
->FIND
->OUTLINE
;
8588 if ((end_line_rc
->ROOT
->ROOT
->TYPE
& TTV_SIG_C
) != TTV_SIG_C
){
8589 if ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
) {
8590 delay
+= ttv_getdelaymax (line
);
8591 inslew_max
= ttv_getslopemax (line
);
8594 delay
+= ttv_getdelaymin (line
);
8595 inslew_min
= ttv_getslopemin (line
);
8601 /* if (!(line->TYPE & (TTV_LINE_D | TTV_LINE_T)))*/
8602 ptlineforslew
= line
;
8603 if ((line
->NODE
!= start
) || ((line
->NODE
== start
) && ((line
->NODE
->ROOT
->TYPE
& TTV_SIG_C
) != TTV_SIG_C
))) {
8604 if(!start_line_rc
|| (start_line_rc
&& (start_line_rc
->ROOT
->FIND
->OUTLINE
!= line
))){
8605 if ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
) {
8606 delay
+= ttv_getdelaymax (line
);
8607 inslew_max
= ttv_getslopemax (line
);
8610 delay
+= ttv_getdelaymin (line
);
8611 inslew_min
= ttv_getslopemin (line
);
8617 /* if (!(line->TYPE & (TTV_LINE_D | TTV_LINE_T))) {
8618 if ((type & TTV_FIND_MAX) == TTV_FIND_MAX) {
8619 delay += ttv_getdelaymax (line);
8620 inslew_max = ttv_getslopemax (line);
8623 delay += ttv_getdelaymin (line);
8624 inslew_min = ttv_getslopemin (line);
8628 if ((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
){
8629 line
= line
->NODE
->FIND
->OUTLINE
;
8631 line
= line
->ROOT
->FIND
->OUTLINE
;
8635 if (line
&& !(line
->TYPE
& (TTV_LINE_D
| TTV_LINE_T
))) {
8636 /* if ((type & TTV_FIND_MAX) == TTV_FIND_MAX) {
8637 delay += ttv_getdelaymax (line);
8638 inslew_max = ttv_getslopemax (line);
8641 delay += ttv_getdelaymin (line);
8642 inslew_min = ttv_getslopemin (line);
8645 if ((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
) start_line
= line
;
8646 else end_line
= line
;
8649 //----------------------------------------------------------------------------
8650 //----------------------------------------------------------------------------
8651 // No models to create
8653 singlerc
= (start_line_rc
|| end_line_rc
) && (start_line_rc
== end_line_rc
);
8656 if (!start_line
&& !end_line
) {
8661 if ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
) {
8662 if (!start_line
&& !end_line
->MDMAX
&& !end_line
->MFMAX
) {
8667 if (!end_line
&& !start_line
->MDMAX
&& !start_line
->MFMAX
) {
8672 if (!start_line
->MDMAX
&& !end_line
->MDMAX
&& !start_line
->MFMAX
&& !end_line
->MFMAX
) {
8679 if (!start_line
&& !end_line
->MDMIN
&& !end_line
->MFMIN
) {
8684 if (!end_line
&& !start_line
->MDMIN
&& !start_line
->MFMIN
) {
8689 if (!start_line
->MDMIN
&& !end_line
->MDMIN
&& !start_line
->MFMIN
&& !end_line
->MFMIN
) {
8697 capa
= STM_DONTCARE
;
8700 // capa = start_line->ROOT->ROOT->CAPA;
8704 c1max
= ttv_get_signal_capa(start_line
->ROOT
->ROOT
) / 1000.0 ;
8707 c1min
= ttv_get_signal_capa(start_line
->ROOT
->ROOT
) / 1000.0 ;
8710 typemax
= RCX_CAPALOAD
;
8711 typemin
= RCX_CAPALOAD
;
8715 locon
= rcx_gethtrcxcon(NULL
,lofig
,start_line
->ROOT
->ROOT
->NAME
) ;
8717 if((locon
== NULL
) || (locon
->PNODE
== NULL
) ||
8718 ((ptrcx
= getrcx(locon
->SIG
)) == NULL
))
8720 c1max
= ttv_get_signal_capa(start_line
->ROOT
->ROOT
) / 1000.0 ;
8723 c1min
= ttv_get_signal_capa(start_line
->ROOT
->ROOT
) / 1000.0 ;
8726 typemax
= RCX_CAPALOAD
;
8727 typemin
= RCX_CAPALOAD
;
8731 if( rcx_crosstalkactive( RCX_QUERY
) != RCX_NOCROSSTALK
) {
8732 slope
.F0MAX
= ttv_getslopenode( start_line
->ROOT
->ROOT
->ROOT
,
8733 start_line
->ROOT
->ROOT
->ROOT
->INFO
->LEVEL
,
8741 slope
.FCCMAX
= ttv_getslopenode( start_line
->ROOT
->ROOT
->ROOT
,
8742 start_line
->ROOT
->ROOT
->ROOT
->INFO
->LEVEL
,
8752 slope
.F0MAX
= -1.0 ;
8753 slope
.FCCMAX
= -1.0 ;
8756 slope
.SENS
= ((start_line
->ROOT
->TYPE
& TTV_NODE_UP
) == TTV_NODE_UP
)
8757 ? TRC_SLOPE_UP
: TRC_SLOPE_DOWN
;
8760 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
) {
8761 typemax
= rcx_rcnload( lofig
,
8764 &rmax
, &c1max
, &c2max
,
8771 typemin
= rcx_rcnload( lofig
,
8774 &rmin
, &c1min
, &c2min
,
8783 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
) {
8784 capa
= ((typemax
==RCX_CAPALOAD
) ? c1max
*1000.0 : (c1max
+c2max
)*1000.0);
8786 capa
= ((typemin
==RCX_CAPALOAD
) ? c1min
*1000.0 : (c1min
+c2min
)*1000.0);
8791 //----------------------------------------------------------------------------
8793 if((((path
->ROOT
->ROOT
->TYPE
& TTV_SIG_C
) == TTV_SIG_C
) || ((path
->ROOT
->ROOT
->TYPE
& TTV_SIG_N
) == TTV_SIG_N
))
8794 &&(((path
->NODE
->ROOT
->TYPE
& TTV_SIG_C
) == TTV_SIG_C
) || ((path
->NODE
->ROOT
->TYPE
& TTV_SIG_N
) == TTV_SIG_N
))){
8795 stm_addaxisvalues(htslope_axis
, htcapa_axis
, path
->NODE
->ROOT
->NETNAME
, path
->ROOT
->ROOT
->NETNAME
);
8797 modelindelay
= NULL
;
8798 modelinslope
= NULL
;
8801 if ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
) {
8802 modelindelay
= stm_getmodel (ttvfig
->INFO
->FIGNAME
, start_line
->MDMAX
);
8803 if (STM_CACHE
&& modelindelay
)
8804 mbk_cache_lock (STM_CACHE
, modelindelay
);
8805 modelinslope
= stm_getmodel (ttvfig
->INFO
->FIGNAME
, start_line
->MFMAX
);
8806 if (STM_CACHE
&& modelinslope
)
8807 mbk_cache_lock (STM_CACHE
, modelinslope
);
8809 modelindelay
= stm_getmodel (ttvfig
->INFO
->FIGNAME
, start_line
->MDMIN
);
8810 if (STM_CACHE
&& modelindelay
)
8811 mbk_cache_lock (STM_CACHE
, modelindelay
);
8812 modelinslope
= stm_getmodel (ttvfig
->INFO
->FIGNAME
, start_line
->MFMIN
);
8813 if (STM_CACHE
&& modelinslope
)
8814 mbk_cache_lock (STM_CACHE
, modelinslope
);
8819 modeloutdelay
= NULL
;
8820 modeloutslope
= NULL
;
8823 if ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
) {
8824 modeloutdelay
= stm_getmodel (ttvfig
->INFO
->FIGNAME
, end_line
->MDMAX
);
8825 if (STM_CACHE
&& modeloutdelay
)
8826 mbk_cache_lock (STM_CACHE
, modeloutdelay
);
8827 modeloutslope
= stm_getmodel (ttvfig
->INFO
->FIGNAME
, end_line
->MFMAX
);
8828 if (STM_CACHE
&& modeloutslope
)
8829 mbk_cache_lock (STM_CACHE
, modeloutslope
);
8831 modeloutdelay
= stm_getmodel (ttvfig
->INFO
->FIGNAME
, end_line
->MDMIN
);
8832 if (STM_CACHE
&& modeloutdelay
)
8833 mbk_cache_lock (STM_CACHE
, modeloutdelay
);
8834 modeloutslope
= stm_getmodel (ttvfig
->INFO
->FIGNAME
, end_line
->MFMIN
);
8835 if (STM_CACHE
&& modeloutslope
)
8836 mbk_cache_lock (STM_CACHE
, modeloutslope
);
8839 }else if(((path
->NODE
->ROOT
->TYPE
& TTV_SIG_C
) == TTV_SIG_C
) || ((path
->NODE
->ROOT
->TYPE
& TTV_SIG_N
) == TTV_SIG_N
)){
8840 stm_addaxisvalues(htslope_axis
, htcapa_axis
, path
->NODE
->ROOT
->NETNAME
, NULL
);
8842 modelindelay
= NULL
;
8843 modelinslope
= NULL
;
8846 if ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
) {
8847 modelindelay
= stm_getmodel (ttvfig
->INFO
->FIGNAME
, start_line
->MDMAX
);
8848 if (STM_CACHE
&& modelindelay
)
8849 mbk_cache_lock (STM_CACHE
, modelindelay
);
8850 modelinslope
= stm_getmodel (ttvfig
->INFO
->FIGNAME
, start_line
->MFMAX
);
8851 if (STM_CACHE
&& modelinslope
)
8852 mbk_cache_lock (STM_CACHE
, modelinslope
);
8854 modelindelay
= stm_getmodel (ttvfig
->INFO
->FIGNAME
, start_line
->MDMIN
);
8855 if (STM_CACHE
&& modelindelay
)
8856 mbk_cache_lock (STM_CACHE
, modelindelay
);
8857 modelinslope
= stm_getmodel (ttvfig
->INFO
->FIGNAME
, start_line
->MFMIN
);
8858 if (STM_CACHE
&& modelinslope
)
8859 mbk_cache_lock (STM_CACHE
, modelinslope
);
8862 if(start_line
!= end_line
){
8863 modeloutdelay
= NULL
;
8864 modeloutslope
= NULL
;
8866 modeloutdelay
= modelindelay
;
8867 modeloutslope
= modelinslope
;
8869 }else if(((path
->ROOT
->ROOT
->TYPE
& TTV_SIG_C
) == TTV_SIG_C
) || ((path
->ROOT
->ROOT
->TYPE
& TTV_SIG_N
) == TTV_SIG_N
)){
8870 stm_addaxisvalues(htslope_axis
, htcapa_axis
, NULL
, path
->ROOT
->ROOT
->NETNAME
);
8872 modeloutdelay
= NULL
;
8873 modeloutslope
= NULL
;
8876 if ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
) {
8877 modeloutdelay
= stm_getmodel (ttvfig
->INFO
->FIGNAME
, end_line
->MDMAX
);
8878 if (STM_CACHE
&& modeloutdelay
)
8879 mbk_cache_lock (STM_CACHE
, modeloutdelay
);
8880 modeloutslope
= stm_getmodel (ttvfig
->INFO
->FIGNAME
, end_line
->MFMAX
);
8881 if (STM_CACHE
&& modeloutslope
)
8882 mbk_cache_lock (STM_CACHE
, modeloutslope
);
8884 modeloutdelay
= stm_getmodel (ttvfig
->INFO
->FIGNAME
, end_line
->MDMIN
);
8885 if (STM_CACHE
&& modeloutdelay
)
8886 mbk_cache_lock (STM_CACHE
, modeloutdelay
);
8887 modeloutslope
= stm_getmodel (ttvfig
->INFO
->FIGNAME
, end_line
->MFMIN
);
8888 if (STM_CACHE
&& modeloutslope
)
8889 mbk_cache_lock (STM_CACHE
, modeloutslope
);
8892 if(start_line
!= end_line
){
8893 modelindelay
= NULL
;
8894 modelinslope
= NULL
;
8896 modelindelay
= modeloutdelay
;
8897 modelinslope
= modeloutslope
;
8900 modeloutdelay
= NULL
;
8901 modeloutslope
= NULL
;
8902 modelindelay
= NULL
;
8903 modelinslope
= NULL
;
8906 // creation du modele rc + gate start ------------------------------------------------------------------------
8907 if (start_line_rc
&& start_line
&& modelindelay
&& modelinslope
&& (start_line
!= end_line
)) {
8910 mindelay
= stm_mod_reduce(NULL
, modelindelay
, nodeslew
/TTV_UNIT
, capa
, STM_LOADFIX_RED
, STM_DELAY
);
8911 ns
= stm_modtbl_getnslew (mindelay
->UMODEL
.TABLE
);
8913 if ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
){
8914 ttv_calcgatercdelayslope (start_line_rc
, start_line
, nodeslew
, nodeslew
,
8915 capa
, NULL
, NULL
, &dmax
, &fmax
, TTV_MODE_NOTSTORE
);
8916 stm_modtbl_setconst (mindelay
->UMODEL
.TABLE
, dmax
/TTV_UNIT
);
8918 ttv_calcgatercdelayslope (start_line_rc
, start_line
, nodeslew
, nodeslew
,
8919 capa
, &dmin
, &fmin
, NULL
, NULL
, TTV_MODE_NOTSTORE
);
8920 stm_modtbl_setconst (mindelay
->UMODEL
.TABLE
, dmin
/TTV_UNIT
);
8924 for (i
= 0; i
< ns
; i
++) {
8925 slew
= stm_modtbl_getslewaxisval (mindelay
->UMODEL
.TABLE
, i
);
8927 if ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
){
8928 ttv_calcgatercdelayslope (start_line_rc
, start_line
, slew
*TTV_UNIT
, slew
*TTV_UNIT
, capa
, NULL
, NULL
, &dmax
, &fmax
, TTV_MODE_NOTSTORE
);
8929 stm_modtbl_set1Dval (mindelay
->UMODEL
.TABLE
, i
, dmax
/TTV_UNIT
);
8931 ttv_calcgatercdelayslope (start_line_rc
, start_line
, slew
*TTV_UNIT
, slew
*TTV_UNIT
, capa
, &dmin
, &fmin
, NULL
, NULL
, TTV_MODE_NOTSTORE
);
8932 stm_modtbl_set1Dval (mindelay
->UMODEL
.TABLE
, i
, dmin
/TTV_UNIT
);
8937 minslope
= stm_mod_reduce(NULL
, modelinslope
, nodeslew
/TTV_UNIT
, capa
, STM_LOADFIX_RED
, STM_SLEW
);
8938 ns
= stm_modtbl_getnslew (minslope
->UMODEL
.TABLE
);
8940 if ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
){
8941 ttv_calcgatercdelayslope (start_line_rc
, start_line
, nodeslew
, nodeslew
,
8942 capa
, NULL
, NULL
, &dmax
, &fmax
, TTV_MODE_NOTSTORE
);
8943 stm_modtbl_setconst (minslope
->UMODEL
.TABLE
, fmax
/TTV_UNIT
);
8945 ttv_calcgatercdelayslope (start_line_rc
, start_line
, nodeslew
, nodeslew
,
8946 capa
, &dmin
, &fmin
, NULL
, NULL
, TTV_MODE_NOTSTORE
);
8947 stm_modtbl_setconst (minslope
->UMODEL
.TABLE
, fmin
/TTV_UNIT
);
8950 for (i
= 0; i
< ns
; i
++) {
8951 slew
= stm_modtbl_getslewaxisval (minslope
->UMODEL
.TABLE
, i
);
8952 if ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
){
8953 ttv_calcgatercdelayslope (start_line_rc
, start_line
, slew
*TTV_UNIT
, slew
*TTV_UNIT
, capa
, NULL
, NULL
, &dmax
, &fmax
, TTV_MODE_NOTSTORE
);
8954 stm_modtbl_set1Dval (minslope
->UMODEL
.TABLE
, i
, fmax
/TTV_UNIT
);
8956 ttv_calcgatercdelayslope (start_line_rc
, start_line
, slew
*TTV_UNIT
, slew
*TTV_UNIT
, capa
, &dmin
, &fmin
, NULL
, NULL
, TTV_MODE_NOTSTORE
);
8957 stm_modtbl_set1Dval (minslope
->UMODEL
.TABLE
, i
, fmin
/TTV_UNIT
);
8961 mbk_cache_unlock (STM_CACHE
, modelinslope
);
8962 mbk_cache_unlock (STM_CACHE
, modelindelay
);
8964 modelinslope
= minslope
;
8965 modelindelay
= mindelay
;
8968 // creation du modele rc + gate end ------------------------------------------------------------------------
8969 if (end_line_rc
&& end_line
&& modeloutdelay
&& modeloutslope
&& (start_line
!= end_line
)) {
8970 if (ptlineforslew
) {
8971 if ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
8972 slew
= ttv_getslopemax (ptlineforslew
);
8974 slew
= ttv_getslopemin (ptlineforslew
);
8976 else slew
= STM_DEF_SLEW
* TTV_UNIT
;
8978 load
= ttv_get_signal_capa(end_line
->ROOT
->ROOT
);
8979 moutdelay
= stm_mod_reduce(NULL
, modeloutdelay
, slew
/TTV_UNIT
, load
, STM_SLEWFIX_RED
, STM_DELAY
);
8980 moutslope
= stm_mod_reduce(NULL
, modeloutslope
, slew
/TTV_UNIT
, load
, STM_SLEWFIX_RED
, STM_SLEW
);
8981 nl
= stm_modtbl_getnload (moutdelay
->UMODEL
.TABLE
);
8982 /* for (i = 0; i < nl; i++) {
8983 load = stm_modtbl_getloadaxisval (moutdelay->UMODEL.TABLE, i);
8985 if ((type & TTV_FIND_MAX) == TTV_FIND_MAX) {
8986 ttv_calcgatercdelayslope (end_line, end_line_rc, slew, slew, load, NULL, NULL, &dmax, &fmax, TTV_MODE_NOTSTORE);
8987 stm_modtbl_set1Dval (moutdelay->UMODEL.TABLE, i, dmax/TTV_UNIT);
8988 stm_modtbl_set1Dval (moutslope->UMODEL.TABLE, i, fmax/TTV_UNIT);
8991 ttv_calcgatercdelayslope (end_line, end_line_rc, slew, slew, load, &dmin, &fmin, NULL, NULL, TTV_MODE_NOTSTORE);
8992 stm_modtbl_set1Dval (moutdelay->UMODEL.TABLE, i, dmin/TTV_UNIT);
8993 stm_modtbl_set1Dval (moutslope->UMODEL.TABLE, i, fmin/TTV_UNIT);
8996 if ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
){
8997 stm_modtbl_scale_and_add_val (moutdelay
->UMODEL
.TABLE
, (float)end_line_rc
->VALMAX
/TTV_UNIT
, 1);
8999 stm_modtbl_scale_and_add_val (moutdelay
->UMODEL
.TABLE
, (float)end_line_rc
->VALMIN
/TTV_UNIT
, 1);
9002 mbk_cache_unlock (STM_CACHE
, modeloutslope
);
9003 mbk_cache_unlock (STM_CACHE
, modeloutdelay
);
9005 modeloutslope
= moutslope
;
9006 modeloutdelay
= moutdelay
;
9009 if (end_line_rc
&& end_line
&& modelindelay
&& modelinslope
&& (start_line
== end_line
)) {
9010 mindelay
= stm_mod_reduce(NULL
, modelindelay
, nodeslew
/TTV_UNIT
, capa
, STM_COPY
, STM_DELAY
);
9011 minslope
= stm_mod_reduce(NULL
, modelinslope
, nodeslew
/TTV_UNIT
, capa
, STM_COPY
, STM_SLEW
);
9012 ns
= stm_modtbl_getnslew (mindelay
->UMODEL
.TABLE
);
9013 nl
= stm_modtbl_getnload (mindelay
->UMODEL
.TABLE
);
9014 ns_slew
= stm_modtbl_getnslew (minslope
->UMODEL
.TABLE
);
9015 /* for (j = 0; j < nl; j++) {
9016 for (i = 0; i < ns; i++) {
9017 slew = stm_modtbl_getslewaxisval (mindelay->UMODEL.TABLE, i);
9018 load = stm_modtbl_getloadaxisval (mindelay->UMODEL.TABLE, j);
9019 if ((type & TTV_FIND_MAX) == TTV_FIND_MAX){
9020 ttv_calcgatercdelayslope (end_line, end_line_rc, slew*TTV_UNIT, slew*TTV_UNIT, load, NULL, NULL, &dmax, &fmax, TTV_MODE_NOTSTORE);
9021 stm_modtbl_set2Dval (mindelay->UMODEL.TABLE, i, j, dmax/TTV_UNIT);
9023 stm_modtbl_set2Dval (minslope->UMODEL.TABLE, i, j, fmax/TTV_UNIT);
9025 stm_modtbl_set1Dval (minslope->UMODEL.TABLE, j, fmax/TTV_UNIT);
9027 ttv_calcgatercdelayslope (end_line, end_line_rc, slew*TTV_UNIT, slew*TTV_UNIT, load, &dmin, &fmin, NULL, NULL, TTV_MODE_NOTSTORE);
9028 stm_modtbl_set2Dval (mindelay->UMODEL.TABLE, i, j, dmin/TTV_UNIT);
9030 stm_modtbl_set2Dval (minslope->UMODEL.TABLE, i, j, fmin/TTV_UNIT);
9032 stm_modtbl_set1Dval (minslope->UMODEL.TABLE, j, fmin/TTV_UNIT);
9036 if ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
){
9037 stm_modtbl_scale_and_add_val (mindelay
->UMODEL
.TABLE
, (float)end_line_rc
->VALMAX
/TTV_UNIT
, 1);
9039 stm_modtbl_scale_and_add_val (mindelay
->UMODEL
.TABLE
, (float)end_line_rc
->VALMIN
/TTV_UNIT
, 1);
9042 if ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
){
9043 stm_modtbl_scale_and_add_val (mindelay
->UMODEL
.TABLE
, (float)start_line_rc
->VALMAX
/TTV_UNIT
, 1);
9045 stm_modtbl_scale_and_add_val (mindelay
->UMODEL
.TABLE
, (float)start_line_rc
->VALMIN
/TTV_UNIT
, 1);
9049 mbk_cache_unlock (STM_CACHE
, modelinslope
);
9050 mbk_cache_unlock (STM_CACHE
, modelindelay
);
9052 modelinslope
= minslope
;
9053 modelindelay
= mindelay
;
9055 // creation du modele rc + gate singlerc ------------------------------------------------------------------------
9057 load
= ttv_get_signal_capa(start_line_rc
->NODE
->ROOT
);
9058 mindelay
= stm_mod_create_table (NULL
, 3, 0, STM_INPUT_SLEW
, STM_NOTYPE
);
9059 minslope
= stm_mod_create_table (NULL
, 3, 0, STM_INPUT_SLEW
, STM_NOTYPE
);
9061 for (i
= 0; i
< 3; i
++) {
9063 case 0: slew
= nodeslew
/ 2; break;
9064 case 1: slew
= nodeslew
; break;
9065 case 2: slew
= nodeslew
* 2; break;
9068 mindelay
->UMODEL
.TABLE
->XRANGE
[i
] = slew
/TTV_UNIT
;
9069 minslope
->UMODEL
.TABLE
->XRANGE
[i
] = slew
/TTV_UNIT
;
9070 if ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
) {
9071 ttv_calcgatercdelayslope (end_line_rc
, NULL
, slew
, slew
, load
, NULL
, NULL
, &dmax
, &fmax
, TTV_MODE_NOTSTORE
);
9072 stm_modtbl_set1Dval (mindelay
->UMODEL
.TABLE
, i
, dmax
/TTV_UNIT
);
9073 stm_modtbl_set1Dval (minslope
->UMODEL
.TABLE
, i
, fmax
/TTV_UNIT
);
9076 ttv_calcgatercdelayslope (end_line_rc
, NULL
, slew
, slew
, load
, &dmin
, &fmin
, NULL
, NULL
, TTV_MODE_NOTSTORE
);
9077 stm_modtbl_set1Dval (mindelay
->UMODEL
.TABLE
, i
, dmin
/TTV_UNIT
);
9078 stm_modtbl_set1Dval (minslope
->UMODEL
.TABLE
, i
, fmin
/TTV_UNIT
);
9082 modelinslope
= minslope
;
9083 modelindelay
= mindelay
;
9086 // models assignation ---------------------------------------------------------
9087 if (start_line
!= end_line
) {
9088 if (ptlineforslew
) {
9089 if ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
9090 slew
= ttv_getslopemax (ptlineforslew
);
9092 slew
= ttv_getslopemin (ptlineforslew
);
9094 else slew
= STM_DEF_SLEW
* TTV_UNIT
;
9096 path
->MD
= stm_mod_merge (NULL
, modelindelay
, modeloutdelay
, (float)delay
/TTV_UNIT
, (float)capa
, (float)slew
/TTV_UNIT
);
9098 path
->MF
= stm_mod_reduce (NULL
, modeloutslope
, (float)slew
/TTV_UNIT
, (float)capa
, STM_SLEWFIX_RED
, STM_SLEW
);
9100 if ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
9101 path
->MF
= stm_mod_create_fcst (NULL
, ttv_getslopemax (end_line
)/TTV_UNIT
, STM_MOD_MODTBL
);
9103 path
->MF
= stm_mod_create_fcst (NULL
, ttv_getslopemin (end_line
)/TTV_UNIT
, STM_MOD_MODTBL
);
9107 if((((start_line
->ROOT
->ROOT
->TYPE
& TTV_SIG_C
) == TTV_SIG_C
) || ((start_line
->ROOT
->ROOT
->TYPE
& TTV_SIG_N
) == TTV_SIG_N
))
9108 &&(((start_line
->NODE
->ROOT
->TYPE
& TTV_SIG_C
) == TTV_SIG_C
) || ((start_line
->NODE
->ROOT
->TYPE
& TTV_SIG_N
) == TTV_SIG_N
))){
9109 path
->MD
= stm_mod_reduce(NULL
, modelindelay
, nodeslew
/TTV_UNIT
, capa
, STM_COPY
, STM_DELAY
);
9110 path
->MF
= stm_mod_reduce(NULL
, modelinslope
, nodeslew
/TTV_UNIT
, capa
, STM_COPY
, STM_SLEW
);
9111 }else if(((start_line
->NODE
->ROOT
->TYPE
& TTV_SIG_C
) == TTV_SIG_C
) || ((start_line
->NODE
->ROOT
->TYPE
& TTV_SIG_N
) == TTV_SIG_N
)){
9112 path
->MD
= stm_mod_reduce(NULL
, modelindelay
, nodeslew
/TTV_UNIT
, capa
, STM_LOADFIX_RED
, STM_DELAY
);
9113 path
->MF
= stm_mod_reduce(NULL
, modelinslope
, nodeslew
/TTV_UNIT
, capa
, STM_LOADFIX_RED
, STM_SLEW
);
9114 }else if(((start_line
->ROOT
->ROOT
->TYPE
& TTV_SIG_C
) == TTV_SIG_C
) || ((start_line
->ROOT
->ROOT
->TYPE
& TTV_SIG_N
) == TTV_SIG_N
)){
9115 path
->MD
= stm_mod_reduce(NULL
, modelindelay
, STM_DEF_SLEW
, capa
, STM_SLEWFIX_RED
, STM_DELAY
);
9116 path
->MF
= stm_mod_reduce(NULL
, modelinslope
, STM_DEF_SLEW
, capa
, STM_SLEWFIX_RED
, STM_SLEW
);
9120 if(((path
->NODE
->TYPE
& TTV_NODE_UP
) == TTV_NODE_UP
) && ((path
->ROOT
->TYPE
& TTV_NODE_UP
) == TTV_NODE_UP
))
9122 else if(((path
->NODE
->TYPE
& TTV_NODE_UP
) == TTV_NODE_UP
) && ((path
->ROOT
->TYPE
& TTV_NODE_DOWN
) == TTV_NODE_DOWN
))
9124 else if(((path
->NODE
->TYPE
& TTV_NODE_DOWN
) == TTV_NODE_DOWN
) && ((path
->ROOT
->TYPE
& TTV_NODE_UP
) == TTV_NODE_UP
))
9126 else if(((path
->NODE
->TYPE
& TTV_NODE_DOWN
) == TTV_NODE_DOWN
) && ((path
->ROOT
->TYPE
& TTV_NODE_DOWN
) == TTV_NODE_DOWN
))
9128 stm_mod_update_transition(path
->MD
, ttype
);
9129 stm_mod_update_transition(path
->MF
, ttype
);
9131 // temp models destruction ----------------------------------------------------
9133 if (mbk_cache_islock (STM_CACHE
, modelinslope
) == YES
)
9134 mbk_cache_unlock (STM_CACHE
, modelinslope
);
9135 if (mbk_cache_islock (STM_CACHE
, modelindelay
) == YES
)
9136 mbk_cache_unlock (STM_CACHE
, modelindelay
);
9137 if (mbk_cache_islock (STM_CACHE
, modeloutdelay
) == YES
)
9138 mbk_cache_unlock (STM_CACHE
, modeloutdelay
);
9139 if (mbk_cache_islock (STM_CACHE
, modeloutslope
) == YES
)
9140 mbk_cache_unlock (STM_CACHE
, modeloutslope
);
9142 if (mindelay
) stm_mod_destroy (mindelay
);
9143 if (minslope
) stm_mod_destroy (minslope
);
9144 if (moutdelay
) stm_mod_destroy (moutdelay
);
9145 if (moutslope
) stm_mod_destroy (moutslope
);
9146 stm_delaxisvalues();
9148 if (path
->MD
!=NULL
&& ttv_get_path_margins_info(ttvfig
, path
, &factor
, &delta
))
9149 stm_modtbl_scale_and_add_val(path
->MD
->UMODEL
.TABLE
, delta
/TTV_UNIT
, factor
);
9152 /*****************************************************************************/
9153 /* function ttv_allocnewmodel() */
9155 /* ttvfig : ttvfig courante */
9156 /* inchain : liste des entrees */
9157 /* goal : noeud sortie */
9158 /* type : type de recherche */
9160 /* construit les chemins a partir du parcours en largeur du graphe */
9161 /*****************************************************************************/
9162 void ttv_allocnewmodel(ttvfig
,node
,goal
,ptline
,ptend
,caracnode
,caracgoal
,type
)
9163 ttvfig_list
*ttvfig
;
9164 ttvevent_list
*node
;
9165 ttvevent_list
*goal
;
9166 ttvline_list
*ptline
;
9167 ttvline_list
*ptend
;
9168 ttvline_list
*caracnode
;
9169 ttvline_list
*caracgoal
;
9172 ttvline_list
*ptlinex
;
9173 char *modelindelay
;
9174 char *modeloutdelay
;
9175 char *modeloutslope
;
9176 long delay
, slew
= STM_DEF_SLEW
* TTV_UNIT
;
9177 float capa
, vt
, vth
, vdd
, vend
;
9178 timing_model
*tmodel
;
9180 ht
*htslope_axis
= NULL
;
9181 ht
*htcapa_axis
= NULL
;
9184 if ((ptype
= getptype(ttvfig
->USER
, TTV_FIG_SAXIS
)) != NULL
)
9185 htslope_axis
= (ht
*)ptype
->DATA
;
9186 if ((ptype
= getptype(ttvfig
->USER
, TTV_FIG_CAXIS
)) != NULL
)
9187 htcapa_axis
= (ht
*)ptype
->DATA
;
9189 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
9191 if(caracnode
== NULL
)
9193 if((caracgoal
->MDMAX
== NULL
) && (caracgoal
->MFMAX
== NULL
))
9196 else if(caracgoal
== NULL
)
9198 if((caracnode
->MDMAX
== NULL
) && (caracnode
->MFMAX
== NULL
))
9201 else if((caracnode
->MDMAX
== NULL
) && (caracgoal
->MDMAX
== NULL
) &&
9202 (caracnode
->MFMAX
== NULL
) && (caracgoal
->MFMAX
== NULL
))
9207 if(caracnode
== NULL
)
9209 if((caracgoal
->MDMIN
== NULL
) && (caracgoal
->MFMIN
== NULL
))
9212 else if(caracgoal
== NULL
)
9214 if((caracnode
->MDMIN
== NULL
) && (caracnode
->MFMIN
== NULL
))
9217 else if((caracnode
->MDMIN
== NULL
) && (caracgoal
->MDMIN
== NULL
) &&
9218 (caracnode
->MFMIN
== NULL
) && (caracgoal
->MFMIN
== NULL
))
9222 if(node
->FIND
->OUTLINE
== ptline
)
9227 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
9229 if(caracnode
== NULL
)
9231 modelindelay
= NULL
;
9235 modelindelay
= caracnode
->MDMAX
;
9237 if(caracgoal
== NULL
)
9239 modeloutdelay
= NULL
;
9240 modeloutslope
= NULL
;
9244 modeloutdelay
= caracgoal
->MDMAX
;
9245 modeloutslope
= caracgoal
->MFMAX
;
9250 if(caracnode
== NULL
)
9252 modelindelay
= NULL
;
9256 modelindelay
= caracnode
->MDMIN
;
9258 if(caracgoal
== NULL
)
9260 modeloutdelay
= NULL
;
9261 modeloutslope
= NULL
;
9265 modeloutdelay
= caracgoal
->MDMIN
;
9266 modeloutslope
= caracgoal
->MFMIN
;
9271 ptlinex
= node
->FIND
->OUTLINE
;
9273 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
){
9274 capa
= ttv_getcapamax(ptlinex
);
9275 slew
= ttv_getslopemax(ptlinex
);
9277 capa
= ttv_getcapamin(ptlinex
);
9278 slew
= ttv_getslopemin(ptlinex
);
9281 capa
= STM_DONTCARE
;
9282 for(ptlinex
= node
->FIND
->OUTLINE
; ptlinex
!= NULL
&& ptlinex
->ROOT
!= goal
;
9283 ptlinex
= ptlinex
->ROOT
->FIND
->OUTLINE
)
9285 if((ptlinex
->TYPE
& (TTV_LINE_D
|TTV_LINE_T
)) == 0)
9287 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
){
9288 delay
+= ttv_getdelaymax(ptlinex
) ;
9289 slew
= ttv_getslopemax(ptlinex
);
9291 delay
+= ttv_getdelaymin(ptlinex
) ;
9292 slew
= ttv_getslopemin(ptlinex
);
9297 if((ptlinex
!= NULL
) && ((ptlinex
->TYPE
& (TTV_LINE_D
|TTV_LINE_T
)) == 0))
9299 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
){
9300 delay
+= ttv_getdelaymax(ptlinex
) ;
9301 slew
= ttv_getslopemax(ptlinex
);
9303 delay
+= ttv_getdelaymin(ptlinex
) ;
9304 slew
= ttv_getslopemin(ptlinex
);
9308 if((((ptline
->ROOT
->ROOT
->TYPE
& TTV_SIG_C
) == TTV_SIG_C
) || ((ptline
->ROOT
->ROOT
->TYPE
& TTV_SIG_N
) == TTV_SIG_N
))
9309 &&(((ptline
->NODE
->ROOT
->TYPE
& TTV_SIG_C
) == TTV_SIG_C
) || ((ptline
->NODE
->ROOT
->TYPE
& TTV_SIG_N
) == TTV_SIG_N
))){
9310 stm_addaxisvalues(htslope_axis
, htcapa_axis
, ptline
->NODE
->ROOT
->NETNAME
, ptline
->ROOT
->ROOT
->NETNAME
);
9311 }else if(((ptline
->NODE
->ROOT
->TYPE
& TTV_SIG_C
) == TTV_SIG_C
) || ((ptline
->NODE
->ROOT
->TYPE
& TTV_SIG_N
) == TTV_SIG_N
)){
9312 stm_addaxisvalues(htslope_axis
, htcapa_axis
, ptline
->NODE
->ROOT
->NETNAME
, NULL
);
9313 }else if(((ptline
->ROOT
->ROOT
->TYPE
& TTV_SIG_C
) == TTV_SIG_C
) || ((ptline
->ROOT
->ROOT
->TYPE
& TTV_SIG_N
) == TTV_SIG_N
)){
9314 stm_addaxisvalues(htslope_axis
, htcapa_axis
, NULL
, ptline
->ROOT
->ROOT
->NETNAME
);
9317 if(((ptline
->NODE
->TYPE
& TTV_NODE_UP
) == TTV_NODE_UP
) && ((ptline
->ROOT
->TYPE
& TTV_NODE_UP
) == TTV_NODE_UP
))
9319 else if(((ptline
->NODE
->TYPE
& TTV_NODE_UP
) == TTV_NODE_UP
) && ((ptline
->ROOT
->TYPE
& TTV_NODE_DOWN
) == TTV_NODE_DOWN
))
9321 else if(((ptline
->NODE
->TYPE
& TTV_NODE_DOWN
) == TTV_NODE_DOWN
) && ((ptline
->ROOT
->TYPE
& TTV_NODE_UP
) == TTV_NODE_UP
))
9323 else if(((ptline
->NODE
->TYPE
& TTV_NODE_DOWN
) == TTV_NODE_DOWN
) && ((ptline
->ROOT
->TYPE
& TTV_NODE_DOWN
) == TTV_NODE_DOWN
))
9325 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
9327 ptline
->MDMAX
= ttv_getstmmodelname(ttvfig
,ptline
,STM_DELAY
,STM_MAX
) ;
9328 ptline
->MFMAX
= ttv_getstmmodelname(ttvfig
,ptline
,STM_SLEW
,STM_MAX
) ;
9329 if(caracnode
!= caracgoal
)
9330 stm_addmergedmodel(ttvfig
->INFO
->FIGNAME
,ptline
->MDMAX
,ttvfig
->INFO
->FIGNAME
,
9331 modelindelay
,ttvfig
->INFO
->FIGNAME
,modeloutdelay
,
9332 (float)delay
/TTV_UNIT
,(float)capa
,(float)slew
/TTV_UNIT
) ;
9334 stm_addreducedmodel(ttvfig
->INFO
->FIGNAME
,ptline
->MDMAX
,ttvfig
->INFO
->FIGNAME
,
9335 modeloutdelay
,(float)slew
/TTV_UNIT
,(float)capa
,STM_COPY
,STM_DELAY
) ;
9337 if(modeloutslope
!= NULL
){
9338 if(caracnode
!= caracgoal
)
9339 stm_addreducedmodel(ttvfig
->INFO
->FIGNAME
,ptline
->MFMAX
,ttvfig
->INFO
->FIGNAME
,
9340 modeloutslope
,(float)slew
/TTV_UNIT
,(float)capa
,STM_SLEWFIX_RED
,STM_SLEW
) ;
9342 stm_addreducedmodel(ttvfig
->INFO
->FIGNAME
,ptline
->MFMAX
,ttvfig
->INFO
->FIGNAME
,
9343 modeloutslope
,(float)slew
/TTV_UNIT
,(float)capa
,STM_COPY
,STM_SLEW
) ;
9345 stm_addconstmodel(ttvfig
->INFO
->FIGNAME
,ptline
->MFMAX
,ptend
->FMAX
/TTV_UNIT
) ;
9347 if (!stm_getmodel(ttvfig
->INFO
->FIGNAME
, ptline
->MDMAX
)) ptline
->MDMAX
= NULL
;
9348 if (!stm_getmodel(ttvfig
->INFO
->FIGNAME
, ptline
->MFMAX
)) ptline
->MFMAX
= NULL
;
9351 tmodel
= stm_getmodel(ttvfig
->INFO
->FIGNAME
, ptline
->MDMAX
);
9352 if((ptline
->ROOT
->TYPE
& TTV_NODE_UP
) == TTV_NODE_UP
)
9353 stm_mod_update(tmodel
, tmodel
->VTH
, tmodel
->VDD
, tmodel
->VT
, tmodel
->VDD
);
9354 else if((ptline
->ROOT
->TYPE
& TTV_NODE_DOWN
) == TTV_NODE_DOWN
)
9355 stm_mod_update(tmodel
, tmodel
->VTH
, tmodel
->VDD
, tmodel
->VT
, 0.0);
9356 vt
= stm_mod_vt(tmodel
);
9357 vth
= stm_mod_vth(tmodel
);
9358 vdd
= stm_mod_vdd(tmodel
);
9359 vend
= stm_mod_vf(tmodel
);
9360 stm_mod_update_transition(tmodel
, ttype
);
9363 tmodel
= stm_getmodel(ttvfig
->INFO
->FIGNAME
, ptline
->MFMAX
);
9364 stm_mod_update(tmodel
, vth
, vdd
, vt
, vend
);
9365 stm_mod_update_transition(tmodel
, ttype
);
9370 ptline
->MDMIN
= ttv_getstmmodelname(ttvfig
,ptline
,STM_DELAY
,STM_MIN
) ;
9371 ptline
->MFMIN
= ttv_getstmmodelname(ttvfig
,ptline
,STM_SLEW
,STM_MIN
) ;
9372 if(caracnode
!= caracgoal
)
9373 stm_addmergedmodel(ttvfig
->INFO
->FIGNAME
,ptline
->MDMIN
,ttvfig
->INFO
->FIGNAME
,
9374 modelindelay
,ttvfig
->INFO
->FIGNAME
,modeloutdelay
,
9375 (float)delay
/TTV_UNIT
,(float)capa
,(float)slew
/TTV_UNIT
) ;
9377 stm_addreducedmodel(ttvfig
->INFO
->FIGNAME
,ptline
->MDMIN
,ttvfig
->INFO
->FIGNAME
,
9378 modeloutdelay
,(float)slew
/TTV_UNIT
,(float)capa
,STM_COPY
,STM_DELAY
) ;
9380 if(modeloutslope
!= NULL
){
9381 if(caracnode
!= caracgoal
)
9382 stm_addreducedmodel(ttvfig
->INFO
->FIGNAME
,ptline
->MFMIN
,ttvfig
->INFO
->FIGNAME
,
9383 modeloutslope
,(float)slew
/TTV_UNIT
,(float)capa
,STM_SLEWFIX_RED
,STM_SLEW
) ;
9385 stm_addreducedmodel(ttvfig
->INFO
->FIGNAME
,ptline
->MFMIN
,ttvfig
->INFO
->FIGNAME
,
9386 modeloutslope
,(float)slew
/TTV_UNIT
,(float)capa
,STM_COPY
,STM_SLEW
) ;
9388 stm_addconstmodel(ttvfig
->INFO
->FIGNAME
,ptline
->MFMIN
,ptend
->FMIN
/TTV_UNIT
) ;
9390 if (!stm_getmodel(ttvfig
->INFO
->FIGNAME
, ptline
->MDMIN
)) ptline
->MDMIN
= NULL
;
9391 if (!stm_getmodel(ttvfig
->INFO
->FIGNAME
, ptline
->MFMIN
)) ptline
->MFMIN
= NULL
;
9394 tmodel
= stm_getmodel(ttvfig
->INFO
->FIGNAME
, ptline
->MDMIN
);
9395 if((ptline
->ROOT
->TYPE
& TTV_NODE_UP
) == TTV_NODE_UP
)
9396 stm_mod_update(tmodel
, tmodel
->VTH
, tmodel
->VDD
, tmodel
->VT
, tmodel
->VDD
);
9397 else if((ptline
->ROOT
->TYPE
& TTV_NODE_DOWN
) == TTV_NODE_DOWN
)
9398 stm_mod_update(tmodel
, tmodel
->VTH
, tmodel
->VDD
, tmodel
->VT
, 0.0);
9399 vt
= stm_mod_vt(tmodel
);
9400 vth
= stm_mod_vth(tmodel
);
9401 vdd
= stm_mod_vdd(tmodel
);
9402 vend
= stm_mod_vf(tmodel
);
9403 stm_mod_update_transition(tmodel
, ttype
);
9406 tmodel
= stm_getmodel(ttvfig
->INFO
->FIGNAME
, ptline
->MFMIN
);
9407 stm_mod_update(tmodel
, vth
, vdd
, vt
, vend
);
9408 stm_mod_update_transition(tmodel
, ttype
);
9411 stm_delaxisvalues();
9414 /*****************************************************************************/
9415 /* function ttv_addpath() */
9417 /* ttvfig : ttvfig courante */
9418 /* inchain : liste des entrees */
9419 /* goal : noeud sortie */
9420 /* type : type de recherche */
9422 /* construit les chemins a partir du parcours en largeur du graphe */
9423 /*****************************************************************************/
9424 void ttv_addpath(ttvfig
,inchain
,goal
,cmd
,type
)
9425 ttvfig_list
*ttvfig
;
9426 chain_list
*inchain
;
9427 ttvevent_list
*goal
;
9428 ttvevent_list
*cmd
;
9431 ttvevent_list
*nodex
;
9432 ttvevent_list
*avnodex
;
9433 ttvevent_list
*node
;
9434 ttvevent_list
*goalx
;
9435 ttvline_list
*line
;
9436 chain_list
*chainout
;
9437 chain_list
*chainend
;
9438 chain_list
*chainsav
;
9446 if((inchain
== NULL
) ||
9447 ((goal
->ROOT
->TYPE
& TTV_SIG_BYPASSOUT
) == TTV_SIG_BYPASSOUT
) ||
9448 ((goal
->TYPE
& TTV_NODE_BYPASSOUT
) == TTV_NODE_BYPASSOUT
))
9450 for(chain
= inchain
; chain
!= NULL
; chain
= chain
->NEXT
)
9451 ((ttvevent_list
*)chain
->DATA
)->FIND
->TYPE
&= ~(TTV_FIND_BEGIN
) ;
9456 chainout
= inchain
;
9457 chainend
= inchain
;
9458 chain
= inchain
->NEXT
;
9459 inchain
->NEXT
= NULL
;
9461 while(chain
!= NULL
)
9463 chainsav
= chain
->NEXT
;
9464 if((((ttvevent_list
*)chain
->DATA
)->ROOT
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) != 0)
9466 chain
->NEXT
= chainout
;
9471 chain
->NEXT
= NULL
;
9472 chainend
->NEXT
= chain
;
9478 inchain
= chainout
;
9482 for(chain
= inchain
; chain
!= NULL
; chain
= chain
->NEXT
)
9484 node
= (ttvevent_list
*)chain
->DATA
;
9485 node
->FIND
->TYPE
&= ~(TTV_FIND_BEGIN
) ;
9486 if(((node
->ROOT
->TYPE
& TTV_SIG_BYPASSIN
) == TTV_SIG_BYPASSIN
) ||
9487 ((node
->TYPE
& TTV_NODE_BYPASSIN
) == TTV_NODE_BYPASSIN
))
9496 if(((goal
->ROOT
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
|TTV_SIG_Q
)) != 0)
9497 && ((node
->ROOT
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) == 0))
9499 node
->TYPE
|= TTV_NODE_MARQUE
;
9501 else if(((node
->ROOT
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
|TTV_SIG_Q
)) != 0)
9502 && ((goal
->ROOT
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) == 0))
9504 goal
->TYPE
|= TTV_NODE_MARQUE
;
9507 if((goal
->ROOT
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
|TTV_SIG_Q
)) == TTV_SIG_Q
)
9509 goal
->TYPE
|= TTV_NODE_MARQUE
;
9512 if((node
->ROOT
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
|TTV_SIG_Q
)) == TTV_SIG_Q
)
9514 node
->TYPE
|= TTV_NODE_MARQUE
;
9517 for(nodex
= node
; nodex
->FIND
->OUTLINE
!= NULL
&&
9518 ((nodex
!= goal
) || (first
== 'Y')) ;
9519 nodex
= nodex
->FIND
->OUTLINE
->ROOT
)
9522 if((type
& TTV_FIND_LINE
) == TTV_FIND_LINE
)
9524 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
9525 nodex
->FIND
->OUTLINE
->TYPE
|= TTV_LINE_DEPTMAX
;
9527 nodex
->FIND
->OUTLINE
->TYPE
|= TTV_LINE_DEPTMIN
;
9530 if(((((nodex
->ROOT
->TYPE
& TTV_SIG_I
) == TTV_SIG_I
) &&
9531 ((((nodex
->TYPE
& TTV_NODE_IMAX
) == TTV_NODE_IMAX
) &&
9532 ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)) ||
9533 (((nodex
->TYPE
& TTV_NODE_IMIN
) == TTV_NODE_IMIN
) &&
9534 ((type
& TTV_FIND_MIN
) == TTV_FIND_MIN
))))) && (nodex
!= node
))
9539 if(((node
->ROOT
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
|TTV_SIG_Q
)) != 0) ||
9540 ((goal
->ROOT
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
|TTV_SIG_Q
)) != 0))
9542 if((nodex
->TYPE
& TTV_NODE_MARQUE
) != TTV_NODE_MARQUE
)
9544 nodex
->TYPE
|= TTV_NODE_MARQUE
;
9545 chainend
= addchain(chainend
,nodex
) ;
9547 if((goalx
->TYPE
& TTV_NODE_MARQUE
) != TTV_NODE_MARQUE
)
9549 goalx
->TYPE
|= TTV_NODE_MARQUE
;
9550 chainend
= addchain(chainend
,goalx
) ;
9553 if((goalx
->FIND
->TYPE
& TTV_FIND_BEGIN
) != TTV_FIND_BEGIN
)
9555 goalx
->FIND
->TYPE
|= TTV_FIND_BEGIN
;
9556 if((nodex
->TYPE
& TTV_NODE_END
) != TTV_NODE_END
)
9558 chainout
= addchain(chainout
,(void*)nodex
) ;
9559 nodex
->TYPE
|= TTV_NODE_END
;
9561 goalx
->USER
= addptype(goalx
->USER
,TTV_NODE_AVNODE
,(void *)avnodex
) ;
9562 goalx
->USER
= addptype(goalx
->USER
,TTV_NODE_IN
,(void*)nodex
) ;
9563 if((ptype
= getptype(nodex
->USER
,TTV_NODE_INCHAIN
)) == NULL
)
9564 nodex
->USER
= addptype(nodex
->USER
,TTV_NODE_INCHAIN
,
9565 (void*)addchain(NULL
,(void*)goalx
)) ;
9567 ptype
->DATA
= (chain_list
*)addchain((chain_list
*)ptype
->DATA
,
9573 if(nodex
->FIND
->OUTLINE
->FIG
== ttvfig
)
9584 if((goalx
->FIND
->TYPE
& TTV_FIND_BEGIN
) != TTV_FIND_BEGIN
)
9586 goalx
->FIND
->TYPE
|= TTV_FIND_BEGIN
;
9587 if((goalx
!= node
) &&
9588 ((((node
->ROOT
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
|TTV_SIG_Q
)) != 0) ||
9589 ((goal
->ROOT
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
|TTV_SIG_Q
)) != 0)) &&
9590 ((goalx
->TYPE
& TTV_NODE_MARQUE
) != TTV_NODE_MARQUE
)))
9592 goalx
->TYPE
|= TTV_NODE_MARQUE
;
9593 chainend
= addchain(chainend
,goalx
) ;
9595 if((nodex
->TYPE
& TTV_NODE_END
) != TTV_NODE_END
)
9597 chainout
= addchain(chainout
,(void*)nodex
) ;
9598 nodex
->TYPE
|= TTV_NODE_END
;
9600 goalx
->USER
= addptype(goalx
->USER
,TTV_NODE_IN
,(void*)nodex
) ;
9601 goalx
->USER
= addptype(goalx
->USER
,TTV_NODE_AVNODE
,(void *)avnodex
) ;
9602 if((ptype
= getptype(nodex
->USER
,TTV_NODE_INCHAIN
)) == NULL
)
9603 nodex
->USER
= addptype(nodex
->USER
,TTV_NODE_INCHAIN
,
9604 (void*)addchain(NULL
,(void*)goalx
)) ;
9606 ptype
->DATA
= (chain_list
*)addchain((chain_list
*)ptype
->DATA
,
9613 inchain
= append(chainend
,inchain
) ;
9615 for(chainend
= chainout
; chainend
!= NULL
; chainend
= chainend
->NEXT
)
9617 goalx
= (ttvevent_list
*)chainend
->DATA
;
9618 goalx
->TYPE
&= ~(TTV_NODE_END
) ;
9619 if(((type
& TTV_FIND_HZ
) == TTV_FIND_HZ
) &&
9620 (((goalx
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
) ||
9621 ((goalx
->ROOT
->TYPE
& TTV_SIG_CZ
) == TTV_SIG_CZ
) ||
9622 ((goalx
->ROOT
->TYPE
& TTV_SIG_CT
) == TTV_SIG_CT
)))
9623 typeline
= TTV_LINE_HZ
;
9624 else if(((goalx
->ROOT
->TYPE
& TTV_SIG_LR
) == TTV_SIG_LR
) ||
9625 ((goalx
->ROOT
->TYPE
& TTV_SIG_LS
) == TTV_SIG_LS
))
9627 if((type
& TTV_FIND_R
) == TTV_FIND_R
)
9628 typeline
= TTV_LINE_R
;
9630 typeline
= TTV_LINE_S
;
9632 else typeline
= (long)0 ;
9634 for(line
= goalx
->INPATH
; line
!= NULL
; line
= line
->NEXT
)
9636 if(((line
->TYPE
& TTV_LINE_CONT
) == TTV_LINE_CONT
) ||
9637 (line
->NODE
->FIND
== NULL
))
9639 if((((node
= line
->NODE
)->FIND
->TYPE
& TTV_FIND_BEGIN
) == TTV_FIND_BEGIN
) &&
9640 (line
->FIG
== ttvfig
))
9641 if((ptype
= getptype(node
->USER
,TTV_NODE_IN
)) != NULL
)
9642 if((ttvevent_list
*)ptype
->DATA
== goalx
)
9644 if((((goalx
->TYPE
& TTV_NODE_MARQUE
) == TTV_NODE_MARQUE
) &&
9645 ((line
->NODE
->TYPE
& TTV_NODE_MARQUE
) == TTV_NODE_MARQUE
) &&
9646 (line
->NODE
!= goalx
)) &&
9647 ((line
->TYPE
& TTV_LINE_P
) == TTV_LINE_P
))
9649 chainsav
= addchain(chainsav
,line
) ;
9652 if((typeline
& TTV_LINE_HZ
) != (line
->TYPE
& TTV_LINE_HZ
))
9655 if((typeline
& TTV_LINE_R
) != (line
->TYPE
& TTV_LINE_R
))
9658 if((typeline
& TTV_LINE_S
) != (line
->TYPE
& TTV_LINE_S
))
9661 if((cmd
!= NULL
) && ((goalx
->ROOT
->TYPE
& TTV_SIG_L
) == TTV_SIG_L
))
9662 if(cmd
!= ttv_getlinecmd(ttvfig
,line
,((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)?TTV_LINE_CMDMAX
:TTV_LINE_CMDMIN
))
9665 avnodex
= (ttvevent_list
*)getptype(node
->USER
,TTV_NODE_AVNODE
)->DATA
;
9666 node
->USER
= delptype(node
->USER
,TTV_NODE_AVNODE
) ;
9668 node
->FIND
->TYPE
&= ~(TTV_FIND_BEGIN
) ;
9669 node
->USER
= delptype(node
->USER
,TTV_NODE_IN
) ;
9671 if(line
->ROOT
== goal
)
9672 delay
= line
->NODE
->FIND
->DELAY
;
9674 delay
= line
->NODE
->FIND
->DELAY
- line
->ROOT
->FIND
->DELAY
;
9675 line
->TYPE
|= TTV_LINE_INFIG
;
9677 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
9679 if((line
->VALMAX
!= TTV_NOTIME
) && (ttv_getdelaymax(line
) >= delay
))
9681 if((((node
->ROOT
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) != 0) ||
9682 ((goalx
->ROOT
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) != 0)) &&
9683 ((line
->TYPE
& TTV_LINE_RC
) != TTV_LINE_RC
))
9685 ttvline_list
*caracin
;
9686 ttvline_list
*caracout
;
9688 if(((node
->ROOT
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) != 0) &&
9689 ((node
->FIND
->OUTLINE
->TYPE
& TTV_LINE_RC
) != TTV_LINE_RC
))
9691 caracin
= node
->FIND
->OUTLINE
;
9697 if(((goalx
->ROOT
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) != 0) &&
9698 ((avnodex
->FIND
->OUTLINE
->TYPE
& TTV_LINE_RC
) != TTV_LINE_RC
))
9700 caracout
= avnodex
->FIND
->OUTLINE
;
9706 if((line
->TYPE
& TTV_LINE_RC
) != TTV_LINE_RC
)
9707 ttv_allocnewmodel(ttvfig
,node
,goalx
,line
,avnodex
->FIND
->OUTLINE
,
9708 caracin
,caracout
,TTV_FIND_MAX
) ;
9711 line
->VALMAX
= delay
;
9712 line
->FMAX
= ttv_getslopemax(avnodex
->FIND
->OUTLINE
) ;
9716 if((line
->VALMIN
!= TTV_NOTIME
) && (ttv_getdelaymin(line
) <= delay
))
9718 if((((node
->ROOT
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) != 0) ||
9719 ((goalx
->ROOT
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) != 0)) &&
9720 ((line
->TYPE
& TTV_LINE_RC
) != TTV_LINE_RC
))
9722 ttvline_list
*caracin
;
9723 ttvline_list
*caracout
;
9725 if(((node
->ROOT
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) != 0) &&
9726 ((node
->FIND
->OUTLINE
->TYPE
& TTV_LINE_RC
) != TTV_LINE_RC
))
9728 caracin
= node
->FIND
->OUTLINE
;
9734 if(((goalx
->ROOT
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) != 0) &&
9735 ((avnodex
->FIND
->OUTLINE
->TYPE
& TTV_LINE_RC
) != TTV_LINE_RC
))
9737 caracout
= avnodex
->FIND
->OUTLINE
;
9743 if((line
->TYPE
& TTV_LINE_RC
) != TTV_LINE_RC
)
9744 ttv_allocnewmodel(ttvfig
,node
,goalx
,line
,avnodex
->FIND
->OUTLINE
,
9745 caracin
,caracout
,TTV_FIND_MIN
) ;
9748 line
->VALMIN
= delay
;
9749 line
->FMIN
= ttv_getslopemin(avnodex
->FIND
->OUTLINE
) ;
9752 if((line
->ROOT
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
)
9754 if((avnodex
->FIND
->OUTLINE
->TYPE
& TTV_LINE_EV
) == TTV_LINE_EV
)
9755 line
->TYPE
|= TTV_LINE_EV
;
9756 if((avnodex
->FIND
->OUTLINE
->TYPE
& TTV_LINE_PR
) == TTV_LINE_PR
)
9757 line
->TYPE
|= TTV_LINE_PR
;
9760 if(((line
->ROOT
->ROOT
->TYPE
& TTV_SIG_LR
) == TTV_SIG_LR
) ||
9761 ((line
->ROOT
->ROOT
->TYPE
& TTV_SIG_LS
) == TTV_SIG_LS
))
9763 if((avnodex
->FIND
->OUTLINE
->TYPE
& TTV_LINE_S
) == TTV_LINE_S
)
9764 line
->TYPE
|= TTV_LINE_S
;
9765 if((avnodex
->FIND
->OUTLINE
->TYPE
& TTV_LINE_R
) == TTV_LINE_R
)
9766 line
->TYPE
|= TTV_LINE_R
;
9769 if((goalx
->ROOT
->TYPE
& TTV_SIG_L
) == TTV_SIG_L
)
9771 ptype_list
*ptypecmd
;
9773 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
9775 ptypecmd
= ttv_addcmd(line
,TTV_LINE_CMDMAX
,
9776 ttv_getlinecmd(ttvfig
,avnodex
->FIND
->OUTLINE
,TTV_LINE_CMDMAX
)) ;
9780 ptypecmd
= ttv_addcmd(line
,TTV_LINE_CMDMIN
,
9781 ttv_getlinecmd(ttvfig
,avnodex
->FIND
->OUTLINE
,TTV_LINE_CMDMIN
)) ;
9787 for(chain
= chainsav
; chain
!= NULL
; chain
= chain
->NEXT
)
9789 line
= (ttvline_list
*)chain
->DATA
;
9790 line
= ttv_addline(ttvfig
,line
->ROOT
,line
->NODE
,line
->VALMAX
,line
->FMAX
,
9791 line
->VALMIN
,line
->FMIN
,TTV_LINE_J
|TTV_LINE_INFIG
) ;
9792 line
->TYPE
|= (((ttvline_list
*)chain
->DATA
)->TYPE
9793 & (TTV_LINE_HZ
|TTV_LINE_EV
|TTV_LINE_PR
|TTV_LINE_RC
|
9794 TTV_LINE_R
|TTV_LINE_S
)) ;
9795 if((ptype
= getptype(((ttvline_list
*)chain
->DATA
)->USER
,
9796 TTV_LINE_CMDMAX
))!= NULL
)
9797 ttv_addcmd(line
,TTV_LINE_CMDMAX
,(ttvevent_list
*)ptype
->DATA
) ;
9798 if((ptype
= getptype(((ttvline_list
*)chain
->DATA
)->USER
,
9799 TTV_LINE_CMDMIN
))!= NULL
)
9800 ttv_addcmd(line
,TTV_LINE_CMDMIN
,(ttvevent_list
*)ptype
->DATA
) ;
9801 ttv_delline((ttvline_list
*)chain
->DATA
) ;
9804 freechain(chainsav
) ;
9806 ptype
= getptype(goalx
->USER
,TTV_NODE_INCHAIN
) ;
9807 for(chain
= (chain_list
*)ptype
->DATA
;
9808 chain
!= NULL
; chain
= chain
->NEXT
)
9810 node
= (ttvevent_list
*)chain
->DATA
;
9812 if((node
->FIND
->TYPE
& TTV_FIND_BEGIN
) != TTV_FIND_BEGIN
)
9817 avnodex
= (ttvevent_list
*)getptype(node
->USER
,TTV_NODE_AVNODE
)->DATA
;
9818 node
->USER
= delptype(node
->USER
,TTV_NODE_AVNODE
) ;
9820 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
9822 if(((node
->ROOT
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) != 0) ||
9823 ((goalx
->ROOT
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) != 0))
9825 ttvline_list
*caracin
;
9826 ttvline_list
*caracout
;
9829 delay
= node
->FIND
->DELAY
;
9831 delay
= node
->FIND
->DELAY
- goalx
->FIND
->DELAY
;
9832 line
= ttv_addline(ttvfig
,goalx
,node
,delay
,
9833 ttv_getslopemax(avnodex
->FIND
->OUTLINE
),TTV_NOTIME
,TTV_NOSLOPE
,
9834 typeline
|TTV_LINE_T
|TTV_LINE_INFIG
) ;
9836 if(((node
->FIND
->OUTLINE
->TYPE
& TTV_LINE_RC
) == TTV_LINE_RC
) &&
9837 (node
->FIND
->OUTLINE
->ROOT
== goalx
))
9838 line
->TYPE
|= TTV_LINE_RC
;
9840 if(((node
->ROOT
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) != 0) &&
9841 ((line
->TYPE
& TTV_LINE_RC
) != TTV_LINE_RC
) &&
9842 ((node
->FIND
->OUTLINE
->TYPE
& TTV_LINE_RC
) != TTV_LINE_RC
))
9844 caracin
= node
->FIND
->OUTLINE
;
9848 if(((goalx
->ROOT
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) != 0) &&
9849 ((line
->TYPE
& TTV_LINE_RC
) != TTV_LINE_RC
) &&
9850 ((avnodex
->FIND
->OUTLINE
->TYPE
& TTV_LINE_RC
) != TTV_LINE_RC
))
9852 caracout
= avnodex
->FIND
->OUTLINE
;
9856 if((line
->TYPE
& TTV_LINE_RC
) != TTV_LINE_RC
)
9857 ttv_allocnewmodel(ttvfig
,node
,goalx
,line
,avnodex
->FIND
->OUTLINE
,caracin
,
9858 caracout
,TTV_FIND_MAX
) ;
9862 if(((goalx
->TYPE
& TTV_NODE_MARQUE
) == TTV_NODE_MARQUE
) &&
9863 ((node
->TYPE
& TTV_NODE_MARQUE
) == TTV_NODE_MARQUE
) &&
9867 delay
= node
->FIND
->DELAY
;
9869 delay
= node
->FIND
->DELAY
- goalx
->FIND
->DELAY
;
9870 line
= ttv_addline(ttvfig
,goalx
,node
,delay
,
9871 ttv_getslopemax(avnodex
->FIND
->OUTLINE
),TTV_NOTIME
,TTV_NOSLOPE
,
9872 typeline
|TTV_LINE_J
|TTV_LINE_INFIG
) ;
9877 delay
= node
->FIND
->DELAY
;
9879 delay
= node
->FIND
->DELAY
- goalx
->FIND
->DELAY
;
9880 line
= ttv_addline(ttvfig
,goalx
,node
,delay
,
9881 ttv_getslopemax(avnodex
->FIND
->OUTLINE
),TTV_NOTIME
,TTV_NOSLOPE
,
9882 typeline
|TTV_LINE_P
|TTV_LINE_INFIG
) ;
9885 if(((node
->FIND
->OUTLINE
->TYPE
& TTV_LINE_RC
) == TTV_LINE_RC
) &&
9886 (node
->FIND
->OUTLINE
->ROOT
== goalx
))
9887 line
->TYPE
|= TTV_LINE_RC
;
9892 if(((node
->ROOT
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) != 0) ||
9893 ((goalx
->ROOT
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) != 0))
9895 ttvline_list
*caracin
;
9896 ttvline_list
*caracout
;
9899 delay
= node
->FIND
->DELAY
;
9901 delay
= node
->FIND
->DELAY
- goalx
->FIND
->DELAY
;
9902 line
= ttv_addline(ttvfig
,goalx
,node
,TTV_NOTIME
,TTV_NOSLOPE
,
9903 delay
,ttv_getslopemin(avnodex
->FIND
->OUTLINE
),
9904 typeline
|TTV_LINE_T
|TTV_LINE_INFIG
) ;
9906 if(((node
->FIND
->OUTLINE
->TYPE
& TTV_LINE_RC
) == TTV_LINE_RC
) &&
9907 (node
->FIND
->OUTLINE
->ROOT
== goalx
))
9908 line
->TYPE
|= TTV_LINE_RC
;
9910 if(((node
->ROOT
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) != 0) &&
9911 ((line
->TYPE
& TTV_LINE_RC
) != TTV_LINE_RC
) &&
9912 ((node
->FIND
->OUTLINE
->TYPE
& TTV_LINE_RC
) != TTV_LINE_RC
))
9914 caracin
= node
->FIND
->OUTLINE
;
9918 if(((goalx
->ROOT
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) != 0) &&
9919 ((line
->TYPE
& TTV_LINE_RC
) != TTV_LINE_RC
) &&
9920 ((avnodex
->FIND
->OUTLINE
->TYPE
& TTV_LINE_RC
) != TTV_LINE_RC
))
9922 caracout
= avnodex
->FIND
->OUTLINE
;
9926 if((line
->TYPE
& TTV_LINE_RC
) != TTV_LINE_RC
)
9927 ttv_allocnewmodel(ttvfig
,node
,goalx
,line
,avnodex
->FIND
->OUTLINE
,caracin
,
9928 caracout
,TTV_FIND_MIN
) ;
9932 if(((goalx
->TYPE
& TTV_NODE_MARQUE
) == TTV_NODE_MARQUE
) &&
9933 ((node
->TYPE
& TTV_NODE_MARQUE
) == TTV_NODE_MARQUE
) &&
9937 delay
= node
->FIND
->DELAY
;
9939 delay
= node
->FIND
->DELAY
- goalx
->FIND
->DELAY
;
9940 line
= ttv_addline(ttvfig
,goalx
,node
,TTV_NOTIME
,TTV_NOSLOPE
,
9941 delay
,ttv_getslopemin(avnodex
->FIND
->OUTLINE
),
9942 typeline
|TTV_LINE_J
|TTV_LINE_INFIG
) ;
9947 delay
= node
->FIND
->DELAY
;
9949 delay
= node
->FIND
->DELAY
- goalx
->FIND
->DELAY
;
9950 line
= ttv_addline(ttvfig
,goalx
,node
,TTV_NOTIME
,TTV_NOSLOPE
,
9951 delay
,ttv_getslopemin(avnodex
->FIND
->OUTLINE
),
9952 typeline
|TTV_LINE_P
|TTV_LINE_INFIG
) ;
9955 if(((node
->FIND
->OUTLINE
->TYPE
& TTV_LINE_RC
) == TTV_LINE_RC
) &&
9956 (node
->FIND
->OUTLINE
->ROOT
== goalx
))
9957 line
->TYPE
|= TTV_LINE_RC
;
9961 if((line
->ROOT
->ROOT
->TYPE
& TTV_SIG_R
) == TTV_SIG_R
)
9963 if((avnodex
->FIND
->OUTLINE
->TYPE
& TTV_LINE_EV
) == TTV_LINE_EV
)
9964 line
->TYPE
|= TTV_LINE_EV
;
9965 if((avnodex
->FIND
->OUTLINE
->TYPE
& TTV_LINE_PR
) == TTV_LINE_PR
)
9966 line
->TYPE
|= TTV_LINE_PR
;
9969 if(((line
->ROOT
->ROOT
->TYPE
& TTV_SIG_LR
) == TTV_SIG_LR
) ||
9970 ((line
->ROOT
->ROOT
->TYPE
& TTV_SIG_LS
) == TTV_SIG_LS
))
9972 if((avnodex
->FIND
->OUTLINE
->TYPE
& TTV_LINE_S
) == TTV_LINE_S
)
9973 line
->TYPE
|= TTV_LINE_S
;
9974 if((avnodex
->FIND
->OUTLINE
->TYPE
& TTV_LINE_R
) == TTV_LINE_R
)
9975 line
->TYPE
|= TTV_LINE_R
;
9978 if((goalx
->ROOT
->TYPE
& TTV_SIG_L
) == TTV_SIG_L
)
9980 ptype_list
*ptypecmd
;
9982 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
9984 ptypecmd
= ttv_addcmd(line
,TTV_LINE_CMDMAX
,
9985 ttv_getlinecmd(ttvfig
,avnodex
->FIND
->OUTLINE
,TTV_LINE_CMDMAX
)) ;
9989 ptypecmd
= ttv_addcmd(line
,TTV_LINE_CMDMIN
,
9990 ttv_getlinecmd(ttvfig
,avnodex
->FIND
->OUTLINE
,TTV_LINE_CMDMIN
)) ;
9994 node
->FIND
->TYPE
&= ~(TTV_FIND_BEGIN
) ;
9995 node
->USER
= delptype(node
->USER
,TTV_NODE_IN
) ;
9997 freechain((chain_list
*)ptype
->DATA
) ;
9998 goalx
->USER
= delptype(goalx
->USER
,TTV_NODE_INCHAIN
) ;
10000 for(chain
= inchain
; chain
!= NULL
; chain
= chain
->NEXT
)
10002 ((ttvevent_list
*)chain
->DATA
)->TYPE
&= ~(TTV_NODE_MARQUE
) ;
10004 goal
->TYPE
&= ~(TTV_NODE_MARQUE
) ;
10006 freechain(chainout
);
10007 freechain(inchain
);
10010 /*****************************************************************************/
10011 /* function ttv_builtpath() */
10013 /* ttvfig : ttvfig courante */
10014 /* type : type de recherche */
10016 /* construit tout les chemins d'une ttvfig a partir des arcs elementaires */
10017 /*****************************************************************************/
10018 void ttv_builtpath(ttvfig
,type
)
10019 ttvfig_list
*ttvfig
;
10023 ttvlbloc_list
*ptlbloc
[3] ;
10024 ttvline_list
*ptline
;
10025 ttvline_list
*ptlinex
;
10026 chain_list
*chainfree
= NULL
;
10027 chain_list
*chain
;
10028 chain_list
*chainc
;
10036 if((ttvfig
->STATUS
& TTV_STS_DUAL
) != (long)0)
10037 ttv_freedualline(ttvfig
,TTV_STS_DUAL
) ;
10039 type
&= ~(TTV_FIND_MAX
| TTV_FIND_MIN
| TTV_FIND_DUAL
| TTV_FIND_HZ
) ;
10041 if((((ttvfig
->STATUS
& TTV_STS_DTX
) != TTV_STS_DTX
) &&
10042 ((type
& TTV_FIND_LINE
) == TTV_FIND_LINE
)) ||
10043 (((ttvfig
->STATUS
& TTV_STS_TTX
) != TTV_STS_TTX
) &&
10044 ((type
& TTV_FIND_PATH
) == TTV_FIND_PATH
)))
10047 ttv_error(31,ttvfig
->INFO
->FIGNAME
,TTV_WARNING
) ;
10051 for(i
= 0 ; i
< ttvfig
->NBCONSIG
; i
++)
10053 sig
= *(ttvfig
->CONSIG
+ i
) ;
10054 if(((sig
->TYPE
& TTV_SIG_LR
) == TTV_SIG_LR
) ||
10055 ((sig
->TYPE
& TTV_SIG_LS
) == TTV_SIG_LS
))
10057 if((sig
->TYPE
& TTV_SIG_CO
) == TTV_SIG_CO
)
10059 if((sig
->TYPE
& TTV_SIG_L
) == TTV_SIG_L
)
10060 chainc
= ttv_getlrcmd(ttvfig
,sig
) ;
10061 else chainc
= NULL
;
10063 chainc
= addchain(chainc
,NULL
) ;
10064 for(chain
= chainc
; chain
!= NULL
; chain
= chain
->NEXT
)
10066 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,(ttvevent_list
*)chain
->DATA
,type
|TTV_FIND_MAX
,
10067 ttvfig
->INFO
->LEVEL
),sig
->NODE
,NULL
,type
|TTV_FIND_MAX
) ;
10068 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,(ttvevent_list
*)chain
->DATA
,type
|TTV_FIND_MAX
,
10069 ttvfig
->INFO
->LEVEL
),sig
->NODE
+1,NULL
,type
|TTV_FIND_MAX
) ;
10070 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,(ttvevent_list
*)chain
->DATA
,type
|TTV_FIND_MIN
,
10071 ttvfig
->INFO
->LEVEL
),sig
->NODE
,NULL
,type
|TTV_FIND_MIN
) ;
10072 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,(ttvevent_list
*)chain
->DATA
,type
|TTV_FIND_MIN
,
10073 ttvfig
->INFO
->LEVEL
),sig
->NODE
+1,NULL
,type
|TTV_FIND_MIN
) ;
10075 freechain(chainc
) ;
10076 if(((sig
->TYPE
& TTV_SIG_CT
) == TTV_SIG_CT
) ||
10077 ((sig
->TYPE
& TTV_SIG_CZ
) == TTV_SIG_CZ
))
10079 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,NULL
,type
|TTV_FIND_MAX
|TTV_FIND_HZ
,
10080 ttvfig
->INFO
->LEVEL
),sig
->NODE
,NULL
,type
|TTV_FIND_MAX
|TTV_FIND_HZ
) ;
10081 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,NULL
,type
|TTV_FIND_MAX
|TTV_FIND_HZ
,
10082 ttvfig
->INFO
->LEVEL
),sig
->NODE
+1,NULL
,type
|TTV_FIND_MAX
|TTV_FIND_HZ
) ;
10083 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,NULL
,type
|TTV_FIND_MIN
|TTV_FIND_HZ
,
10084 ttvfig
->INFO
->LEVEL
),sig
->NODE
,NULL
,type
|TTV_FIND_MIN
|TTV_FIND_HZ
) ;
10085 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,NULL
,type
|TTV_FIND_MIN
|TTV_FIND_HZ
,
10086 ttvfig
->INFO
->LEVEL
),sig
->NODE
+1,NULL
,type
|TTV_FIND_MIN
|TTV_FIND_HZ
) ;
10091 if((type
& TTV_FIND_HIER
) == TTV_FIND_HIER
)
10092 for(i
= 0 ; i
< ttvfig
->NBNCSIG
; i
++)
10094 sig
= *(ttvfig
->NCSIG
+ i
) ;
10095 if(((sig
->TYPE
& TTV_SIG_LR
) == TTV_SIG_LR
) ||
10096 ((sig
->TYPE
& TTV_SIG_LS
) == TTV_SIG_LS
))
10098 if((sig
->TYPE
& TTV_SIG_L
) == TTV_SIG_L
)
10099 chainc
= ttv_getlrcmd(ttvfig
,sig
) ;
10100 else chainc
= NULL
;
10102 chainc
= addchain(chainc
,NULL
) ;
10103 for(chain
= chainc
; chain
!= NULL
; chain
= chain
->NEXT
)
10105 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,(ttvevent_list
*)chain
->DATA
,type
|TTV_FIND_MAX
,
10106 ttvfig
->INFO
->LEVEL
),sig
->NODE
,NULL
,type
|TTV_FIND_MAX
) ;
10107 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,(ttvevent_list
*)chain
->DATA
,type
|TTV_FIND_MAX
,
10108 ttvfig
->INFO
->LEVEL
),sig
->NODE
+1,NULL
,type
|TTV_FIND_MAX
) ;
10109 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,(ttvevent_list
*)chain
->DATA
,type
|TTV_FIND_MIN
,
10110 ttvfig
->INFO
->LEVEL
),sig
->NODE
,NULL
,type
|TTV_FIND_MIN
) ;
10111 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,(ttvevent_list
*)chain
->DATA
,type
|TTV_FIND_MIN
,
10112 ttvfig
->INFO
->LEVEL
),sig
->NODE
+1,NULL
,type
|TTV_FIND_MIN
) ;
10114 freechain(chainc
) ;
10117 for(i
= 0 ; i
< ttvfig
->NBELCMDSIG
+ ttvfig
->NBILCMDSIG
; i
++)
10119 sig
= (i
< ttvfig
->NBELCMDSIG
) ? *(ttvfig
->ELCMDSIG
+ i
)
10120 : *(ttvfig
->ILCMDSIG
+ i
- ttvfig
->NBELCMDSIG
) ;
10121 if((sig
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) == 0)
10123 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,NULL
,type
|TTV_FIND_MAX
,
10124 ttvfig
->INFO
->LEVEL
),sig
->NODE
,NULL
,type
|TTV_FIND_MAX
) ;
10125 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,NULL
,type
|TTV_FIND_MAX
,
10126 ttvfig
->INFO
->LEVEL
),sig
->NODE
+1,NULL
,type
|TTV_FIND_MAX
) ;
10127 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,NULL
,type
|TTV_FIND_MIN
,
10128 ttvfig
->INFO
->LEVEL
),sig
->NODE
,NULL
,type
|TTV_FIND_MIN
) ;
10129 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,NULL
,type
|TTV_FIND_MIN
,
10130 ttvfig
->INFO
->LEVEL
),sig
->NODE
+1,NULL
,type
|TTV_FIND_MIN
) ;
10134 for(i
= 0 ; i
< ttvfig
->NBELATCHSIG
+ ttvfig
->NBILATCHSIG
; i
++)
10136 sig
= (i
< ttvfig
->NBELATCHSIG
) ? *(ttvfig
->ELATCHSIG
+ i
)
10137 : *(ttvfig
->ILATCHSIG
+ i
- ttvfig
->NBELATCHSIG
) ;
10138 chainc
= ttv_getlrcmd(ttvfig
,sig
) ;
10140 chainc
= addchain(chainc
,NULL
) ;
10141 for(chain
= chainc
; chain
!= NULL
; chain
= chain
->NEXT
)
10143 if(((sig
->TYPE
& TTV_SIG_LR
) == TTV_SIG_LR
) ||
10144 ((sig
->TYPE
& TTV_SIG_LS
) == TTV_SIG_LS
))
10146 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,
10147 (ttvevent_list
*)chain
->DATA
,type
|TTV_FIND_MAX
|TTV_FIND_R
,
10148 ttvfig
->INFO
->LEVEL
),sig
->NODE
,(ttvevent_list
*)chain
->DATA
,
10149 type
|TTV_FIND_MAX
|TTV_FIND_R
) ;
10150 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,
10151 (ttvevent_list
*)chain
->DATA
,type
|TTV_FIND_MAX
|TTV_FIND_R
,
10152 ttvfig
->INFO
->LEVEL
),sig
->NODE
+1,(ttvevent_list
*)chain
->DATA
,
10153 type
|TTV_FIND_MAX
|TTV_FIND_R
) ;
10154 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,
10155 (ttvevent_list
*)chain
->DATA
,type
|TTV_FIND_MIN
|TTV_FIND_R
,
10156 ttvfig
->INFO
->LEVEL
),sig
->NODE
,(ttvevent_list
*)chain
->DATA
,
10157 type
|TTV_FIND_MIN
|TTV_FIND_R
) ;
10158 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,
10159 (ttvevent_list
*)chain
->DATA
,type
|TTV_FIND_MIN
|TTV_FIND_R
,
10160 ttvfig
->INFO
->LEVEL
),sig
->NODE
+1,(ttvevent_list
*)chain
->DATA
,
10161 type
|TTV_FIND_MIN
|TTV_FIND_R
) ;
10162 typers
= TTV_FIND_S
;
10165 typers
= (long)0 ; ;
10166 if(((sig
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) == 0) || (typers
== TTV_FIND_S
))
10168 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,(ttvevent_list
*)chain
->DATA
,type
|TTV_FIND_MAX
|typers
,
10169 ttvfig
->INFO
->LEVEL
),sig
->NODE
,
10170 (ttvevent_list
*)chain
->DATA
,
10171 type
|TTV_FIND_MAX
|typers
) ;
10172 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,(ttvevent_list
*)chain
->DATA
,type
|TTV_FIND_MAX
|typers
,
10173 ttvfig
->INFO
->LEVEL
),sig
->NODE
+1,
10174 (ttvevent_list
*)chain
->DATA
,
10175 type
|TTV_FIND_MAX
|typers
) ;
10176 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,(ttvevent_list
*)chain
->DATA
,type
|TTV_FIND_MIN
|typers
,
10177 ttvfig
->INFO
->LEVEL
),sig
->NODE
,
10178 (ttvevent_list
*)chain
->DATA
,
10179 type
|TTV_FIND_MIN
|typers
) ;
10180 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,(ttvevent_list
*)chain
->DATA
,type
|TTV_FIND_MIN
|typers
,
10181 ttvfig
->INFO
->LEVEL
),sig
->NODE
+1,
10182 (ttvevent_list
*)chain
->DATA
,
10183 type
|TTV_FIND_MIN
|typers
) ;
10186 freechain(chainc
) ;
10189 for(i
= 0 ; i
< ttvfig
->NBEPRESIG
+ ttvfig
->NBIPRESIG
; i
++)
10191 sig
= (i
< ttvfig
->NBEPRESIG
) ? *(ttvfig
->EPRESIG
+ i
)
10192 : *(ttvfig
->IPRESIG
+ i
- ttvfig
->NBEPRESIG
) ;
10193 if((sig
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) == 0)
10195 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,NULL
,type
|TTV_FIND_MAX
,
10196 ttvfig
->INFO
->LEVEL
),sig
->NODE
,NULL
,type
|TTV_FIND_MAX
) ;
10197 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,NULL
,type
|TTV_FIND_MAX
,
10198 ttvfig
->INFO
->LEVEL
),sig
->NODE
+1,NULL
,type
|TTV_FIND_MAX
) ;
10200 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,
10201 NULL
,type
|TTV_FIND_MAX
|TTV_FIND_HZ
,ttvfig
->INFO
->LEVEL
),sig
->NODE
,
10202 NULL
,type
|TTV_FIND_MAX
|TTV_FIND_HZ
) ;
10203 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,
10204 NULL
,type
|TTV_FIND_MAX
|TTV_FIND_HZ
,ttvfig
->INFO
->LEVEL
),sig
->NODE
+1,
10205 NULL
,type
|TTV_FIND_MAX
|TTV_FIND_HZ
) ;
10206 if((sig
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) == 0)
10208 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,NULL
,type
|TTV_FIND_MIN
,
10209 ttvfig
->INFO
->LEVEL
),sig
->NODE
,NULL
,type
|TTV_FIND_MIN
) ;
10210 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,NULL
,type
|TTV_FIND_MIN
,
10211 ttvfig
->INFO
->LEVEL
),sig
->NODE
+1,NULL
,type
|TTV_FIND_MIN
) ;
10213 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,NULL
,
10214 type
|TTV_FIND_MIN
|TTV_FIND_HZ
,ttvfig
->INFO
->LEVEL
),sig
->NODE
,
10215 NULL
,type
|TTV_FIND_MIN
|TTV_FIND_HZ
) ;
10216 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,NULL
,
10217 type
|TTV_FIND_MIN
|TTV_FIND_HZ
,ttvfig
->INFO
->LEVEL
),sig
->NODE
+1,
10218 NULL
,type
|TTV_FIND_MIN
|TTV_FIND_HZ
) ;
10221 for(i
= 0 ; i
< ttvfig
->NBEBREAKSIG
+ ttvfig
->NBIBREAKSIG
; i
++)
10223 sig
= (i
< ttvfig
->NBEBREAKSIG
) ? *(ttvfig
->EBREAKSIG
+ i
)
10224 : *(ttvfig
->IBREAKSIG
+ i
- ttvfig
->NBEBREAKSIG
) ;
10225 if((sig
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) == 0)
10227 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,NULL
,type
|TTV_FIND_MAX
,
10228 ttvfig
->INFO
->LEVEL
),sig
->NODE
,NULL
,type
|TTV_FIND_MAX
) ;
10229 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,NULL
,type
|TTV_FIND_MAX
,
10230 ttvfig
->INFO
->LEVEL
),sig
->NODE
+1,NULL
,type
|TTV_FIND_MAX
) ;
10231 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,NULL
,type
|TTV_FIND_MIN
,
10232 ttvfig
->INFO
->LEVEL
),sig
->NODE
,NULL
,type
|TTV_FIND_MIN
) ;
10233 ttv_addpath(ttvfig
,ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,NULL
,type
|TTV_FIND_MIN
,
10234 ttvfig
->INFO
->LEVEL
),sig
->NODE
+1,NULL
,type
|TTV_FIND_MIN
) ;
10239 ttvfig
->STATUS
|= TTV_STS_TTX
;
10243 ptlbloc
[0] = ttvfig
->FBLOC
;
10244 ptlbloc
[1] = ttvfig
->EBLOC
;
10245 ptlbloc
[2] = ttvfig
->DBLOC
;
10246 for(i
= 0 ; i
< 3 ; i
++)
10247 for( ; ptlbloc
[i
] != NULL
; ptlbloc
[i
] = ptlbloc
[i
]->NEXT
)
10249 for(j
= 0 ; j
< TTV_MAX_LBLOC
; j
++)
10251 ptline
= ptlbloc
[i
]->LINE
+ j
;
10252 if((ptline
->TYPE
& TTV_LINE_FR
) == TTV_LINE_FR
)
10255 if((type
& TTV_FIND_LINE
) == TTV_FIND_LINE
)
10257 if((ptline
->TYPE
& TTV_LINE_DEPTMAX
) == TTV_LINE_DEPTMAX
)
10258 ptline
->TYPE
&= ~(TTV_LINE_DEPTMAX
) ;
10260 ptline
->TYPE
|= TTV_LINE_DENPTMAX
;
10261 if((ptline
->TYPE
& TTV_LINE_DEPTMIN
) == TTV_LINE_DEPTMIN
)
10262 ptline
->TYPE
&= ~(TTV_LINE_DEPTMIN
) ;
10264 ptline
->TYPE
|= TTV_LINE_DENPTMIN
;
10266 if((ptline
->TYPE
& TTV_LINE_CONT
) == TTV_LINE_CONT
)
10268 if((ptline
->TYPE
& TTV_LINE_D
) == TTV_LINE_D
)
10270 ptlinex
= ttv_addline(ttvfig
,ptline
->ROOT
,ptline
->NODE
,
10271 ttv_getdelaymax(ptline
),ttv_getslopemax(ptline
),
10272 ttv_getdelaymin(ptline
),ttv_getslopemin(ptline
),
10273 TTV_LINE_T
|TTV_LINE_CONT
|
10274 (ptline
->TYPE
& (TTV_LINE_A
|TTV_LINE_U
|TTV_LINE_O
))) ;
10275 ttv_addcaracline(ptlinex
,ptline
->MDMAX
,ptline
->MDMIN
,
10276 ptline
->MFMAX
,ptline
->MFMIN
) ;
10280 ptlinex
= ttv_addline(ttvfig
,ptline
->ROOT
,ptline
->NODE
,
10281 ttv_getdelaymax(ptline
),ttv_getslopemax(ptline
),
10282 ttv_getdelaymin(ptline
),ttv_getslopemin(ptline
),
10283 TTV_LINE_J
|TTV_LINE_CONT
|
10284 (ptline
->TYPE
& (TTV_LINE_A
|TTV_LINE_U
|TTV_LINE_O
))) ;
10286 if((ptline
->ROOT
->ROOT
->TYPE
& TTV_SIG_L
) == TTV_SIG_L
)
10288 ttv_addcmd(ptlinex
,TTV_LINE_CMDMAX
,
10289 ttv_getlinecmd(ttvfig
,ptline
,TTV_LINE_CMDMAX
)) ;
10290 ttv_addcmd(ptlinex
,TTV_LINE_CMDMIN
,
10291 ttv_getlinecmd(ttvfig
,ptline
,TTV_LINE_CMDMIN
)) ;
10298 if((type
& TTV_FIND_PATH
) == TTV_FIND_PATH
)
10300 ptlbloc
[2] = ttvfig
->TBLOC
;
10301 ptlbloc
[1] = ttvfig
->PBLOC
;
10302 ptlbloc
[0] = ttvfig
->JBLOC
;
10303 for(i
= 0 ; i
< 3 ; i
++)
10304 for(; ptlbloc
[i
] != NULL
; ptlbloc
[i
] = ptlbloc
[i
]->NEXT
)
10306 for(j
= 0 ; j
< TTV_MAX_LBLOC
; j
++)
10308 ptline
= ptlbloc
[i
]->LINE
+ j
;
10309 if((ptline
->TYPE
& TTV_LINE_FR
) == TTV_LINE_FR
)
10312 if(((ptline
->NODE
->ROOT
->TYPE
& TTV_SIG_S
) == TTV_SIG_S
) ||
10313 ((ptline
->ROOT
->ROOT
->TYPE
& TTV_SIG_S
) == TTV_SIG_S
) ||
10314 /* pour le pb des commandes
10315 ((ptline->NODE->ROOT->TYPE & (TTV_SIG_Q | TTV_SIG_C | TTV_SIG_N))
10318 (((ptline
->TYPE
& TTV_LINE_INFIG
) != TTV_LINE_INFIG
) &&
10319 ((ptline
->TYPE
& TTV_LINE_CONT
) != TTV_LINE_CONT
)))
10321 if((ptline
->TYPE
& TTV_LINE_T
) == TTV_LINE_T
)
10323 if(ptline
->MDMAX
!= NULL
)
10324 chainfree
= addchain(chainfree
,ptline
->MDMAX
) ;
10325 if(ptline
->MFMAX
!= NULL
)
10326 chainfree
= addchain(chainfree
,ptline
->MFMAX
) ;
10327 if(ptline
->MDMIN
!= NULL
)
10328 chainfree
= addchain(chainfree
,ptline
->MDMIN
) ;
10329 if(ptline
->MFMIN
!= NULL
)
10330 chainfree
= addchain(chainfree
,ptline
->MFMIN
) ;
10333 ttv_delline(ptline
) ;
10337 ptline
->TYPE
&= ~(TTV_LINE_INFIG
) ;
10342 if(chainfree
!= NULL
)
10344 stm_freemodellist(ttvfig
->INFO
->FIGNAME
,chainfree
) ;
10345 freechain(chainfree
) ;
10349 void ttv_FreeMarkedSigList()
10352 while (MARKED_SIG_LIST
!=NULL
)
10354 tvs
=(ttvsig_list
*)MARKED_SIG_LIST
->DATA
;
10355 if (getptype(tvs
->USER
, TTV_SIG_MARKED
)==NULL
)
10357 tvs
->USER
=delptype(tvs
->USER
, TTV_SIG_MARKED
);
10359 MARKED_SIG_LIST
=delchain(MARKED_SIG_LIST
, MARKED_SIG_LIST
);
10363 static int marked_for(ttvevent_list
*evi
, ttvevent_list
*evo
, int hz
)
10367 if (evo
->TYPE
& TTV_NODE_UP
) mask
=1; else mask
=2;
10368 if (hz
) mask
=mask
<<8;
10369 if ((pt
=getptype(evi
->USER
, TTV_SIG_MARKED
))!=NULL
&& ((long)pt
->DATA
& mask
)!=0) return 1;
10373 static void mark_for(ttvevent_list
*evi
, ttvevent_list
*evo
, int hz
)
10377 if (evo
->TYPE
& TTV_NODE_UP
) mask
=1; else mask
=2;
10378 if (hz
) mask
=mask
<<8;
10379 if ((pt
=getptype(evi
->USER
, TTV_SIG_MARKED
))==NULL
)
10380 pt
=evi
->USER
=addptype(evi
->USER
, TTV_SIG_MARKED
, (void *)0);
10381 mask
|=(long)pt
->DATA
;
10382 pt
->DATA
=(void *)mask
;
10385 ttvpath_list
*filter_parallel_to_node(ttvpath_list
*pth
)
10387 ttvpath_list
*path
, *next
;
10388 chain_list
*cl
=NULL
, *ch
;
10390 for (path
=pth
; path
!=NULL
; path
=next
)
10393 if ((path
->TYPE
& TTV_FIND_HZ
)==TTV_FIND_HZ
) hz
=1;
10395 if (!marked_for(path
->NODE
, path
->ROOT
, hz
))
10397 cl
=addchain(cl
, path
);
10398 mark_for(path
->NODE
, path
->ROOT
, hz
);
10403 ttv_freepathlist(path
);
10408 for (ch
=cl
; ch
!=NULL
; ch
=ch
->NEXT
)
10410 pth
=(ttvpath_list
*)ch
->DATA
;
10412 pth
->NODE
->USER
=testanddelptype(pth
->NODE
->USER
, TTV_SIG_MARKED
);
10422 ttvpath_list
*ttv_getpathnocross_v2(ttvfig
,figpath
,ptsig
,mask
,delaymax
,delaymin
,type
,addasync
)
10423 ttvfig_list
*ttvfig
;
10424 ttvfig_list
*figpath
;
10425 ttvsig_list
*ptsig
;
10432 ttvpath_list
*path
;
10434 ttv_reset_search_informations();
10435 if (addasync
) ttv_search_mode(1, TTV_MORE_OPTIONS_ADD_ASYNCHRONOUS_PATHS
);
10437 path
= ttv_getpathnocross (ttvfig
, figpath
, ptsig
, mask
, delaymax
, delaymin
, type
);
10439 if (ttv_get_search_informations() & TTV_SEARCH_INFORMATIONS_CRITIC_FALSEPATH
)
10441 ttv_freepathlist(path
);
10442 path
= ttv_getpathsignocross (ttvfig
, figpath
, ptsig
, mask
, delaymax
, delaymin
, type
);
10443 path
=filter_parallel_to_node(path
);
10445 if (addasync
) ttv_search_mode(0, TTV_MORE_OPTIONS_ADD_ASYNCHRONOUS_PATHS
);
10449 ttvpath_list
*ttv_getaccessnocross_v2(ttvfig
,figpath
,ptsig
,mask
,delaymax
,delaymin
,type
,addasync
)
10450 ttvfig_list
*ttvfig
;
10451 ttvfig_list
*figpath
;
10452 ttvsig_list
*ptsig
;
10459 ttvpath_list
*path
;
10461 ttv_reset_search_informations();
10462 if (addasync
) ttv_search_mode(1, TTV_MORE_OPTIONS_ADD_ASYNCHRONOUS_PATHS
);
10464 path
= ttv_getaccessnocross (ttvfig
, figpath
, ptsig
, mask
, delaymax
, delaymin
, type
);
10466 if (ttv_get_search_informations() & TTV_SEARCH_INFORMATIONS_CRITIC_FALSEPATH
)
10468 ttv_freepathlist(path
);
10469 path
= ttv_getaccesssignocross (ttvfig
, figpath
, ptsig
, mask
, delaymax
, delaymin
, type
);
10470 path
=filter_parallel_to_node(path
);
10472 if (addasync
) ttv_search_mode(0, TTV_MORE_OPTIONS_ADD_ASYNCHRONOUS_PATHS
);
10476 chain_list
*ttv_getendpoints(ttvfig_list
*tvf
, chain_list
*sigl
, long type
)
10478 chain_list
*sub
, *cl
, *lst
, *ret
=NULL
;
10479 ttvevent_list
*tve
;
10481 int maxperiod
, savmpd
;
10483 if ((type
& TTV_FIND_DUAL
)!=0) type
|=TTV_FIND_CMD
;
10485 maxperiod
= V_INT_TAB
[__TTV_MAX_PATH_PERIOD
].VALUE
;
10486 savmpd
=TTV_MaxPathPeriodPrecharge
;
10488 V_INT_TAB
[__TTV_MAX_PATH_PERIOD
].VALUE
= 0 ;
10489 TTV_MaxPathPeriodPrecharge
=0;
10491 for (lst
=sigl
; lst
!=NULL
; lst
=lst
->NEXT
)
10493 sig
=(ttvsig_list
*)lst
->DATA
;
10494 sub
= ttv_findpath(tvf
,tvf
,sig
->NODE
,NULL
,type
,tvf
->INFO
->LEVEL
) ;
10495 for(cl
= sub
; cl
!= NULL
; cl
= cl
->NEXT
)
10497 tve
=(ttvevent_list
*)cl
->DATA
;
10498 tve
->FIND
->TYPE
&= ~TTV_FIND_BEGIN
;
10499 if ((tve
->ROOT
->TYPE
& TTV_SIG_MARQUE
)==0) ret
=addchain(ret
, tve
->ROOT
);
10500 tve
->ROOT
->TYPE
|=TTV_SIG_MARQUE
;
10504 sub
= ttv_findpath(tvf
,tvf
,sig
->NODE
+1,NULL
,type
,tvf
->INFO
->LEVEL
) ;
10505 for(cl
= sub
; cl
!= NULL
; cl
= cl
->NEXT
)
10507 tve
=(ttvevent_list
*)cl
->DATA
;
10508 tve
->FIND
->TYPE
&= ~TTV_FIND_BEGIN
;
10509 if ((tve
->ROOT
->TYPE
& TTV_SIG_MARQUE
)==0) ret
=addchain(ret
, tve
->ROOT
);
10510 tve
->ROOT
->TYPE
|=TTV_SIG_MARQUE
;
10515 for (cl
=ret
; cl
!=NULL
; cl
=cl
->NEXT
)
10516 ((ttvsig_list
*)cl
->DATA
)->TYPE
&=~TTV_SIG_MARQUE
;
10517 V_INT_TAB
[__TTV_MAX_PATH_PERIOD
].VALUE
= maxperiod
;
10518 TTV_MaxPathPeriodPrecharge
=savmpd
;
10522 static ttvcritic_list
*ttv_create_one_node_critic(ttvfig_list
*ttvfig
,ttvfig_list
*ttvins
, ttvevent_list
*node
, long type
)
10524 ttvcritic_list
*critic
;
10529 newslope
= (long)ttv_getnodeslope(ttvfig
,ttvins
,node
,&slope
,type
) ;
10530 start
= ttv_getinittime(ttvfig
,node
,STB_NO_INDEX
,type
,STB_NO_INDEX
,NULL
) ;
10531 critic
= ttv_alloccritic(NULL
,ttvfig
,NULL
,node
,type
,0,start
,slope
,start
,newslope
,0,NULL
,NULL
) ;
10533 critic
->NODE_FLAG
|=TTV_NODE_FLAG_FIRST_OF_DETAIL
;
10537 ttvpath_list
*ttv_create_one_node_path(ttvfig_list
*ttvfig
,ttvfig_list
*ttvins
,ttvevent_list
*node
,long type
)
10539 ttvfig_list
*ttvfigx
;
10540 long startsref
= 0, starts
, start
;
10541 ttvpath_list
*path
;
10544 ttvfigx
= node
->ROOT
->ROOT
;
10546 starts
= ttv_getnodeslope(ttvfig
,ttvins
,node
,&startsref
,type
) ;
10547 start
= ttv_getinittime(ttvfig
,node
,STB_NO_INDEX
,type
,STB_NO_INDEX
,&phase
) ;
10548 path
= ttv_allocpath(NULL
,ttvfigx
,node
,node
,NULL
,
10549 NULL
,NULL
,NULL
,0,0,0,
10552 start
,starts
,NULL
,NULL
, TTV_NOTIME
,phase
,0) ;
10554 path
->CRITIC
= ttv_create_one_node_critic(ttvfig
,ttvins
,node
,type
) ;