1 /****************************************************************************/
3 /* Chaine de CAO & VLSI Alliance */
5 /* Produit : TTV Verison 1 */
6 /* Fichier : ttv_fact.c */
8 /* (c) copyright 1995-1998 Laboratoire LIP6 equipe ASIM */
9 /* Tous droits reserves */
10 /* Support : e-mail alliance-support@asim.lip6.fr */
12 /* Auteur(s) : Karim DIOURY */
14 /****************************************************************************/
15 /* factorisation de chemin */
16 /****************************************************************************/
20 chain_list
*TTV_ALLOC_FLINE
= NULL
;
21 chain_list
*TTV_CMPT_NODE
= NULL
;
22 chain_list
*TTV_CMPT_SIGLIST
= NULL
;
23 ttvfline_list
*TTV_FREE_FLINE
= NULL
;
24 long TTV_MAX_FCYCLE
= (long)10 ;
25 long TTV_MAX_FLINE
= (long)0 ;
26 long TTV_MAX_CMPT
= (long)0 ;
28 /*****************************************************************************/
29 /* function ttv_addcouple() */
31 /* node1 : noeud d'entree */
32 /* node : noeud de recherche */
33 /* node2 : noeud de sortie */
35 /* rajoute un couple de noeud a un cmpt */
36 /*****************************************************************************/
37 void ttv_addcouple(node1
,node
,node2
)
38 ttvevent_list
*node1
;
40 ttvevent_list
*node2
;
45 if((node
== NULL
) || (node1
== NULL
) || (node2
== NULL
))
48 cmpt
= ttv_getcmpt(node
) ;
50 if(((node
->TYPE
& TTV_NODE_PFACT
) != TTV_NODE_PFACT
) ||
51 (cmpt
->NBCOUPLE
> (cmpt
->NBNODEIN
+ cmpt
->NBNODEOUT
+ (long)1)))
54 if(cmpt
->TABNODE
== NULL
)
56 cmpt
->TABNODE
= addht(cmpt
->NBNODEIN
) ;
57 htab
= addht(cmpt
->NBNODEOUT
) ;
58 cmpt
->TABLIST
= addchain(cmpt
->TABLIST
,htab
) ;
59 addhtitem(cmpt
->TABNODE
,(void *)node1
,(long)htab
) ;
60 addhtitem(htab
,(void *)node2
,(long)node2
) ;
65 htab
= (ht
*)gethtitem(cmpt
->TABNODE
,(void *)node1
) ;
67 if((htab
== (ht
*)EMPTYHT
) || (htab
== (ht
*)DELETEHT
))
69 htab
= addht(cmpt
->NBNODEOUT
) ;
70 cmpt
->TABLIST
= addchain(cmpt
->TABLIST
,htab
) ;
71 addhtitem(cmpt
->TABNODE
,(void *)node1
,(long)htab
) ;
72 addhtitem(htab
,(void *)node2
,(long)node2
) ;
77 if(sethtitem(htab
,(void *)node2
,(long)node2
) == 0)
81 /*****************************************************************************/
82 /* function ttv_checkcouple() */
84 /* node1 : noeud d'entree */
85 /* node : noeud de recherche */
86 /* node2 : noeud de sortie */
88 /* verifie si un couple existe dans un noeud */
89 /*****************************************************************************/
90 int ttv_checkcouple(node1
,node
,node2
)
91 ttvevent_list
*node1
;
93 ttvevent_list
*node2
;
99 if((node
== NULL
) || (node1
== NULL
) || (node2
== NULL
))
102 cmpt
= ttv_getcmpt(node
) ;
107 if(cmpt
->TABNODE
== NULL
)
110 htab
= (ht
*)gethtitem(cmpt
->TABNODE
,(void *)node1
) ;
112 if((htab
== (ht
*)EMPTYHT
) || (htab
== (ht
*)DELETEHT
))
115 value
= gethtitem(htab
,(void *)node2
) ;
117 if((value
== EMPTYHT
) || (value
== DELETEHT
))
123 /*****************************************************************************/
124 /* function ttv_delcouple() */
128 /* supprime les couples d'un noeud */
129 /*****************************************************************************/
130 int ttv_delcouple(node
)
131 ttvevent_list
*node
;
136 cmpt
= ttv_getcmpt(node
) ;
141 if(cmpt
->TABNODE
== NULL
)
143 cmpt
->NBCOUPLE
= (long)0 ;
147 for(chain
= cmpt
->TABLIST
; chain
!= NULL
; chain
= chain
->NEXT
)
149 delht((ht
*)chain
->DATA
) ;
152 if(cmpt
->TABLIST
!= NULL
)
154 freechain(cmpt
->TABLIST
) ;
155 cmpt
->TABLIST
= NULL
;
158 if(cmpt
->TABNODE
!= NULL
)
160 delht(cmpt
->TABNODE
) ;
161 cmpt
->TABNODE
= NULL
;
164 cmpt
->NBCOUPLE
= (long)0 ;
169 /*****************************************************************************/
170 /* function ttv_cmptcompar() */
172 /* chain1 : premier cmpt */
173 /* chain2 : deuxieme cmpt */
175 /* compare deux cmpt en fonction des gains qu'ils engendrent */
176 /*****************************************************************************/
177 int ttv_cmptcompar(chain1
,chain2
)
178 chain_list
**chain1
;
179 chain_list
**chain2
;
181 ttvcmpt_list
*cmpt1
;
182 ttvcmpt_list
*cmpt2
;
184 cmpt1
= ttv_getcmpt((ttvevent_list
*)((*chain1
)->DATA
)) ;
185 cmpt2
= ttv_getcmpt((ttvevent_list
*)((*chain2
)->DATA
)) ;
187 return((int)((cmpt1
->NBPATH
- (cmpt1
->NBIN
+cmpt1
->NBOUT
)) -
188 (cmpt2
->NBPATH
- (cmpt2
->NBIN
+cmpt2
->NBOUT
)))) ;
191 /*****************************************************************************/
192 /* function ttv_classcmpt() */
194 /* chain : liste des node a classer */
196 /* classe la liste de node en fonction des gains qu'ils engendrent */
197 /*****************************************************************************/
198 chain_list
*ttv_classcmpt(chain
)
202 chain_list
**chaintab
;
209 for(chainx
= chain
; chainx
!= NULL
; chainx
= chainx
->NEXT
)
212 chaintab
= (chain_list
**)mbkalloc(nbchain
* sizeof(chain_list
*)) ;
216 for(nbchainx
= (long)0 ; nbchainx
< nbchain
; nbchainx
++)
218 *(chaintab
+ nbchainx
) = chainx
;
219 chainx
= chainx
->NEXT
;
222 qsort(chaintab
,nbchain
,sizeof(chain_list
*),(int (*)(const void*,const void*))ttv_cmptcompar
) ;
227 for(nbchainx
= (long)1 ; nbchainx
< nbchain
; nbchainx
++)
229 chainx
->NEXT
= *(chaintab
+ nbchainx
) ;
230 chainx
= chainx
->NEXT
;
233 chainx
->NEXT
= NULL
;
240 /*****************************************************************************/
241 /* function ttv_freeallcmpt() */
244 /* supprime tous les compteurs */
245 /*****************************************************************************/
246 void ttv_freeallcmpt()
251 for(chain
= TTV_CMPT_NODE
; chain
!= NULL
; chain
= chain
->NEXT
)
253 if((ptype
= getptype(((ttvevent_list
*)chain
->DATA
)->USER
,TTV_NODE_CMPT
))
256 ttv_freecmpt((ttvevent_list
*)chain
->DATA
) ;
260 for(chain
= TTV_ALLOC_FLINE
; chain
!= NULL
; chain
= chain
->NEXT
)
261 mbkfree(chain
->DATA
) ;
263 freechain(TTV_ALLOC_FLINE
) ;
264 freechain(TTV_CMPT_NODE
) ;
266 TTV_ALLOC_FLINE
= NULL
;
267 TTV_FREE_FLINE
= NULL
;
268 TTV_CMPT_NODE
= NULL
;
271 /*****************************************************************************/
272 /* function ttv_delallcmpt() */
275 /* supprime tous les compteurs */
276 /*****************************************************************************/
277 void ttv_delallcmpt()
282 for(chain
= TTV_CMPT_SIGLIST
; chain
!= NULL
; chain
= chain
->NEXT
)
284 for(i
= 0 ; i
< 2 ; i
++)
286 ttv_freecmpt((ttvevent_list
*)(((ttvsig_list
*)chain
->DATA
)->NODE
+ i
)) ;
291 /*****************************************************************************/
292 /* function ttv_freeflinelist() */
296 /* supprime une liste de lien */
297 /*****************************************************************************/
298 int ttv_freeflinelist(fline
)
299 ttvfline_list
*fline
;
301 if(fline
== NULL
) return 0 ;
303 TTV_FREE_FLINE
= (ttvfline_list
*)append((chain_list
*)fline
,
304 (chain_list
*)TTV_FREE_FLINE
);
308 /*****************************************************************************/
309 /* function ttv_freefline() */
311 /* cmpt : compteur */
312 /* type : type de lien */
314 /* supprime les liens d'un compteur */
315 /*****************************************************************************/
316 int ttv_freefline(cmpt
,type
)
320 if(cmpt
== NULL
) return 0 ;
322 if((type
& TTV_FLIN_IN
) == TTV_FLIN_IN
)
324 if(cmpt
->PATHIN
== NULL
)
326 TTV_FREE_FLINE
= (ttvfline_list
*)append((chain_list
*)cmpt
->PATHIN
,
327 (chain_list
*)TTV_FREE_FLINE
);
328 cmpt
->PATHIN
= NULL
;
329 cmpt
->NBNODEIN
= (long)0 ;
331 if((type
& TTV_FLIN_OUT
) == TTV_FLIN_OUT
)
333 if(cmpt
->PATHOUT
== NULL
)
335 TTV_FREE_FLINE
= (ttvfline_list
*)append((chain_list
*)cmpt
->PATHOUT
,
336 (chain_list
*)TTV_FREE_FLINE
);
337 cmpt
->PATHOUT
= NULL
;
338 cmpt
->NBNODEOUT
= (long)0 ;
344 /*****************************************************************************/
345 /* function ttv_freecmpt() */
349 /* supprime le cmpt d'un noeud */
350 /*****************************************************************************/
351 int ttv_freecmpt(node
)
352 ttvevent_list
*node
;
357 if((ptype
= getptype(node
->USER
,TTV_NODE_CMPT
)) == NULL
)
360 cmpt
= (ttvcmpt_list
*)ptype
->DATA
;
362 ttv_freefline(cmpt
,TTV_FLIN_IN
|TTV_FLIN_OUT
) ;
364 if(cmpt
->TABIN
!= NULL
)
367 if(cmpt
->TABOUT
!= NULL
)
368 delht(cmpt
->TABOUT
) ;
370 ttv_delcouple(node
) ;
372 node
->USER
= delptype(node
->USER
,TTV_NODE_CMPT
) ;
379 /*****************************************************************************/
380 /* function ttv_allocfline() */
382 /* cmpt : ajoue d'un lien a un compteur */
383 /* node : noeud a ajouter */
384 /* type : type de lien in ou out */
386 /* fonction d'allocation de lien pour un compteur */
387 /*****************************************************************************/
388 ttvfline_list
*ttv_allocfline(cmpt
,node
,type
)
390 ttvevent_list
*node
;
398 if((type
& TTV_FLIN_IN
) == TTV_FLIN_IN
)
400 if(cmpt
->TABIN
!= NULL
)
402 pt
= (ttvfline_list
*)gethtitem(cmpt
->TABIN
,node
) ;
403 if((pt
!= (ttvfline_list
*)EMPTYHT
) && (pt
!= (ttvfline_list
*)DELETEHT
))
409 if(cmpt
->TABOUT
!= NULL
)
411 pt
= (ttvfline_list
*)gethtitem(cmpt
->TABOUT
,node
) ;
412 if((pt
!= (ttvfline_list
*)EMPTYHT
) && (pt
!= (ttvfline_list
*)DELETEHT
))
418 if (TTV_FREE_FLINE
== NULL
)
420 pt
= (ttvfline_list
*)mbkalloc(TTV_MAX_BLOC
* sizeof(ttvfline_list
));
421 TTV_MAX_FLINE
+= TTV_MAX_BLOC
;
423 TTV_ALLOC_FLINE
= addchain(TTV_ALLOC_FLINE
,(void *)pt
) ;
424 for (i
= 1 ; i
< TTV_MAX_BLOC
; i
++)
433 TTV_FREE_FLINE
= TTV_FREE_FLINE
->NEXT
;
436 pt
->NBOUT
= (long)0 ;
437 pt
->NBPATH
= (long)0 ;
443 if((type
& TTV_FLIN_IN
) == TTV_FLIN_IN
)
445 if(cmpt
->TABIN
== NULL
)
446 cmpt
->TABIN
= addht(10) ;
447 pt
->NEXT
= cmpt
->PATHIN
;
450 addhtitem(cmpt
->TABIN
,(void *)node
,(long)pt
) ;
454 if(cmpt
->TABOUT
== NULL
)
455 cmpt
->TABOUT
= addht(10) ;
456 pt
->NEXT
= cmpt
->PATHOUT
;
459 addhtitem(cmpt
->TABOUT
,(void *)node
,(long)pt
) ;
466 /*****************************************************************************/
467 /* function ttv_alloccmpt() */
469 /* node : node ou il faut ajouter les compteur */
471 /* fonction d'allocation de compteur pour un noeud */
472 /*****************************************************************************/
473 ttvcmpt_list
*ttv_alloccmpt(node
)
474 ttvevent_list
*node
;
479 if((ptype
= getptype(node
->USER
,TTV_NODE_CMPT
)) != NULL
)
480 return((ttvcmpt_list
*)ptype
->DATA
) ;
482 pt
= (ttvcmpt_list
*)mbkalloc(sizeof(ttvcmpt_list
));
485 pt
->NBOUT
= (long)0 ;
486 pt
->NBPATH
= (long)0 ;
491 pt
->NBCOUPLE
= (long)0 ;
492 pt
->NBNODEIN
= (long)0 ;
493 pt
->NBNODEOUT
= (long)0 ;
497 node
->USER
= addptype(node
->USER
,TTV_NODE_CMPT
,(void *)pt
) ;
499 TTV_CMPT_NODE
= addchain(TTV_CMPT_NODE
,(void *)node
) ;
504 /*****************************************************************************/
505 /* function ttv_getcmpt() */
507 /* node : node ou il faut ajouter les compteur */
509 /* fonction d'allocation de compteur pour un noeud */
510 /*****************************************************************************/
511 ttvcmpt_list
*ttv_getcmpt(node
)
512 ttvevent_list
*node
;
516 if((ptype
= getptype(node
->USER
,TTV_NODE_CMPT
)) != NULL
)
517 return((ttvcmpt_list
*)ptype
->DATA
) ;
522 /*****************************************************************************/
523 /* function ttv_clearcmpt() */
525 /* node : node ou il faut netoyer les compteur */
527 /* fonction de nettoyage des compteur d'un noeud */
528 /*****************************************************************************/
529 int ttv_clearcmpt(cmpt
,type
)
533 ttvevent_list
*ptnode
;
534 ttvfline_list
*fline
;
535 ttvfline_list
*flinex
;
537 chain_list
*chainnode
;
542 if(cmpt
== NULL
) return(0) ;
544 if((type
& TTV_FLIN_IN
) == TTV_FLIN_IN
)
550 for(fline
= cmpt
->PATHIN
; fline
!= NULL
; fline
= fline
->NEXT
)
552 if((ptype
= getptype(fline
->NODE
->USER
,TTV_NODE_FIN
)) == NULL
)
554 fline
->NODE
->USER
= addptype(fline
->NODE
->USER
,TTV_NODE_FIN
,
555 ttv_allocfline(NULL
,fline
->NODE
,TTV_FLIN_IN
)) ;
556 ptype
= fline
->NODE
->USER
;
557 chainnode
= addchain(chainnode
,(void *)fline
->NODE
) ;
559 flinex
= (ttvfline_list
*)ptype
->DATA
;
560 flinex
->NBIN
+= fline
->NBIN
;
561 flinex
->NBOUT
+= fline
->NBOUT
;
562 flinex
->NBPATH
+= fline
->NBPATH
;
564 ttv_freefline(cmpt
,TTV_FLIN_IN
) ;
565 cmpt
->TABIN
= addht(10) ;
566 for(chain
= chainnode
; chain
!= NULL
; chain
= chain
->NEXT
)
568 ptnode
= (ttvevent_list
*)chain
->DATA
;
569 ptype
= getptype(ptnode
->USER
,TTV_NODE_FIN
) ;
570 flinex
= (ttvfline_list
*)ptype
->DATA
;
571 flinex
->NEXT
= cmpt
->PATHIN
;
572 cmpt
->PATHIN
= flinex
;
573 addhtitem(cmpt
->TABIN
,(void *)flinex
->NODE
,(long)flinex
) ;
574 ptnode
->USER
= delptype(ptnode
->USER
,TTV_NODE_FIN
) ;
577 cmpt
->NBNODEIN
= nb
;
578 freechain(chainnode
) ;
581 if((type
& TTV_FLIN_OUT
) == TTV_FLIN_OUT
)
585 delht(cmpt
->TABOUT
) ;
587 for(fline
= cmpt
->PATHOUT
; fline
!= NULL
; fline
= fline
->NEXT
)
589 if((ptype
= getptype(fline
->NODE
->USER
,TTV_NODE_FOUT
)) == NULL
)
591 fline
->NODE
->USER
= addptype(fline
->NODE
->USER
,TTV_NODE_FOUT
,
592 ttv_allocfline(NULL
,fline
->NODE
,TTV_FLIN_OUT
)) ;
593 ptype
= fline
->NODE
->USER
;
594 chainnode
= addchain(chainnode
,(void *)fline
->NODE
) ;
596 flinex
= (ttvfline_list
*)ptype
->DATA
;
597 flinex
->NBIN
+= fline
->NBIN
;
598 flinex
->NBOUT
+= fline
->NBOUT
;
599 flinex
->NBPATH
+= fline
->NBPATH
;
601 ttv_freefline(cmpt
,TTV_FLIN_OUT
) ;
602 cmpt
->TABOUT
= addht(10) ;
603 for(chain
= chainnode
; chain
!= NULL
; chain
= chain
->NEXT
)
605 ptnode
= (ttvevent_list
*)chain
->DATA
;
606 ptype
= getptype(ptnode
->USER
,TTV_NODE_FOUT
) ;
607 flinex
= (ttvfline_list
*)ptype
->DATA
;
608 flinex
->NEXT
= cmpt
->PATHOUT
;
609 cmpt
->PATHOUT
= flinex
;
610 addhtitem(cmpt
->TABOUT
,(void *)flinex
->NODE
,(long)flinex
) ;
611 ptnode
->USER
= delptype(ptnode
->USER
,TTV_NODE_FOUT
) ;
614 cmpt
->NBNODEOUT
= nb
;
615 freechain(chainnode
) ;
621 /*****************************************************************************/
622 /* function ttv_verifactsig() */
624 /* ptsig : signal a verifier */
625 /* type : type de recherche */
627 /* verifie si les noeud d'un signal sont des points de factorisation */
628 /*****************************************************************************/
629 int ttv_verifactsig(ptsig
,type
)
633 ttvevent_list
*node
;
637 for(i
= 0 ; i
< 2 ; i
++)
639 node
= ptsig
->NODE
+ i
;
640 if((node
->TYPE
& (TTV_NODE_MIN
|TTV_NODE_MOUT
)) != 0)
642 node
->TYPE
&= ~(TTV_NODE_MIN
|TTV_NODE_MOUT
) ;
643 if((type
& TTV_FIND_FACTGLO
) == TTV_FIND_FACTGLO
)
645 node
->TYPE
&= ~(TTV_NODE_PFACT
) ;
647 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
649 node
->TYPE
|= TTV_NODE_IMAX
;
653 node
->TYPE
|= TTV_NODE_IMIN
;
657 if(((type
& TTV_FIND_FACTGLO
) != TTV_FIND_FACTGLO
) &&
658 ((node
->TYPE
& TTV_NODE_PFACT
) == TTV_NODE_PFACT
))
661 node
->TYPE
&= ~(TTV_NODE_PFACT
) ;
662 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
664 node
->TYPE
|= TTV_NODE_IMAX
;
668 node
->TYPE
|= TTV_NODE_IMIN
;
675 /*****************************************************************************/
676 /* function ttv_checkfactsig() */
678 /* ptsig : signal a verifier */
680 /* test si un signal est un point de factorisation */
681 /*****************************************************************************/
682 int ttv_checkfactsig(ptsig
)
685 if(((ptsig
->NODE
[0].TYPE
& (TTV_NODE_IMAX
|TTV_NODE_IMIN
)) != 0) ||
686 ((ptsig
->NODE
[1].TYPE
& (TTV_NODE_IMAX
|TTV_NODE_IMIN
)) != 0))
692 /*****************************************************************************/
693 /* function ttv_classnodetype() */
695 /* chainnode : liste de noeud */
696 /* type : type de recherche */
698 /* classe les noeuds deja points de factorisation en noeud prioritaire */
699 /*****************************************************************************/
700 chain_list
*ttv_classnodetype(chainnode
)
701 chain_list
*chainnode
;
703 ttvevent_list
*node
;
706 chain_list
*chainnodex
;
708 chainnode
= ttv_classcmpt(chainnode
) ;
715 node
= (ttvevent_list
*)chain
->DATA
;
716 if(((node
->TYPE
& (TTV_NODE_IMAX
|TTV_NODE_IMIN
)) != 0) ||
717 ((node
->ROOT
->TYPE
& TTV_SIG_I
) == TTV_SIG_I
))
719 if(chain
== chainnode
)
721 chainnode
= chainnode
->NEXT
;
722 chain
->NEXT
= chainnodex
;
728 chainx
->NEXT
= chain
->NEXT
;
729 chain
->NEXT
= chainnodex
;
731 chain
= chainx
->NEXT
;
737 chain
= chain
->NEXT
;
741 chainnodex
= reverse(chainnodex
) ;
742 chainnode
= append(chainnode
,chainnodex
) ;
747 /*****************************************************************************/
748 /* function ttv_delcmpt() */
750 /* node : node ou il faut supprimer les compteur */
752 /* fonction de suppression de compteur pour un noeud */
753 /*****************************************************************************/
754 int ttv_delcmpt(node
,gain
)
755 ttvevent_list
*node
;
760 ttvcmpt_list
*cmptx
;
761 ttvfline_list
*fline
;
762 ttvfline_list
*flinex
;
763 ttvfline_list
*flineaux
;
764 chain_list
*chainin
= NULL
;
765 chain_list
*chainout
= NULL
;
773 if((ptype
= getptype(node
->USER
,TTV_NODE_CMPT
)) == NULL
)
776 pt
= (ttvcmpt_list
*)ptype
->DATA
;
780 for(fline
= pt
->PATHIN
; fline
!= NULL
; fline
= fline
->NEXT
)
782 if((fline
->NODE
->TYPE
& TTV_NODE_OLDFACT
) != TTV_NODE_OLDFACT
)
794 for(fline
= pt
->PATHOUT
; fline
!= NULL
; fline
= fline
->NEXT
)
796 if((fline
->NODE
->TYPE
& TTV_NODE_OLDFACT
) != TTV_NODE_OLDFACT
)
809 for(fline
= pt
->PATHIN
; fline
!= NULL
; fline
= fline
->NEXT
)
811 if((fline
->NODE
->TYPE
& TTV_NODE_OLDFACT
) == TTV_NODE_OLDFACT
)
813 cmpt
= ttv_getcmpt(fline
->NODE
) ;
814 if(((fline
->NODE
->TYPE
& TTV_NODE_MARFACT
) == TTV_NODE_MARFACT
) &&
817 chainin
= addchain(chainin
,(void *)fline
->NODE
) ;
819 for(flinex
= pt
->PATHOUT
; flinex
!= NULL
; flinex
= flinex
->NEXT
)
821 if(((flinex
->NODE
->TYPE
& TTV_NODE_OLDFACT
) == TTV_NODE_OLDFACT
) ||
822 (ttv_checkcouple(fline
->NODE
,node
,flinex
->NODE
) == 0))
824 cmptx
= ttv_getcmpt(flinex
->NODE
) ;
825 if(((flinex
->NODE
->TYPE
& TTV_NODE_MARFACT
) == TTV_NODE_MARFACT
) &&
828 chainout
= addchain(chainout
,(void *)flinex
->NODE
) ;
832 flineaux
= ttv_allocfline(cmpt
,flinex
->NODE
,TTV_FLIN_OUT
) ;
833 flineaux
->NBIN
= fline
->NBIN
;
834 flineaux
->NBOUT
= flinex
->NBOUT
;
835 flineaux
->NBPATH
= fline
->NBPATH
;
836 fline
->NODE
->TYPE
|= TTV_NODE_NEWFOUT
;
840 flineaux
= ttv_allocfline(cmptx
,fline
->NODE
,TTV_FLIN_IN
) ;
841 flineaux
->NBIN
= fline
->NBIN
;
842 flineaux
->NBOUT
= flinex
->NBOUT
;
843 flineaux
->NBPATH
= fline
->NBPATH
;
844 flinex
->NODE
->TYPE
|= TTV_NODE_NEWFIN
;
845 if((flagin
== 'N') &&
846 ((flinex
->NODE
->TYPE
& TTV_NODE_MAROUT
) != TTV_NODE_MAROUT
))
848 flinex
->NODE
->TYPE
&= ~(TTV_NODE_MARFACT
|TTV_NODE_MARIN
) ;
852 if((flagout
== 'N') && (cmpt
!= NULL
) &&
853 ((fline
->NODE
->TYPE
& TTV_NODE_MARIN
) != TTV_NODE_MARIN
))
855 fline
->NODE
->TYPE
&= ~(TTV_NODE_MARFACT
|TTV_NODE_MAROUT
) ;
861 for(chain
= chainin
; chain
!= NULL
; chain
= chain
->NEXT
)
863 cmpt
= ttv_getcmpt((ttvevent_list
*)chain
->DATA
) ;
864 /*ttv_clearcmpt(cmpt,TTV_FLIN_OUT) ;*/
866 for(fline
= cmpt
->PATHIN
; fline
!= NULL
; fline
= fline
->NEXT
)
868 if((fline
->NODE
->TYPE
& TTV_NODE_OLDFACT
) == TTV_NODE_OLDFACT
)
875 for(fline
= cmpt
->PATHOUT
; fline
!= NULL
; fline
= fline
->NEXT
)
877 if((fline
->NODE
->TYPE
& TTV_NODE_OLDFACT
) == TTV_NODE_OLDFACT
)
883 if(((nbin
*nbout
) - (nbin
+nbout
)) == gain
)
885 ((ttvevent_list
*)chain
->DATA
)->TYPE
|= TTV_NODE_MARFACT
;
889 for(chain
= chainout
; chain
!= NULL
; chain
= chain
->NEXT
)
891 cmpt
= ttv_getcmpt((ttvevent_list
*)chain
->DATA
) ;
892 /*ttv_clearcmpt(cmpt,TTV_FLIN_IN) ;*/
894 for(fline
= cmpt
->PATHIN
; fline
!= NULL
; fline
= fline
->NEXT
)
896 if((fline
->NODE
->TYPE
& TTV_NODE_OLDFACT
) == TTV_NODE_OLDFACT
)
903 for(fline
= cmpt
->PATHOUT
; fline
!= NULL
; fline
= fline
->NEXT
)
905 if((fline
->NODE
->TYPE
& TTV_NODE_OLDFACT
) == TTV_NODE_OLDFACT
)
911 if(((nbin
*nbout
) - (nbin
+nbout
)) == gain
)
913 ((ttvevent_list
*)chain
->DATA
)->TYPE
|= TTV_NODE_MARFACT
;
917 freechain(chainout
) ;
926 /*****************************************************************************/
927 /* function ttv_deletebadfact() */
929 /* type : type de recherche */
931 /* supprmie les noeuds qui ne sont pas des points de factorisations */
932 /* en fonction ddu nombre de couple et des entrees sorties */
933 /*****************************************************************************/
934 int ttv_deletebadfact(type
)
938 ttvevent_list
*node
;
941 chain_list
*chainnode
;
947 for(chain
= TTV_CMPT_SIGLIST
; chain
!= NULL
; chain
= chain
->NEXT
)
949 ptsig
= (ttvsig_list
*)chain
->DATA
;
950 for(i
= 0 ; i
< 2 ; i
++)
952 node
= (ttvevent_list
*)ptsig
->NODE
+ i
;
953 if((((node
->TYPE
& TTV_NODE_IMAX
) == TTV_NODE_IMAX
) &&
954 ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)) ||
955 (((node
->TYPE
& TTV_NODE_IMIN
) == TTV_NODE_IMIN
) &&
956 ((type
& TTV_FIND_MIN
) == TTV_FIND_MIN
)) ||
957 ((node
->TYPE
& TTV_NODE_PFACT
) != TTV_NODE_PFACT
))
959 if((ptype
= getptype(node
->USER
,TTV_NODE_CMPT
)) == NULL
)
961 node
->TYPE
&= ~(TTV_NODE_PFACT
) ;
965 cmpt
= (ttvcmpt_list
*)ptype
->DATA
;
966 /*ttv_clearcmpt(cmpt,TTV_FLIN_IN|TTV_FLIN_OUT) ;*/
967 if(cmpt
->NBCOUPLE
<= (cmpt
->NBNODEIN
+cmpt
->NBNODEOUT
+(long)1))
969 chainnode
= addchain(chainnode
,(void *)node
) ;
970 node
->TYPE
|= TTV_NODE_MARFACT
;
974 chainnode
= ttv_classnodetype(chainnode
) ;
975 for(chain
= chainnode
; chain
!= NULL
; chain
= chain
->NEXT
)
977 node
= (ttvevent_list
*)chain
->DATA
;
979 if((node
->TYPE
& TTV_NODE_MARFACT
) == TTV_NODE_MARFACT
)
981 ttv_delcmpt(node
,(long)3) ;
982 node
->TYPE
&= ~(TTV_NODE_MARFACT
|TTV_NODE_PFACT
) ;
983 node
->TYPE
|= TTV_NODE_OLDFACT
;
991 freechain(chainnode
) ;
992 ttv_cleanfactline() ;
997 /*****************************************************************************/
998 /* function ttv_deleteglobal() */
1000 /* type : type de recherche */
1002 /* supprmie les noeuds qui ne sont pas des points de factorisations */
1003 /* en fonction de leur gain global */
1004 /*****************************************************************************/
1005 void ttv_deleteglobal(type
)
1008 ttvsig_list
*ptsig
;
1009 ttvevent_list
*node
;
1010 ttvcmpt_list
*cmpt
;
1012 chain_list
*chainnode
;
1017 for(chain
= TTV_CMPT_SIGLIST
; chain
!= NULL
; chain
= chain
->NEXT
)
1019 ptsig
= (ttvsig_list
*)chain
->DATA
;
1020 for(i
= 0 ; i
< 2 ; i
++)
1022 node
= (ttvevent_list
*)ptsig
->NODE
+ i
;
1023 if((((node
->TYPE
& TTV_NODE_IMAX
) == TTV_NODE_IMAX
) &&
1024 ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)) ||
1025 (((node
->TYPE
& TTV_NODE_IMIN
) == TTV_NODE_IMIN
) &&
1026 ((type
& TTV_FIND_MIN
) == TTV_FIND_MIN
)) ||
1027 ((node
->TYPE
& TTV_NODE_PFACT
) != TTV_NODE_PFACT
))
1029 if((ptype
= getptype(node
->USER
,TTV_NODE_CMPT
)) == NULL
)
1031 node
->TYPE
&= ~(TTV_NODE_PFACT
) ;
1035 cmpt
= (ttvcmpt_list
*)ptype
->DATA
;
1036 if((cmpt
->NBPATH
- (cmpt
->NBIN
+ cmpt
->NBOUT
)) < (long)2)
1038 ttv_delcmpt(node
,(long)2) ;
1039 node
->TYPE
&= ~(TTV_NODE_PFACT
) ;
1040 node
->TYPE
|= TTV_NODE_OLDFACT
;
1045 ttv_cleanfactline() ;
1046 ttv_cleansiglist() ;
1049 /*****************************************************************************/
1050 /* function ttv_deletenofact() */
1052 /* type : type de recherche */
1054 /* supprmie les noeuds qui ne sont pas des points de factorisations */
1055 /* en fonction de leur gain local */
1056 /*****************************************************************************/
1057 void ttv_deletenofact(type
)
1060 ttvsig_list
*ptsig
;
1061 ttvevent_list
*node
;
1062 ttvcmpt_list
*cmpt
;
1063 ttvfline_list
*fline
;
1065 chain_list
*chainnode
;
1067 chain_list
*chainaux
[6] ;
1073 for(gain
= -1 ; gain
< 3 ; gain
++ )
1076 for(chain
= TTV_CMPT_SIGLIST
; chain
!= NULL
; chain
= chain
->NEXT
)
1078 ptsig
= (ttvsig_list
*)chain
->DATA
;
1079 for(i
= 0 ; i
< 2 ; i
++)
1081 node
= (ttvevent_list
*)ptsig
->NODE
+ i
;
1082 if((((node
->TYPE
& TTV_NODE_IMAX
) == TTV_NODE_IMAX
) &&
1083 ((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)) ||
1084 (((node
->TYPE
& TTV_NODE_IMIN
) == TTV_NODE_IMIN
) &&
1085 ((type
& TTV_FIND_MIN
) == TTV_FIND_MIN
)) ||
1086 ((node
->TYPE
& TTV_NODE_PFACT
) != TTV_NODE_PFACT
))
1088 if((ptype
= getptype(node
->USER
,TTV_NODE_CMPT
)) == NULL
)
1090 node
->TYPE
&= ~(TTV_NODE_PFACT
) ;
1094 cmpt
= (ttvcmpt_list
*)ptype
->DATA
;
1095 /*ttv_clearcmpt(cmpt,TTV_FLIN_IN|TTV_FLIN_OUT) ;*/
1097 for(fline
= cmpt
->PATHIN
; fline
!= NULL
; fline
= fline
->NEXT
)
1099 if((fline
->NODE
->TYPE
& TTV_NODE_OLDFACT
) == TTV_NODE_OLDFACT
)
1106 for(fline
= cmpt
->PATHOUT
; fline
!= NULL
; fline
= fline
->NEXT
)
1108 if((fline
->NODE
->TYPE
& TTV_NODE_OLDFACT
) == TTV_NODE_OLDFACT
)
1111 if(nbout
== (long)4)
1114 if(((nbin
*nbout
) - (nbin
+nbout
)) == gain
)
1116 chainnode
= addchain(chainnode
,(void *)node
) ;
1117 node
->TYPE
|= TTV_NODE_MARFACT
;
1119 node
->TYPE
|= TTV_NODE_MARIN
;
1120 if(nbout
== (long)1)
1121 node
->TYPE
|= TTV_NODE_MAROUT
;
1123 else if(((nbin
*nbout
) - (nbin
+nbout
)) < gain
)
1125 gain
= ((nbin
*nbout
) - (nbin
+nbout
)) ;
1126 for(chainaux
[0] = chainnode
; chainaux
[0] != NULL
;
1127 chainaux
[0] = chainaux
[0]->NEXT
)
1129 ((ttvevent_list
*)chainaux
[0]->DATA
)->TYPE
&= ~(TTV_NODE_MARFACT
|
1130 TTV_NODE_MARIN
|TTV_NODE_MAROUT
) ;
1132 freechain(chainnode
) ;
1133 chainnode
= addchain(NULL
,(void *)node
) ;
1134 node
->TYPE
|= TTV_NODE_MARFACT
;
1136 node
->TYPE
|= TTV_NODE_MARIN
;
1137 if(nbout
== (long)1)
1138 node
->TYPE
|= TTV_NODE_MAROUT
;
1142 if(gain
== (long)-1)
1144 chainnode
= ttv_classnodetype(chainnode
) ;
1145 for(chain
= chainnode
; chain
!= NULL
; chain
= chain
->NEXT
)
1147 node
= (ttvevent_list
*)chain
->DATA
;
1149 if((node
->TYPE
& TTV_NODE_MARFACT
) == TTV_NODE_MARFACT
)
1151 ttv_delcmpt(node
,gain
) ;
1152 node
->TYPE
&= ~(TTV_NODE_MARFACT
|TTV_NODE_PFACT
) ;
1153 node
->TYPE
|= TTV_NODE_OLDFACT
;
1156 for(chain
= chainnode
; chain
!= NULL
; chain
= chain
->NEXT
)
1158 node
= (ttvevent_list
*)chain
->DATA
;
1159 node
->TYPE
&= ~(TTV_NODE_MARIN
|TTV_NODE_MAROUT
) ;
1161 freechain(chainnode
) ;
1166 for(chain
= chainnode
; chain
!= NULL
; chain
= chain
->NEXT
)
1168 node
= (ttvevent_list
*)chain
->DATA
;
1169 node
->TYPE
&= ~(TTV_NODE_MARIN
|TTV_NODE_MAROUT
|TTV_NODE_MARFACT
) ;
1171 freechain(chainnode
) ;
1174 chainaux
[0] = NULL
;
1175 chainaux
[1] = NULL
;
1176 chainaux
[2] = NULL
;
1177 chainaux
[3] = NULL
;
1178 chainaux
[4] = NULL
;
1179 chainaux
[5] = NULL
;
1180 for(chain
= chainnode
; chain
!= NULL
; chain
= chain
->NEXT
)
1182 node
= (ttvevent_list
*)chain
->DATA
;
1183 if((ptype
= getptype(node
->USER
,TTV_NODE_CMPT
)) == NULL
)
1186 cmpt
= (ttvcmpt_list
*)ptype
->DATA
;
1188 for(fline
= cmpt
->PATHIN
; fline
!= NULL
; fline
= fline
->NEXT
)
1190 if((fline
->NODE
->TYPE
& TTV_NODE_MARFACT
) == TTV_NODE_MARFACT
)
1195 for(fline
= cmpt
->PATHOUT
; fline
!= NULL
; fline
= fline
->NEXT
)
1197 if((fline
->NODE
->TYPE
& TTV_NODE_MARFACT
) == TTV_NODE_MARFACT
)
1202 chainaux
[nbin
] = addchain(chainaux
[nbin
],node
) ;
1204 freechain(chainnode
) ;
1205 for(i
= 0 ; i
< 6 ; i
++)
1207 chainaux
[i
] = ttv_classnodetype(chainaux
[i
]) ;
1208 for(chain
= chainaux
[i
] ; chain
!= NULL
; chain
= chain
->NEXT
)
1210 node
= (ttvevent_list
*)chain
->DATA
;
1212 if((node
->TYPE
& TTV_NODE_MARFACT
) == TTV_NODE_MARFACT
)
1214 ttv_delcmpt(node
,gain
) ;
1215 node
->TYPE
&= ~(TTV_NODE_MARFACT
|TTV_NODE_PFACT
) ;
1216 node
->TYPE
|= TTV_NODE_OLDFACT
;
1219 freechain(chainaux
[i
]) ;
1223 ttv_cleanfactline() ;
1224 ttv_cleansiglist() ;
1227 /*****************************************************************************/
1228 /* function ttv_cleansiglist() */
1231 /* supprmie les signaux qui ne sont plus des points de factorisation */
1232 /*****************************************************************************/
1233 void ttv_cleansiglist()
1235 ttvsig_list
*ptsig
;
1236 ttvevent_list
*node
;
1237 chain_list
*chainsig
;
1239 chain_list
*chainx
;
1244 chain
= TTV_CMPT_SIGLIST
;
1246 while(chain
!= NULL
)
1249 ptsig
= (ttvsig_list
*)chain
->DATA
;
1250 for(i
= 0 ; i
< 2 ; i
++)
1252 node
= (ttvevent_list
*)ptsig
->NODE
+ i
;
1253 if(((node
->TYPE
& TTV_NODE_PFACT
) != TTV_NODE_PFACT
) ||
1254 (ttv_getcmpt(node
) == NULL
))
1256 node
->TYPE
&= ~(TTV_NODE_FACTMASK
) ;
1257 ttv_freecmpt(node
) ;
1266 if(chain
== TTV_CMPT_SIGLIST
)
1268 TTV_CMPT_SIGLIST
= TTV_CMPT_SIGLIST
->NEXT
;
1269 chain
->NEXT
= chainsig
;
1271 chain
= TTV_CMPT_SIGLIST
;
1275 chainx
->NEXT
= chain
->NEXT
;
1276 chain
->NEXT
= chainsig
;
1278 chain
= chainx
->NEXT
;
1284 chain
= chain
->NEXT
;
1287 freechain(chainsig
) ;
1290 /*****************************************************************************/
1291 /* function ttv_cleanfactline() */
1294 /* supprmie les liens allant au noeud de factorisation non retenus */
1295 /*****************************************************************************/
1296 void ttv_cleanfactline()
1298 ttvsig_list
*ptsig
;
1299 ttvevent_list
*node
;
1300 ttvcmpt_list
*cmpt
;
1301 ttvfline_list
*fline
;
1302 ttvfline_list
*flinex
;
1303 chain_list
*chainnode
;
1308 for(chain
= TTV_CMPT_SIGLIST
; chain
!= NULL
; chain
= chain
->NEXT
)
1310 ptsig
= (ttvsig_list
*)chain
->DATA
;
1311 for(i
= 0 ; i
< 2 ; i
++)
1313 node
= (ttvevent_list
*)ptsig
->NODE
+ i
;
1314 if((node
->TYPE
& TTV_NODE_PFACT
) != TTV_NODE_PFACT
)
1316 node
->TYPE
&= ~(TTV_NODE_NEWFIN
|TTV_NODE_NEWFOUT
) ;
1317 if((node
->TYPE
& TTV_NODE_OLDFACT
) == TTV_NODE_OLDFACT
)
1318 chainnode
= addchain(chainnode
,(void *)node
) ;
1321 if((node
->TYPE
& TTV_NODE_NEWFIN
) == TTV_NODE_NEWFIN
)
1323 node
->TYPE
&= ~(TTV_NODE_NEWFIN
) ;
1324 cmpt
= ttv_getcmpt(node
) ;
1325 fline
= cmpt
->PATHIN
;
1326 while(fline
!= NULL
)
1328 if((fline
->NODE
->TYPE
& TTV_NODE_OLDFACT
) == TTV_NODE_OLDFACT
)
1330 delhtitem(cmpt
->TABIN
,(void *)fline
->NODE
) ;
1331 if(cmpt
->PATHIN
== fline
)
1333 cmpt
->PATHIN
= cmpt
->PATHIN
->NEXT
;
1334 fline
->NEXT
= NULL
;
1335 ttv_freeflinelist(fline
) ;
1336 fline
= cmpt
->PATHIN
;
1340 flinex
->NEXT
= fline
->NEXT
;
1341 fline
->NEXT
= NULL
;
1342 ttv_freeflinelist(fline
) ;
1343 fline
= flinex
->NEXT
;
1349 fline
= fline
->NEXT
;
1352 if((node
->TYPE
& TTV_NODE_NEWFOUT
) == TTV_NODE_NEWFOUT
)
1354 node
->TYPE
&= ~(TTV_NODE_NEWFOUT
) ;
1355 cmpt
= ttv_getcmpt(node
) ;
1356 fline
= cmpt
->PATHOUT
;
1357 while(fline
!= NULL
)
1359 if((fline
->NODE
->TYPE
& TTV_NODE_OLDFACT
) == TTV_NODE_OLDFACT
)
1361 delhtitem(cmpt
->TABOUT
,(void *)fline
->NODE
) ;
1362 if(cmpt
->PATHOUT
== fline
)
1364 cmpt
->PATHOUT
= cmpt
->PATHOUT
->NEXT
;
1365 fline
->NEXT
= NULL
;
1366 ttv_freeflinelist(fline
) ;
1367 fline
= cmpt
->PATHOUT
;
1371 flinex
->NEXT
= fline
->NEXT
;
1372 fline
->NEXT
= NULL
;
1373 ttv_freeflinelist(fline
) ;
1374 fline
= flinex
->NEXT
;
1380 fline
= fline
->NEXT
;
1385 for(chain
= chainnode
; chain
!= NULL
; chain
= chain
->NEXT
)
1387 ((ttvevent_list
*)chain
->DATA
)->TYPE
&= ~(TTV_NODE_OLDFACT
) ;
1390 freechain(chainnode
) ;
1393 /*****************************************************************************/
1394 /* function ttv_count() */
1396 /* ttvfig : ttvfig que l'on veut factorise */
1397 /* chainin : chaine des entre ou des sortie */
1398 /* type : type de factorisation dual ou pas */
1400 /* compte le nombre de chemin et de sortie ou des entree et le memorise */
1401 /* dans des ptype */
1402 /* renvoie la liste des points de factorisations trouve si la parcours est */
1403 /* dual et le nombre de chemin si le parcours n'est pas dual */
1404 /*****************************************************************************/
1405 long ttv_count(ttvfig
,root
,chainin
,type
)
1406 ttvfig_list
*ttvfig
;
1407 ttvevent_list
*root
;
1408 chain_list
*chainin
;
1411 ttvevent_list
*node
;
1412 ttvcmpt_list
*cmpt
;
1413 ttvcmpt_list
*cmptx
;
1414 ttvfline_list
*fline
;
1415 ttvfline_list
*flinex
;
1417 chain_list
*chainmarque
= NULL
;
1418 ttvevent_list
*nodes
;
1419 ttvevent_list
*nodee
;
1420 ttvevent_list
*nodem
;
1421 ttvevent_list
*pnode
;
1422 ttvevent_list
*snode
;
1439 for(chain
= chainin
; chain
!= NULL
; chain
= chain
->NEXT
)
1441 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
1459 node
= (ttvevent_list
*)chain
->DATA
;
1460 if(((node
->ROOT
->TYPE
& (TTV_SIG_C
| TTV_SIG_N
)) != 0) ||
1461 ((root
->ROOT
->TYPE
& (TTV_SIG_C
| TTV_SIG_N
)) != 0))
1465 node
->FIND
->TYPE
&= ~(TTV_FIND_BEGIN
) ;
1469 while(node
->FIND
->OUTLINE
!= NULL
)
1471 if(node
->FIND
->OUTLINE
->FIG
== ttvfig
)
1476 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
1477 node
= node
->FIND
->OUTLINE
->NODE
;
1479 node
= node
->FIND
->OUTLINE
->ROOT
;
1486 while(node
->FIND
->OUTLINE
!= NULL
)
1488 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
1490 node
->FIND
->OUTLINE
->TYPE
|= TTV_LINE_DEPTMAX
;
1494 node
->FIND
->OUTLINE
->TYPE
|= TTV_LINE_DEPTMIN
;
1497 if((node
->TYPE
& TTV_NODE_PFACT
) == TTV_NODE_PFACT
)
1500 node
->ROOT
->TYPE
|= TTV_SIG_EXT
;
1501 cmpt
= ttv_alloccmpt(node
) ;
1502 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
1504 if((pnode
->TYPE
& TTV_NODE_PUSED
) != TTV_NODE_PUSED
)
1505 fline
= ttv_allocfline(cmpt
,pnode
,TTV_FLIN_OUT
) ;
1506 if((pnode
->TYPE
& TTV_NODE_PFACT
) == TTV_NODE_PFACT
)
1508 cmptx
= ttv_alloccmpt(pnode
) ;
1509 if((pnode
->TYPE
& TTV_NODE_PUSED
) != TTV_NODE_PUSED
)
1510 flinex
= ttv_allocfline(cmptx
,node
,TTV_FLIN_IN
) ;
1512 if((node
->TYPE
& TTV_NODE_MARQUE
) != TTV_NODE_MARQUE
)
1514 node
->TYPE
|= TTV_NODE_MARQUE
;
1515 chainmarque
= addchain(chainmarque
,(void *)node
) ;
1518 if((pnode
->TYPE
& TTV_NODE_PUSED
) != TTV_NODE_PUSED
)
1521 if((pnode
->TYPE
& TTV_NODE_PFACT
) == TTV_NODE_PFACT
)
1523 pnode
->TYPE
|= TTV_NODE_PUSED
;
1526 nbm
= cmpt
->NBPATH
;
1528 if((nbmm
- (nbme
+ nbms
)) < (nbm
- (nbe
+ nbs
)))
1537 if((nbem
- (nbee
+ nbes
)) < (nbm
- (nbe
+ nbs
)))
1548 if((nbsm
- (nbse
+ nbss
)) < (nbm
- (nbe
+ nbs
)))
1557 if((node
->TYPE
& (TTV_NODE_MIN
|TTV_NODE_MOUT
)) != 0)
1558 if((node
!= nodee
) && (node
!= nodes
) && (node
!= nodem
))
1559 node
->TYPE
&= ~(TTV_NODE_MIN
| TTV_NODE_MOUT
) ;
1565 node
->ROOT
->TYPE
|= TTV_SIG_EXT
;
1566 fline
= ttv_allocfline(cmpt
,pnode
,TTV_FLIN_IN
) ;
1567 if((pnode
->TYPE
& TTV_NODE_PFACT
) == TTV_NODE_PFACT
)
1569 cmptx
= ttv_alloccmpt(pnode
) ;
1570 flinex
= ttv_allocfline(cmptx
,node
,TTV_FLIN_OUT
) ;
1572 if((node
->TYPE
& TTV_NODE_MARQUE
) != TTV_NODE_MARQUE
)
1574 node
->TYPE
|= TTV_NODE_MARQUE
;
1575 chainmarque
= addchain(chainmarque
,(void *)node
) ;
1578 if((pnode
->TYPE
& TTV_NODE_PUSED
) != TTV_NODE_PUSED
)
1581 if((pnode
->TYPE
& TTV_NODE_PFACT
) == TTV_NODE_PFACT
)
1583 pnode
->TYPE
|= TTV_NODE_PUSED
;
1587 if((pnode
->TYPE
& TTV_NODE_PFACT
) == TTV_NODE_PFACT
)
1589 if((type
& TTV_FIND_COUPLE
) == TTV_FIND_COUPLE
)
1590 ttv_addcouple(snode
,pnode
,node
) ;
1595 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
1596 node
= node
->FIND
->OUTLINE
->NODE
;
1598 node
= node
->FIND
->OUTLINE
->ROOT
;
1601 if(node
->FIND
->OUTLINE
!= NULL
)
1603 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
1605 node
->FIND
->OUTLINE
->TYPE
|= TTV_LINE_DEPTMAX
;
1609 node
->FIND
->OUTLINE
->TYPE
|= TTV_LINE_DEPTMIN
;
1615 if((pnode
->TYPE
& TTV_NODE_PFACT
) == TTV_NODE_PFACT
)
1617 cmptx
= ttv_alloccmpt(pnode
) ;
1618 if((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
)
1620 if((pnode
->TYPE
& TTV_NODE_PUSED
) != TTV_NODE_PUSED
)
1622 flinex
= ttv_allocfline(cmptx
,node
,TTV_FLIN_IN
) ;
1624 pnode
->TYPE
|= TTV_NODE_PUSED
;
1629 flinex
= ttv_allocfline(cmptx
,node
,TTV_FLIN_OUT
) ;
1630 if((pnode
->TYPE
& TTV_NODE_PUSED
) != TTV_NODE_PUSED
)
1633 pnode
->TYPE
|= TTV_NODE_PUSED
;
1637 if((type
& TTV_FIND_COUPLE
) == TTV_FIND_COUPLE
)
1638 ttv_addcouple(snode
,pnode
,node
) ;
1640 if(((type
& TTV_FIND_DUAL
) == TTV_FIND_DUAL
) && (nodem
!= NULL
))
1642 if(((nbmm
- (nbme
+ nbms
)) >= (((nbem
+ nbsm
) - (nbse
* nbes
))
1643 - (nbee
+ nbss
+ 1))) ||
1644 (flag
== 'E') || ((nodem
== nodes
) && (nodem
== nodee
)))
1646 nodee
->TYPE
&= ~(TTV_NODE_MIN
| TTV_NODE_MOUT
) ;
1647 nodes
->TYPE
&= ~(TTV_NODE_MIN
| TTV_NODE_MOUT
) ;
1648 nodem
->TYPE
|= (TTV_NODE_MIN
|TTV_NODE_MOUT
) ;
1650 else if((nbes
< nbee
) && (nbss
> nbse
))
1652 nodee
->TYPE
|= TTV_NODE_MIN
;
1653 nodee
->TYPE
&= ~(TTV_NODE_MOUT
) ;
1654 nodes
->TYPE
|= TTV_NODE_MOUT
;
1655 nodes
->TYPE
&= ~(TTV_NODE_MIN
) ;
1659 nodee
->TYPE
&= ~(TTV_NODE_MIN
| TTV_NODE_MOUT
) ;
1660 nodes
->TYPE
&= ~(TTV_NODE_MIN
| TTV_NODE_MOUT
) ;
1661 nodem
->TYPE
|= (TTV_NODE_MIN
|TTV_NODE_MOUT
) ;
1666 for(chain
= chainin
; chain
!= NULL
; chain
= chain
->NEXT
)
1667 ((ttvevent_list
*)chain
->DATA
)->TYPE
&= ~(TTV_NODE_MARQUE
|TTV_NODE_PUSED
) ;
1668 for(chain
= chainmarque
; chain
!= NULL
; chain
= chain
->NEXT
)
1669 ((ttvevent_list
*)chain
->DATA
)->TYPE
&= ~(TTV_NODE_MARQUE
|TTV_NODE_PUSED
) ;
1671 freechain(chainmarque
) ;
1675 /*****************************************************************************/
1676 /* function ttv_filterrs() */
1678 /* chain : list de noeuds */
1680 /* filtre les destinations rs */
1681 /*****************************************************************************/
1682 chain_list
*ttv_filterrs(chain
,type
)
1688 chain_list
*chrs
= NULL
;
1689 chain_list
*chnotrs
= NULL
;
1696 if(((((ttvevent_list
*)chx
->DATA
)->ROOT
->TYPE
& TTV_SIG_LR
) == TTV_SIG_LR
) ||
1697 ((((ttvevent_list
*)chx
->DATA
)->ROOT
->TYPE
& TTV_SIG_LS
) == TTV_SIG_LS
))
1704 chx
->NEXT
= chnotrs
;
1710 for(ch
= chnotrs
; ch
!= NULL
; ch
= ch
->NEXT
)
1711 ((ttvevent_list
*)ch
->DATA
)->FIND
->TYPE
&= ~(TTV_FIND_BEGIN
) ;
1712 freechain(chnotrs
) ;
1717 for(ch
= chrs
; ch
!= NULL
; ch
= ch
->NEXT
)
1718 ((ttvevent_list
*)ch
->DATA
)->FIND
->TYPE
&= ~(TTV_FIND_BEGIN
) ;
1724 /*****************************************************************************/
1725 /* function ttv_countsep() */
1727 /* ttvfig : ttvfig a factoriser */
1728 /* type : type de factorisation lien ou chemin */
1730 /* compte le nombre de chemin et d'entree de sortie que voie un signal */
1731 /* renvoie le nombre de chemin total dans le graphe */
1732 /*****************************************************************************/
1733 long ttv_countsep(ttvfig
,type
,marque
)
1734 ttvfig_list
*ttvfig
;
1739 ttvevent_list
*event
;
1740 ttvlbloc_list
*ptlbloc
[3] ;
1741 ttvline_list
*ptline
;
1743 chain_list
*chaindualhz
= NULL
;
1744 chain_list
*chainduals
= NULL
;
1745 chain_list
*chaindualr
= NULL
;
1753 type
&= ~(TTV_FIND_DUAL
| TTV_FIND_HZ
) ;
1755 if((((ttvfig
->STATUS
& TTV_STS_DTX
) != TTV_STS_DTX
) &&
1756 ((type
& TTV_FIND_LINE
) == TTV_FIND_LINE
)) ||
1757 (((ttvfig
->STATUS
& TTV_STS_TTX
) != TTV_STS_TTX
) &&
1758 ((type
& TTV_FIND_PATH
) == TTV_FIND_PATH
)))
1760 ttv_error(31,ttvfig
->INFO
->FIGNAME
,TTV_WARNING
) ;
1764 for(i
= 0 ; i
< ttvfig
->NBCONSIG
; i
++)
1766 sig
= *(ttvfig
->CONSIG
+ i
) ;
1767 if(((sig
->TYPE
& TTV_SIG_LR
) == TTV_SIG_LR
) ||
1768 ((sig
->TYPE
& TTV_SIG_LS
) == TTV_SIG_LS
))
1770 if((sig
->TYPE
& TTV_SIG_CO
) == TTV_SIG_CO
)
1772 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,NULL
,type
,ttvfig
->INFO
->LEVEL
) ;
1773 nbpath
+= (long)ttv_count(ttvfig
,sig
->NODE
,chain
,type
) ;
1776 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,NULL
,type
,ttvfig
->INFO
->LEVEL
) ;
1777 nbpath
+= (long)ttv_count(ttvfig
,sig
->NODE
+1,chain
,type
) ;
1783 for(i
= 0 ; i
< ttvfig
->NBNCSIG
; i
++)
1785 sig
= *(ttvfig
->NCSIG
+ i
) ;
1786 if(((sig
->TYPE
& TTV_SIG_LR
) == TTV_SIG_LR
) ||
1787 ((sig
->TYPE
& TTV_SIG_LS
) == TTV_SIG_LS
))
1789 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,NULL
,type
,ttvfig
->INFO
->LEVEL
) ;
1790 nbpath
+= (long)ttv_count(ttvfig
,sig
->NODE
,chain
,type
) ;
1793 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,NULL
,type
,ttvfig
->INFO
->LEVEL
) ;
1794 nbpath
+= (long)ttv_count(ttvfig
,sig
->NODE
+1,chain
,type
) ;
1799 for(i
= 0 ; i
< ttvfig
->NBELCMDSIG
+ ttvfig
->NBILCMDSIG
; i
++)
1801 sig
= (i
< ttvfig
->NBELCMDSIG
) ? *(ttvfig
->ELCMDSIG
+ i
)
1802 : *(ttvfig
->ILCMDSIG
+ i
- ttvfig
->NBELCMDSIG
) ;
1803 if((sig
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) == 0)
1805 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,NULL
,type
,ttvfig
->INFO
->LEVEL
) ;
1806 nbpath
+= (long)ttv_count(ttvfig
,sig
->NODE
,chain
,type
) ;
1809 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,NULL
,type
,ttvfig
->INFO
->LEVEL
) ;
1810 nbpath
+= (long)ttv_count(ttvfig
,sig
->NODE
+1,chain
,type
) ;
1816 for(i
= 0 ; i
< ttvfig
->NBELATCHSIG
+ ttvfig
->NBILATCHSIG
; i
++)
1818 sig
= (i
< ttvfig
->NBELATCHSIG
) ? *(ttvfig
->ELATCHSIG
+ i
)
1819 : *(ttvfig
->ILATCHSIG
+ i
- ttvfig
->NBELATCHSIG
) ;
1820 if(((sig
->TYPE
& TTV_SIG_LR
) == TTV_SIG_LR
) ||
1821 ((sig
->TYPE
& TTV_SIG_LS
) == TTV_SIG_LS
))
1823 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,NULL
,type
|TTV_FIND_R
,ttvfig
->INFO
->LEVEL
) ;
1824 nbpath
+= (long)ttv_count(ttvfig
,sig
->NODE
,chain
,type
) ;
1826 for(ch
= chain
; ch
!= NULL
; ch
= ch
->NEXT
)
1827 if((((ttvevent_list
*)ch
->DATA
)->TYPE
& TTV_NODE_INR
) != TTV_NODE_INR
)
1829 chaindualr
= addchain(chaindualr
,ch
->DATA
) ;
1830 ((ttvevent_list
*)ch
->DATA
)->TYPE
|= TTV_NODE_INR
;
1833 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,NULL
,type
|TTV_FIND_R
,ttvfig
->INFO
->LEVEL
) ;
1834 nbpath
+= (long)ttv_count(ttvfig
,sig
->NODE
+1,chain
,type
) ;
1836 for(ch
= chain
; ch
!= NULL
; ch
= ch
->NEXT
)
1837 if((((ttvevent_list
*)ch
->DATA
)->TYPE
& TTV_NODE_INR
) != TTV_NODE_INR
)
1839 chaindualr
= addchain(chaindualr
,ch
->DATA
) ;
1840 ((ttvevent_list
*)ch
->DATA
)->TYPE
|= TTV_NODE_INR
;
1843 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,NULL
,type
|TTV_FIND_S
,ttvfig
->INFO
->LEVEL
) ;
1844 nbpath
+= (long)ttv_count(ttvfig
,sig
->NODE
,chain
,type
) ;
1846 for(ch
= chain
; ch
!= NULL
; ch
= ch
->NEXT
)
1847 if((((ttvevent_list
*)ch
->DATA
)->TYPE
& TTV_NODE_INS
) != TTV_NODE_INS
)
1849 chainduals
= addchain(chainduals
,ch
->DATA
) ;
1850 ((ttvevent_list
*)ch
->DATA
)->TYPE
|= TTV_NODE_INS
;
1853 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,NULL
,type
|TTV_FIND_S
,ttvfig
->INFO
->LEVEL
) ;
1854 nbpath
+= (long)ttv_count(ttvfig
,sig
->NODE
+1,chain
,type
) ;
1856 for(ch
= chain
; ch
!= NULL
; ch
= ch
->NEXT
)
1857 if((((ttvevent_list
*)ch
->DATA
)->TYPE
& TTV_NODE_INS
) != TTV_NODE_INS
)
1859 chainduals
= addchain(chainduals
,ch
->DATA
) ;
1860 ((ttvevent_list
*)ch
->DATA
)->TYPE
|= TTV_NODE_INS
;
1864 else if((sig
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) == 0)
1866 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,NULL
,type
,ttvfig
->INFO
->LEVEL
) ;
1867 nbpath
+= (long)ttv_count(ttvfig
,sig
->NODE
,chain
,type
) ;
1870 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,NULL
,type
,ttvfig
->INFO
->LEVEL
) ;
1871 nbpath
+= (long)ttv_count(ttvfig
,sig
->NODE
+1,chain
,type
) ;
1877 for(i
= 0 ; i
< ttvfig
->NBEPRESIG
+ ttvfig
->NBIPRESIG
; i
++)
1879 sig
= (i
< ttvfig
->NBEPRESIG
) ? *(ttvfig
->EPRESIG
+ i
)
1880 : *(ttvfig
->IPRESIG
+ i
- ttvfig
->NBEPRESIG
) ;
1881 if((sig
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) == 0)
1883 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,NULL
,type
,ttvfig
->INFO
->LEVEL
) ;
1884 nbpath
+= (long)ttv_count(ttvfig
,sig
->NODE
,chain
,type
) ;
1887 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,NULL
,type
,ttvfig
->INFO
->LEVEL
) ;
1888 nbpath
+= (long)ttv_count(ttvfig
,sig
->NODE
+1,chain
,type
) ;
1892 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,NULL
,type
|TTV_FIND_HZ
,ttvfig
->INFO
->LEVEL
) ;
1893 nbpath
+= (long)ttv_count(ttvfig
,sig
->NODE
,chain
,type
|TTV_FIND_HZ
) ;
1895 for(ch
= chain
; ch
!= NULL
; ch
= ch
->NEXT
)
1896 if((((ttvevent_list
*)ch
->DATA
)->TYPE
& TTV_NODE_INHZ
) != TTV_NODE_INHZ
)
1898 chaindualhz
= addchain(chaindualhz
,ch
->DATA
) ;
1899 ((ttvevent_list
*)ch
->DATA
)->TYPE
|= TTV_NODE_INHZ
;
1902 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,NULL
,type
|TTV_FIND_HZ
,ttvfig
->INFO
->LEVEL
) ;
1903 nbpath
+= (long)ttv_count(ttvfig
,sig
->NODE
+1,chain
,type
|TTV_FIND_HZ
) ;
1905 for(ch
= chain
; ch
!= NULL
; ch
= ch
->NEXT
)
1906 if((((ttvevent_list
*)ch
->DATA
)->TYPE
& TTV_NODE_INHZ
) != TTV_NODE_INHZ
)
1908 chaindualhz
= addchain(chaindualhz
,ch
->DATA
) ;
1909 ((ttvevent_list
*)ch
->DATA
)->TYPE
|= TTV_NODE_INHZ
;
1914 for(i
= 0 ; i
< ttvfig
->NBEBREAKSIG
+ ttvfig
->NBIBREAKSIG
; i
++)
1916 sig
= (i
< ttvfig
->NBEBREAKSIG
) ? *(ttvfig
->EBREAKSIG
+ i
)
1917 : *(ttvfig
->IBREAKSIG
+ i
- ttvfig
->NBEBREAKSIG
) ;
1918 if((sig
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) == 0)
1920 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,NULL
,type
,ttvfig
->INFO
->LEVEL
) ;
1921 nbpath
+= (long)ttv_count(ttvfig
,sig
->NODE
,chain
,type
) ;
1924 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,NULL
,type
,ttvfig
->INFO
->LEVEL
) ;
1925 nbpath
+= (long)ttv_count(ttvfig
,sig
->NODE
+1,chain
,type
) ;
1931 if(((type
& TTV_FIND_LINE
) == TTV_FIND_LINE
) && (marque
== 'Y'))
1935 ptlbloc
[0] = ttvfig
->DBLOC
;
1936 ptlbloc
[1] = ttvfig
->EBLOC
;
1937 ptlbloc
[2] = ttvfig
->FBLOC
;
1938 for(i
= 0 ; i
< 2 ; i
++)
1939 for( ; ptlbloc
[i
] != NULL
; ptlbloc
[i
] = ptlbloc
[i
]->NEXT
)
1941 for(j
= 0 ; j
< TTV_MAX_LBLOC
; j
++)
1943 ptline
= ptlbloc
[i
]->LINE
+ j
;
1944 if((ptline
->TYPE
& TTV_LINE_FR
) == TTV_LINE_FR
)
1946 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
1948 if((ptline
->TYPE
& TTV_LINE_DEPTMAX
) == TTV_LINE_DEPTMAX
)
1949 ptline
->TYPE
&= ~(TTV_LINE_DEPTMAX
) ;
1951 ptline
->TYPE
|= TTV_LINE_DENPTMAX
;
1955 if((ptline
->TYPE
& TTV_LINE_DEPTMIN
) == TTV_LINE_DEPTMIN
)
1956 ptline
->TYPE
&= ~(TTV_LINE_DEPTMIN
) ;
1958 ptline
->TYPE
|= TTV_LINE_DENPTMIN
;
1964 for(i
= 0 ; i
< ttvfig
->NBCONSIG
; i
++)
1966 sig
= *(ttvfig
->CONSIG
+ i
) ;
1967 if((sig
->TYPE
& TTV_SIG_CI
) == TTV_SIG_CI
)
1969 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,NULL
,type
|TTV_FIND_DUAL
,ttvfig
->INFO
->LEVEL
) ;
1970 if((chaindualr
!= NULL
) || (chainduals
!= NULL
))
1971 chain
= ttv_filterrs(chain
,'N') ;
1972 ttv_count(ttvfig
,sig
->NODE
,chain
,type
|TTV_FIND_DUAL
) ;
1975 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,NULL
,type
|TTV_FIND_DUAL
,ttvfig
->INFO
->LEVEL
) ;
1976 if((chaindualr
!= NULL
) || (chainduals
!= NULL
))
1977 chain
= ttv_filterrs(chain
,'N') ;
1978 ttv_count(ttvfig
,sig
->NODE
+1,chain
,type
|TTV_FIND_DUAL
) ;
1984 for(i
= 0 ; i
< ttvfig
->NBNCSIG
; i
++)
1986 sig
= *(ttvfig
->NCSIG
+ i
) ;
1987 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,NULL
,type
|TTV_FIND_DUAL
,ttvfig
->INFO
->LEVEL
) ;
1988 if((chaindualr
!= NULL
) || (chainduals
!= NULL
))
1989 chain
= ttv_filterrs(chain
,'N') ;
1990 ttv_count(ttvfig
,sig
->NODE
,chain
,type
|TTV_FIND_DUAL
) ;
1993 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,NULL
,type
|TTV_FIND_DUAL
,ttvfig
->INFO
->LEVEL
) ;
1994 if((chaindualr
!= NULL
) || (chainduals
!= NULL
))
1995 chain
= ttv_filterrs(chain
,'N') ;
1996 ttv_count(ttvfig
,sig
->NODE
+1,chain
,type
|TTV_FIND_DUAL
) ;
2001 for(i
= 0 ; i
< ttvfig
->NBELCMDSIG
+ ttvfig
->NBILCMDSIG
; i
++)
2003 sig
= (i
< ttvfig
->NBELCMDSIG
) ? *(ttvfig
->ELCMDSIG
+ i
)
2004 : *(ttvfig
->ILCMDSIG
+ i
- ttvfig
->NBELCMDSIG
) ;
2005 if((sig
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) == 0)
2007 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,NULL
,type
|TTV_FIND_DUAL
,ttvfig
->INFO
->LEVEL
) ;
2008 if((chaindualr
!= NULL
) || (chainduals
!= NULL
))
2009 chain
= ttv_filterrs(chain
,'N') ;
2010 ttv_count(ttvfig
,sig
->NODE
,chain
,type
|TTV_FIND_DUAL
) ;
2013 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,NULL
,type
|TTV_FIND_DUAL
,ttvfig
->INFO
->LEVEL
) ;
2014 if((chaindualr
!= NULL
) || (chainduals
!= NULL
))
2015 chain
= ttv_filterrs(chain
,'N') ;
2016 ttv_count(ttvfig
,sig
->NODE
+1,chain
,type
|TTV_FIND_DUAL
) ;
2022 for(i
= 0 ; i
< ttvfig
->NBEBREAKSIG
+ ttvfig
->NBIBREAKSIG
; i
++)
2024 sig
= (i
< ttvfig
->NBEBREAKSIG
) ? *(ttvfig
->EBREAKSIG
+ i
)
2025 : *(ttvfig
->IBREAKSIG
+ i
- ttvfig
->NBEBREAKSIG
) ;
2026 if((sig
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) == 0)
2028 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,NULL
,type
|TTV_FIND_DUAL
,ttvfig
->INFO
->LEVEL
) ;
2029 if((chaindualr
!= NULL
) || (chainduals
!= NULL
))
2030 chain
= ttv_filterrs(chain
,'N') ;
2031 ttv_count(ttvfig
,sig
->NODE
,chain
,type
|TTV_FIND_DUAL
) ;
2034 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,NULL
,type
|TTV_FIND_DUAL
,ttvfig
->INFO
->LEVEL
) ;
2035 if((chaindualr
!= NULL
) || (chainduals
!= NULL
))
2036 chain
= ttv_filterrs(chain
,'N') ;
2037 ttv_count(ttvfig
,sig
->NODE
+1,chain
,type
|TTV_FIND_DUAL
) ;
2043 for(i
= 0 ; i
< ttvfig
->NBELATCHSIG
+ ttvfig
->NBILATCHSIG
; i
++)
2045 sig
= (i
< ttvfig
->NBELATCHSIG
) ? *(ttvfig
->ELATCHSIG
+ i
)
2046 : *(ttvfig
->ILATCHSIG
+ i
- ttvfig
->NBELATCHSIG
) ;
2047 if((sig
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) == 0)
2049 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,NULL
,type
|TTV_FIND_DUAL
,ttvfig
->INFO
->LEVEL
) ;
2050 if((chaindualr
!= NULL
) || (chainduals
!= NULL
))
2051 chain
= ttv_filterrs(chain
,'N') ;
2052 ttv_count(ttvfig
,sig
->NODE
,chain
,type
|TTV_FIND_DUAL
) ;
2055 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,NULL
,type
|TTV_FIND_DUAL
,ttvfig
->INFO
->LEVEL
) ;
2056 if((chaindualr
!= NULL
) || (chainduals
!= NULL
))
2057 chain
= ttv_filterrs(chain
,'N') ;
2058 ttv_count(ttvfig
,sig
->NODE
+1,chain
,type
|TTV_FIND_DUAL
) ;
2064 for(ch
= chaindualr
; ch
; ch
= ch
->NEXT
)
2066 event
= (ttvevent_list
*)ch
->DATA
;
2067 event
->TYPE
&= ~(TTV_NODE_INR
) ;
2068 chain
= ttv_findpath(ttvfig
,ttvfig
,event
,NULL
,type
|TTV_FIND_DUAL
|TTV_FIND_R
,
2069 ttvfig
->INFO
->LEVEL
) ;
2070 chain
= ttv_filterrs(chain
,'Y') ;
2071 ttv_count(ttvfig
,event
,chain
,type
|TTV_FIND_DUAL
|TTV_FIND_R
) ;
2076 freechain(chaindualr
) ;
2078 for(ch
= chainduals
; ch
; ch
= ch
->NEXT
)
2080 event
= (ttvevent_list
*)ch
->DATA
;
2081 event
->TYPE
&= ~(TTV_NODE_INS
) ;
2082 chain
= ttv_findpath(ttvfig
,ttvfig
,event
,NULL
,type
|TTV_FIND_DUAL
|TTV_FIND_S
,
2083 ttvfig
->INFO
->LEVEL
) ;
2084 chain
= ttv_filterrs(chain
,'Y') ;
2085 ttv_count(ttvfig
,event
,chain
,type
|TTV_FIND_DUAL
|TTV_FIND_S
) ;
2090 freechain(chainduals
) ;
2092 for(i
= 0 ; i
< ttvfig
->NBEPRESIG
+ ttvfig
->NBIPRESIG
; i
++)
2094 sig
= (i
< ttvfig
->NBEPRESIG
) ? *(ttvfig
->EPRESIG
+ i
)
2095 : *(ttvfig
->IPRESIG
+ i
- ttvfig
->NBEPRESIG
) ;
2096 if((sig
->TYPE
& (TTV_SIG_C
|TTV_SIG_N
)) == 0)
2098 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
,NULL
,type
|TTV_FIND_DUAL
,ttvfig
->INFO
->LEVEL
) ;
2099 if((chaindualr
!= NULL
) || (chainduals
!= NULL
))
2100 chain
= ttv_filterrs(chain
,'N') ;
2101 ttv_count(ttvfig
,sig
->NODE
,chain
,type
|TTV_FIND_DUAL
) ;
2104 chain
= ttv_findpath(ttvfig
,ttvfig
,sig
->NODE
+1,NULL
,type
|TTV_FIND_DUAL
,ttvfig
->INFO
->LEVEL
) ;
2105 if((chaindualr
!= NULL
) || (chainduals
!= NULL
))
2106 chain
= ttv_filterrs(chain
,'N') ;
2107 ttv_count(ttvfig
,sig
->NODE
+1,chain
,type
|TTV_FIND_DUAL
) ;
2113 for(ch
= chaindualhz
; ch
; ch
= ch
->NEXT
)
2115 event
= (ttvevent_list
*)ch
->DATA
;
2116 event
->TYPE
&= ~(TTV_NODE_INHZ
) ;
2117 chain
= ttv_findpath(ttvfig
,ttvfig
,event
,NULL
,type
|TTV_FIND_DUAL
|TTV_FIND_HZ
,
2118 ttvfig
->INFO
->LEVEL
) ;
2119 ttv_count(ttvfig
,event
,chain
,type
|TTV_FIND_DUAL
|TTV_FIND_HZ
) ;
2124 freechain(chaindualhz
) ;
2131 /*****************************************************************************/
2132 /* function ttv_detectinter() */
2134 /* ttvfig : ttvfig que l'on veut factorise */
2135 /* type : type de detection sur lien ou sur chemin */
2137 /* detecte les points intermediaires pour la factorisation */
2138 /*****************************************************************************/
2139 void ttv_detectinter(ttvfig
,type
)
2140 ttvfig_list
*ttvfig
;
2144 ttvsig_list
*ptsig
;
2145 ttvevent_list
*node
;
2146 ttvcmpt_list
*cmpt
;
2147 ttvsbloc_list
*ptsbloc
;
2148 ttvsbloc_list
*ptsblocsav
;
2149 ttvlbloc_list
*ptlbloc
[3] ;
2150 ttvline_list
*ptline
;
2151 chain_list
*chaini
;
2152 chain_list
*chainx
;
2155 long i
,j
,nbfree
,nbend
;
2159 long typenodex
= (long)0 ;
2166 if((type
& TTV_FIND_MAX
) == TTV_FIND_MAX
)
2169 typenodex
|= TTV_NODE_IMAX
;
2173 typenodex
&= ~(TTV_NODE_IMAX
) ;
2177 if((type
& TTV_FIND_MIN
) == TTV_FIND_MIN
)
2179 typenodex
|= TTV_NODE_IMIN
;
2184 typenodex
&= ~(TTV_NODE_IMIN
) ;
2188 if(((type
& TTV_FIND_MIN
) != TTV_FIND_MIN
) &&
2189 ((type
& TTV_FIND_MAX
) != TTV_FIND_MAX
))
2191 typenodex
|= TTV_NODE_IMAX
;
2192 typenodex
|= TTV_NODE_IMIN
;
2197 type
&= ~(TTV_FIND_DUAL
|TTV_FIND_MAX
|TTV_FIND_MIN
|TTV_FIND_HZ
) ;
2198 type
|= TTV_FIND_HIER
;
2200 /*file = mbkfopen(ttvfig->INFO->FIGNAME,"cnt",WRITE_TEXT) ;
2201 fprintf(file,"figure %s\n\n",ttvfig->INFO->FIGNAME) ;*/
2203 for(nbloop
= 0 ; nbloop
< nbloopx
; nbloop
++ )
2208 type
|= TTV_FIND_MAX
;
2209 type
&= ~(TTV_FIND_MIN
) ;
2210 /*fprintf(file,"MAX PATH FACTORISATION\n\n") ;*/
2211 typenode
= TTV_NODE_IMAX
;
2215 /*fprintf(file,"MIN PATH FACTORISATION\n\n") ;*/
2216 type
|= TTV_FIND_MIN
;
2217 type
&= ~(TTV_FIND_MAX
) ;
2218 typenode
= TTV_NODE_IMIN
;
2221 for(i
= 0 ; i
< ttvfig
->NBINTSIG
+ ttvfig
->NBEXTSIG
; i
++)
2223 ptsig
= (i
< ttvfig
->NBEXTSIG
) ? *(ttvfig
->EXTSIG
+ i
)
2224 : *(ttvfig
->INTSIG
+ i
- ttvfig
->NBEXTSIG
) ;
2225 if(ptsig
->ROOT
== ttvfig
)
2227 ptsig
->NODE
[0].TYPE
|= typenodex
;
2228 ptsig
->NODE
[1].TYPE
|= typenodex
;
2232 ptsig
->NODE
[0].TYPE
&= ~(typenode
) ;
2233 ptsig
->NODE
[1].TYPE
&= ~(typenode
) ;
2235 ptsig
->NODE
[0].TYPE
&= ~(TTV_NODE_FACTMASK
) ;
2236 ptsig
->NODE
[1].TYPE
&= ~(TTV_NODE_FACTMASK
) ;
2237 ptsig
->NODE
[0].TYPE
|= TTV_NODE_PFACT
;
2238 ptsig
->NODE
[1].TYPE
|= TTV_NODE_PFACT
;
2239 TTV_CMPT_SIGLIST
= addchain(TTV_CMPT_SIGLIST
,(void *)ptsig
) ;
2242 for(i
= 0 ; i
< ttvfig
->NBESIG
; i
++)
2244 ptsig
= *(ttvfig
->ESIG
+ i
) ;
2245 if(ptsig
->ROOT
== ttvfig
)
2247 ptsig
->NODE
[0].TYPE
&= ~(TTV_NODE_FACTMASK
) ;
2248 ptsig
->NODE
[1].TYPE
&= ~(TTV_NODE_FACTMASK
) ;
2249 ptsig
->NODE
[0].TYPE
|= TTV_NODE_PFACT
;
2250 ptsig
->NODE
[1].TYPE
|= TTV_NODE_PFACT
;
2251 ptsig
->NODE
[0].TYPE
&= ~(typenode
) ;
2252 ptsig
->NODE
[1].TYPE
&= ~(typenode
) ;
2253 TTV_CMPT_SIGLIST
= addchain(TTV_CMPT_SIGLIST
,(void *)ptsig
) ;
2257 ptsbloc
= ttvfig
->ISIG
;
2258 nbfree
= (TTV_MAX_SBLOC
- (ttvfig
->NBISIG
% TTV_MAX_SBLOC
)) % TTV_MAX_SBLOC
;
2259 nbend
= ttvfig
->NBISIG
+ nbfree
;
2261 for(i
= nbfree
; i
< nbend
; i
++)
2263 j
= i
% TTV_MAX_SBLOC
;
2264 if((j
== 0) && (i
!= 0)) ptsbloc
= ptsbloc
->NEXT
;
2265 ptsig
= ptsbloc
->SIG
+ j
;
2266 ptsig
->NODE
[0].TYPE
&= ~(TTV_NODE_FACTMASK
) ;
2267 ptsig
->NODE
[1].TYPE
&= ~(TTV_NODE_FACTMASK
) ;
2268 ptsig
->NODE
[0].TYPE
|= TTV_NODE_PFACT
;
2269 ptsig
->NODE
[1].TYPE
|= TTV_NODE_PFACT
;
2270 ptsig
->NODE
[0].TYPE
&= ~(typenode
) ;
2271 ptsig
->NODE
[1].TYPE
&= ~(typenode
) ;
2272 TTV_CMPT_SIGLIST
= addchain(TTV_CMPT_SIGLIST
,(void *)ptsig
) ;
2277 if((type
& TTV_FIND_FACTGLO
) != TTV_FIND_FACTGLO
)
2279 while((test
!= 0) && (test
<= TTV_MAX_FCYCLE
))
2283 nbpath
= ttv_countsep(ttvfig
,type
,marque
) ;
2286 ttv_deleteglobal(type
) ;
2287 ttv_deletenofact(type
) ;
2292 ttv_countsep(ttvfig
,type
|TTV_FIND_COUPLE
,marque
) ;
2296 for(chain
= TTV_CMPT_SIGLIST
; chain
!= NULL
; chain
= chain
->NEXT
)
2298 ptsig
= (ttvsig_list
*)chain
->DATA
;
2299 for(i
= 0 ; i
< 2 ; i
++)
2301 node
= (ttvevent_list
*)ptsig
->NODE
+ i
;
2302 if((node
->TYPE
& TTV_NODE_PFACT
) != TTV_NODE_PFACT
)
2304 if((cmpt
= ttv_getcmpt(node
)) == NULL
)
2306 /*ttv_clearcmpt(cmpt,TTV_FLIN_IN|TTV_FLIN_OUT) ;*/
2307 if(((cmpt
->NBNODEIN
* cmpt
->NBNODEOUT
) -
2308 (cmpt
->NBNODEIN
+ cmpt
->NBNODEOUT
)) < (long)2)
2317 if(test
< TTV_MAX_FCYCLE
)
2321 /* ne sert a rien */
2322 /*ttv_delallcmpt() ;
2323 ttv_countsep(ttvfig,type|TTV_FIND_COUPLE,marque) ;*/
2324 /* fin sert a rien */
2330 if((ttv_deletebadfact(type
) == 0) && (test
< TTV_MAX_FCYCLE
))
2336 /* ne sert a rien */
2337 /*ttv_delallcmpt() ;
2338 ttv_countsep(ttvfig,type|TTV_FIND_COUPLE,marque) ;*/
2339 /* fin sert a rien */
2348 ttv_countsep(ttvfig
,type
,marque
) ;
2352 /*fprintf(file,"nb cycle = %ld nb fline = %ld nb cmpt = %ld\n\n",test,TTV_MAX_FLINE,TTV_MAX_CMPT) ;*/
2354 for(chain
= TTV_CMPT_SIGLIST
; chain
!= NULL
; chain
= chain
->NEXT
)
2356 ptsig
= (ttvsig_list
*)chain
->DATA
;
2357 if(ttv_verifactsig(ptsig
,type
) != 0)
2360 /*fprintf(file,"%s : factorisation point \n\n",ttv_getsigname(ttvfig,buf,ptsig)) ;*/
2363 fprintf(file,"%s : not factorisation point \n\n",ttv_getsigname(ttvfig,buf,ptsig)) ;*/
2365 if((type
& TTV_FIND_FACTGLO
) == TTV_FIND_FACTGLO
)
2367 for(i
= 0 ; i
< 2 ; i
++)
2369 /* fprintf(file,"node %ld : ",i) ;
2370 node = (ttvevent_list *)ptsig->NODE + i ;
2371 if(((node->TYPE & TTV_NODE_IMAX) == TTV_NODE_IMAX) &&
2372 ((type & TTV_FIND_MAX) == TTV_FIND_MAX))
2373 fprintf(file,"FP : MAX ") ;
2374 if(((node->TYPE & TTV_NODE_IMIN) == TTV_NODE_IMIN) &&
2375 ((type & TTV_FIND_MIN) == TTV_FIND_MIN))
2376 fprintf(file,"FP : MIN ") ;
2377 if(((node->TYPE & TTV_NODE_IMAX) == TTV_NODE_IMAX) &&
2378 ((type & TTV_FIND_MIN) == TTV_FIND_MIN))
2379 fprintf(file,"MAX ") ;
2380 if(((node->TYPE & TTV_NODE_IMIN) == TTV_NODE_IMIN) &&
2381 ((type & TTV_FIND_MAX) == TTV_FIND_MAX))
2382 fprintf(file,"MIN ") ;
2383 if((ptype = getptype(node->USER,TTV_NODE_CMPT)) == NULL)
2386 cmpt = (ttvcmpt_list *)ptype->DATA ;*/
2387 /*ttv_clearcmpt(cmpt,TTV_FLIN_IN|TTV_FLIN_OUT) ;*/
2397 fprintf(file,"nbin = %ld nbout = %ld nbpath = %ld gain = %ld\n",
2398 cmpt->NBIN,cmpt->NBOUT,cmpt->NBPATH,
2399 cmpt->NBPATH - (cmpt->NBIN + cmpt->NBOUT)) ;
2400 if(cmpt->NBCOUPLE <= (cmpt->NBNODEIN+cmpt->NBNODEOUT+(long)1))
2401 fprintf(file,"BF nbnodein = %ld nbnodeout = %ld nbfantotal = %ld nbcouple = %ld\n",cmpt->NBNODEIN,cmpt->NBNODEOUT,cmpt->NBNODEIN+cmpt->NBNODEOUT,cmpt->NBCOUPLE) ;
2403 fprintf(file,"GF nbnodein = %ld nbnodeout = %ld nbfantotal = %ld nbcouple = %ld\n",cmpt->NBNODEIN,cmpt->NBNODEOUT,cmpt->NBNODEIN+cmpt->NBNODEOUT,cmpt->NBCOUPLE) ;
2410 for(fline = cmpt->PATHIN ; fline != NULL ; fline = fline->NEXT)
2412 fprintf(file,"IN : %s %c nbin = %ld nbout = %ld nbpath = %ld gain = %ld\n",
2413 ttv_getsigname(ttvfig,buf,fline->NODE->ROOT),
2414 ((fline->NODE->TYPE & TTV_NODE_UP) == TTV_NODE_UP) ? 'U':'D',
2415 fline->NBIN,fline->NBOUT,fline->NBPATH,
2416 fline->NBPATH - (fline->NBIN + fline->NBOUT)) ;
2417 nbin += fline->NBIN ;
2419 nbpathin += fline->NBPATH ;
2420 if(fline->NBOUT > nboutmax)
2421 nboutmax = fline->NBOUT ;
2422 if(fline->NBOUT > cmpt->NBOUT)
2423 fprintf(file,"ERROR OUT : nbout = %d nbcmptout = %ld\n",
2424 fline->NBOUT,cmpt->NBOUT) ;
2425 if((fline->NODE->TYPE & TTV_NODE_MARQUE) == TTV_NODE_MARQUE)
2426 fprintf(file,"ERROR MUL : %s %c\n",ttv_getsigname(ttvfig,buf,fline->NODE->ROOT),((fline->NODE->TYPE & TTV_NODE_UP) == TTV_NODE_UP) ? 'U':'D') ;
2427 fline->NODE->TYPE |= TTV_NODE_MARQUE ;
2430 for(fline = cmpt->PATHIN ; fline != NULL ; fline = fline->NEXT)
2431 fline->NODE->TYPE &= ~(TTV_NODE_MARQUE) ;
2438 for(fline = cmpt->PATHOUT ; fline != NULL ; fline = fline->NEXT)
2440 fprintf(file,"OUT : %s %c nbin = %ld nbout = %ld nbpath = %ld gain = %ld\n",
2441 ttv_getsigname(ttvfig,buf,fline->NODE->ROOT),
2442 ((fline->NODE->TYPE & TTV_NODE_UP) == TTV_NODE_UP) ? 'U':'D',
2443 fline->NBIN,fline->NBOUT,fline->NBPATH,
2444 fline->NBPATH - (fline->NBIN + fline->NBOUT)) ;
2445 nbout += fline->NBOUT ;
2447 nbpathout += fline->NBPATH ;
2448 if(fline->NBIN > nbinmax)
2449 nbinmax = fline->NBIN ;
2450 if(fline->NBIN > cmpt->NBIN)
2451 fprintf(file,"ERROR IN : nbin = %d nbcmptin = %ld\n",
2452 fline->NBIN,cmpt->NBIN) ;
2453 if((fline->NODE->TYPE & TTV_NODE_MARQUE) == TTV_NODE_MARQUE)
2454 fprintf(file,"ERROR MUL : %s %c\n",ttv_getsigname(ttvfig,buf,fline->NODE->ROOT),((fline->NODE->TYPE & TTV_NODE_UP) == TTV_NODE_UP) ? 'U':'D') ;
2455 fline->NODE->TYPE |= TTV_NODE_MARQUE ;
2457 for(fline = cmpt->PATHOUT ; fline != NULL ; fline = fline->NEXT)
2458 fline->NODE->TYPE &= ~(TTV_NODE_MARQUE) ;
2460 if((((nbinx*nboutx) - (nbinx+nboutx)) < (long)2) ||
2461 (nbinx == (long)0) || (nboutx == (long)0))
2462 fprintf(file,"ERROR FAN : ") ;
2463 fprintf(file,"node fan : fanin = %d fanout = %ld\n",
2465 if((nbpathin != cmpt->NBPATH) || (nbpathout != cmpt->NBPATH))
2466 fprintf(file,"ERROR PATH : nbpathin = %d nbpathout = %ld nbpath = %ld\n",
2467 nbpathin,nbpathout,cmpt->NBPATH) ;
2468 if((nbin != cmpt->NBIN) || (nboutmax > cmpt->NBOUT))
2469 fprintf(file,"ERROR IN : nbin = %d nbcmptin = %ld nboutmax = %ld\n" ,
2470 nbin,cmpt->NBIN,nbpathout) ;
2471 if((nbout != cmpt->NBOUT) || (nbinmax > cmpt->NBIN))
2472 fprintf(file,"ERROR OUT : nbout = %d nbcmptout = %ld nbinmax = %ld \n",
2473 nbout,cmpt->NBOUT,nbinmax) ;
2475 else fprintf(file,"nothing\n") ;
2476 fprintf(file,"\n") ;
2481 freechain(TTV_CMPT_SIGLIST
) ;
2482 TTV_CMPT_SIGLIST
= NULL
;
2484 /* fprintf(file,"\nnb fact = %ld nb path = %ld\n",nbx,nbpath) ;*/
2491 if((nbx
=ttvfig
->NBESIG
) != 0)
2493 for(i
= 0 ; i
< ttvfig
->NBESIG
; i
++)
2495 ptsig
= *(ttvfig
->ESIG
+ i
) ;
2496 ptsig
->NODE
[0].TYPE
&= ~(TTV_NODE_PFACT
) ;
2497 ptsig
->NODE
[1].TYPE
&= ~(TTV_NODE_PFACT
) ;
2498 if(ttv_checkfactsig(ptsig
) != 0)
2501 chaini
= addchain(chaini
,ptsig
) ;
2502 ptsig
->TYPE
|= TTV_SIG_I
;
2503 ptsig
->TYPE
&= ~(TTV_SIG_S
) ;
2508 ptsig
->TYPE
&= ~(TTV_SIG_EXT
) ;
2509 chainx
= addchain(chainx
,(void*)ptsig
) ;
2514 ttv_freereflist(ttvfig
,ttvfig
->ESIG
,(long)0) ;
2515 ttvfig
->ESIG
= ttv_allocreflist(chainx
,nbx
) ;
2516 ttvfig
->NBESIG
= nbx
;
2525 if((nbx
= ttvfig
->NBISIG
) != 0)
2527 ptsbloc
= ttvfig
->ISIG
;
2528 nbfree
= (TTV_MAX_SBLOC
- (ttvfig
->NBISIG
% TTV_MAX_SBLOC
))
2530 nbend
= ttvfig
->NBISIG
+ nbfree
;
2532 for(i
= nbfree
; i
< nbend
; i
++)
2534 j
= i
% TTV_MAX_SBLOC
;
2535 if((j
== 0) && (i
!= 0)) ptsbloc
= ptsbloc
->NEXT
;
2536 ptsig
= ptsbloc
->SIG
+ j
;
2537 ptsig
->NODE
[0].TYPE
&= ~(TTV_NODE_PFACT
) ;
2538 ptsig
->NODE
[1].TYPE
&= ~(TTV_NODE_PFACT
) ;
2539 if(ttv_checkfactsig(ptsig
) != 0)
2541 ttvsig_list
*ptsigx
;
2544 ptsig
->TYPE
|= TTV_SIG_F
;
2545 chaini
= ttv_addrefsig(ttvfig
,ptsig
->NAME
,ptsig
->NETNAME
,ptsig
->CAPA
,TTV_SIG_I
,chaini
) ;
2546 ptsigx
= (ttvsig_list
*)chaini
->DATA
;
2547 if((ptsig
->TYPE
& TTV_SIG_EXT
) == TTV_SIG_EXT
)
2549 ptsigx
->TYPE
|= TTV_SIG_EXT
;
2550 ptsig
->TYPE
&= ~(TTV_SIG_EXT
) ;
2552 ptsigx
->NODE
[0].TYPE
|= (ptsig
->NODE
[0].TYPE
& TTV_NODE_IMAX
) ;
2553 ptsigx
->NODE
[1].TYPE
|= (ptsig
->NODE
[1].TYPE
& TTV_NODE_IMAX
) ;
2554 ptsigx
->NODE
[0].TYPE
|= (ptsig
->NODE
[0].TYPE
& TTV_NODE_IMIN
) ;
2555 ptsigx
->NODE
[1].TYPE
|= (ptsig
->NODE
[1].TYPE
& TTV_NODE_IMIN
) ;
2556 ptsigx
->USER
= ptsig
->USER
;
2557 ptsigx
->NODE
[0].USER
= ptsig
->NODE
[0].USER
;
2558 ptsigx
->NODE
[1].USER
= ptsig
->NODE
[1].USER
;
2559 ptsigx
->NODE
[0].INLINE
= ptsig
->NODE
[0].INLINE
;
2560 ptsigx
->NODE
[1].INLINE
= ptsig
->NODE
[1].INLINE
;
2561 ptsigx
->NODE
[0].INPATH
= ptsig
->NODE
[0].INPATH
;
2562 ptsigx
->NODE
[1].INPATH
= ptsig
->NODE
[1].INPATH
;
2563 ptsig
->USER
= NULL
;
2564 ptsig
->NODE
[0].USER
= NULL
;
2565 ptsig
->NODE
[1].USER
= NULL
;
2566 ptsig
->USER
= addptype(ptsig
->USER
,TTV_SIG_NEW
,(void*)ptsigx
) ;
2567 chainx
= addchain(chainx
,ptsig
) ;
2572 ptsig
->TYPE
&= ~(TTV_SIG_EXT
) ;
2578 nbx
= ttvfig
->NBISIG
- nbx
;
2579 ptsbloc
= ttvfig
->ISIG
;
2580 nbfree
= (TTV_MAX_SBLOC
- (ttvfig
->NBISIG
% TTV_MAX_SBLOC
))
2582 nbend
= ttvfig
->NBISIG
+ nbfree
;
2584 for(i
= nbfree
; i
< nbend
; i
++)
2586 j
= i
% TTV_MAX_SBLOC
;
2587 if((j
== 0) && (i
!= 0)) ptsbloc
= ptsbloc
->NEXT
;
2588 ptsig
= ptsbloc
->SIG
+ j
;
2589 if((ptsig
->TYPE
& TTV_SIG_F
) == TTV_SIG_F
)
2590 ptsig
->TYPE
|= TTV_SIG_MARQUE
;
2592 if(nbx
== (long)0) break ;
2595 for(chain
= chainx
; chain
!= NULL
; chain
= chain
->NEXT
)
2597 ttvsig_list
*ptsigx
;
2600 ptsig
= (ttvsig_list
*)chain
->DATA
;
2601 ptsigx
= ttvfig
->ISIG
->SIG
+ nbfree
;
2602 if((ptsig
->TYPE
& TTV_SIG_MARQUE
) == TTV_SIG_MARQUE
)
2604 ptsig
->TYPE
&= ~(TTV_SIG_MARQUE
) ;
2607 while((ptsigx
->TYPE
& TTV_SIG_F
) == TTV_SIG_F
)
2610 if(nbfree
== TTV_MAX_SBLOC
)
2612 ptsbloc
= ttvfig
->ISIG
;
2613 ttvfig
->ISIG
= ptsbloc
->NEXT
;
2614 ptsbloc
->NEXT
= ptsblocsav
;
2615 ptsblocsav
= ptsbloc
;
2618 ptsigx
= ttvfig
->ISIG
->SIG
+ nbfree
;
2620 ptype
= ptsig
->USER
;
2621 ptsig
->NAME
= ptsigx
->NAME
;
2622 ptsig
->NETNAME
= ptsigx
->NETNAME
;
2623 ptsig
->CAPA
= ptsigx
->CAPA
;
2624 ptsig
->ROOT
= ptsigx
->ROOT
;
2625 ptsig
->TYPE
= ptsigx
->TYPE
;
2626 ptsig
->USER
= ptsigx
->USER
;
2627 ptsig
->NODE
[0].ROOT
= ptsig
;
2628 ptsig
->NODE
[0].TYPE
= ptsigx
->NODE
[0].TYPE
;
2629 ptsig
->NODE
[0].INLINE
= ptsigx
->NODE
[0].INLINE
;
2630 ptsig
->NODE
[0].INPATH
= ptsigx
->NODE
[0].INPATH
;
2631 ptsig
->NODE
[0].FIND
= ptsigx
->NODE
[0].FIND
;
2632 ptsig
->NODE
[0].USER
= ptsigx
->NODE
[0].USER
;
2633 ptsig
->NODE
[1].ROOT
= ptsig
;
2634 ptsig
->NODE
[1].TYPE
= ptsigx
->NODE
[1].TYPE
;
2635 ptsig
->NODE
[1].INLINE
= ptsigx
->NODE
[1].INLINE
;
2636 ptsig
->NODE
[1].INPATH
= ptsigx
->NODE
[1].INPATH
;
2637 ptsig
->NODE
[1].FIND
= ptsigx
->NODE
[1].FIND
;
2638 ptsig
->NODE
[1].USER
= ptsigx
->NODE
[1].USER
;
2639 ptype
->NEXT
= ptsig
->USER
;
2640 ptsig
->USER
= ptype
;
2641 ptsigx
->USER
= NULL
;
2642 ptsigx
->NODE
[0].USER
= NULL
;
2643 ptsigx
->NODE
[1].USER
= NULL
;
2644 ptsigx
->USER
= addptype(ptsigx
->USER
,TTV_SIG_NEW
,(void*)ptsig
) ;
2645 chainx
= addchain(chainx
,(void*)ptsigx
) ;
2647 if(nbfree
== TTV_MAX_SBLOC
)
2649 ptsbloc
= ttvfig
->ISIG
;
2650 ttvfig
->ISIG
= ptsbloc
->NEXT
;
2651 ptsbloc
->NEXT
= ptsblocsav
;
2652 ptsblocsav
= ptsbloc
;
2658 if(ttvfig
->ISIG
!= NULL
)
2660 ptsig
= ttvfig
->ISIG
->SIG
+ nbfree
;
2661 while((ptsig
->TYPE
& TTV_SIG_F
) == TTV_SIG_F
)
2664 if(nbfree
== TTV_MAX_SBLOC
)
2666 ptsbloc
= ttvfig
->ISIG
;
2667 ttvfig
->ISIG
= ptsbloc
->NEXT
;
2668 ptsbloc
->NEXT
= ptsblocsav
;
2669 ptsblocsav
= ptsbloc
;
2672 ptsig
= ttvfig
->ISIG
->SIG
+ nbfree
;
2677 ptlbloc
[2] = ttvfig
->FBLOC
;
2678 ptlbloc
[1] = ttvfig
->EBLOC
;
2679 ptlbloc
[0] = ttvfig
->DBLOC
;
2680 for(i
= 0 ; i
< 3 ; i
++)
2681 for( ; ptlbloc
[i
] != NULL
; ptlbloc
[i
] = ptlbloc
[i
]->NEXT
)
2683 for(j
= 0 ; j
< TTV_MAX_LBLOC
; j
++)
2685 ptline
= ptlbloc
[i
]->LINE
+ j
;
2686 if((ptline
->TYPE
& TTV_LINE_FR
) == TTV_LINE_FR
)
2688 if((ptype
= getptype(ptline
->ROOT
->ROOT
->USER
,TTV_SIG_NEW
)) != NULL
)
2690 if((ptline
->ROOT
->TYPE
& TTV_NODE_UP
) == TTV_NODE_UP
)
2691 ptline
->ROOT
= ((ttvsig_list
*)ptype
->DATA
)->NODE
+1 ;
2693 ptline
->ROOT
= ((ttvsig_list
*)ptype
->DATA
)->NODE
;
2695 if((ptype
= getptype(ptline
->NODE
->ROOT
->USER
,TTV_SIG_NEW
)) != NULL
)
2697 if((ptline
->NODE
->TYPE
& TTV_NODE_UP
) == TTV_NODE_UP
)
2698 ptline
->NODE
= ((ttvsig_list
*)ptype
->DATA
)->NODE
+1 ;
2700 ptline
->NODE
= ((ttvsig_list
*)ptype
->DATA
)->NODE
;
2702 if((ptline
->NODE
->ROOT
->TYPE
& TTV_SIG_I
) == TTV_SIG_I
)
2704 ptline
->NODE
->ROOT
->TYPE
|= TTV_SIG_MARQUE
;
2705 if((ptline
->TYPE
& TTV_LINE_D
) == TTV_LINE_D
)
2706 ptline
->NODE
->ROOT
->TYPE
|= TTV_SIG_EXT
;
2708 if((ptline
->ROOT
->ROOT
->TYPE
& TTV_SIG_I
) == TTV_SIG_I
)
2710 ptline
->ROOT
->ROOT
->TYPE
|= TTV_SIG_MARQUE
;
2711 if((ptline
->TYPE
& TTV_LINE_D
) == TTV_LINE_D
)
2712 ptline
->ROOT
->ROOT
->TYPE
|= TTV_SIG_EXT
;
2717 ptlbloc
[2] = ttvfig
->PBLOC
;
2718 ptlbloc
[1] = ttvfig
->JBLOC
;
2719 ptlbloc
[0] = ttvfig
->TBLOC
;
2720 for(i
= 0 ; i
< 3 ; i
++)
2721 for( ; ptlbloc
[i
] != NULL
; ptlbloc
[i
] = ptlbloc
[i
]->NEXT
)
2723 for(j
= 0 ; j
< TTV_MAX_LBLOC
; j
++)
2725 ptline
= ptlbloc
[i
]->LINE
+ j
;
2726 if((ptline
->TYPE
& TTV_LINE_FR
) == TTV_LINE_FR
)
2728 if((ptype
= getptype(ptline
->ROOT
->ROOT
->USER
,TTV_SIG_NEW
)) != NULL
)
2730 if((ptline
->ROOT
->TYPE
& TTV_NODE_UP
) == TTV_NODE_UP
)
2731 ptline
->ROOT
= ((ttvsig_list
*)ptype
->DATA
)->NODE
+1 ;
2733 ptline
->ROOT
= ((ttvsig_list
*)ptype
->DATA
)->NODE
;
2735 if((ptype
= getptype(ptline
->NODE
->ROOT
->USER
,TTV_SIG_NEW
)) != NULL
)
2737 if((ptline
->NODE
->TYPE
& TTV_NODE_UP
) == TTV_NODE_UP
)
2738 ptline
->NODE
= ((ttvsig_list
*)ptype
->DATA
)->NODE
+1 ;
2740 ptline
->NODE
= ((ttvsig_list
*)ptype
->DATA
)->NODE
;
2745 for(chain
= chainx
; chain
!= NULL
; chain
= chain
->NEXT
)
2746 ((ttvsig_list
*)chain
->DATA
)->USER
=
2747 delptype(((ttvsig_list
*)chain
->DATA
)->USER
,TTV_SIG_NEW
) ;
2750 ttv_freesbloclist(ptsblocsav
) ;
2752 if(chaini
!= NULL
) flag
= 'Y' ;
2754 for(i
= 0 ; i
< ttvfig
->NBEXTSIG
+ ttvfig
->NBINTSIG
; i
++)
2756 ptsig
= (i
< ttvfig
->NBEXTSIG
) ? *(ttvfig
->EXTSIG
+ i
)
2757 : *(ttvfig
->INTSIG
+ i
- ttvfig
->NBEXTSIG
) ;
2758 if((i
>= ttvfig
->NBEXTSIG
) && ((ptsig
->TYPE
& TTV_SIG_EXT
) == TTV_SIG_EXT
))
2762 ptsig
->NODE
[0].TYPE
&= ~(TTV_NODE_PFACT
) ;
2763 ptsig
->NODE
[1].TYPE
&= ~(TTV_NODE_PFACT
) ;
2764 if((ttv_checkfactsig(ptsig
) != 0) || (ptsig
->ROOT
== ttvfig
) ||
2765 ((ptsig
->TYPE
& TTV_SIG_MARQUE
) == TTV_SIG_MARQUE
))
2767 ptsig
->TYPE
&= ~(TTV_SIG_MARQUE
) ;
2768 chaini
= addchain(chaini
,ptsig
) ;
2772 ptsig
->TYPE
&= ~(TTV_SIG_EXT
) ;
2779 ttv_freereflist(ttvfig
,ttvfig
->EXTSIG
,(long)0) ;
2780 ttv_freereflist(ttvfig
,ttvfig
->INTSIG
,(long)0) ;
2781 ttvfig
->EXTSIG
= NULL
;
2782 ttvfig
->INTSIG
= NULL
;
2783 ttvfig
->NBEXTSIG
= (long)0 ;
2784 ttvfig
->NBINTSIG
= (long)0 ;
2786 while(chain
!= NULL
)
2788 ptsig
= (ttvsig_list
*)chain
->DATA
;
2789 chaini
= chain
->NEXT
;
2790 if((ptsig
->TYPE
& TTV_SIG_EXT
) == TTV_SIG_EXT
)
2792 ptsig
->TYPE
&= ~(TTV_SIG_EXT
) ;
2793 chain
->NEXT
= (chain_list
*)ttvfig
->EXTSIG
;
2794 ttvfig
->EXTSIG
= (ttvsig_list
**)chain
;
2795 ttvfig
->NBEXTSIG
++ ;
2799 chain
->NEXT
= (chain_list
*)ttvfig
->INTSIG
;
2800 ttvfig
->INTSIG
= (ttvsig_list
**)chain
;
2801 ttvfig
->NBINTSIG
++ ;
2805 ttvfig
->EXTSIG
= ttv_allocreflist((chain_list
*)ttvfig
->EXTSIG
,
2807 ttvfig
->INTSIG
= ttv_allocreflist((chain_list
*)ttvfig
->INTSIG
,
2813 ttv_delsigtab(ttvfig
) ;