1 /*------------------------------------------------------------\
2 | |
3 | This file is part of the Alliance CAD System Copyright |
4 | (C) Laboratoire LIP6 - D�partement ASIM Universite P&M Curie|
5 | |
6 | Home page : http://www-asim.lip6.fr/alliance/ |
7 | E-mail : mailto:alliance-users@asim.lip6.fr |
8 | |
9 | This progam is free software; you can redistribute it |
10 | and/or modify it under the terms of the GNU General Public |
11 | License as published by the Free Software Foundation; |
12 | either version 2 of the License, or (at your option) any |
13 | later version. |
14 | |
15 | Alliance VLSI CAD System is distributed in the hope that |
16 | it will be useful, but WITHOUT ANY WARRANTY; |
17 | without even the implied warranty of MERCHANTABILITY or |
18 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General |
19 | Public License for more details. |
20 | |
21 | You should have received a copy of the GNU General Public |
22 | License along with the GNU C Library; see the file COPYING. |
23 | If not, write to the Free Software Foundation, Inc., |
24 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
25 | |
26 \------------------------------------------------------------*/
27
28 /*------------------------------------------------------------\
29 | |
30 | Tool : GRAAL |
31 | |
32 | File : Error.c |
33 | |
34 | Author : Jacomme Ludovic |
35 | |
36 | Date : 28.03.95 |
37 | |
38 \------------------------------------------------------------*/
39 /*------------------------------------------------------------\
40 | |
41 | Include Files |
42 | |
43 \------------------------------------------------------------*/
44
45 # include <stdio.h>
46 # include <stdlib.h>
47 # include <string.h>
48 # include <signal.h>
49 # include <setjmp.h>
50 # include "mut.h"
51 # include "mph.h"
52 # include "rds.h"
53 # include "rpr.h"
54 # include "rfm.h"
55 # include "rtl.h"
56 # include "GSB.h"
57 # include "GRM.h"
58 # include "GRM_error.h"
59 # include "GMF_menu.h"
60
61 /*------------------------------------------------------------\
62 | |
63 | Constants |
64 | |
65 \------------------------------------------------------------*/
66 /*------------------------------------------------------------\
67 | |
68 | Types |
69 | |
70 \------------------------------------------------------------*/
71 /*------------------------------------------------------------\
72 | |
73 | Variables |
74 | |
75 \------------------------------------------------------------*/
76
77 static FILE *GraalStreamErr;
78 static FILE *GraalStreamOut;
79 static FILE *GraalStreamAll;
80
81 static char GraalErrFileName[ 40 ];
82 static char GraalOutFileName[ 40 ];
83 static char GraalAllFileName[ 40 ];
84
85 static char GraalNormalMode = 1;
86
87 /*------------------------------------------------------------\
88 | |
89 | Graal Error Message |
90 | |
91 \------------------------------------------------------------*/
92
93 static char *GraalErrorBuffer = (char *)NULL;
94
95 /*------------------------------------------------------------\
96 | |
97 | Graal Informations |
98 | |
99 \------------------------------------------------------------*/
100
101 static char GraalInformationsBuffer[ GRAAL_INFORMATIONS_BUFFER_SIZE ];
102
103 /*------------------------------------------------------------\
104 | |
105 | Functions |
106 | |
107 \------------------------------------------------------------*/
108 /*------------------------------------------------------------\
109 | |
110 | Graal Error Message Functions |
111 | |
112 \------------------------------------------------------------*/
113 /*------------------------------------------------------------\
114 | |
115 | GraalExitCloseStream |
116 | |
117 \------------------------------------------------------------*/
118
GraalExitCloseStream()119 void GraalExitCloseStream()
120 {
121 rdsbegin();
122
123 if ( GraalStreamErr != (FILE *)0 )
124 {
125 fclose( GraalStreamErr );
126 unlink( GraalErrFileName );
127 }
128
129 if ( GraalStreamAll != (FILE *)0 )
130 {
131 fclose( GraalStreamAll );
132 unlink( GraalAllFileName );
133 }
134
135 if ( ( GraalNormalMode ) &&
136 ( GraalStreamOut != (FILE *)0 ) )
137 {
138 fclose( GraalStreamOut );
139 unlink( GraalOutFileName );
140 }
141
142 rdsend();
143 }
144
145 /*------------------------------------------------------------\
146 | |
147 | GraalExitFatalError |
148 | |
149 \------------------------------------------------------------*/
150
GraalExitFatalError()151 void GraalExitFatalError()
152 {
153 rdsbegin();
154
155 GraalExitCloseStream();
156
157 if ( GraalHeadUndo != (graalundo *)NULL )
158 {
159 GraalFigureMbk->NAME = namealloc( "graal_dump" );
160 GraalSaveFigure();
161 }
162
163 exit( 2 );
164
165 rdsend();
166 }
167
168 /*------------------------------------------------------------\
169 | |
170 | GraalExitErrorMessage |
171 | |
172 \------------------------------------------------------------*/
173
GraalExitErrorMessage(Error)174 void GraalExitErrorMessage( Error )
175
176 int Error;
177 {
178 rdsbegin();
179
180 GraalExitCloseStream();
181
182 if ( GraalHeadUndo != (graalundo *)NULL )
183 {
184 CallbackFileSaveAs( NULL, NULL, NULL );
185 }
186
187 exit( Error );
188
189 rdsend();
190 }
191
192 /*------------------------------------------------------------\
193 | |
194 | GraalInitializeErrorMessage |
195 | |
196 \------------------------------------------------------------*/
197
GraalInitializeErrorMessage(Debug)198 void GraalInitializeErrorMessage( Debug )
199
200 char Debug;
201 {
202 rdsbegin();
203
204 GraalNormalMode = ! Debug;
205
206 if ( GraalNormalMode )
207 {
208 sprintf( GraalOutFileName, "/tmp/%s_out_%d", PACKAGE, getpid() );
209 }
210
211 sprintf( GraalErrFileName, "/tmp/%s_err_%d", PACKAGE, getpid() );
212 sprintf( GraalAllFileName, "/tmp/%s_all_%d", PACKAGE, getpid() );
213
214 GraalStreamErr = freopen( GraalErrFileName, "w+", stderr);
215 GraalStreamAll = fopen ( GraalAllFileName, "w+" );
216
217 if ( GraalNormalMode )
218 {
219 GraalStreamOut = freopen( GraalOutFileName, "w+", stdout);
220 }
221 else
222 {
223 GraalStreamOut = GraalStreamErr;
224 }
225
226 if ( ( GraalStreamAll == (FILE *)NULL ) ||
227 ( GraalStreamOut == (FILE *)NULL ) ||
228 ( GraalStreamErr == (FILE *)NULL ) )
229 {
230 fprintf( stdout, "Grm: Unable to open trace window !\n");
231 exit( 1 );
232 }
233
234 if ( GraalNormalMode )
235 {
236 unlink( GraalOutFileName );
237 }
238
239 unlink( GraalErrFileName );
240
241 signal( SIGINT, GraalExitErrorMessage );
242
243 if ( ! Debug )
244 {
245 signal( SIGSEGV, GraalExitFatalError );
246 signal( SIGUSR1, GraalExitFatalError );
247 signal( SIGUSR2, GraalExitFatalError );
248 }
249
250 rdsend();
251 }
252
253 /*------------------------------------------------------------\
254 | |
255 | GraalFlushErrorMessage |
256 | |
257 \------------------------------------------------------------*/
258
GraalFlushErrorMessage()259 void GraalFlushErrorMessage()
260 {
261 int Data;
262
263 rdsbegin();
264
265 fflush( GraalStreamErr );
266 fseek( GraalStreamErr, 0L, 0 );
267
268 while( ( Data = fgetc( GraalStreamErr ) ) != EOF )
269 {
270 fputc( Data, GraalStreamAll );
271 }
272
273 fclose( GraalStreamErr );
274
275 GraalStreamErr = freopen( GraalErrFileName, "w+", stderr );
276
277 if ( GraalNormalMode )
278 {
279 fflush( GraalStreamOut );
280 fseek( GraalStreamOut, 0L, 0 );
281
282 while( ( Data = fgetc( GraalStreamOut ) ) != EOF )
283 {
284 fputc( Data, GraalStreamAll );
285 }
286
287 fclose( GraalStreamOut );
288
289 GraalStreamOut = freopen( GraalOutFileName, "w+", stdout );
290 }
291
292 rdsend();
293 }
294
295 /*------------------------------------------------------------\
296 | |
297 | GraalGetErrorMessage |
298 | |
299 \------------------------------------------------------------*/
300
GraalGetErrorMessage()301 char *GraalGetErrorMessage()
302
303 {
304 char *Message;
305 long Length;
306 long Index;
307 int Data;
308
309 rdsbegin();
310
311 GraalFlushErrorMessage();
312
313 fflush( GraalStreamAll );
314
315 Length = ftell( GraalStreamAll );
316
317 if ( GraalErrorBuffer != (char *)NULL )
318 {
319 rdsfreeblock( GraalErrorBuffer );
320 }
321
322 GraalErrorBuffer = rdsallocblock( Length + 1 );
323 Index = 0;
324
325 while ( ( ( Data = fgetc( GraalStreamAll ) ) != EOF ) &&
326 ( Index < Length ) )
327 {
328 GraalErrorBuffer[ Index++ ] = (char)Data;
329 }
330
331 rewind( GraalStreamAll );
332
333 GraalErrorBuffer[ Index ] = '\0';
334
335 if ( Index == 0 )
336 {
337 Message = (char *)NULL;
338 }
339 else
340 {
341 Message = GraalErrorBuffer;
342 }
343
344 rdsend();
345 return( Message );
346 }
347
348 /*------------------------------------------------------------\
349 | |
350 | GraalGetInformations |
351 | |
352 \------------------------------------------------------------*/
353
GraalGetInformations()354 char *GraalGetInformations()
355
356 {
357 char *Scan;
358
359 rdsbegin();
360
361 GraalComputeBound();
362
363 Scan = GraalInformationsBuffer;
364
365 if ( GraalFigureMbk != (phfig_list *)NULL )
366 {
367 sprintf( Scan, " FIGURE : %s\n\n XAB1 : %ld\n YAB1 : %ld\n XAB2 : %ld\n YAB2 : %ld\n\n",
368 GraalFigureMbk->NAME,
369 (long)( GraalFigureMbk->XAB1 / GRAAL_SCALE_X ),
370 (long)( GraalFigureMbk->YAB1 / GRAAL_SCALE_X ),
371 (long)( GraalFigureMbk->XAB2 / GRAAL_SCALE_X ),
372 (long)( GraalFigureMbk->YAB2 / GRAAL_SCALE_X ) );
373 }
374 else
375 {
376 sprintf( Scan, " FIGURE : No current figure !\n\n" );
377 }
378
379 Scan = Scan + strlen( Scan );
380
381 sprintf( Scan, " BOUNDING BOX : \n\n XMIN : %ld\n YMIN : %ld\n XMAX : %ld\n YMAX : %ld\n\n",
382 GraalBoundXmin / GRAAL_RDS_LAMBDA, GraalBoundYmin / GRAAL_RDS_LAMBDA,
383 GraalBoundXmax / GRAAL_RDS_LAMBDA, GraalBoundYmax / GRAAL_RDS_LAMBDA );
384
385 Scan = Scan + strlen( Scan );
386
387 sprintf( Scan, " WINDOWS : \n\n XMIN : %ld\n YMIN : %ld\n XMAX : %ld\n YMAX : %ld\n DX : %ld\n DY : %ld\n SIDE : %ld\n\n",
388 GraalWindowXmin / GRAAL_RDS_LAMBDA, GraalWindowYmin / GRAAL_RDS_LAMBDA,
389 GraalWindowXmax / GRAAL_RDS_LAMBDA, GraalWindowYmax / GRAAL_RDS_LAMBDA,
390 GraalWindowDx , GraalWindowDy,
391 GraalWindowSide / GRAAL_RDS_LAMBDA );
392
393 Scan = Scan + strlen( Scan );
394
395 sprintf( Scan, " RDS TECHNOLOGY : %s\n\n", RDS_TECHNO_NAME );
396
397 Scan = Scan + strlen( Scan );
398
399 sprintf( Scan, " GRAAL TECHNOLOGY : %s\n\n", GRAAL_TECHNO_NAME );
400
401 rdsend();
402 return( GraalInformationsBuffer );
403 }
404