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