1 /****************************************************************************/
3 /* Chaine de CAO & VLSI Alliance */
5 /* Produit : YAGLE v3.50 */
6 /* Fichier : yag_constrain.c */
8 /* (c) copyright 1995 Laboratoire MASI equipe CAO & VLSI */
9 /* Tous droits reserves */
10 /* Support : e-mail alliance-support@asim.lip6.fr */
12 /* Auteur(s) : Anthony LESTER le : 30/05/1995 */
14 /* Modifie par : le : ../../.... */
15 /* Modifie par : le : ../../.... */
16 /* Modifie par : le : ../../.... */
18 /****************************************************************************/
20 #include "yag_headers.h"
22 static chain_list
*getOppositeSwitchList(losig_list
*ptsig
);
23 static void markConstrained (list_list
*headlist
);
24 static locon_list
*getLocon (char *name
);
25 static cone_list
*getCone (char *name
);
27 static ht
*YAG_CONSTRAINT_HT
= NULL
;
28 static ht
*YAG_VARLIST_HT
= NULL
;
30 /*****************************************************************************
31 * function yagInitConstraints() *
32 *****************************************************************************/
34 /* generate the list of constraints, mark the connectors and cones */
35 /* concerned, and generate the list of constrained variables. */
38 yagInitConstraints(inffig_list
*ifl
)
40 chain_list
*ptconstraints
= NULL
;
41 chain_list
*ptchain
, *ptvarlist
;
46 ptconstraints
= yagMuxToConstraint(ifl
);
47 if (ptconstraints
!= NULL
) {
48 if (yagCountChains(ptconstraints
) > 10) {
49 YAG_CONSTRAINT_HT
= addht(100);
50 YAG_VARLIST_HT
= addht(100);
53 YAG_CONSTRAINT_HT
= NULL
;
54 YAG_VARLIST_HT
= NULL
;
56 markConstrained((list_list
*)ptconstraints
->DATA
);
57 YAG_CONTEXT
->YAG_CONSTRAINT_LIST
= ptconstraints
;
59 for (ptlist
= (list_list
*)ptconstraints
->DATA
; ptlist
; ptlist
= ptlist
->NEXT
) {
60 addhtitem(YAG_VARLIST_HT
, ptlist
->DATA
, (long)ptlist
);
63 for (ptchain
= YAG_CONTEXT
->YAG_CONSTRAINT_LIST
->NEXT
; ptchain
; ptchain
= ptchain
->NEXT
) {
64 common
=(long *)mbkalloc(sizeof(long));
66 for (ptlist
= (list_list
*) ptchain
->DATA
; ptlist
; ptlist
= ptlist
->NEXT
) {
67 ptlist
->COMMON
=common
;
69 if (YAG_CONSTRAINT_HT
) {
70 object
= ptlist
->DATA
;
71 if ((ptvarlist
= (chain_list
*)gethtitem(YAG_CONSTRAINT_HT
, object
)) != (void *)EMPTYHT
) {
72 ptvarlist
= addchain(ptvarlist
, ptlist
);
73 sethtitem(YAG_CONSTRAINT_HT
, object
, (long)ptvarlist
);
75 else addhtitem(YAG_CONSTRAINT_HT
, object
, (long)addchain(NULL
, ptlist
));
83 yagDeleteConstraints()
85 chain_list
*ptchain
, *ptvarlist
;
86 list_list
*ptlist
, *ptnextlist
;
89 if (YAG_CONTEXT
->YAG_CONSTRAINT_LIST
!= NULL
) {
90 for (ptlist
= (list_list
*)YAG_CONTEXT
->YAG_CONSTRAINT_LIST
->DATA
; ptlist
; ptlist
= ptnextlist
) {
91 ptnextlist
= ptlist
->NEXT
;
92 freechain(ptlist
->SUPDATA
);
95 for (ptchain
= YAG_CONTEXT
->YAG_CONSTRAINT_LIST
->NEXT
; ptchain
; ptchain
= ptchain
->NEXT
) {
96 for (ptlist
= (list_list
*) ptchain
->DATA
; ptlist
; ptlist
= ptnextlist
) {
97 ptnextlist
= ptlist
->NEXT
;
98 freechain(ptlist
->SUPDATA
);
99 if (ptlist
== ptchain
->DATA
) mbkfree(ptlist
->COMMON
);
100 if (YAG_CONSTRAINT_HT
) {
101 object
= ptlist
->DATA
;
102 ptvarlist
= (chain_list
*)gethtitem(YAG_CONSTRAINT_HT
, object
);
103 if (ptvarlist
!= (void *)EMPTYHT
&& ptvarlist
!= (void *)DELETEHT
) {
104 freechain(ptvarlist
);
105 delhtitem(YAG_CONSTRAINT_HT
, object
);
111 freechain(YAG_CONTEXT
->YAG_CONSTRAINT_LIST
);
112 YAG_CONTEXT
->YAG_CONSTRAINT_LIST
= NULL
;
113 if (YAG_CONSTRAINT_HT
) {
114 delht(YAG_CONSTRAINT_HT
);
115 YAG_CONSTRAINT_HT
= NULL
;
117 if (YAG_VARLIST_HT
) {
118 delht(YAG_VARLIST_HT
);
119 YAG_VARLIST_HT
= NULL
;
124 /*****************************************************************************
125 * function yagGetConstraint() *
126 *****************************************************************************/
128 /* scans the list of constraints and return the first */
129 /* for which all the variables have been tagged. */
132 yagGetConstraint(chain_list
*ptcontraints
)
137 for (ptchain
= ptcontraints
; ptchain
; ptchain
= ptchain
->NEXT
) {
138 ptlist
= (list_list
*)ptchain
->DATA
;
139 common
= *(long *)ptlist
->COMMON
;
140 if (common
==0) return ptchain
;
145 /*****************************************************************************
146 * function yagTagConstraint() *
147 *****************************************************************************/
149 /* tag the constraint variables which refer to the given object */
152 yagTagConstraint(void *object
)
155 chain_list
*ptchain
, *ptvarlist
;
157 list_list
*ptmainvar
;
158 chain_list
*ptnamechain
;
162 if (YAG_CONSTRAINT_HT
) {
163 if ((ptvarlist
= (chain_list
*)gethtitem(YAG_CONSTRAINT_HT
, object
)) != (void *)EMPTYHT
) {
164 for (ptchain
= ptvarlist
; ptchain
; ptchain
= ptchain
->NEXT
) {
165 list
=(list_list
*)ptchain
->DATA
;
166 if (list
->TYPE
== 0) {
167 (*(long *)list
->COMMON
)--;
172 /* Tag also the opposite switch variables */
173 ptmainvar
= (list_list
*)gethtitem(YAG_VARLIST_HT
, object
);
174 if (ptmainvar
!= (list_list
*)EMPTYHT
) {
175 for (ptnamechain
= ptmainvar
->SUPDATA
; ptnamechain
; ptnamechain
= ptnamechain
->NEXT
) {
176 ptothername
= (char *)ptnamechain
->DATA
;
177 if ((ptvarlist
= (chain_list
*)gethtitem(YAG_CONSTRAINT_HT
, ptothername
)) != (void *)EMPTYHT
) {
178 for (ptchain
= ptvarlist
; ptchain
; ptchain
= ptchain
->NEXT
) {
179 list
=(list_list
*)ptchain
->DATA
;
180 if (list
->TYPE
== 0) {
181 (*(long *)list
->COMMON
)--;
189 else if (YAG_CONTEXT
->YAG_CONSTRAINT_LIST
) { /* Without the hash table */
190 for (pt
= YAG_CONTEXT
->YAG_CONSTRAINT_LIST
->NEXT
; pt
; pt
= pt
->NEXT
) {
191 for (list
= (list_list
*) pt
->DATA
; list
; list
= list
->NEXT
) {
192 if (object
== list
->DATA
) {
193 if (list
->TYPE
== 0) {
194 (*(long *)list
->COMMON
)--;
200 /* Tag also the opposite switch variables */
201 for (ptmainvar
= YAG_CONTEXT
->YAG_CONSTRAINT_LIST
->DATA
; ptmainvar
&& ptmainvar
->DATA
!= object
; ptmainvar
= ptmainvar
->NEXT
);
203 for (ptnamechain
= ptmainvar
->SUPDATA
; ptnamechain
; ptnamechain
= ptnamechain
->NEXT
) {
204 ptothername
= (char *)ptnamechain
->DATA
;
205 for (pt
= YAG_CONTEXT
->YAG_CONSTRAINT_LIST
->NEXT
; pt
; pt
= pt
->NEXT
) {
206 for (list
= (list_list
*) pt
->DATA
; list
; list
= list
->NEXT
) {
207 if (ptothername
== list
->DATA
) {
208 if (list
->TYPE
== 0) {
209 (*(long *)list
->COMMON
)--;
220 /*****************************************************************************
221 * function yagRemoveConstraintTags() *
222 *****************************************************************************/
224 /* remove all the tags of the constraint list */
227 yagRemoveConstraintTags()
232 for (ptchain
= YAG_CONTEXT
->YAG_CONSTRAINT_LIST
->NEXT
; ptchain
; ptchain
= ptchain
->NEXT
) {
233 for (ptlist
= (list_list
*)ptchain
->DATA
; ptlist
; ptlist
= ptlist
->NEXT
)
235 (*(long *)ptlist
->COMMON
)++;
241 /*****************************************************************************
242 * function yagGetOppositeConstraintVars() *
243 *****************************************************************************/
245 /* given a name returns list of any names on other side of eventual switches */
248 yagGetOppositeConstraintVars(char *name
)
250 list_list
*ptmainvar
;
252 if (YAG_CONTEXT
->YAG_CONSTRAINT_LIST
== NULL
) return NULL
;
253 if (YAG_VARLIST_HT
) {
254 ptmainvar
= (list_list
*)gethtitem(YAG_VARLIST_HT
, name
);
255 if (ptmainvar
!= (list_list
*)EMPTYHT
) {
256 return ptmainvar
->SUPDATA
;
260 for (ptmainvar
= YAG_CONTEXT
->YAG_CONSTRAINT_LIST
->DATA
; ptmainvar
&& ptmainvar
->DATA
!= name
; ptmainvar
= ptmainvar
->NEXT
);
262 return ptmainvar
->SUPDATA
;
268 /*****************************************************************************
269 * function getOppositeSwitchList() *
270 *****************************************************************************/
272 /* given a losig returns list of any names on other side of eventual switches */
275 getOppositeSwitchList(losig_list
*ptsig
)
277 chain_list
*reschain
= NULL
;
278 chain_list
*loconchain
;
281 lotrs_list
*pttrans
, *ptothertrans
;
286 loconchain
= (chain_list
*)getptype(ptsig
->USER
, LOFIGCHAIN
)->DATA
;
287 for (ptchain
= loconchain
; ptchain
; ptchain
= ptchain
->NEXT
) {
288 ptlocon
= (locon_list
*)ptchain
->DATA
;
289 if (ptlocon
->TYPE
== 'T' && ptlocon
->NAME
== CNS_GRIDNAME
) {
290 pttrans
= ptlocon
->ROOT
;
291 if ((ptuser
= getptype(pttrans
->USER
, CNS_SWITCH
)) != NULL
) {
292 ptothertrans
= (lotrs_list
*)ptuser
->DATA
;
293 oppositename
= ((cone_list
*)ptothertrans
->GRID
)->NAME
;
294 if (yagGetChain(reschain
, oppositename
) == NULL
) {
295 reschain
= addchain(reschain
, oppositename
);
303 /*****************************************************************************
304 * function markConstrained() *
305 *****************************************************************************/
307 /* mark all constrained cones and connectors */
308 /* build list of opposite switch names */
311 markConstrained(list_list
*headlist
)
320 for (ptlist
= headlist
; ptlist
; ptlist
= ptlist
->NEXT
) {
321 varName
= (char *)ptlist
->DATA
;
324 if ((ptcon
= getLocon(varName
)) != NULL
) {
325 ptcon
->USER
= addptype(ptcon
->USER
, YAG_CONSTRAINT_PTYPE
, NULL
);
328 if ((ptcone
= getCone(varName
)) != NULL
) {
329 ptcone
->TYPE
|= YAG_CONSTRAINT
;
330 ptsig
= (losig_list
*)getptype(ptcone
->USER
, CNS_SIGNAL
)->DATA
;
333 if (found
== FALSE
) {
334 avt_errmsg(YAG_ERRMSG
, "008", AVT_FATAL
, varName
);
336 if (ptsig
) ptlist
->SUPDATA
= getOppositeSwitchList(ptsig
);
340 /*****************************************************************************
341 * function getLocon() *
342 *****************************************************************************/
344 /* returns a connector pointer from its name */
351 for (ptcon
= CNS_HEADCNSFIG
->LOCON
; ptcon
!= NULL
; ptcon
= ptcon
->NEXT
) {
352 if (ptcon
->NAME
== name
) break;
357 /*****************************************************************************
358 * function getCone() *
359 *****************************************************************************/
361 /* returns a cone pointer from its name */
366 cone_list
*ptcone
= NULL
;
368 for (ptcone
= CNS_HEADCNSFIG
->CONE
; ptcone
; ptcone
= ptcone
->NEXT
) {
369 if (ptcone
->NAME
== name
) break;