1 /****************************************************************************/
3 /* Chaine de CAO & VLSI Alliance */
5 /* Produit : FCL v1.02 */
6 /* Fichier : fcl_partition.c */
8 /* (c) copyright 1996 Laboratoire MASI equipe CAO & VLSI */
9 /* Tous droits reserves */
10 /* Support : e-mail alliance-support@asim.lip6.fr */
13 /****************************************************************************/
15 #include "fcl_headers.h"
19 ####====================================================================####
23 ## Ajoute un element dans une partition, si cette partition n'existe pas ##
24 ## elle est alors creee ##
26 ####====================================================================####
27 ## entree : pointeur sur la liste des partitions ##
28 ## : pointeur sur la structure de l'element ajoute ##
29 ## : valeur du label de l'element ##
30 ## : type de l'element (TRS ou SIG) ##
31 ## sortie : un pointeur sur le debut des partitions ##
32 ####====================================================================####
35 addpartition(ptpartition
, ptdata
, valeur
, type
)
36 partition_list
*ptpartition
;
43 pt
= getpartition(ptpartition
, valeur
, type
);
45 if (pt
== (partition_list
*) NULL
) {
46 pt
= (partition_list
*) mbkalloc(sizeof(partition_list
));
48 pt
->NEXT
= ptpartition
;
52 pt
->DATA
= (void *) NULL
;
56 pt
->DATA
= (void *) addchain((chain_list
*) pt
->DATA
, ptdata
);
64 ####====================================================================####
66 ## small_partition() ##
68 ## renvoie un pointeur sur la partition ayant le moins d'elements ##
69 ## Les autres partitions sont detruites ##
71 ####====================================================================####
72 ## entree : pointeur sur la liste des partitions ##
73 ## sortie : un pointeur sur le debut des partitions ##
74 ####====================================================================####
77 smallestpartition(ptpartition
)
78 partition_list
*ptpartition
;
80 for (; ptpartition
->NEXT
;) {
81 if (ptpartition
->NEXT
->NBELEM
< ptpartition
->NBELEM
) {
82 ptpartition
= delpartition(ptpartition
, ptpartition
->LABEL
, ptpartition
->TYPE
);
85 ptpartition
= delpartition(ptpartition
, ptpartition
->NEXT
->LABEL
, ptpartition
->NEXT
->TYPE
);
93 ####====================================================================####
97 ## Recherche une partition suivant un label partitculier ##
99 ####====================================================================####
100 ## entree : pointeur sur la liste des partitions ##
101 ## : valeur du label de l'element ##
102 ## : type de l'element (TRS ou SIG) ##
103 ## sortie : un pointeur sur la partition ##
104 ####====================================================================####
107 getpartition(ptpartition
, valeur
, type
)
108 partition_list
*ptpartition
;
114 for (pt
= ptpartition
; pt
; pt
= pt
->NEXT
)
115 if (pt
->LABEL
== valeur
&& pt
->TYPE
== type
)
118 return (partition_list
*) NULL
;
122 ####====================================================================####
126 ## Supprime une partition suivant un label partitculier ##
128 ####====================================================================####
129 ## entree : pointeur sur la liste des partitions ##
130 ## : valeur du label de l'element ##
131 ## : type de l'element (TRS ou SIG) ##
132 ## sortie : un pointeur sur la tete des partitions ##
133 ####====================================================================####
136 delpartition(ptpartition
, valeur
, type
)
137 partition_list
*ptpartition
;
142 partition_list
*pt_before
= ptpartition
;
144 for (pt
= ptpartition
; pt
; pt_before
= pt
, pt
= pt
->NEXT
) {
145 if (pt
->LABEL
== valeur
&& pt
->TYPE
== type
) {
147 /* On veut enlever l'element de tete */
148 ptpartition
= pt
->NEXT
;
150 pt_before
->NEXT
= pt
->NEXT
;
152 freechain((chain_list
*) pt
->DATA
);
162 ####====================================================================####
164 ## removepartitionelement() ##
166 ## Supprime un element dans une partition, si cette partition est vide ##
167 ## elle est alors detruite ##
169 ####====================================================================####
170 ## entree : pointeur sur la liste des partitions ##
171 ## : pointeur sur la structure de l'element enleve ##
172 ## : valeur du label de l'element ##
173 ## : type de l'element (TRS ou SIG) ##
174 ## sortie : un pointeur sur le debut des partitions ##
175 ####====================================================================####
178 removepartitionelement(ptpartition
, valeur
, type
)
179 partition_list
*ptpartition
;
185 pt
= getpartition(ptpartition
, valeur
, type
);
186 if (!--pt
->NBELEM
) ptpartition
= delpartition(ptpartition
, valeur
, type
);
193 ####====================================================================####
195 ## comparepartition() ##
197 ## Compare les deux listes de partitions (model, circuit) ##
198 ## Les partitions du circuit qui n'existent pas dans le model sont ##
199 ## supprime; Verifie qu'a chaque partition du model correspond une ##
200 ## partition dans le circuit ##
202 ####====================================================================####
203 ## entree : pointeur sur la liste des partitions ##
204 ## : pointeur sur la structure de l'element enleve ##
205 ## : valeur du label de l'element ##
206 ## : type de l'element (TRS ou SIG) ##
207 ## sortie : un pointeur sur le debut des partitions ##
208 ####====================================================================####
211 comparepartition(ptpartition_c
, ptpartition_m
)
212 partition_list
*ptpartition_c
;
213 partition_list
*ptpartition_m
;
216 partition_list
*ptcandidat
;
217 partition_list
*ptnext
;
221 /* Supprimer toutes les partitions du circuit pour lesquelles */
222 /* des partitions de poids identiques n'existent pas dans le */
223 /* graphe de la cellule memoire */
224 /* Marquer corrompu les signaux ou les transitors de ces */
225 /* partitions supprimees */
227 for (pt
= ptpartition_c
; pt
; pt
= ptnext
) {
228 if ((ptcandidat
= getpartition(ptpartition_m
, pt
->LABEL
, pt
->TYPE
)) == NULL
|| pt
->LABEL
== 0) {
230 ptpartition_c
= delpartition(ptpartition_c
, pt
->LABEL
, pt
->TYPE
);
232 else ptnext
= pt
->NEXT
;
235 /* Verifie qu'a chaque partition du sous-graphe */
236 /* il existe une partition de taille au moins */
237 /* egale dans le graphe */
238 for (pt
= ptpartition_m
; pt
; pt
= pt
->NEXT
) {
239 if (pt
->LABEL
== 0 && pt
->TYPE
== 'S') {
240 for (ptchain
= pt
->DATA
; ptchain
; ptchain
= ptchain
->NEXT
) {
241 ptlosig
= (losig_list
*) (ptchain
->DATA
);
242 fclCorruptLosig(ptlosig
);
245 else if ((ptcandidat
= getpartition(ptpartition_c
, pt
->LABEL
, pt
->TYPE
)) == NULL
|| ptcandidat
->NBELEM
< pt
->NBELEM
) {
246 /* Pas d'isomorphisme */
247 if (FCL_TRACE_LEVEL
> 1) {
248 printf("*** FCL Match Failed as partition label '%d' in model has no correspondance\n", pt
->LABEL
);
249 displaypartition(pt
);
252 while (ptpartition_c
) {
253 ptpartition_c
= delpartition(ptpartition_c
, ptpartition_c
->LABEL
, ptpartition_c
->TYPE
);
259 return ptpartition_c
;
264 printpartition(ptpartition
)
265 partition_list
*ptpartition
;
269 for (pt
= ptpartition
; pt
; pt
= pt
->NEXT
) {
270 printf("Partition Type=%c label=%d nb elements=%d\n", pt
->TYPE
, pt
->LABEL
, pt
->NBELEM
);
275 displaypartition(ptpartition
)
276 partition_list
*ptpartition
;
281 if (ptpartition
->TYPE
== 'T')
282 for (ptchain
= ptpartition
->DATA
; ptchain
; ptchain
= ptchain
->NEXT
) {
283 ptsig
= ((lotrs_list
*) ptchain
->DATA
)->GRID
->SIG
;
284 if (ptsig
->NAMECHAIN
== NULL
)
285 printf("#### Vecteur candidat G : %ld\n", ptsig
->INDEX
);
287 printf("#### Vecteur candidat G : %s\n",
288 (char *) ptsig
->NAMECHAIN
->DATA
);
290 ptsig
= ((lotrs_list
*) ptchain
->DATA
)->SOURCE
->SIG
;
291 if (ptsig
->NAMECHAIN
== NULL
)
292 printf("#### Vecteur candidat S : %ld\n", ptsig
->INDEX
);
294 printf("#### Vecteur candidat S : %s\n",
295 (char *) ptsig
->NAMECHAIN
->DATA
);
297 ptsig
= ((lotrs_list
*) ptchain
->DATA
)->DRAIN
->SIG
;
298 if (ptsig
->NAMECHAIN
== NULL
)
299 printf("#### Vecteur candidat D : %ld\n", ptsig
->INDEX
);
301 printf("#### Vecteur candidat D : %s\n",
302 (char *) ptsig
->NAMECHAIN
->DATA
);
305 for (ptchain
= ptpartition
->DATA
; ptchain
; ptchain
= ptchain
->NEXT
) {
306 ptsig
= (losig_list
*) ptchain
->DATA
;
307 if (ptsig
->NAMECHAIN
== NULL
)
308 printf("#### Vecteur candidat : %ld\n", ptsig
->INDEX
);
310 printf("#### Vecteur candidat : %s\n",
311 (char *) ptsig
->NAMECHAIN
->DATA
);