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