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