Initial version of donated sources by Avertec, 3.4p5.
[tas-yagle.git] / distrib / sources / tas / tlf / tlf_parse.c
1 /****************************************************************************/
2 /* */
3 /* Chaine de CAO & VLSI AVERTEC */
4 /* */
5 /* Produit : TLF Version 1.00 */
6 /* Fichier : tlf_parse.c */
7 /* */
8 /* (c) copyright 2000 AVERTEC */
9 /* Tous droits reserves */
10 /* */
11 /* Auteur(s) : Gilles Augustins */
12 /* */
13 /****************************************************************************/
14
15 /****************************************************************************/
16 /* includes */
17 /****************************************************************************/
18
19 #include TLF_H
20 #include "tlf_parse.h"
21 #include "tlf_env.h"
22
23 /****************************************************************************/
24 /* defines */
25 /****************************************************************************/
26
27
28 /****************************************************************************/
29 /* globals */
30 /****************************************************************************/
31
32 int TLF_LINE ;
33 char *TLF_TOOLNAME = "tlf2ttv";
34 char *TLF_TOOLVERSION = "1.0" ;
35 chain_list *TLF_TTVFIG_LIST = NULL ;
36 char TLF_TIME_UNIT = TLF_NS ;
37 char TLF_CAPA_UNIT = TLF_PF ;
38 char TLF_RES_UNIT = TLF_KOHM ;
39
40 int GCF_LINE ;
41 char GCF_MODE ;
42 FILE *GCF_OUT ;
43 ht *ATTRIBUTE_HT = NULL ;
44 eqt_ctx *tlfEqtCtx = NULL;
45
46 /****************************************************************************/
47 /* externs */
48 /****************************************************************************/
49
50 extern int tlf3parse() ;
51 extern void tlf3restart();
52 extern FILE *tlf3in ;
53
54 extern int tlf4parse() ;
55 extern void tlf4restart();
56 extern FILE *tlf4in ;
57
58 extern int gcfparse () ;
59 extern FILE *gcfin ;
60
61 extern int tlf4debug;
62 /****************************************************************************/
63 /* functions */
64 /****************************************************************************/
65
66 void parsetlf3 (char *tlf_file)
67 {
68 avt_error("library", -1, AVT_INFO, "loading TLF3 '¤2%s¤.'\n", tlf_file);
69 tlf_parse (tlf_file, 3);
70 }
71
72 /****************************************************************************/
73
74 void parsetlf4 (char *tlf_file)
75 {
76 avt_error("library", -1, AVT_INFO, "loading TLF4 '¤2%s¤.'\n", tlf_file);
77 tlf_parse (tlf_file, 4);
78 }
79
80 /****************************************************************************/
81
82 void tlf_parse (char *tlf_file, int version)
83 {
84 static char viergetlf3 = 1 ;
85 static char viergetlf4 = 1 ;
86
87 if (version == 3) {
88 if ((tlf3in = mbkfopen (tlf_file, TLF_IN, READ_TEXT))) {
89 if(viergetlf3 == 0)
90 tlf3restart(tlf3in) ;
91 viergetlf3 = 0 ;
92 TLF_LINE = 1 ;
93 tlfEqtCtx = eqt_init (EQT_NB_VARS);
94 tlf3parse () ;
95 eqt_term (tlfEqtCtx);
96 fclose (tlf3in) ;
97 } else {
98 fprintf (stderr, "TLF ERROR : no file %s\n", tlf_file);
99 EXIT (EXIT_FAILURE) ;
100 }
101 }
102
103 if (version == 4) {
104 if ((tlf4in = mbkfopen (tlf_file, TLF_IN, READ_TEXT))) {
105 if(viergetlf4 == 0)
106 tlf4restart(tlf4in) ;
107 viergetlf4 = 0 ;
108 TLF_LINE = 1 ;
109 tlfEqtCtx = eqt_init (EQT_NB_VARS);
110 tlf4parse () ;
111 eqt_term (tlfEqtCtx);
112 fclose (tlf4in) ;
113 } else {
114 fprintf (stderr, "TLF ERROR : no file %s\n", tlf_file);
115 EXIT (EXIT_FAILURE) ;
116 }
117 }
118 }
119
120 /****************************************************************************/
121
122 chain_list *tlf_load (char *filename, int version)
123 {
124 tlf_parse (filename, version) ;
125 return (TLF_TTVFIG_LIST) ;
126 }
127
128 /****************************************************************************/
129
130 void tlf_gcf2stb (char *file)
131 {
132 char *filename ;
133 filename = (char*)mbkalloc (TLF_BUFSIZE * sizeof (char)) ;
134
135 sprintf (filename, "%s.%s", file, "gcf") ;
136
137 if ((gcfin = mbkfopen (file, "tlf", READ_TEXT))) {
138 sprintf (filename, "%s.%s", file, "stb") ;
139 //GCF_OUT = fopen (filename, "w+") ;
140 GCF_OUT = mbkfopen (file, "stb", WRITE_TEXT) ;
141 GCF_LINE = 1 ;
142 GCF_MODE = CLOCK_DETECT ;
143 gcfparse () ;
144 GCF_MODE = CLOCK_DUMP ;
145 rewind (gcfin) ;
146 gcfparse () ;
147 GCF_MODE = DISABLE_DUMP ;
148 rewind (gcfin) ;
149 gcfparse () ;
150 GCF_MODE = SPECIN_DUMP ;
151 rewind (gcfin) ;
152 gcfparse () ;
153 GCF_MODE = SPECOUT_DUMP ;
154 rewind (gcfin) ;
155 gcfparse () ;
156 fclose (gcfin) ;
157 fclose (GCF_OUT) ;
158 } else {
159 printf ("File %s does not seem to exist\n", filename) ;
160 EXIT (EXIT_FAILURE) ;
161 }
162 }
163
164 /****************************************************************************/
165
166 long ftol (float f)
167 {
168 long l ;
169 long d ;
170
171 d = (long)(f * 10) - (long)f * 10 ;
172 if (d <= 5)
173 l = (long)f ;
174 if (d > 5 && f > 0)
175 l = (long)f + 1 ;
176 if (d > 5 && f < 0)
177 l = (long)f - 1 ;
178 if(f == 0.0)
179 l = (long)0 ;
180
181 return (l) ;
182 }
183
184 /****************************************************************************/
185
186 long ftolstretch (float f)
187 {
188 long l ;
189
190 l = ftol (f) ;
191
192 l = l < GCF_MIN_CONSTRAINT ? GCF_MIN_CONSTRAINT : l ;
193 l = l > GCF_MAX_CONSTRAINT ? GCF_MAX_CONSTRAINT : l ;
194
195 return (l) ;
196 }
197
198 /****************************************************************************/
199
200 int is_attribute (char *ident)
201 {
202 long attribute ;
203
204 if (ATTRIBUTE_HT)
205 attribute = gethtitem (ATTRIBUTE_HT, ident) ;
206 else
207 return 0 ;
208
209 if ((attribute != EMPTYHT) && (attribute != DELETEHT))
210 return 1 ;
211 else
212 return 0 ;
213 }
214
215 /******************************************************************************/
216
217 void set_attribute (char *attribute, char target)
218 {
219 if (!ATTRIBUTE_HT)
220 ATTRIBUTE_HT = addht (ATTRIBUTE_HT_SIZE) ;
221
222 addhtitem (ATTRIBUTE_HT, attribute, (long)target) ;
223 }
224
225 /******************************************************************************/
226
227 void callback_attribute (char *attribute, char *arg)
228 {
229 char *gcc_silent;
230 gcc_silent = attribute;
231 gcc_silent = arg;
232 /* fprintf (stdout, "calling %s (%s)\n", attribute, arg) ; */
233 }
234
235 /******************************************************************************/
236
237 int isclockpin (chain_list *isclockpinchain, char *pname)
238 {
239 chain_list *ch ;
240
241 for (ch = isclockpinchain ; ch ; ch = ch->NEXT)
242 if (ch->DATA == pname)
243 return (1) ;
244 return (0) ;
245 }
246
247 /******************************************************************************/
248
249 char getoutputtype (char *pname, chain_list *flipflops, chain_list *latchs)
250 {
251 chain_list *ch ;
252
253 for (ch = flipflops ; ch ; ch = ch->NEXT)
254 if (ch->DATA == pname)
255 return 'F' ;
256 for (ch = latchs ; ch ; ch = ch->NEXT)
257 if (ch->DATA == pname)
258 return 'L' ;
259 return 'B' ;
260 }
261
262 /******************************************************************************/
263 void tlf3reset()
264 {
265 }
266
267 /******************************************************************************/
268 void tlf4reset()
269 {
270 if (ATTRIBUTE_HT){
271 delht(ATTRIBUTE_HT);
272 ATTRIBUTE_HT = NULL;
273 }
274 TLF_TIME_UNIT = TLF_NS ;
275 TLF_CAPA_UNIT = TLF_PF ;
276 }