5 #include "stb_falseslack.h"
8 typedef struct stbfalsepath
10 struct stbfalsepath
*NEXT
;
25 stbfalseslack_list
*WILDCARDS
, *NOWILDCARDS
;
26 ht
*START_HASH
, *END_HASH
;
32 chain_list
*FALSESLACK_WILDCARD
, *FALSESLACK_NOWILDCARD
;
35 static int stb_falseslack_match_name(ttvfig_list
*tvf
, ttvsig_list
*tvs
, char *regex
)
38 if (mbk_TestREGEX(ttv_getsigname(tvf
, buf
, tvs
),regex
)) return 1;
39 if (mbk_TestREGEX(ttv_getnetname(tvf
, buf
, tvs
),regex
)) return 1;
43 static inline void *getkey_forsignal(ttvsig_list
*tvs
)
48 ht
*stb_buildquickaccessht_forfalsepath(ttvfig_list
*ttvfig
, NameAllocator
*NA
)
52 char buf
[1024], *nname
;
58 CreateNameAllocator(10000, NA
, CASE_SENSITIVE
);
60 chainsig
= ttv_getsigbytype(ttvfig
,NULL
,TTV_SIG_C
|
67 while (chainsig
!=NULL
)
69 tvs
=(ttvsig_list
*)chainsig
->DATA
;
71 ttv_getnetname(ttvfig
, buf
, tvs
);
72 nname
=NameAlloc(NA
, buf
);
73 if ((l
=gethtitem(h
, nname
))==EMPTYHT
) cl
=NULL
;
74 else cl
=(chain_list
*)l
;
76 addhtitem(h
, nname
, (long)addchain(cl
, tvs
));
78 ttv_getsigname(ttvfig
, buf
, tvs
);
79 if (mbk_casestrcmp(nname
, buf
)!=0 && (nname
=namefind(buf
))!=NULL
)
80 addhtitem(h
, nname
, (long)tvs
);
82 chainsig
=delchain(chainsig
, chainsig
);
87 void stb_freeequickaccessht_forfalsepath(ht
*h
, NameAllocator
*NA
)
92 scanhtkey( h
, 1, &nextkey
, &nextitem
) ;
93 while( nextitem
!= EMPTYHT
)
95 if (NameAllocFind(NA
, nextkey
)!=NULL
)
96 freechain( (chain_list
*)nextitem
) ;
97 scanhtkey( h
, 0, &nextkey
, &nextitem
) ;
103 static int stb_addfalsepath_entry_in_hash_table(ttvfig_list
*ttvfig
, ht
*destination
, char *sig
, ht
*h
, stbfalseslack_list
*pt
, int wild
, NameAllocator
*NA
)
105 nowildcard_info
*nwi
;
108 char *signame
, buf
[1024];
111 if ((l
=gethtitem(h
, sig
))!=EMPTYHT
|| ((signame
=NameAllocFind(NA
, sig
))!=NULL
&& (l1
=gethtitem(h
, signame
))!=EMPTYHT
))
115 ttv_getnetname(ttvfig
, buf
, (ttvsig_list
*)l
);
116 signame
=NameAllocFind(NA
, buf
);
117 if (signame
!=NULL
) l1
=gethtitem(h
, signame
);
122 for (cl
=(chain_list
*)l1
; cl
!=NULL
; cl
=cl
->NEXT
)
124 ptsig
=(ttvsig_list
*)cl
->DATA
;
126 if ((l
=gethtitem(destination
, getkey_forsignal(ptsig
)))==EMPTYHT
)
128 nwi
=(nowildcard_info
*)mbkalloc(sizeof(nowildcard_info
));
130 nwi
->FALSESLACK_NOWILDCARD
=nwi
->FALSESLACK_WILDCARD
=NULL
;
131 addhtitem(destination
, getkey_forsignal(ptsig
), (long)nwi
);
135 nwi
=(nowildcard_info
*)l
;
138 if (wild
) nwi
->FALSESLACK_WILDCARD
=addchain(nwi
->FALSESLACK_WILDCARD
, pt
);
139 else nwi
->FALSESLACK_NOWILDCARD
=addchain(nwi
->FALSESLACK_NOWILDCARD
, pt
);
143 else avt_errmsg(STB_ERRMSG
, "042", AVT_WARNING
, mbk_get_reverse_index_regex(sig
));
148 /*****************************************************************************/
149 /* function ttv_addfalsepath */
151 /* ttvfig : figure */
153 /* ajoute un faux chemin dans la liste des faux chemins */
154 /*****************************************************************************/
155 void stb_addfalsepath(stbfig_list
*stbfig
, ptype_list
*siglist
, ht
*nametosig
,NameAllocator
*NA
)
157 stbfalseslack_list
*pt
, **whereptype
;
159 falseslack_info
*fpi
;
162 pt
= (stbfalseslack_list
*)mbkalloc(sizeof(stbfalseslack_list
));
164 pt
->setuphold
=((char)siglist
->TYPE
) & (INF_FALSESLACK_SETUP
|INF_FALSESLACK_HOLD
|INF_FALSESLACK_LATCH
);
165 pt
->startclock
=mbk_index_regex((char *)siglist
->DATA
);
166 pt
->startclock_dir
=(char)siglist
->TYPE
;
167 siglist
=siglist
->NEXT
;
168 pt
->startsig
=mbk_index_regex((char *)siglist
->DATA
);
169 pt
->startsig_dir
=(char)siglist
->TYPE
;
170 siglist
=siglist
->NEXT
;
171 pt
->endsig
=mbk_index_regex((char *)siglist
->DATA
);
172 pt
->endsig_dir
=(char)siglist
->TYPE
;
173 siglist
=siglist
->NEXT
;
174 pt
->endclock
=mbk_index_regex((char *)siglist
->DATA
);
175 pt
->endclock_dir
=(char)siglist
->TYPE
;
177 if ((ptype
= getptype(stbfig
->USER
,STB_FIG_FALSESLACK
))==NULL
)
179 fpi
=(falseslack_info
*)mbkalloc(sizeof(falseslack_info
));
180 fpi
->WILDCARDS
=fpi
->NOWILDCARDS
=NULL
;
181 fpi
->START_HASH
=addht(100);
182 fpi
->END_HASH
=addht(100);
183 stbfig
->USER
= addptype(stbfig
->USER
, STB_FIG_FALSESLACK
, fpi
);
186 fpi
=(falseslack_info
*)ptype
->DATA
;
188 if (!mbk_isregex_name(pt
->startsig
)) inw
=0; else inw
=1;
189 if (!mbk_isregex_name(pt
->endsig
)) outw
=0; else outw
=1;
191 whereptype
=&fpi
->NOWILDCARDS
;
193 whereptype
=&fpi
->WILDCARDS
;
195 pt
->NEXT
= *whereptype
;
198 if (!stb_addfalsepath_entry_in_hash_table(stbfig
->FIG
,fpi
->START_HASH
, pt
->startsig
, nametosig
, pt
, outw
, NA
))
202 if (!stb_addfalsepath_entry_in_hash_table(stbfig
->FIG
,fpi
->END_HASH
, pt
->endsig
, nametosig
, pt
, inw
, NA
))
207 /*****************************************************************************/
208 /* function ttv_freefalsepath */
210 /* ttvfig : figure */
212 /* modelise un lien en fonction de sa resistance et son parametre de front */
213 /*****************************************************************************/
215 void stb_freefalseslack(stbfig_list
*stbfig
)
218 falseslack_info
*fpi
;
219 nowildcard_info
*nwi
;
221 stbfalseslack_list
*fpl
, *nfpl
;
223 ptype
= getptype(stbfig
->USER
,STB_FIG_FALSESLACK
) ;
228 fpi
=(falseslack_info
*)ptype
->DATA
;
229 cl
=GetAllHTElems(fpi
->START_HASH
);
232 nwi
=(nowildcard_info
*)cl
->DATA
;
233 freechain(nwi
->FALSESLACK_WILDCARD
);
234 freechain(nwi
->FALSESLACK_NOWILDCARD
);
238 delht(fpi
->START_HASH
);
240 cl
=GetAllHTElems(fpi
->END_HASH
);
243 nwi
=(nowildcard_info
*)cl
->DATA
;
244 freechain(nwi
->FALSESLACK_WILDCARD
);
245 freechain(nwi
->FALSESLACK_NOWILDCARD
);
249 delht(fpi
->END_HASH
);
251 for (fpl
=fpi
->WILDCARDS
; fpl
!=NULL
; fpl
=nfpl
)
257 for (fpl
=fpi
->NOWILDCARDS
; fpl
!=NULL
; fpl
=nfpl
)
264 stbfig
->USER
= delptype(stbfig
->USER
,STB_FIG_FALSESLACK
) ;
267 static int stb_sameevent(char ev
, long type
)
269 if ((ev
& INF_FALSESLACK_UP
)!=0 && (type
& TTV_NODE_UP
)!=0) return 1;
270 if ((ev
& INF_FALSESLACK_DOWN
)!=0 && (type
& TTV_NODE_UP
)==0) return 1;
274 static int check_goodtype(int type
, ttvevent_list
*eventout
)
276 if ((type
& (INF_FALSESLACK_LATCH
|INF_FALSESLACK_PRECH
))==0) return 1;
277 if ((type
& INF_FALSESLACK_LATCH
)!=0 && (eventout
->ROOT
->TYPE
& TTV_SIG_L
)!=0) return 1;
278 if ((type
& INF_FALSESLACK_PRECH
)!=0 && (eventout
->ROOT
->TYPE
& TTV_SIG_R
)!=0) return 1;
282 int stb_isfalseslack(stbfig_list
*stbfig
, ttvevent_list
*startck
, ttvevent_list
*eventin
, ttvevent_list
*eventout
, ttvevent_list
*endck
, int type
)
284 stbfalseslack_list
*pt
;
286 falseslack_info
*fpi
;
289 nowildcard_info
*nwi_start
, *nwi_end
, *orig_nwi_start
, *orig_nwi_end
;
293 if((ptype
= getptype(stbfig
->USER
,STB_FIG_FALSESLACK
)) == NULL
)
296 fpi
=(falseslack_info
*)ptype
->DATA
;
298 // GESTION DES NON WILDCARDS
299 if ((l
=gethtitem(fpi
->START_HASH
, getkey_forsignal(eventin
->ROOT
)))!=EMPTYHT
) nwi_start
=(nowildcard_info
*)l
;
301 if ((l
=gethtitem(fpi
->END_HASH
, getkey_forsignal(eventout
->ROOT
)))!=EMPTYHT
) nwi_end
=(nowildcard_info
*)l
;
304 if ((eventout
->ROOT
->TYPE
& TTV_SIG_R
)!=0 || (eventout
->ROOT
->TYPE
& TTV_SIG_CT
)==TTV_SIG_CT
) maxres
=INF_FALSESLACK_NOTHZ
|INF_FALSESLACK_HZ
;
305 else maxres
=INF_FALSESLACK_NOTHZ
;
307 orig_nwi_start
=nwi_start
;
308 orig_nwi_end
=nwi_end
;
310 if (nwi_end
!=NULL
&& nwi_start
!=NULL
)
312 // on grade la liste la plus courte
314 if (nwi_end
->nb
<nwi_start
->nb
) nwi_start
=nwi_end
, l
=2;
319 if (nwi_start
==NULL
) nwi_start
=nwi_end
, l
=2;
325 if (usew
==0) cl
=nwi_start
->FALSESLACK_NOWILDCARD
;
326 else cl
=nwi_start
->FALSESLACK_WILDCARD
;
330 pt
=(stbfalseslack_list
*)cl
->DATA
;
331 if ((pt
->setuphold
& type
)!=0 && check_goodtype(pt
->setuphold
,eventout
))
333 if(stb_sameevent(pt
->startsig_dir
, eventin
->TYPE
) && stb_sameevent(pt
->endsig_dir
, eventout
->TYPE
) &&
334 (startck
==NULL
|| stb_sameevent(pt
->startclock_dir
, startck
->TYPE
)) &&
335 (endck
==NULL
|| stb_sameevent(pt
->endclock_dir
, endck
->TYPE
)))
337 if(((l
==2 && stb_falseslack_match_name(stbfig
->FIG
, eventin
->ROOT
, pt
->startsig
))
338 || (l
==1 && stb_falseslack_match_name(stbfig
->FIG
, eventout
->ROOT
,pt
->endsig
)))
339 && (startck
==NULL
|| stb_falseslack_match_name(stbfig
->FIG
, startck
->ROOT
,pt
->startclock
))
340 && (endck
==NULL
|| stb_falseslack_match_name(stbfig
->FIG
, endck
->ROOT
,pt
->endclock
)))
342 res
|=(pt
->endsig_dir
& (INF_FALSESLACK_HZ
|INF_FALSESLACK_NOTHZ
));
343 if ((res
& maxres
)==maxres
) return res
;
352 if (orig_nwi_start
!=NULL
) tab
[0]=orig_nwi_start
->FALSESLACK_WILDCARD
; else tab
[0]=NULL
;
353 if (orig_nwi_end
!=NULL
) tab
[1]=orig_nwi_end
->FALSESLACK_WILDCARD
; else tab
[1]=NULL
;
360 pt
=(stbfalseslack_list
*)cl
->DATA
;
361 if ((pt
->setuphold
& type
)!=0 && check_goodtype(pt
->setuphold
,eventout
))
363 if(stb_sameevent(pt
->startsig_dir
, eventin
->TYPE
) && stb_sameevent(pt
->endsig_dir
, eventout
->TYPE
) &&
364 (startck
==NULL
|| stb_sameevent(pt
->startclock_dir
, startck
->TYPE
)) &&
365 (endck
==NULL
|| stb_sameevent(pt
->endclock_dir
, endck
->TYPE
)))
367 if(((l
==2 && stb_falseslack_match_name(stbfig
->FIG
, eventin
->ROOT
, pt
->startsig
))
368 || (l
==1 && stb_falseslack_match_name(stbfig
->FIG
, eventout
->ROOT
,pt
->endsig
)))
369 && (startck
==NULL
|| stb_falseslack_match_name(stbfig
->FIG
, startck
->ROOT
,pt
->startclock
))
370 && (endck
==NULL
|| stb_falseslack_match_name(stbfig
->FIG
, endck
->ROOT
,pt
->endclock
)))
372 res
|=(pt
->endsig_dir
& (INF_FALSESLACK_HZ
|INF_FALSESLACK_NOTHZ
));
373 if ((res
& maxres
)==maxres
) return res
;
383 // GESTION DES WILDCARDS
384 for(pt
= fpi
->WILDCARDS
; pt
!= NULL
; pt
= pt
->NEXT
)
386 if ((pt
->setuphold
& type
)!=0 && check_goodtype(pt
->setuphold
,eventout
))
388 if(stb_sameevent(pt
->startsig_dir
, eventin
->TYPE
) && stb_sameevent(pt
->endsig_dir
, eventout
->TYPE
) &&
389 (startck
==NULL
|| stb_sameevent(pt
->startclock_dir
, startck
->TYPE
)) &&
390 (endck
==NULL
|| stb_sameevent(pt
->endclock_dir
, endck
->TYPE
)))
392 if(stb_falseslack_match_name(stbfig
->FIG
, eventin
->ROOT
, pt
->startsig
)
393 && stb_falseslack_match_name(stbfig
->FIG
, eventout
->ROOT
,pt
->endsig
)
394 && (startck
==NULL
|| stb_falseslack_match_name(stbfig
->FIG
, startck
->ROOT
,pt
->startclock
))
395 && (endck
==NULL
|| stb_falseslack_match_name(stbfig
->FIG
, endck
->ROOT
,pt
->endclock
)))
397 res
|=(pt
->endsig_dir
& (INF_FALSESLACK_HZ
|INF_FALSESLACK_NOTHZ
));
398 if ((res
& maxres
)==maxres
) return res
;
407 void stb_setfalseslack(stbfig_list
*sf
, inffig_list
*ifl
)
414 if (ifl
!=NULL
&& ifl
->LOADED
.INF_FALSESLACK
!=NULL
)
416 nametosig
=stb_buildquickaccessht_forfalsepath(sf
->FIG
, &NA
);
418 for (ch
= ifl
->LOADED
.INF_FALSESLACK
; ch
; ch
= ch
->NEXT
)
420 p
= (ptype_list
*) ch
->DATA
;
421 stb_addfalsepath(sf
, p
, nametosig
, &NA
);
423 stb_freeequickaccessht_forfalsepath(nametosig
, &NA
);
424 DeleteNameAllocator(&NA
);
428 int stb_hasfalseslack(stbfig_list
*stbfig
, ttvevent_list
*eventout
)
430 stbfalseslack_list
*pt
;
432 falseslack_info
*fpi
;
436 if((ptype
= getptype(stbfig
->USER
,STB_FIG_FALSESLACK
)) == NULL
) return(0) ;
438 fpi
=(falseslack_info
*)ptype
->DATA
;
440 if ((l
=gethtitem(fpi
->END_HASH
, getkey_forsignal(eventout
->ROOT
)))!=EMPTYHT
) return 1;
442 for(pt
= fpi
->WILDCARDS
; pt
!= NULL
; pt
= pt
->NEXT
)
444 if(stb_sameevent(pt
->endsig_dir
, eventout
->TYPE
))
446 if(stb_falseslack_match_name(stbfig
->FIG
, eventout
->ROOT
,pt
->endsig
)) return 1;