1 /*
2 * This file is part of the Alliance CAD System
3 * Copyright (C) Laboratoire LIP6 - D�partement ASIM
4 * Universite Pierre et Marie Curie
5 *
6 * Home page : http://www-asim.lip6.fr/alliance/
7 * E-mail : mailto:alliance-users@asim.lip6.fr
8 *
9 * This library is free software; you can redistribute it and/or modify it
10 * under the terms of the GNU Library General Public License as published
11 * by the Free Software Foundation; either version 2 of the License, or (at
12 * your option) any later version.
13 *
14 * Alliance VLSI CAD System is distributed in the hope that it will be
15 * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
17 * Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License along
20 * with the GNU C Library; see the file COPYING. If not, write to the Free
21 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 */
23
24 /*******************************************************************************
25 * mbk : vti parser for symbolic layout view : cp format v7r5 *
26 * *
27 * Based upon material provided by Alain Greiner in 1990, in lex and yacc *
28 * *
29 * version 0.0 written by Hichang Li in june 1991 under the supervision of *
30 * Frederic Petrot *
31 * version 1.0 is basically an update of version 0.0 written by Frederic *
32 * Petrot on september 1991 *
33 * *
34 * New versions are mostly bug corrections, or standardization matters and are *
35 * done by Frederic Petrot, since middle 1990. *
36 * *
37 * version : 3.06 *
38 * date : 03/08/92 *
39 *******************************************************************************/
40
41 /*
42 * $Log: parse_vti_p.c,v $
43 * Revision 1.5 2012/05/14 14:20:26 alliance
44 * Updated GNU/FSF address (patch from Thibault North).
45 *
46 * Revision 1.4 2009/06/14 13:51:58 ludo
47 * - port 64 bits
48 *
49 * Revision 1.3 2002/09/30 16:21:00 czo
50 * support/users
51 *
52 * Revision 1.2 2002/03/14 12:34:30 fred
53 * Using new headers
54 *
55 * Revision 1.1.1.1 2002/03/08 14:17:47 fred
56 * Importing MBKVTI sources into the new CVS tree
57 *
58 * Revision 1.7 2001/02/21 15:37:40 fred
59 * New layers
60 *
61 * Revision 1.6 2000/02/22 14:00:12 syf
62 * IDEM
63 *
64 * Revision 1.5 2000/02/09 10:09:45 syf
65 * Hello world
66 *
67 * Revision 1.4 2000/02/07 16:55:36 syf
68 * BIGVIA TURNVIA et CALUx
69 *
70 * Revision 1.3 2000/01/12 10:00:47 syf
71 * Nouveau PHVIA
72 *
73 * Revision 1.2 1999/07/12 16:16:24 ludo
74 * Modif pour Franck
75 *
76 * Revision 1.1.1.1 1998/10/02 15:27:13 alliance
77 * Imported by czo
78 *
79 * Revision 5.1 1998/09/16 14:48:38 mbkvti
80 * rcs version number consistency
81 *
82 * Revision 5.0 1998/09/16 14:46:20 mbkvti
83 * rcs version number consistency
84 *
85 */
86 #ident "$Id: parse_vti_p.c,v 1.5 2012/05/14 14:20:26 alliance Exp $"
87
88 #include <string.h>
89 #include <ctype.h>
90 #include <stdlib.h>
91 #include <math.h>
92 #include <mut.h>
93 #include <mph.h>
94 #include <mpu.h>
95
96 #define LSIZE 16384 /* max line size for fgets */
97
98 enum {CPPREF_ERROR, CPIREF_ERROR, CPCREF_ERROR, SYNTAX_ERROR, VIA_ERROR,
99 BIGVIA_ERROR, REF_ERROR, OPEN_ERROR, PARSE_ERROR, CLOSE_ERROR};
100
101
102 /*******************************************************************************
103 * These macros are big but are supposed to speed up the whole thing *
104 * All arguments are passed per values, this is different from old versions *
105 *******************************************************************************/
106
107 /*******************************************************************************
108 * macro cppref() *
109 *******************************************************************************/
110 #define cppref(px, py, refnum, lineno) \
111 { \
112 point_list *ptpoint; \
113 \
114 for (ptpoint = head_point; ptpoint; ptpoint = ptpoint->NEXT) \
115 if (ptpoint->INDEX == refnum) \
116 break; \
117 \
118 if (ptpoint == (point_list *)NULL) \
119 cp_error((int)CPPREF_ERROR, fname, lineno, refnum); \
120 \
121 px = ptpoint->X; \
122 py = ptpoint->Y; \
123 }
124
125 /*******************************************************************************
126 * macro cpcref() *
127 *******************************************************************************/
128 #define cpcref(px, py, refnum, lineno) \
129 { \
130 phcon_list *ptcon; \
131 \
132 for (ptcon = figure->PHCON; ptcon; ptcon = ptcon->NEXT) \
133 if (((long)(getptype(ptcon->USER, (long)VTIPARSER)->DATA)) == refnum) \
134 break; \
135 \
136 if (ptcon == (phcon_list *)NULL) \
137 cp_error((int)CPCREF_ERROR, fname, lineno, refnum); \
138 \
139 px = ptcon->XCON; \
140 py = ptcon->YCON; \
141 }
142
143 /*******************************************************************************
144 * macro cpiref() *
145 *******************************************************************************/
146 #define cpiref(px, py, insname, refnum, lineno) \
147 { \
148 phfig_list *ptnewfig; \
149 phcon_list *ptcon; \
150 phins_list *ptins; \
151 \
152 ptins = getphins(figure, insname); \
153 ptnewfig = getphfig(ptins->FIGNAME, 'P'); \
154 for (ptcon = ptnewfig->PHCON; ptcon; ptcon = ptcon->NEXT) \
155 if ((long)(getptype(ptcon->USER, (long)VTIPARSER)->DATA) == refnum) \
156 break; \
157 \
158 if (ptcon == (phcon_list *)NULL) \
159 cp_error((int)CPIREF_ERROR, fname, lineno, refnum); \
160 \
161 xyflat(&px, &py, ptcon->XCON, ptcon->YCON, ptins->XINS, ptins->YINS, \
162 ptnewfig->XAB1, ptnewfig->YAB1, ptnewfig->XAB2, ptnewfig->YAB2, \
163 ptins->TRANSF); \
164 }
165 /*******************************************************************************
166 * macro used to add a point to the point list *
167 *******************************************************************************/
168 #define addpoint(xp,yp) \
169 { \
170 point_list *point; \
171 point = (point_list *)mbkalloc(sizeof(point_list)); \
172 point->INDEX = ++index; \
173 point->X = xp; \
174 point->Y = yp; \
175 point->NEXT = head_point; \
176 head_point = point; \
177 }
178
179 /*******************************************************************************
180 * cp_error : generic error routine for vtiloadphfig function *
181 *******************************************************************************/
cp_error(type,name,line,parameter)182 static void cp_error(type, name, line, parameter)
183 int type, line;
184 long parameter;
185 char *name;
186 {
187
188 (void)fflush(stdout);
189 (void)fprintf(stderr, "*** mbk error ***\n");
190 switch (type) {
191 case CPPREF_ERROR :
192 (void)fprintf(stderr,
193 "illegal segment reference : point P %ld doesn't exist",
194 parameter);
195 break;
196 case CPCREF_ERROR :
197 (void)fprintf(stderr,
198 "illegal segment reference : connector C %ld doesn't exist",
199 parameter);
200 break;
201 case CPIREF_ERROR :
202 (void)fprintf(stderr,
203 "illegal segment reference : connector C %ld doesn't exist",
204 parameter);
205 break;
206 case SYNTAX_ERROR :
207 (void)fprintf(stderr, "syntax error");
208 break;
209 case VIA_ERROR :
210 (void)fprintf(stderr, "D entry has unknown contact type");
211 break;
212 case BIGVIA_ERROR :
213 (void)fprintf(stderr, "D entry has unimplement automatic generation of mega-contacts");
214 break;
215 case REF_ERROR :
216 (void)fprintf(stderr, "unknown segment reference type");
217 break;
218 case OPEN_ERROR :
219 (void)fprintf(stderr, "can't open file : %s", name);
220 break;
221 case PARSE_ERROR :
222 (void)fprintf(stderr, "abnormal parsing for : %s", name);
223 break;
224 case CLOSE_ERROR :
225 (void)fprintf(stderr, "can't close file : %s", name);
226 break;
227 }
228 if (!line)
229 (void)fprintf(stderr, "\nvtiloadphfig : parsing file %s.%s\n",
230 name, IN_PH);
231 else
232 (void)fprintf(stderr, "\nvtiloadphfig : parsing file %s.%s line %d\n",
233 name, IN_PH, line);
234 EXIT(1);
235 }
236
237 #if 0
238 /* Somehow unuseful right now that double are 64 bits long */
239 /*******************************************************************************
240 * shift : shift a floating point number in order to x 1000 float approx failed *
241 *******************************************************************************/
242 #define shift(pt) \
243 if (*(pt + 1) == '\0') { \
244 *pt = '0'; \
245 *(pt + 1) = '0'; \
246 *(pt + 2) = '0'; \
247 *(pt + 3) = '\0'; \
248 } else if (*(pt + 2) == '\0') { \
249 *pt = *(pt + 1); \
250 *(pt + 1) = '0'; \
251 *(pt + 2) = '0'; \
252 *(pt + 3) = '\0'; \
253 } else if (*(pt + 3) == '\0') { \
254 *pt = *(pt + 1); \
255 *(pt + 1) = *(pt + 2); \
256 *(pt + 2) = '0'; \
257 *(pt + 3) = '\0'; \
258 } else { \
259 *pt = *(pt + 1); \
260 *(pt + 1) = *(pt + 2); \
261 *(pt + 2) = *(pt + 3); \
262 *(pt + 3) = '\0'; \
263 }
264 #endif
265
266
vti_addphseg(phfig_list * figure,char layer,long l1,long x1,long y1,long x2,long y2,char * sname)267 static void vti_addphseg(phfig_list * figure, char layer,
268 long l1, long x1, long y1,
269 long x2, long y2, char * sname)
270 {
271 if ( ( x1 == x2 ) || ( y1 == y2 ) ) {
272 (void)addphseg(figure, layer, l1, x1, y1, x2, y2, sname);
273 }
274 else
275 fprintf(stderr, "WARNING : illegal segment layer=%d w=%ld"
276 " x1=%ld y1=%ld x2=%ld y2=%ld name=%s\n\n",
277 layer, l1/SCALE_X, x1/SCALE_X, y1/SCALE_X,
278 x2/SCALE_X, y2/SCALE_X,
279 ( sname != (char *)0 ) ? sname : "NULL" );
280 }
281
282 /*******************************************************************************
283 * stol : convert a string to a long *
284 *******************************************************************************/
stol(tokenpt)285 static long stol(tokenpt)
286 char *tokenpt;
287 {
288 //register char *pt;
289
290 if ((/*pt =*/ strchr(tokenpt, '.')) == (char *)NULL)
291 return (long)(SCALE_X * atol(tokenpt));
292 else {
293 #if 0
294 shift(pt);
295 return (long)(SCALE_X * atol(tokenpt) / 1000);
296 #endif
297 return (long)((double)SCALE_X * atof(tokenpt));
298 }
299 }
300
301 /*******************************************************************************
302 * fonction codelayer() *
303 *******************************************************************************/
codelayer(layername)304 static char codelayer(layername)
305 char *layername;
306 {
307 if (!strcmp(layername, "metal"))
308 return ALU1;
309 else if (!strcmp(layername, "metal2"))
310 return ALU2;
311 else if (!strcmp(layername, "metal3"))
312 return ALU3;
313 else if (!strcmp(layername, "metal4"))
314 return ALU4;
315 else if (!strcmp(layername, "metal5"))
316 return ALU5;
317 else if (!strcmp(layername, "metal6"))
318 return ALU6;
319 else if (!strcmp(layername, "metal7"))
320 return ALU7;
321 else if (!strcmp(layername, "metal8"))
322 return ALU8;
323 else if (!strcmp(layername, "metal9"))
324 return ALU9;
325 else if (!strcmp(layername, "allowM"))
326 return TALU1;
327 else if (!strcmp(layername, "allowM1"))
328 return TALU1;
329 else if (!strcmp(layername, "allowM2"))
330 return TALU2;
331 else if (!strcmp(layername, "allowM3"))
332 return TALU3;
333 else if (!strcmp(layername, "allowM4"))
334 return TALU4;
335 else if (!strcmp(layername, "allowM5"))
336 return TALU5;
337 else if (!strcmp(layername, "allowM6"))
338 return TALU6;
339 else if (!strcmp(layername, "allowM7"))
340 return TALU7;
341 else if (!strcmp(layername, "allowM8"))
342 return TALU8;
343 else if (!strcmp(layername, "allowM9"))
344 return TALU9;
345 else if (!strcmp(layername, "poly"))
346 return POLY;
347 else if (!strcmp(layername, "poly2"))
348 return POLY2;
349 else if (!strcmp(layername, "ndif"))
350 return NDIF;
351 else if (!strcmp(layername, "pdif"))
352 return PDIF;
353 else if (!strcmp(layername, "ntie"))
354 return NTIE;
355 else if (!strcmp(layername, "ptie"))
356 return PTIE;
357 else if (!strcmp(layername, "ntrans"))
358 return NTRANS;
359 else if (!strcmp(layername, "ptrans"))
360 return PTRANS;
361 else if (!strcmp(layername, "nwell"))
362 return NWELL;
363 else if (!strcmp(layername, "pwell"))
364 return PWELL;
365 return 255;
366 }
367
368 /*******************************************************************************
369 * checkname : check for busses *
370 *******************************************************************************/
checkname(name)371 static char *checkname(name)
372 char *name;
373 {
374 char *s, *t;
375
376 s = t = name;
377 while (*t) {
378 if (*t == '[')
379 *t = ' ';
380 else if (*t == ']') {
381 if (*(++t) == '\0') /* ok, it's finished */
382 goto end;
383 else if (*t == '[') /* multiple array */
384 continue;
385 }
386 *s++ = *t++;
387 }
388 end:
389 *s = '\0';
390 return name;
391 }
392
393 /*******************************************************************************
394 * physical parser : vti2mbk *
395 *******************************************************************************/
parse(figure,mode,in,fname)396 static int parse(figure, mode, in, fname)
397 phfig_list *figure;
398 char mode;
399 FILE *in;
400 char *fname;
401 {
402 char line[LSIZE];
403 char *t1, *t2, *t3, *t4, *t5; /* pointers for token on a line */
404 char *t6, *t7, *t8, *t9, *t10; /* */
405 char *t11; /* of vti file */
406 char s[100]; /* intermediate buffer to process tokens */
407 long l1, l2, l3, l4; /* results from string to long */
408 long x1, x2, y1, y2;
409 point_list *head_point = (point_list *)NULL;
410 int index = 0;
411 char *sname = NULL;
412 int i = 1; /* file line number */
413
414 while (1) {
415 i++;
416 if (fgets(line, LSIZE, in) == (char *)NULL)
417 cp_error((int)SYNTAX_ERROR, fname, i, 0L);
418 switch (line[0]) {
419 case ' ' : /* comment */
420 case '#' : /* comment */
421 break;
422 case 'A' :
423 if (line[2] == '\\') /* comment */
424 break;
425 if (strchr(line + 2, '*') == (char *)NULL) { /* A num num num num */
426 t1 = strtok(line + 2, " \n\t\"");
427 (void)strcpy(s, t1);
428 l1 = stol(s);
429 t2 = strtok((char *)NULL, " \n\t\"");
430 (void)strcpy(s, t2);
431 l2 = stol(s);
432 t3 = strtok((char *)NULL, " \n\t\"");
433 (void)strcpy(s, t3);
434 l3 = stol(s);
435 t4 = strtok((char *)NULL, " \n\t\"");
436 (void)strcpy(s, t4);
437 l4 = stol(s);
438 t5 = strtok((char *)NULL, " \n\t\"");
439 if (t5 != (char *)NULL)
440 cp_error((int)SYNTAX_ERROR, fname, i, 0L);
441 defab(figure, l1, l2, l3, l4);
442 }
443 break;
444 case 'B' : /* doesn't care about bounding box */
445 break;
446 case 'C' : /* C name num num name num num name name name name */
447 if (mode != 'C') {
448 t1 = strtok(line + 2, " \n\t\"");
449 t2 = strtok((char *)NULL, " \n\t\"");
450 (void)strcpy(s, t2);
451 l1 = stol(s);
452 t3 = strtok((char *)NULL, " \n\t\"");
453 (void)strcpy(s, t3);
454 l2 = stol(s);
455 t4 = strtok((char *)NULL, " \n\t\"");
456 t5 = strtok((char *)NULL, " \n\t\"");
457 (void)strcpy(s, t5);
458 l3 = stol(s);
459 t6 = strtok((char *)NULL, " \n\t\"");
460 l4 = atol(t6);
461 t7 = strtok((char *)NULL, " \n\t\"");
462 t8 = strtok((char *)NULL, " \n\t\"");
463 t9 = strtok((char *)NULL, " \n\t\"");
464 t10 = strtok((char *)NULL, " \n\t\"");
465 t11 = strtok((char *)NULL, " \n\t\"");
466 if (t11 != (char *)NULL)
467 cp_error((int)SYNTAX_ERROR, fname, i, 0L);
468 {
469 char orient = '\0';
470 if (!strcmp(t9, "NW"))
471 orient = WEST;
472 else if (*t9 == 'N' || *t9 == 'n')
473 orient = NORTH;
474 else if (*t9 == 'E' || *t9 == 'e')
475 orient = EAST;
476 else if (*t9 == 'S' || *t9 == 's')
477 orient = SOUTH;
478 else if (*t9 == 'W' || *t9 == 'w')
479 orient = WEST;
480 (void)addphcon(figure, orient, checkname(t10), l1, l2,
481 codelayer(t4), l3);
482 figure->PHCON->USER = (ptype_list *)addptype((ptype_list *)NULL,
483 (long)VTIPARSER, (void *)l4);
484 }
485 }
486 break;
487 case 'D' : /* D num num name name num num num */
488 t1 = strtok(line + 2, " \n\t\"");
489 (void)strcpy(s, t1);
490 l1 = stol(s);
491 t2 = strtok((char *)NULL, " \n\t\"");
492 (void)strcpy(s, t2);
493 l2 = stol(s);
494 t3 = strtok((char *)NULL, " \n\t\"");
495 t4 = strtok((char *)NULL, " \n\t\"");
496 t5 = strtok((char *)NULL, " \n\t\"");
497 t6 = strtok((char *)NULL, " \n\t\"");
498 (void)strcpy(s, t6);
499 l3 = stol(s);
500 t7 = strtok((char *)NULL, " \n\t\"");
501 (void)strcpy(s, t7);
502 l4 = stol(s);
503 addpoint(l1, l2);
504 if (mode != 'P') {
505 if (isdigit(*t4)) /* for vti v8 compatibility */
506 break; /* D num num name num num num */
507 if (!strcmp(t4, "VIA"))
508 {
509 (void)addphvia(figure, CONT_VIA, l1, l2, l3, l4,NULL);
510 }
511 else if (!strcmp(t4, "CONT"))
512 {
513 (void)addphvia(figure, CONT_POLY, l1, l2, l3, l4,NULL);
514 }
515 else if (!strcmp(t4, "CONT2"))
516 {
517 (void)addphvia(figure, CONT_POLY2, l1, l2, l3, l4,NULL);
518 }
519 else if (!strcmp(t4, "VIA2"))
520 {
521 (void)addphvia(figure, CONT_VIA2, l1, l2, l3, l4,NULL);
522 }
523 else if ((!strcmp(t4, "VIA01"))||(!strcmp(t4, "VI01")))
524 {
525 (void)addphvia(figure, CONT_POLY, l1, l2, l3, l4,NULL);
526 }
527 else if ((!strcmp(t4, "VIA02"))||(!strcmp(t4, "VI02")))
528 {
529 (void)addphvia(figure, CONT_POLY, l1, l2, l3, l4,NULL);
530 (void)addphvia(figure, CONT_VIA, l1, l2, l3, l4,NULL);
531 }
532 else if ((!strcmp(t4, "VIA03"))||(!strcmp(t4, "VI03")))
533 {
534 (void)addphvia(figure, CONT_POLY, l1, l2, l3, l4,NULL);
535 (void)addphvia(figure, CONT_VIA, l1, l2, l3, l4,NULL);
536 (void)addphvia(figure, CONT_VIA2, l1, l2, l3, l4,NULL);
537 }
538 else if ((!strcmp(t4, "VIA04"))||(!strcmp(t4, "VI04")))
539 {
540 (void)addphvia(figure, CONT_POLY, l1, l2, l3, l4,NULL);
541 (void)addphvia(figure, CONT_VIA, l1, l2, l3, l4,NULL);
542 (void)addphvia(figure, CONT_VIA2, l1, l2, l3, l4,NULL);
543 (void)addphvia(figure, CONT_VIA3, l1, l2, l3, l4,NULL);
544 }
545 else if ((!strcmp(t4, "VIA05"))||(!strcmp(t4, "VI05")))
546 {
547 (void)addphvia(figure, CONT_POLY, l1, l2, l3, l4,NULL);
548 (void)addphvia(figure, CONT_VIA, l1, l2, l3, l4,NULL);
549 (void)addphvia(figure, CONT_VIA2, l1, l2, l3, l4,NULL);
550 (void)addphvia(figure, CONT_VIA3, l1, l2, l3, l4,NULL);
551 (void)addphvia(figure, CONT_VIA4, l1, l2, l3, l4,NULL);
552 }
553 else if ((!strcmp(t4, "VIA06"))||(!strcmp(t4, "VI06")))
554 {
555 (void)addphvia(figure, CONT_POLY, l1, l2, l3, l4,NULL);
556 (void)addphvia(figure, CONT_VIA, l1, l2, l3, l4,NULL);
557 (void)addphvia(figure, CONT_VIA2, l1, l2, l3, l4,NULL);
558 (void)addphvia(figure, CONT_VIA3, l1, l2, l3, l4,NULL);
559 (void)addphvia(figure, CONT_VIA4, l1, l2, l3, l4,NULL);
560 (void)addphvia(figure, CONT_VIA5, l1, l2, l3, l4,NULL);
561 }
562 else if ((!strcmp(t4, "VIA07"))||(!strcmp(t4, "VI07")))
563 {
564 (void)addphvia(figure, CONT_POLY, l1, l2, l3, l4,NULL);
565 (void)addphvia(figure, CONT_VIA, l1, l2, l3, l4,NULL);
566 (void)addphvia(figure, CONT_VIA2, l1, l2, l3, l4,NULL);
567 (void)addphvia(figure, CONT_VIA3, l1, l2, l3, l4,NULL);
568 (void)addphvia(figure, CONT_VIA4, l1, l2, l3, l4,NULL);
569 (void)addphvia(figure, CONT_VIA5, l1, l2, l3, l4,NULL);
570 (void)addphvia(figure, CONT_VIA6, l1, l2, l3, l4,NULL);
571 }
572 else if ((!strcmp(t4, "VIA08"))||(!strcmp(t4, "VI08")))
573 {
574 (void)addphvia(figure, CONT_POLY, l1, l2, l3, l4,NULL);
575 (void)addphvia(figure, CONT_VIA, l1, l2, l3, l4,NULL);
576 (void)addphvia(figure, CONT_VIA2, l1, l2, l3, l4,NULL);
577 (void)addphvia(figure, CONT_VIA3, l1, l2, l3, l4,NULL);
578 (void)addphvia(figure, CONT_VIA4, l1, l2, l3, l4,NULL);
579 (void)addphvia(figure, CONT_VIA5, l1, l2, l3, l4,NULL);
580 (void)addphvia(figure, CONT_VIA6, l1, l2, l3, l4,NULL);
581 (void)addphvia(figure, CONT_VIA7, l1, l2, l3, l4,NULL);
582 }
583 else if ((!strcmp(t4, "VIA09"))||(!strcmp(t4, "VI09")))
584 {
585 (void)addphvia(figure, CONT_POLY, l1, l2, l3, l4,NULL);
586 (void)addphvia(figure, CONT_VIA, l1, l2, l3, l4,NULL);
587 (void)addphvia(figure, CONT_VIA2, l1, l2, l3, l4,NULL);
588 (void)addphvia(figure, CONT_VIA3, l1, l2, l3, l4,NULL);
589 (void)addphvia(figure, CONT_VIA4, l1, l2, l3, l4,NULL);
590 (void)addphvia(figure, CONT_VIA5, l1, l2, l3, l4,NULL);
591 (void)addphvia(figure, CONT_VIA6, l1, l2, l3, l4,NULL);
592 (void)addphvia(figure, CONT_VIA7, l1, l2, l3, l4,NULL);
593 (void)addphvia(figure, CONT_VIA8, l1, l2, l3, l4,NULL);
594 }
595 else if ((!strcmp(t4, "VIA12"))||(!strcmp(t4, "VI12")))
596 {
597 (void)addphvia(figure, CONT_VIA, l1, l2, l3, l4,NULL);
598 }
599 else if ((!strcmp(t4, "VIA13"))||(!strcmp(t4, "VI13")))
600 {
601 (void)addphvia(figure, CONT_VIA, l1, l2, l3, l4,NULL);
602 (void)addphvia(figure, CONT_VIA2, l1, l2, l3, l4,NULL);
603 }
604 else if ((!strcmp(t4, "VIA14"))||(!strcmp(t4, "VI14")))
605 {
606 (void)addphvia(figure, CONT_VIA, l1, l2, l3, l4,NULL);
607 (void)addphvia(figure, CONT_VIA2, l1, l2, l3, l4,NULL);
608 (void)addphvia(figure, CONT_VIA3, l1, l2, l3, l4,NULL);
609 }
610 else if ((!strcmp(t4, "VIA15"))||(!strcmp(t4, "VI15")))
611 {
612 (void)addphvia(figure, CONT_VIA, l1, l2, l3, l4,NULL);
613 (void)addphvia(figure, CONT_VIA2, l1, l2, l3, l4,NULL);
614 (void)addphvia(figure, CONT_VIA3, l1, l2, l3, l4,NULL);
615 (void)addphvia(figure, CONT_VIA4, l1, l2, l3, l4,NULL);
616 }
617 else if ((!strcmp(t4, "VIA16"))||(!strcmp(t4, "VI16")))
618 {
619 (void)addphvia(figure, CONT_VIA, l1, l2, l3, l4,NULL);
620 (void)addphvia(figure, CONT_VIA2, l1, l2, l3, l4,NULL);
621 (void)addphvia(figure, CONT_VIA3, l1, l2, l3, l4,NULL);
622 (void)addphvia(figure, CONT_VIA4, l1, l2, l3, l4,NULL);
623 (void)addphvia(figure, CONT_VIA5, l1, l2, l3, l4,NULL);
624 }
625 else if ((!strcmp(t4, "VIA17"))||(!strcmp(t4, "VI17")))
626 {
627 (void)addphvia(figure, CONT_VIA, l1, l2, l3, l4,NULL);
628 (void)addphvia(figure, CONT_VIA2, l1, l2, l3, l4,NULL);
629 (void)addphvia(figure, CONT_VIA3, l1, l2, l3, l4,NULL);
630 (void)addphvia(figure, CONT_VIA4, l1, l2, l3, l4,NULL);
631 (void)addphvia(figure, CONT_VIA5, l1, l2, l3, l4,NULL);
632 (void)addphvia(figure, CONT_VIA6, l1, l2, l3, l4,NULL);
633 }
634 else if ((!strcmp(t4, "VIA18"))||(!strcmp(t4, "VI18")))
635 {
636 (void)addphvia(figure, CONT_VIA, l1, l2, l3, l4,NULL);
637 (void)addphvia(figure, CONT_VIA2, l1, l2, l3, l4,NULL);
638 (void)addphvia(figure, CONT_VIA3, l1, l2, l3, l4,NULL);
639 (void)addphvia(figure, CONT_VIA4, l1, l2, l3, l4,NULL);
640 (void)addphvia(figure, CONT_VIA5, l1, l2, l3, l4,NULL);
641 (void)addphvia(figure, CONT_VIA6, l1, l2, l3, l4,NULL);
642 (void)addphvia(figure, CONT_VIA7, l1, l2, l3, l4,NULL);
643 }
644 else if ((!strcmp(t4, "VIA19"))||(!strcmp(t4, "VI19")))
645 {
646 (void)addphvia(figure, CONT_VIA, l1, l2, l3, l4,NULL);
647 (void)addphvia(figure, CONT_VIA2, l1, l2, l3, l4,NULL);
648 (void)addphvia(figure, CONT_VIA3, l1, l2, l3, l4,NULL);
649 (void)addphvia(figure, CONT_VIA4, l1, l2, l3, l4,NULL);
650 (void)addphvia(figure, CONT_VIA5, l1, l2, l3, l4,NULL);
651 (void)addphvia(figure, CONT_VIA6, l1, l2, l3, l4,NULL);
652 (void)addphvia(figure, CONT_VIA7, l1, l2, l3, l4,NULL);
653 (void)addphvia(figure, CONT_VIA8, l1, l2, l3, l4,NULL);
654 }
655
656 else if ((!strcmp(t4, "VIA23"))||(!strcmp(t4, "VI23")))
657 {
658 (void)addphvia(figure, CONT_VIA2, l1, l2, l3, l4,NULL);
659 }
660 else if ((!strcmp(t4, "VIA24"))||(!strcmp(t4, "VI24")))
661 {
662 (void)addphvia(figure, CONT_VIA2, l1, l2, l3, l4,NULL);
663 (void)addphvia(figure, CONT_VIA3, l1, l2, l3, l4,NULL);
664 }
665 else if ((!strcmp(t4, "VIA25"))||(!strcmp(t4, "VI25")))
666 {
667 (void)addphvia(figure, CONT_VIA2, l1, l2, l3, l4,NULL);
668 (void)addphvia(figure, CONT_VIA3, l1, l2, l3, l4,NULL);
669 (void)addphvia(figure, CONT_VIA4, l1, l2, l3, l4,NULL);
670 }
671 else if ((!strcmp(t4, "VIA26"))||(!strcmp(t4, "VI26")))
672 {
673 (void)addphvia(figure, CONT_VIA2, l1, l2, l3, l4,NULL);
674 (void)addphvia(figure, CONT_VIA3, l1, l2, l3, l4,NULL);
675 (void)addphvia(figure, CONT_VIA4, l1, l2, l3, l4,NULL);
676 (void)addphvia(figure, CONT_VIA5, l1, l2, l3, l4,NULL);
677 }
678 else if ((!strcmp(t4, "VIA27"))||(!strcmp(t4, "VI27")))
679 {
680 (void)addphvia(figure, CONT_VIA2, l1, l2, l3, l4,NULL);
681 (void)addphvia(figure, CONT_VIA3, l1, l2, l3, l4,NULL);
682 (void)addphvia(figure, CONT_VIA4, l1, l2, l3, l4,NULL);
683 (void)addphvia(figure, CONT_VIA5, l1, l2, l3, l4,NULL);
684 (void)addphvia(figure, CONT_VIA6, l1, l2, l3, l4,NULL);
685 }
686 else if ((!strcmp(t4, "VIA28"))||(!strcmp(t4, "VI28")))
687 {
688 (void)addphvia(figure, CONT_VIA2, l1, l2, l3, l4,NULL);
689 (void)addphvia(figure, CONT_VIA3, l1, l2, l3, l4,NULL);
690 (void)addphvia(figure, CONT_VIA4, l1, l2, l3, l4,NULL);
691 (void)addphvia(figure, CONT_VIA5, l1, l2, l3, l4,NULL);
692 (void)addphvia(figure, CONT_VIA6, l1, l2, l3, l4,NULL);
693 (void)addphvia(figure, CONT_VIA7, l1, l2, l3, l4,NULL);
694 }
695 else if ((!strcmp(t4, "VIA29"))||(!strcmp(t4, "VI29")))
696 {
697 (void)addphvia(figure, CONT_VIA2, l1, l2, l3, l4,NULL);
698 (void)addphvia(figure, CONT_VIA3, l1, l2, l3, l4,NULL);
699 (void)addphvia(figure, CONT_VIA4, l1, l2, l3, l4,NULL);
700 (void)addphvia(figure, CONT_VIA5, l1, l2, l3, l4,NULL);
701 (void)addphvia(figure, CONT_VIA6, l1, l2, l3, l4,NULL);
702 (void)addphvia(figure, CONT_VIA7, l1, l2, l3, l4,NULL);
703 (void)addphvia(figure, CONT_VIA8, l1, l2, l3, l4,NULL);
704 }
705 else if ((!strcmp(t4, "VIA34"))||(!strcmp(t4, "VI34")))
706 {
707 (void)addphvia(figure, CONT_VIA3, l1, l2, l3, l4,NULL);
708 }
709 else if ((!strcmp(t4, "VIA35"))||(!strcmp(t4, "VI35")))
710 {
711 (void)addphvia(figure, CONT_VIA3, l1, l2, l3, l4,NULL);
712 (void)addphvia(figure, CONT_VIA4, l1, l2, l3, l4,NULL);
713 (void)addphvia(figure, CONT_VIA5, l1, l2, l3, l4,NULL);
714 }
715 else if ((!strcmp(t4, "VIA36"))||(!strcmp(t4, "VI36")))
716 {
717 (void)addphvia(figure, CONT_VIA3, l1, l2, l3, l4,NULL);
718 (void)addphvia(figure, CONT_VIA4, l1, l2, l3, l4,NULL);
719 (void)addphvia(figure, CONT_VIA5, l1, l2, l3, l4,NULL);
720 (void)addphvia(figure, CONT_VIA6, l1, l2, l3, l4,NULL);
721 }
722 else if ((!strcmp(t4, "VIA37"))||(!strcmp(t4, "VI37")))
723 {
724 (void)addphvia(figure, CONT_VIA3, l1, l2, l3, l4,NULL);
725 (void)addphvia(figure, CONT_VIA4, l1, l2, l3, l4,NULL);
726 (void)addphvia(figure, CONT_VIA5, l1, l2, l3, l4,NULL);
727 (void)addphvia(figure, CONT_VIA6, l1, l2, l3, l4,NULL);
728 (void)addphvia(figure, CONT_VIA7, l1, l2, l3, l4,NULL);
729 }
730 else if ((!strcmp(t4, "VIA38"))||(!strcmp(t4, "VI38")))
731 {
732 (void)addphvia(figure, CONT_VIA3, l1, l2, l3, l4,NULL);
733 (void)addphvia(figure, CONT_VIA4, l1, l2, l3, l4,NULL);
734 (void)addphvia(figure, CONT_VIA5, l1, l2, l3, l4,NULL);
735 (void)addphvia(figure, CONT_VIA6, l1, l2, l3, l4,NULL);
736 (void)addphvia(figure, CONT_VIA7, l1, l2, l3, l4,NULL);
737 (void)addphvia(figure, CONT_VIA8, l1, l2, l3, l4,NULL);
738 }
739 else if ((!strcmp(t4, "VIA39"))||(!strcmp(t4, "VI39")))
740 {
741 (void)addphvia(figure, CONT_VIA3, l1, l2, l3, l4,NULL);
742 (void)addphvia(figure, CONT_VIA4, l1, l2, l3, l4,NULL);
743 (void)addphvia(figure, CONT_VIA5, l1, l2, l3, l4,NULL);
744 (void)addphvia(figure, CONT_VIA6, l1, l2, l3, l4,NULL);
745 (void)addphvia(figure, CONT_VIA7, l1, l2, l3, l4,NULL);
746 (void)addphvia(figure, CONT_VIA8, l1, l2, l3, l4,NULL);
747 }
748 else if ((!strcmp(t4, "VIA45"))||(!strcmp(t4, "VI45")))
749 {
750 (void)addphvia(figure, CONT_VIA4, l1, l2, l3, l4,NULL);
751 }
752 else if ((!strcmp(t4, "VIA46"))||(!strcmp(t4, "VI46")))
753 {
754 (void)addphvia(figure, CONT_VIA4, l1, l2, l3, l4,NULL);
755 (void)addphvia(figure, CONT_VIA5, l1, l2, l3, l4,NULL);
756 }
757 else if ((!strcmp(t4, "VIA47"))||(!strcmp(t4, "VI47")))
758 {
759 (void)addphvia(figure, CONT_VIA4, l1, l2, l3, l4,NULL);
760 (void)addphvia(figure, CONT_VIA5, l1, l2, l3, l4,NULL);
761 (void)addphvia(figure, CONT_VIA6, l1, l2, l3, l4,NULL);
762 }
763 else if ((!strcmp(t4, "VIA48"))||(!strcmp(t4, "VI48")))
764 {
765 (void)addphvia(figure, CONT_VIA4, l1, l2, l3, l4,NULL);
766 (void)addphvia(figure, CONT_VIA5, l1, l2, l3, l4,NULL);
767 (void)addphvia(figure, CONT_VIA6, l1, l2, l3, l4,NULL);
768 (void)addphvia(figure, CONT_VIA7, l1, l2, l3, l4,NULL);
769 }
770 else if ((!strcmp(t4, "VIA49"))||(!strcmp(t4, "VI49")))
771 {
772 (void)addphvia(figure, CONT_VIA4, l1, l2, l3, l4,NULL);
773 (void)addphvia(figure, CONT_VIA5, l1, l2, l3, l4,NULL);
774 (void)addphvia(figure, CONT_VIA6, l1, l2, l3, l4,NULL);
775 (void)addphvia(figure, CONT_VIA7, l1, l2, l3, l4,NULL);
776 (void)addphvia(figure, CONT_VIA8, l1, l2, l3, l4,NULL);
777 }
778 else if ((!strcmp(t4, "VIA56"))||(!strcmp(t4, "VI56")))
779 {
780 (void)addphvia(figure, CONT_VIA5, l1, l2, l3, l4,NULL);
781 }
782 else if ((!strcmp(t4, "VIA57"))||(!strcmp(t4, "VI57")))
783 {
784 (void)addphvia(figure, CONT_VIA5, l1, l2, l3, l4,NULL);
785 (void)addphvia(figure, CONT_VIA6, l1, l2, l3, l4,NULL);
786 }
787 else if ((!strcmp(t4, "VIA58"))||(!strcmp(t4, "VI58")))
788 {
789 (void)addphvia(figure, CONT_VIA5, l1, l2, l3, l4,NULL);
790 (void)addphvia(figure, CONT_VIA6, l1, l2, l3, l4,NULL);
791 (void)addphvia(figure, CONT_VIA7, l1, l2, l3, l4,NULL);
792 }
793 else if ((!strcmp(t4, "VIA59"))||(!strcmp(t4, "VI59")))
794 {
795 (void)addphvia(figure, CONT_VIA5, l1, l2, l3, l4,NULL);
796 (void)addphvia(figure, CONT_VIA6, l1, l2, l3, l4,NULL);
797 (void)addphvia(figure, CONT_VIA7, l1, l2, l3, l4,NULL);
798 (void)addphvia(figure, CONT_VIA8, l1, l2, l3, l4,NULL);
799 }
800 else if ((!strcmp(t4, "VIA67"))||(!strcmp(t4, "VI67")))
801 {
802 (void)addphvia(figure, CONT_VIA6, l1, l2, l3, l4,NULL);
803 }
804 else if ((!strcmp(t4, "VIA68"))||(!strcmp(t4, "VI68")))
805 {
806 (void)addphvia(figure, CONT_VIA6, l1, l2, l3, l4,NULL);
807 (void)addphvia(figure, CONT_VIA7, l1, l2, l3, l4,NULL);
808 }
809 else if ((!strcmp(t4, "VIA69"))||(!strcmp(t4, "VI69")))
810 {
811 (void)addphvia(figure, CONT_VIA6, l1, l2, l3, l4,NULL);
812 (void)addphvia(figure, CONT_VIA7, l1, l2, l3, l4,NULL);
813 (void)addphvia(figure, CONT_VIA8, l1, l2, l3, l4,NULL);
814 }
815 else if ((!strcmp(t4, "VIA78"))||(!strcmp(t4, "VI78")))
816 {
817 (void)addphvia(figure, CONT_VIA7, l1, l2, l3, l4,NULL);
818 }
819 else if ((!strcmp(t4, "VIA79"))||(!strcmp(t4, "VI79")))
820 {
821 (void)addphvia(figure, CONT_VIA7, l1, l2, l3, l4,NULL);
822 (void)addphvia(figure, CONT_VIA8, l1, l2, l3, l4,NULL);
823 }
824 else if ((!strcmp(t4, "VIA89"))||(!strcmp(t4, "VI89")))
825 (void)addphvia(figure, CONT_VIA8, l1, l2, l3, l4,NULL);
826 else if (!strcmp(t4, "TURN1"))
827 (void)addphvia(figure, CONT_TURN1, l1, l2, l3, l4,NULL);
828 else if (!strcmp(t4, "TURN2"))
829 (void)addphvia(figure, CONT_TURN2, l1, l2, l3, l4,NULL);
830 else if (!strcmp(t4, "TURN3"))
831 (void)addphvia(figure, CONT_TURN3, l1, l2, l3, l4,NULL);
832 else if (!strcmp(t4, "TURN4"))
833 (void)addphvia(figure, CONT_TURN4, l1, l2, l3, l4,NULL);
834 else if (!strcmp(t4, "TURN5"))
835 (void)addphvia(figure, CONT_TURN5, l1, l2, l3, l4,NULL);
836 else if (!strcmp(t4, "TURN6"))
837 (void)addphvia(figure, CONT_TURN6, l1, l2, l3, l4,NULL);
838 else if (!strcmp(t4, "TURN7"))
839 (void)addphvia(figure, CONT_TURN7, l1, l2, l3, l4,NULL);
840 else if (!strcmp(t4, "TURN8"))
841 (void)addphvia(figure, CONT_TURN8, l1, l2, l3, l4,NULL);
842 else if (!strcmp(t4, "TURN9"))
843 (void)addphvia(figure, CONT_TURN9, l1, l2, l3, l4,NULL);
844 else
845 cp_error((int)VIA_ERROR, fname, i, 0L);
846 }
847 break;
848 case 'E' : /* E */
849 {
850 point_list *point;
851 phins_list *ins;
852 void *sav;
853
854 for (point = head_point; point; point = (point_list *)sav) {
855 sav = (void *)point->NEXT;
856 mbkfree((void *)point);
857 }
858 if (mode == 'P') {
859 for (ins = figure->PHINS; ins; ins = (phins_list *)sav) {
860 sav = (void *)ins->NEXT;
861 mbkfree((void *)ins);
862 }
863 figure->PHINS = (phins_list *)NULL;
864 }
865 return 0;
866 }
867 case 'F':
868 break;
869
870 case 'I' : /* I name num num num name name name name */
871 t1 = strtok(line + 2, " \n\t\"");
872 t2 = strtok((char *)NULL, " \n\t\"");
873 (void)strcpy(s, t2);
874 l1 = stol(s);
875 t3 = strtok((char *)NULL, " \n\t\"");
876 (void)strcpy(s, t3);
877 l2 = stol(s);
878 t4 = strtok((char *)NULL, " \n\t\"");
879 l3 = atol(t4);
880 t5 = strtok((char *)NULL, " \n\t\"");
881 t6 = strtok((char *)NULL, " \n\t\"");
882 /* load what is referenced by .cp or .scp as .cp */
883 if (*t6 == 'c' || *t6 == 's') { /* load instances for any mode */
884 char symm;
885 switch ((int)l3) {
886 case 0 :
887 symm = NOSYM;
888 break;
889 case 1 :
890 symm = ROT_P;
891 break;
892 case 2 :
893 symm = SYMXY;
894 break;
895 case 3 :
896 symm = ROT_M;
897 break;
898 case 4 :
899 symm = SYM_X;
900 break;
901 case 5 :
902 symm = SY_RM;
903 break;
904 case 6 :
905 symm = SYM_Y;
906 break;
907 case 7 :
908 symm = SY_RP;
909 break;
910 default :
911 symm = -1;
912 }
913 (void)addphins(figure, t5, t1, symm, l1, l2);
914 }
915 if (mode != 'C')
916 if (*t6 == 'l' && !strncmp(t5, "ref_", 4))
917 (void)addphref(figure, t5, checkname(t1), l1, l2);
918 if (mode != 'P') {
919 if (*t6 == 'l') {
920 if (!strcmp(t5, "cbn")) {
921 (void)addphvia(figure, CONT_BODY_N, l1, l2,0,0,NULL);
922 } else if (!strcmp(t5, "cbnv")) {
923 (void)addphvia(figure, CONT_BODY_N, l1, l2,0,0,NULL);
924 (void)addphvia(figure, CONT_VIA, l1, l2,0,0,NULL);
925 } else if (!strcmp(t5, "cbp")) {
926 (void)addphvia(figure, CONT_BODY_P, l1, l2,0,0,NULL);
927 } else if (!strcmp(t5, "cbpv")) {
928 (void)addphvia(figure, CONT_BODY_P, l1, l2,0,0,NULL);
929 (void)addphvia(figure, CONT_VIA, l1, l2,0,0,NULL);
930 } else if (!strcmp(t5, "cdn")) {
931 (void)addphvia(figure, CONT_DIF_N, l1, l2,0,0,NULL);
932 } else if (!strcmp(t5, "cdnv")) {
933 (void)addphvia(figure, CONT_DIF_N, l1, l2,0,0,NULL);
934 (void)addphvia(figure, CONT_VIA, l1, l2,0,0,NULL);
935 } else if (!strcmp(t5, "cdp")) {
936 (void)addphvia(figure, CONT_DIF_P, l1, l2,0,0,NULL);
937 } else if (!strcmp(t5, "cdpv")) {
938 (void)addphvia(figure, CONT_DIF_P, l1, l2,0,0,NULL);
939 (void)addphvia(figure, CONT_VIA, l1, l2,0,0,NULL);
940 } else if (!strcmp(t5, "cpf")) {
941 (void)addphvia(figure, CONT_POLY, l1, l2,0,0,NULL);
942 } else if (!strcmp(t5, "cpfv")) {
943 (void)addphvia(figure, CONT_POLY, l1, l2,0,0,NULL);
944 (void)addphvia(figure, CONT_VIA, l1, l2,0,0,NULL);
945 } else if (!strcmp(t5, "cpf2")) {
946 (void)addphvia(figure, CONT_POLY2, l1, l2,0,0,NULL);
947 } else if (!strcmp(t5, "cpf2v")) {
948 (void)addphvia(figure, CONT_POLY2, l1, l2,0,0,NULL);
949 (void)addphvia(figure, CONT_VIA, l1, l2,0,0,NULL);
950 } else if (!strcmp(t5, "cvia")) {
951 (void)addphvia(figure, CONT_VIA, l1, l2,0,0,NULL);
952 } else if (!strcmp(t5, "cvia2")) {
953 (void)addphvia(figure, CONT_VIA2, l1, l2,0,0,NULL);
954 } else if (!strcmp(t5, "cxn")) {
955 (void)addphvia(figure, C_X_N, l1, l2,0,0,NULL);
956 } else if (!strcmp(t5, "cxp")) {
957 (void)addphvia(figure, C_X_P, l1, l2,0,0,NULL);
958 /* Bull specific: quite bright, insn't it ? */
959 } else if (!strcmp(t5, "via12")) {
960 (void)addphvia(figure, CONT_VIA, l1, l2,0,0,NULL);
961 } else if (!strcmp(t5, "via13")) {
962 (void)addphvia(figure, CONT_VIA, l1, l2,0,0,NULL);
963 (void)addphvia(figure, CONT_VIA2, l1, l2,0,0,NULL);
964 } else if (!strcmp(t5, "via14")) {
965 (void)addphvia(figure, CONT_VIA, l1, l2,0,0,NULL);
966 (void)addphvia(figure, CONT_VIA2, l1, l2,0,0,NULL);
967 (void)addphvia(figure, CONT_VIA3, l1, l2,0,0,NULL);
968 } else if (!strcmp(t5, "via15")) {
969 (void)addphvia(figure, CONT_VIA, l1, l2,0,0,NULL);
970 (void)addphvia(figure, CONT_VIA2, l1, l2,0,0,NULL);
971 (void)addphvia(figure, CONT_VIA3, l1, l2,0,0,NULL);
972 (void)addphvia(figure, CONT_VIA4, l1, l2,0,0,NULL);
973 } else if (!strcmp(t5, "via16")) {
974 (void)addphvia(figure, CONT_VIA, l1, l2,0,0,NULL);
975 (void)addphvia(figure, CONT_VIA2, l1, l2,0,0,NULL);
976 (void)addphvia(figure, CONT_VIA3, l1, l2,0,0,NULL);
977 (void)addphvia(figure, CONT_VIA4, l1, l2,0,0,NULL);
978 (void)addphvia(figure, CONT_VIA5, l1, l2,0,0,NULL);
979 } else if (!strcmp(t5, "via17")) {
980 (void)addphvia(figure, CONT_VIA, l1, l2,0,0,NULL);
981 (void)addphvia(figure, CONT_VIA2, l1, l2,0,0,NULL);
982 (void)addphvia(figure, CONT_VIA3, l1, l2,0,0,NULL);
983 (void)addphvia(figure, CONT_VIA4, l1, l2,0,0,NULL);
984 (void)addphvia(figure, CONT_VIA5, l1, l2,0,0,NULL);
985 (void)addphvia(figure, CONT_VIA6, l1, l2,0,0,NULL);
986 } else if (!strcmp(t5, "via18")) {
987 (void)addphvia(figure, CONT_VIA, l1, l2,0,0,NULL);
988 (void)addphvia(figure, CONT_VIA2, l1, l2,0,0,NULL);
989 (void)addphvia(figure, CONT_VIA3, l1, l2,0,0,NULL);
990 (void)addphvia(figure, CONT_VIA4, l1, l2,0,0,NULL);
991 (void)addphvia(figure, CONT_VIA5, l1, l2,0,0,NULL);
992 (void)addphvia(figure, CONT_VIA6, l1, l2,0,0,NULL);
993 (void)addphvia(figure, CONT_VIA7, l1, l2,0,0,NULL);
994 } else if (!strcmp(t5, "via19")) {
995 (void)addphvia(figure, CONT_VIA, l1, l2,0,0,NULL);
996 (void)addphvia(figure, CONT_VIA2, l1, l2,0,0,NULL);
997 (void)addphvia(figure, CONT_VIA3, l1, l2,0,0,NULL);
998 (void)addphvia(figure, CONT_VIA4, l1, l2,0,0,NULL);
999 (void)addphvia(figure, CONT_VIA5, l1, l2,0,0,NULL);
1000 (void)addphvia(figure, CONT_VIA6, l1, l2,0,0,NULL);
1001 (void)addphvia(figure, CONT_VIA7, l1, l2,0,0,NULL);
1002 (void)addphvia(figure, CONT_VIA8, l1, l2,0,0,NULL);
1003 } else if (!strcmp(t5, "via23")) {
1004 (void)addphvia(figure, CONT_VIA2, l1, l2,0,0,NULL);
1005 } else if (!strcmp(t5, "via24")) {
1006 (void)addphvia(figure, CONT_VIA2, l1, l2,0,0,NULL);
1007 (void)addphvia(figure, CONT_VIA3, l1, l2,0,0,NULL);
1008 } else if (!strcmp(t5, "via25")) {
1009 (void)addphvia(figure, CONT_VIA2, l1, l2,0,0,NULL);
1010 (void)addphvia(figure, CONT_VIA3, l1, l2,0,0,NULL);
1011 (void)addphvia(figure, CONT_VIA4, l1, l2,0,0,NULL);
1012 } else if (!strcmp(t5, "via26")) {
1013 (void)addphvia(figure, CONT_VIA2, l1, l2,0,0,NULL);
1014 (void)addphvia(figure, CONT_VIA3, l1, l2,0,0,NULL);
1015 (void)addphvia(figure, CONT_VIA4, l1, l2,0,0,NULL);
1016 (void)addphvia(figure, CONT_VIA5, l1, l2,0,0,NULL);
1017 } else if (!strcmp(t5, "via27")) {
1018 (void)addphvia(figure, CONT_VIA2, l1, l2,0,0,NULL);
1019 (void)addphvia(figure, CONT_VIA3, l1, l2,0,0,NULL);
1020 (void)addphvia(figure, CONT_VIA4, l1, l2,0,0,NULL);
1021 (void)addphvia(figure, CONT_VIA5, l1, l2,0,0,NULL);
1022 (void)addphvia(figure, CONT_VIA6, l1, l2,0,0,NULL);
1023 } else if (!strcmp(t5, "via28")) {
1024 (void)addphvia(figure, CONT_VIA2, l1, l2,0,0,NULL);
1025 (void)addphvia(figure, CONT_VIA3, l1, l2,0,0,NULL);
1026 (void)addphvia(figure, CONT_VIA4, l1, l2,0,0,NULL);
1027 (void)addphvia(figure, CONT_VIA5, l1, l2,0,0,NULL);
1028 (void)addphvia(figure, CONT_VIA6, l1, l2,0,0,NULL);
1029 (void)addphvia(figure, CONT_VIA7, l1, l2,0,0,NULL);
1030 } else if (!strcmp(t5, "via29")) {
1031 (void)addphvia(figure, CONT_VIA2, l1, l2,0,0,NULL);
1032 (void)addphvia(figure, CONT_VIA3, l1, l2,0,0,NULL);
1033 (void)addphvia(figure, CONT_VIA4, l1, l2,0,0,NULL);
1034 (void)addphvia(figure, CONT_VIA5, l1, l2,0,0,NULL);
1035 (void)addphvia(figure, CONT_VIA6, l1, l2,0,0,NULL);
1036 (void)addphvia(figure, CONT_VIA7, l1, l2,0,0,NULL);
1037 (void)addphvia(figure, CONT_VIA8, l1, l2,0,0,NULL);
1038 } else if (!strcmp(t5, "via34")) {
1039 (void)addphvia(figure, CONT_VIA3, l1, l2,0,0,NULL);
1040 } else if (!strcmp(t5, "via35")) {
1041 (void)addphvia(figure, CONT_VIA3, l1, l2,0,0,NULL);
1042 (void)addphvia(figure, CONT_VIA4, l1, l2,0,0,NULL);
1043 } else if (!strcmp(t5, "via36")) {
1044 (void)addphvia(figure, CONT_VIA3, l1, l2,0,0,NULL);
1045 (void)addphvia(figure, CONT_VIA4, l1, l2,0,0,NULL);
1046 (void)addphvia(figure, CONT_VIA5, l1, l2,0,0,NULL);
1047 } else if (!strcmp(t5, "via37")) {
1048 (void)addphvia(figure, CONT_VIA3, l1, l2,0,0,NULL);
1049 (void)addphvia(figure, CONT_VIA4, l1, l2,0,0,NULL);
1050 (void)addphvia(figure, CONT_VIA5, l1, l2,0,0,NULL);
1051 (void)addphvia(figure, CONT_VIA6, l1, l2,0,0,NULL);
1052 } else if (!strcmp(t5, "via38")) {
1053 (void)addphvia(figure, CONT_VIA3, l1, l2,0,0,NULL);
1054 (void)addphvia(figure, CONT_VIA4, l1, l2,0,0,NULL);
1055 (void)addphvia(figure, CONT_VIA5, l1, l2,0,0,NULL);
1056 (void)addphvia(figure, CONT_VIA6, l1, l2,0,0,NULL);
1057 (void)addphvia(figure, CONT_VIA7, l1, l2,0,0,NULL);
1058 } else if (!strcmp(t5, "via39")) {
1059 (void)addphvia(figure, CONT_VIA3, l1, l2,0,0,NULL);
1060 (void)addphvia(figure, CONT_VIA4, l1, l2,0,0,NULL);
1061 (void)addphvia(figure, CONT_VIA5, l1, l2,0,0,NULL);
1062 (void)addphvia(figure, CONT_VIA6, l1, l2,0,0,NULL);
1063 (void)addphvia(figure, CONT_VIA7, l1, l2,0,0,NULL);
1064 (void)addphvia(figure, CONT_VIA8, l1, l2,0,0,NULL);
1065 } else if (!strcmp(t5, "via45")) {
1066 (void)addphvia(figure, CONT_VIA4, l1, l2,0,0,NULL);
1067 } else if (!strcmp(t5, "via46")) {
1068 (void)addphvia(figure, CONT_VIA4, l1, l2,0,0,NULL);
1069 (void)addphvia(figure, CONT_VIA5, l1, l2,0,0,NULL);
1070 } else if (!strcmp(t5, "via47")) {
1071 (void)addphvia(figure, CONT_VIA4, l1, l2,0,0,NULL);
1072 (void)addphvia(figure, CONT_VIA5, l1, l2,0,0,NULL);
1073 (void)addphvia(figure, CONT_VIA6, l1, l2,0,0,NULL);
1074 } else if (!strcmp(t5, "via48")) {
1075 (void)addphvia(figure, CONT_VIA4, l1, l2,0,0,NULL);
1076 (void)addphvia(figure, CONT_VIA5, l1, l2,0,0,NULL);
1077 (void)addphvia(figure, CONT_VIA6, l1, l2,0,0,NULL);
1078 (void)addphvia(figure, CONT_VIA7, l1, l2,0,0,NULL);
1079 } else if (!strcmp(t5, "via49")) {
1080 (void)addphvia(figure, CONT_VIA4, l1, l2,0,0,NULL);
1081 (void)addphvia(figure, CONT_VIA5, l1, l2,0,0,NULL);
1082 (void)addphvia(figure, CONT_VIA6, l1, l2,0,0,NULL);
1083 (void)addphvia(figure, CONT_VIA7, l1, l2,0,0,NULL);
1084 (void)addphvia(figure, CONT_VIA8, l1, l2,0,0,NULL);
1085 } else if (!strcmp(t5, "via56")) {
1086 (void)addphvia(figure, CONT_VIA5, l1, l2,0,0,NULL);
1087 } else if (!strcmp(t5, "via57")) {
1088 (void)addphvia(figure, CONT_VIA5, l1, l2,0,0,NULL);
1089 (void)addphvia(figure, CONT_VIA6, l1, l2,0,0,NULL);
1090 } else if (!strcmp(t5, "via58")) {
1091 (void)addphvia(figure, CONT_VIA5, l1, l2,0,0,NULL);
1092 (void)addphvia(figure, CONT_VIA6, l1, l2,0,0,NULL);
1093 (void)addphvia(figure, CONT_VIA7, l1, l2,0,0,NULL);
1094 } else if (!strcmp(t5, "via59")) {
1095 (void)addphvia(figure, CONT_VIA5, l1, l2,0,0,NULL);
1096 (void)addphvia(figure, CONT_VIA6, l1, l2,0,0,NULL);
1097 (void)addphvia(figure, CONT_VIA7, l1, l2,0,0,NULL);
1098 (void)addphvia(figure, CONT_VIA8, l1, l2,0,0,NULL);
1099 } else if (!strcmp(t5, "via67")) {
1100 (void)addphvia(figure, CONT_VIA6, l1, l2,0,0,NULL);
1101 } else if (!strcmp(t5, "via68")) {
1102 (void)addphvia(figure, CONT_VIA6, l1, l2,0,0,NULL);
1103 (void)addphvia(figure, CONT_VIA7, l1, l2,0,0,NULL);
1104 } else if (!strcmp(t5, "via69")) {
1105 (void)addphvia(figure, CONT_VIA6, l1, l2,0,0,NULL);
1106 (void)addphvia(figure, CONT_VIA7, l1, l2,0,0,NULL);
1107 (void)addphvia(figure, CONT_VIA8, l1, l2,0,0,NULL);
1108 } else if (!strcmp(t5, "via78")) {
1109 (void)addphvia(figure, CONT_VIA7, l1, l2,0,0,NULL);
1110 } else if (!strcmp(t5, "via79")) {
1111 (void)addphvia(figure, CONT_VIA7, l1, l2,0,0,NULL);
1112 (void)addphvia(figure, CONT_VIA8, l1, l2,0,0,NULL);
1113 } else if (!strcmp(t5, "via89")) {
1114 (void)addphvia(figure, CONT_VIA8, l1, l2,0,0,NULL);
1115 } else if (!strcmp(t5, "turn1")) {
1116 (void)addphvia(figure, CONT_TURN1, l1, l2,0,0,NULL);
1117 } else if (!strcmp(t5, "turn2")) {
1118 (void)addphvia(figure, CONT_TURN2, l1, l2,0,0,NULL);
1119 } else if (!strcmp(t5, "turn3")) {
1120 (void)addphvia(figure, CONT_TURN3, l1, l2,0,0,NULL);
1121 } else if (!strcmp(t5, "turn4")) {
1122 (void)addphvia(figure, CONT_TURN4, l1, l2,0,0,NULL);
1123 } else if (!strcmp(t5, "turn5")) {
1124 (void)addphvia(figure, CONT_TURN5, l1, l2,0,0,NULL);
1125 } else if (!strcmp(t5, "turn6")) {
1126 (void)addphvia(figure, CONT_TURN6, l1, l2,0,0,NULL);
1127 } else if (!strcmp(t5, "turn7")) {
1128 (void)addphvia(figure, CONT_TURN7, l1, l2,0,0,NULL);
1129 } else if (!strcmp(t5, "turn8")) {
1130 (void)addphvia(figure, CONT_TURN8, l1, l2,0,0,NULL);
1131 } else if (!strcmp(t5, "turn9")) {
1132 (void)addphvia(figure, CONT_TURN9, l1, l2,0,0,NULL);
1133 }
1134 }
1135 }
1136 break;
1137 case 'J' : /* J num num name name */
1138 t1 = strtok(line + 2, " \n\t\"");
1139 (void)strcpy(s, t1);
1140 l1 = stol(s);
1141 t2 = strtok((char *)NULL, " \n\t\"");
1142 (void)strcpy(s, t2);
1143 l2 = stol(s);
1144 addpoint(l1, l2);
1145 break;
1146 case 'P' : /* P num num name name */
1147 t1 = strtok(line + 2, " \n\t\"");
1148 (void)strcpy(s, t1);
1149 l1 = stol(s);
1150 t2 = strtok((char *)NULL, " \n\t\"");
1151 (void)strcpy(s, t2);
1152 l2 = stol(s);
1153 addpoint(l1, l2);
1154 break;
1155 case 'S' :
1156 t1 = strtok(line + 2, " \n\t\"");
1157 (void)strcpy(s, t1);
1158 l1 = stol(s);
1159 t2 = strtok((char *)NULL, " \n\t\"");
1160 t3 = strtok((char *)NULL, " \n\t\"");
1161 t4 = strtok((char *)NULL, " \n\t\"");
1162 t5 = strtok((char *)NULL, " \n\t\"");
1163 t6 = strtok((char *)NULL, " \n\t\"");
1164 t7 = strtok((char *)NULL, " \n\t\"");
1165 t8 = strtok((char *)NULL, " \n\t\"");
1166 t9 = strtok((char *)NULL, " \n\t\"");
1167 {
1168 char layer = codelayer(t3);
1169 if (mode == 'A'
1170 || (mode == 'P' &&
1171 (
1172 layer == TALU1 || layer == TALU2 || layer == TALU3
1173 || layer == TALU4 || layer == TALU5 || layer == TALU6
1174 || layer == TALU7 || layer == TALU8 || layer == TALU9
1175 || layer == CALU1 || layer == CALU2 || layer == CALU3
1176 || layer == CALU4 || layer == CALU5 || layer == CALU6
1177 || layer == CALU7 || layer == CALU8 || layer == CALU9
1178 ))
1179 || (mode == 'C' &&
1180 ( layer != TALU1 && layer && TALU2 && layer != TALU3
1181 && layer != TALU4 && layer != TALU5 && layer != TALU6
1182 && layer != TALU7 && layer != TALU8 && layer != TALU9
1183 && layer != CALU1 && layer != CALU2 && layer != CALU3
1184 && layer != CALU4 && layer != CALU5 && layer != CALU6
1185 && layer != CALU7 && layer != CALU8 && layer != CALU9
1186 ))
1187 ) {
1188 switch (*t4) {
1189 case 'p' : /* S num name name P_REF num P_REF num */
1190 *t4 = 'P';
1191 case 'P' :
1192 switch (*t6) {
1193 case 'p' :
1194 *t6 = 'P';
1195 case 'P' :
1196 l2 = atol(t5);
1197 l3 = atol(t7);
1198 cppref(x1, y1, l2, i);
1199 cppref(x2, y2, l3, i);
1200 (void)vti_addphseg(figure, layer, l1, x1, y1,
1201 x2, y2, sname);
1202 break;
1203 case 'c' : /* S num name name P_REF num C_REF num */
1204 *t6 = 'C';
1205 case 'C' :
1206 l2 = atol(t5);
1207 l3 = atol(t7);
1208 cppref(x1, y1, l2, i);
1209 cpcref(x2, y2, l3, i);
1210 (void)vti_addphseg(figure, layer, l1,
1211 x1, y1, x2, y2, sname);
1212 break;
1213 case 'i' :/* S num name name P_REF num I_REF name num */
1214 *t6 = 'I';
1215 case 'I' :
1216 l2 = atol(t5);
1217 l3 = atol(t8);
1218 cppref(x1, y1, l2, i);
1219 cpiref(x2, y2, t7, l3, i);
1220 (void)vti_addphseg(figure, layer, l1, x1, y1,
1221 x2, y2, sname);
1222 break;
1223
1224 default :
1225 cp_error((int)REF_ERROR, fname, i, 0L);
1226 }
1227 break;
1228
1229 case 'c' : /* S num name name C_REF num P_REF num */
1230 *t4 = 'C';
1231 case 'C' :
1232 switch (*t6) {
1233 case 'p' :
1234 *t6 = 'P';
1235 case 'P' :
1236 l2 = atol(t5);
1237 l3 = atol(t7);
1238 cpcref(x1, y1, l2, i);
1239 cppref(x2, y2, l3, i);
1240 (void)vti_addphseg(figure, layer, (long)l1,
1241 x1, y1, x2, y2, sname);
1242 break;
1243 case 'c' : /* S num name name C_REF num C_REF num */
1244 *t6 = 'C';
1245 case 'C' :
1246 l2 = atol(t5);
1247 l3 = atol(t7);
1248 cpcref(x1, y1, l2, i);
1249 cpcref(x2, y2, l3, i);
1250 (void)vti_addphseg(figure, layer, l1,
1251 x1, y1, x2, y2, sname);
1252 break;
1253 case 'i' : /* S num name name C_REF num I_REF name num */
1254 *t6 = 'I';
1255 case 'I' :
1256 l2 = atol(t5);
1257 l3 = atol(t8);
1258 cpcref(x1, y1, l2, i);
1259 cpiref(x2, y2, t7, l3, i);
1260 (void)vti_addphseg(figure, layer, l1, x1, y1,
1261 x2, y2, sname);
1262 break;
1263 default :
1264 cp_error((int)REF_ERROR, fname, i, 0L);
1265 }
1266 break;
1267 case 'i' : /* S num name name I_REF name num P_REF num */
1268 *t4 = 'I';
1269 case 'I' :
1270 switch (*t7) {
1271 case 'p' :
1272 *t7 = 'P';
1273 case 'P' :
1274 l2 = atol(t6);
1275 l3 = atol(t8);
1276 cppref(x2, y2, l3, i);
1277 cpiref(x1, y1, t5, l2, i);
1278 (void)vti_addphseg(figure, layer, l1, x1, y1,
1279 x2, y2, sname);
1280 break;
1281 case 'c' : /* S num name name I_REF name num C_REF num */
1282 *t7 = 'C';
1283 case 'C' :
1284 l2 = atol(t6);
1285 l3 = atol(t8);
1286 cpcref(x2, y2, l3, i);
1287 cpiref(x1, y1, t5, l2, i);
1288 (void)vti_addphseg(figure, layer, l1, x1, y1,
1289 x2, y2, sname);
1290 break;
1291 case 'i' : /* S num name name I_REF name num I_REF name num */
1292 *t7 = 'I';
1293 case 'I' :
1294 l2 = atol(t6);
1295 l3 = atol(t9);
1296 cpiref(x1, y1, t5, l2, i);
1297 cpiref(x2, y2, t8, l3, i);
1298 (void)vti_addphseg(figure, layer, l1, x1, y1,
1299 x2, y2, sname);
1300 break;
1301 default:
1302 cp_error((int)REF_ERROR, fname, i, 0L);
1303 }
1304 break;
1305 default :
1306 cp_error((int)REF_ERROR, fname, i, 0L);
1307 }
1308 }
1309 }
1310 break;
1311 case 'V' : /* V num name num */
1312 break;
1313 case 'W' :
1314 t1 = strtok(line + 2, " \n\t\"");
1315 t2 = strtok((char *)NULL, " \n\t\"");
1316 t3 = strtok((char *)NULL, " \n\t\"");
1317 t4 = strtok((char *)NULL, " \n\t\"");
1318 t5 = strtok((char *)NULL, " \n\t\"");
1319 if (t5 != (char *)NULL) /* W num num num num name */
1320 sname = namealloc(checkname(t5));
1321 else /* W num num num num */
1322 sname = (char *)NULL;
1323 break;
1324 default :
1325 cp_error((int)SYNTAX_ERROR, fname, i, 0L);
1326 }
1327 }
1328 }
1329
1330 /*******************************************************************************
1331 * This is the only function to be accesible from outside *
1332 * Effective call the the cp parser *
1333 *******************************************************************************/
vtiloadphfig(ptfig,figname,mode)1334 void vtiloadphfig(ptfig, figname, mode)
1335 phfig_list *ptfig;
1336 char *figname;
1337 char mode;
1338 {
1339 FILE *in;
1340
1341 /* opening file */
1342 if ((in = mbkfopen(figname, IN_PH, READ_TEXT)) == (FILE *)NULL)
1343 cp_error((int)OPEN_ERROR, figname, 0, 0L);
1344
1345 if (TRACE_MODE == 'Y')
1346 (void)printf("\n--- mbk --- parsing file %s.%s in mode %c\n",
1347 figname, IN_PH, mode);
1348
1349 /* parsing */
1350 if (parse(ptfig, mode, in, figname))
1351 cp_error((int)PARSE_ERROR, figname, 0, 0L);
1352
1353 if (fclose(in))
1354 cp_error((int)CLOSE_ERROR, figname, 0, 0L);
1355
1356 strcpy(PARSER_INFO, "@(#)vti symbolic layout view parser version 3.06");
1357 }
1358