1 /****************************************************************************/
3 /* Chaine de CAO & VLSI AVERTEC */
5 /* Produit : ZEN Version 1.00 */
6 /* Fichier : zen_zenfig.c */
8 /* (c) copyright 2002 AVERTEC */
9 /* Tous droits reserves */
11 /* Auteur(s) : //Stephane Picault */
14 /****************************************************************************/
18 static ht
*ZEN_HTNOD
= NULL
;
20 /****************************************************************************/
21 /*{{{ zen_searchzennod() */
23 /* cherche un noeud dans la liste des noeuds */
24 /****************************************************************************/
25 zennod_list
*zen_searchzennod(ZenFig
,name
)
29 /* zennod_list *ScanZenNod;
31 for (ScanZenNod=ZenFig->NOD;ScanZenNod;ScanZenNod=ScanZenNod->NEXT)
32 if (ScanZenNod->NAME==name) return ScanZenNod;
36 static zenfig_list
*zenfig
= NULL
;
47 // if (ZenFig!=zenfig) ZEN_WARNING(0,"attention nouvelle zenfig");
51 if (!ZEN_HTNOD
) ZEN_HTNOD
= addht(ZEN_HTSIZE
);
53 if ((res
=gethtitem(ZEN_HTNOD
,name
))==EMPTYHT
) return NULL
;
54 else return (zennod_list
*)res
;
57 /*}}}************************************************************************/
58 /*{{{ zen_addzennod() */
61 /****************************************************************************/
62 zennod_list
*zen_addzennod(lastzennod
,name
,abl
)
63 zennod_list
*lastzennod
; /* pointer on the last zennod_list */
64 char *name
; /* node's name */
67 zennod_list
*NewZenNod
;
71 cct
= (abl
)?initializeCct(name
,1,1) :NULL
;
72 bdd
= (abl
)?zen_ablToBddCct(cct
,abl
):NULL
;
73 // if (bdd) addOutputCct(cct,name,bdd);
75 if (!ZEN_HTNOD
) ZEN_HTNOD
= addht(ZEN_HTSIZE
);
77 NewZenNod
= zen_alloczennod();
80 NewZenNod
->NEXT
= lastzennod
;
81 NewZenNod
->NAME
= namealloc(name
);
84 NewZenNod
->VALUE
= ZEN_VALUE_UNKNOWN
;
85 NewZenNod
->INNOD
= NULL
;
86 NewZenNod
->OUTNOD
= NULL
;
89 NewZenNod
->NBZER
= -1;
90 NewZenNod
->NBONE
= -1;
92 addhtitem(ZEN_HTNOD
,NewZenNod
->NAME
,(long)NewZenNod
);
96 /*}}}************************************************************************/
97 /*{{{ zen_alloczennod() */
99 /* allocation memoire d'un zennod */
100 /****************************************************************************/
101 zennod_list
*zen_alloczennod()
103 return (zennod_list
*)mbkalloc(sizeof(zennod_list
));
106 /*}}}************************************************************************/
107 /*{{{ zen_freezennod() */
110 /****************************************************************************/
111 void zen_freezennod(listzennod
)
112 zennod_list
*listzennod
;
114 if (!listzennod
) return;
116 freechain(listzennod
->OUTNOD
);
117 freechain(listzennod
->INNOD
);
118 zen_freezennod(listzennod
->NEXT
);
119 destroyCct(listzennod
->CCT
);
124 /*}}}************************************************************************/
125 /*{{{ zen_viewzennod( */
128 /****************************************************************************/
129 void zen_viewzennod(node
)
132 chain_list
*ScanChain
;
133 zennod_list
*ScanNod
;
135 avt_log(LOGZEN
,2,"\n\t--> Node");
136 avt_log(LOGZEN
,2,"\n\t\tNAME\t: %s",node
->NAME
);
137 avt_log(LOGZEN
,2,"\n\t\tINDEX\t= %ld",node
->INDEX
);
140 avt_log(LOGZEN
,2,"\n\t\tBDD\t:\n");
141 displayExprLog(LOGZEN
,2,bddToAblCct(node
->CCT
,node
->BDD
));
144 avt_log(LOGZEN
,2,"\n\t\tBDD\t: (Null)\n");
145 avt_log(LOGZEN
,2,"\t\tVALUE\t= %c",node
->VALUE
);
146 for (ScanChain
=node
->INNOD
;ScanChain
;ScanChain
=ScanChain
->NEXT
)
148 ScanNod
= (zennod_list
*)ScanChain
->DATA
;
149 avt_log(LOGZEN
,2,"\n\t\tINNOD\t: (%ld)\t: %s\t= %c",
150 ScanNod
->INDEX
,ScanNod
->NAME
,ScanNod
->VALUE
);
152 for (ScanChain
=node
->OUTNOD
;ScanChain
;ScanChain
=ScanChain
->NEXT
)
154 ScanNod
= (zennod_list
*)ScanChain
->DATA
;
155 avt_log(LOGZEN
,2,"\n\t\tOUTNOD\t: (%ld)\t: %s\t= %c",
156 ScanNod
->INDEX
,ScanNod
->NAME
,ScanNod
->VALUE
);
158 avt_log(LOGZEN
,2,"\n\t<-- Node");
160 if ( ((node
->BDD
)&&(!node
->INNOD
)) || ((!node
->BDD
)&&(node
->INNOD
)))
161 ZEN_WARNING(0,"no bdd on zennode");
164 /*}}}************************************************************************/
168 /****************************************************************************/
169 zennod_list
*zen_addOutNode(zenfig
,beout
,name
,abl
)
175 zennod_list
*newZenNode
;
178 newZenNode
= zen_addzennod(zenfig
->NOD
,name
,*abl
);
179 zenfig
->NOD_OUT
= addchain(zenfig
->NOD_OUT
,newZenNode
);
180 zenfig
->NOD
= newZenNode
;
185 /*}}}************************************************************************/
189 /****************************************************************************/
190 zennod_list
*zen_addRegNode(zenfig
,bereg
,name1
,name2
,abl
)
197 zennod_list
*newZenNode
= NULL
;
201 for (biabl
=bereg
->BIABL
;biabl
;biabl
=biabl
->NEXT
)
203 chainx
= supportChain_listExpr(biabl
->CNDABL
);
204 for (;chainx
;chainx
=chainx
->NEXT
)
205 if (chainx
->DATA
==name2
)
207 *abl
= biabl
->CNDABL
;
208 newZenNode
= zen_addzennod(zenfig
->NOD
,name1
,*abl
);
209 zenfig
->NOD
= newZenNode
;
212 if (newZenNode
) break;
213 chainx
= supportChain_listExpr(biabl
->VALABL
);
214 for (;chainx
;chainx
=chainx
->NEXT
)
215 if (chainx
->DATA
==name2
)
217 *abl
= biabl
->VALABL
;
218 newZenNode
= zen_addzennod(zenfig
->NOD
,name1
,*abl
);
219 zenfig
->NOD
= newZenNode
;
222 if (newZenNode
) break;
224 if (newZenNode
) zenfig
->NOD_OUT
= addchain(zenfig
->NOD_OUT
,newZenNode
);
229 /*}}}************************************************************************/
233 /****************************************************************************/
234 zennod_list
*zen_addAuxNode(zenfig
,beaux
,name
,abl
)
240 zennod_list
*newZenNode
;
243 newZenNode
= zen_addzennod(zenfig
->NOD
,name
,*abl
);
244 zenfig
->NOD
= newZenNode
;
248 /*}}}************************************************************************/
252 /****************************************************************************/
253 zennod_list
*zen_addRinNode(zenfig
,name
)
257 zennod_list
*newZenNode
;
259 newZenNode
= zen_addzennod(zenfig
->NOD
,name
,createAtom(name
));
260 zenfig
->NOD_IN
= addchain(zenfig
->NOD_IN
,newZenNode
);
261 zenfig
->NOD
= newZenNode
;