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    :                  Share.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 <Xm/Xm.h>
48 
49 # include "mut.h"
50 # include "mph.h"
51 # include "rds.h"
52 # include "rwi.h"
53 # include "rut.h"
54 # include "rpr.h"
55 # include "GSB.h"
56 # include "GSB_share.h"
57 
58 /*------------------------------------------------------------\
59 |                                                             |
60 |                           Constants                         |
61 |                                                             |
62 \------------------------------------------------------------*/
63 /*------------------------------------------------------------\
64 |                                                             |
65 |                            Types                            |
66 |                                                             |
67 \------------------------------------------------------------*/
68 /*------------------------------------------------------------\
69 |                                                             |
70 |                          Variables                          |
71 |                                                             |
72 \------------------------------------------------------------*/
73 
74   char GRAAL_RDS_ACTIVE_LAYER_TABLE[ RDS_ALL_LAYER ] =
75 
76   {
77     1,  /* RDS_NWELL   */
78     1,  /* RDS_PWELL   */
79     1,  /* RDS_NIMP    */
80     1,  /* RDS_PIMP    */
81     1,  /* RDS_ACTIV   */
82     1,  /* RDS_NDIF    */
83     1,  /* RDS_PDIF    */
84     1,  /* RDS_NTIE    */
85     1,  /* RDS_PTIE    */
86     1,  /* RDS_POLY    */
87     1,  /* RDS_VPOLY   */
88     1,  /* RDS_GATE    */
89     1,  /* RDS_TPOLY   */
90     1,  /* RDS_POLY2   */
91     1,  /* RDS_CONT    */
92     1,  /* RDS_TCONT   */
93     1,  /* RDS_CONT2   */
94     1,  /* RDS_ALU1    */
95     1,  /* RDS_VALU1   */
96     1,  /* RDS_TALU1   */
97     1,  /* RDS_VIA1    */
98     1,  /* RDS_TVIA1   */
99     1,  /* RDS_ALU2    */
100     1,  /* RDS_VALU2   */
101     1,  /* RDS_TALU2   */
102     1,  /* RDS_VIA2    */
103     1,  /* RDS_TVIA2   */
104     1,  /* RDS_ALU3    */
105     1,  /* RDS_VALU3   */
106     1,  /* RDS_TALU3   */
107     1,  /* RDS_VIA3    */
108     1,  /* RDS_TVIA3   */
109     1,  /* RDS_ALU4    */
110     1,  /* RDS_CPAS    */
111     1,  /* RDS_REF     */
112     1,  /* RDS_USER0   */
113     1,  /* RDS_USER1   */
114     1,  /* RDS_USER2   */
115     1   /* RDS_ABOX    */
116   };
117 
118   char GRAAL_RDS_ACTIVE_NAME_TABLE[ GRAAL_MAX_ACTIVE_NAME ] =
119 
120   {
121     1, /* FIGURE             NAME */
122     1, /* INSTANCE           NAME */
123     1, /* FIGURE CONNECTOR   NAME */
124     1, /* INSTANCE CONNECTOR NAME */
125     1, /* FIGURE SEGMENT     NAME */
126     1, /* INSTANCE SEGMENT   NAME */
127     1, /* FIGURE REFERENCE   NAME */
128     1  /* INSTANCE REFERENCE NAME */
129   };
130 
131 /*------------------------------------------------------------\
132 |                                                             |
133 |             Fill Mode and Instance Interface                |
134 |                                                             |
135 \------------------------------------------------------------*/
136 
137   char GRAAL_FILL_MODE          = GRAAL_FILL_MODE_PATTERN;
138   char GRAAL_INSTANCE_INTERFACE = GRAAL_TRUE;
139   char GRAAL_CONNECTOR_INDEX    = GRAAL_FALSE;
140   char GRAAL_FORCE_DISPLAY      = GRAAL_FALSE;
141   char GRAAL_BLACK_BOX_STRING   = GRAAL_FALSE;
142   char GRAAL_SWITCH_COLOR_MAP   = GRAAL_FALSE;
143 
144 /*------------------------------------------------------------\
145 |                                                             |
146 |                       Cursor Type                           |
147 |                                                             |
148 \------------------------------------------------------------*/
149 
150   char GRAAL_XOR_CURSOR = GRAAL_FALSE;
151 
152 /*------------------------------------------------------------\
153 |                                                             |
154 |                       File Name                             |
155 |                                                             |
156 \------------------------------------------------------------*/
157 
158   char *GRAAL_GMS_FILE_NAME = (char *)NULL;
159 
160 /*------------------------------------------------------------\
161 |                                                             |
162 |                       Cut Transistor Table                  |
163 |                                                             |
164 \------------------------------------------------------------*/
165 
166   static long GRAAL_CUT_C_X_PARAM[ 5 ];
167 
168   /* 0 -> Constant 0    */
169   /* 1 -> Nothing to do */
170   /* 2 -> D             */
171   /* 3 -> ( D + d ) / 2 */
172   /* 4 -> ( D - d ) / 2 */
173 
174   static long GRAAL_CUT_C_X_TABLE [ 16 ] [ 4 ] [ 4 ] =
175 
176   {
177     /*  X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy              */
178                                                                         /*   O   */
179     { { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 } }, /*       */
180 
181     /*  X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy          |   */
182                                                                         /*   O   */
183     { { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 } }, /*       */
184 
185     /*  X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy              */
186                                                                         /*   O   */
187     { { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 } }, /*   |   */
188 
189     /*  X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy          |   */
190                                                                         /*   O   */
191     { { 0, 0, 4, 2 }, { 3, 0, 4, 2 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 } }, /*   |   */
192 
193     /*  X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy              */
194                                                                         /* --O   */
195     { { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 } }, /*       */
196 
197     /*  X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy          |   */
198                                                                         /* --O   */
199     { { 0, 0, 2, 4 }, { 0, 3, 4, 4 }, { 3, 4, 4, 3 }, { 1, 1, 1, 1 } }, /*       */
200 
201     /*  X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy              */
202                                                                         /* --O   */
203     { { 0, 0, 4, 4 }, { 3, 0, 4, 2 }, { 0, 3, 3, 4 }, { 1, 1, 1, 1 } }, /*   |   */
204 
205     /*  X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy          |   */
206                                                                         /* --O   */
207     { { 0, 0, 4, 4 }, { 3, 0, 4, 2 }, { 0, 3, 4, 4 }, { 1, 1, 1, 1 } }, /*   |   */
208 
209     /*  X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy              */
210                                                                         /*   O-- */
211     { { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 } }, /*       */
212 
213     /*  X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy          |   */
214                                                                         /*   O-- */
215     { { 0, 0, 4, 2 }, { 4, 0, 3, 4 }, { 3, 3, 4, 4 }, { 1, 1, 1, 1 } }, /*       */
216 
217     /*  X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy              */
218                                                                         /*   O-- */
219     { { 0, 0, 4, 2 }, { 3, 0, 4, 4 }, { 4, 3, 3, 4 }, { 1, 1, 1, 1 } }, /*   |   */
220 
221     /*  X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy          |   */
222                                                                         /*   O-- */
223     { { 0, 0, 4, 2 }, { 3, 0, 4, 4 }, { 3, 3, 4, 4 }, { 1, 1, 1, 1 } }, /*   |   */
224 
225     /*  X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy              */
226                                                                         /* --O-- */
227     { { 0, 0, 2, 4 }, { 0, 3, 2, 4 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 } }, /*       */
228 
229     /*  X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy          |   */
230                                                                         /* --O-- */
231     { { 0, 0, 2, 4 }, { 0, 3, 4, 4 }, { 3, 3, 4, 4 }, { 1, 1, 1, 1 } }, /*       */
232 
233     /*  X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy              */
234                                                                         /* --O-- */
235     { { 0, 0, 4, 4 }, { 3, 0, 4, 4 }, { 0, 3, 2, 4 }, { 1, 1, 1, 1 } }, /*   |   */
236 
237     /*  X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy     X  Y  Dx Dy          |   */
238                                                                         /* --O-- */
239     { { 0, 0, 4, 4 }, { 3, 0, 4, 4 }, { 0, 3, 4, 4 }, { 3, 3, 4, 4 } }, /*   |   */
240 
241   };
242 
243   long *GRAAL_CUT_C_X_ARRAY[ MBK_MAX_LAYER ];
244   char  GRAAL_CUT_C_X_LIST[ MBK_MAX_VIA ];
245 
246 /*------------------------------------------------------------\
247 |                                                             |
248 |                          Functions                          |
249 |                                                             |
250 \------------------------------------------------------------*/
251 /*------------------------------------------------------------\
252 |                                                             |
253 |                      GraalPostTreatString                   |
254 |                                                             |
255 \------------------------------------------------------------*/
256 
GraalPostTreatString(Text)257 char *GraalPostTreatString( Text )
258 
259   char *Text;
260 {
261   char OnlySpace;
262   int  Counter;
263 
264   rdsbegin();
265 
266   if ( Text != (char *)NULL )
267   {
268     OnlySpace = 1;
269 
270     for ( Counter = 0; Text[ Counter ]; Counter++ )
271     {
272       if ( Text[ Counter ] != ' ' ) OnlySpace = 0;
273     }
274 
275     if ( OnlySpace ) Text = (char *)NULL;
276   }
277 
278   rdsend();
279   return( Text );
280 }
281 
282 /*------------------------------------------------------------\
283 |                                                             |
284 |                  GraalInitializeCutCxTable                  |
285 |                                                             |
286 \------------------------------------------------------------*/
287 
GraalInitializeCutCxTable()288 void GraalInitializeCutCxTable()
289 
290 {
291   int   Index;
292   long  DeltaGate;
293   long  DeltaDiff;
294   int   Layer;
295   int   GateLayer;
296   int   DiffLayer;
297   long *Table;
298   int   MbkLayer;
299   int   TransType;
300   int   CXType;
301 
302   rdsbegin();
303 
304   for ( MbkLayer = 0; MbkLayer < MBK_MAX_LAYER; MbkLayer++ )
305   {
306     TransType = GET_LYNX_TRANSISTOR_TYPE( MbkLayer );
307     CXType    = GET_LYNX_TRANSISTOR_CX( MbkLayer );
308 
309     if ( ( TransType == RDS_LYNX_TRANSISTOR_EMPTY ) ||
310          ( CXType    == RDS_LYNX_TRANSISTOR_EMPTY ) )
311     {
312       GRAAL_CUT_C_X_ARRAY[ MbkLayer ] = (long *)NULL;
313     }
314     else
315     {
316       Table = (long *)rdsalloc( sizeof( GRAAL_CUT_C_X_TABLE ), RDS_ALLOC_BLOCK );
317       memcpy( Table, GRAAL_CUT_C_X_TABLE, sizeof( GRAAL_CUT_C_X_TABLE ) );
318 
319       GRAAL_CUT_C_X_ARRAY[ MbkLayer ] = Table;
320 
321       DeltaGate = -1;
322       DeltaDiff = -1;
323       Index     = 0;
324       GateLayer = GET_LYNX_TRANSISTOR_GATE_LAYER( MbkLayer );
325       DiffLayer = GET_LYNX_TRANSISTOR_DIFF_LAYER( MbkLayer );
326       Layer     = GET_VIA_LAYER( CXType, Index );
327 
328       while ( Layer != RDS_VIA_EMPTY )
329       {
330         if ( Layer == GateLayer )
331         {
332           DeltaGate = GET_VIA_SIZE( CXType, Index );
333         }
334         else
335         if ( Layer == DiffLayer )
336         {
337           DeltaDiff = GET_VIA_SIZE( CXType, Index );
338         }
339 
340         Index = Index + 1;
341 
342         Layer = GET_VIA_LAYER( CXType, Index );
343       }
344 
345       if ( ( DeltaGate == -1 ) ||
346            ( DeltaDiff == -1 ) )
347       {
348         for ( Index = 0; Index < 256; Index++ )
349         {
350           Table[ Index ] = -1;
351         }
352       }
353       else
354       {
355         /* 0 -> Constant 0    */
356         /* 1 -> Nothing to do */
357         /* 2 -> D             */
358         /* 3 -> ( D + d ) / 2 */
359         /* 4 -> ( D - d ) / 2 */
360 
361         GRAAL_CUT_C_X_PARAM[ 0 ] =  0;
362         GRAAL_CUT_C_X_PARAM[ 1 ] = -1;
363         GRAAL_CUT_C_X_PARAM[ 2 ] = DeltaDiff;
364         GRAAL_CUT_C_X_PARAM[ 3 ] = ( DeltaDiff + DeltaGate ) >> 1;
365         GRAAL_CUT_C_X_PARAM[ 4 ] = ( DeltaDiff - DeltaGate ) >> 1;
366 
367         for ( Index = 0; Index < 256; Index++ )
368         {
369           Table[ Index ] = GRAAL_CUT_C_X_PARAM[ Table[ Index ] ];
370         }
371       }
372     }
373   }
374 
375   for ( Index = 0; Index < MBK_MAX_VIA; Index++ )
376   {
377     for ( MbkLayer = 0; MbkLayer  < MBK_MAX_LAYER; MbkLayer++ )
378     {
379       if ( GET_LYNX_TRANSISTOR_CX( MbkLayer ) == Index ) break;
380     }
381 
382     GRAAL_CUT_C_X_LIST[ Index ] = MbkLayer;
383   }
384 
385   rdsend();
386 }
387 
388 /*------------------------------------------------------------\
389 |                                                             |
390 |                         Graalenv                            |
391 |                                                             |
392 \------------------------------------------------------------*/
393 
Graalenv()394 void Graalenv()
395 {
396   char *Env;
397   FILE *File;
398   char *Buffer;
399 
400   Env = mbkgetenv( "HOME" );
401 
402   if ( Env == (char *)NULL )
403   {
404     GRAAL_GMS_FILE_NAME = GMS_FILE_NAME;
405   }
406   else
407   {
408     GRAAL_GMS_FILE_NAME =
409 
410      (char *)rdsallocblock( strlen( Env ) + strlen( GMS_FILE_NAME ) + 2 );
411 
412     strcpy( GRAAL_GMS_FILE_NAME, Env );
413     strcat( GRAAL_GMS_FILE_NAME, "/" );
414     strcat( GRAAL_GMS_FILE_NAME, GMS_FILE_NAME );
415   }
416 
417   Buffer = rdsallocblock( strlen( WORK_LIB ) + 32 );
418   sprintf( Buffer, "%s/_ludo_%u", WORK_LIB, getpid() );
419 
420   File = fopen( Buffer, "w" );
421 
422   if ( File == (FILE *)0 )
423   {
424     fprintf( stdout, "Gsb: fatal error, invalid MBK_WORK_LIB '%s'\n", WORK_LIB );
425     exit( 3 );
426   }
427   else
428   {
429     unlink( Buffer );
430     fclose( File );
431   }
432 
433   rdsfreeblock( Buffer );
434 }
435