1 %{
2 /*
3  * PCB Edif parser based heavily on:
4  *
5  *	Header: edif.y,v 1.18 87/12/07 19:59:49 roger Locked
6  */
7 /************************************************************************
8  *									*
9  *				edif.y					*
10  *									*
11  *			EDIF 2.0.0 parser, Level 0			*
12  *									*
13  *	You are free to copy, distribute, use it, abuse it, make it	*
14  *	write bad tracks all over the disk ... or anything else.	*
15  *									*
16  *	Your friendly neighborhood Rogue Monster - roger@mips.com	*
17  *									*
18  ************************************************************************/
19 #include <stdio.h>
20 
21 /* for malloc, free, atoi */
22 #include <stdlib.h>
23 
24 /* for strcpy */
25 #include <string.h>
26 
27 #include <ctype.h>
28 
29 #include "global.h"
30 #include "data.h"
31 /* from mymem.h, not include because of the malloc junk */
32 LibraryMenuType * GetLibraryMenuMemory (LibraryType *);
33 LibraryEntryType * GetLibraryEntryMemory (LibraryMenuType *);
34 
35 /*
36  *	Local definitions.
37  */
38 #define	IDENT_LENGTH		255
39 #define	Malloc(s)		malloc(s)
40 #define	Free(p)			free(p)
41 #define	Getc(s)			getc(s)
42 #define	Ungetc(c)		ungetc(c,Input)
43 
44  typedef struct _str_pair
45  {
46      char* str1;
47      char* str2;
48      struct _str_pair* next;
49  } str_pair;
50 
51  typedef struct _pair_list
52  {
53      char* name;
54      str_pair* list;
55  } pair_list;
56 
new_str_pair(char * s1,char * s2)57  str_pair* new_str_pair(char* s1, char* s2)
58  {
59    str_pair* ps = (str_pair *)malloc(sizeof(str_pair));
60      ps->str1 = s1;
61      ps->str2 = s2;
62      ps->next = NULL;
63      return ps;
64  }
65 
new_pair_list(str_pair * ps)66  pair_list* new_pair_list(str_pair* ps)
67  {
68    pair_list* pl = (pair_list *)malloc(sizeof(pair_list));
69      pl->list = ps;
70      pl->name = NULL;
71      return pl;
72  }
73 
str_pair_free(str_pair * ps)74  void str_pair_free(str_pair* ps)
75  {
76      str_pair* node;
77      while ( ps )
78      {
79 	 free(ps->str1);
80 	 free(ps->str2);
81 	 node = ps;
82 	 ps = ps->next;
83 	 free(node);
84      }
85  }
86 
pair_list_free(pair_list * pl)87  void pair_list_free(pair_list* pl)
88  {
89      str_pair_free(pl->list);
90      free(pl->name);
91      free(pl);
92  }
93 
define_pcb_net(str_pair * name,pair_list * nodes)94  void define_pcb_net(str_pair* name, pair_list* nodes)
95  {
96      int tl;
97      str_pair* done_node;
98      str_pair* node;
99      char* buf;
100      char* p;
101      LibraryEntryType *entry;
102      LibraryMenuType *menu = GetLibraryMenuMemory (&PCB->NetlistLib);
103 
104      if ( !name->str1 )
105      {
106 	 /* no net name given, stop now */
107 	 /* if renamed str2 also exists and must be freed */
108 	 if ( name->str2 )  free(name->str2);
109 	 free(name);
110 	 pair_list_free(nodes);
111 	 return;
112      }
113      menu->Name = strdup (name->str1);
114      free(name->str1);
115      /* if renamed str2 also exists and must be freed */
116      if ( name->str2 )  free(name->str2);
117      free(name);
118      buf = (char *)malloc(256);
119      if ( !buf )
120      {
121 	 /* no memory */
122 	 pair_list_free(nodes);
123 	 return;
124      }
125 
126      node = nodes->list;
127      free(nodes->name);
128      free(nodes);
129      while ( node )
130      {
131 	 /* check for node with no instance */
132 	 if ( !node->str1 )
133 	 {
134 	     /* toss it and move on */
135 	     free(node->str2);
136 	     done_node = node;
137 	     node = node->next;
138 	     free(done_node);
139 	     continue;
140 	 }
141 	 tl = strlen(node->str1) + strlen(node->str2);
142 	 if ( tl + 3 > 256 )
143 	 {
144 	     free(buf);
145 	     buf = (char *)malloc(tl+3);
146 	     if ( !buf )
147 	     {
148 		 /* no memory */
149 		 str_pair_free(node);
150 		 return;
151 	     }
152 	 }
153 	 strcpy(buf,node->str1);
154 	 /* make all upper case, because of PCB funky behaviour */
155 	 p=buf;
156 	 while ( *p )
157 	 {
158 	     *p = toupper( (int) *p);
159 	     p++;
160 	 }
161 	 /* add dash separating designator from node */
162 	 *(buf+strlen(node->str1)) = '-';
163 	 /* check for the edif number prefix */
164 	 if ( node->str2[0] == '&' )
165 	 {
166 	     /* skip number prefix */
167 	     strcpy(buf+strlen(node->str1)+1,node->str2 +1);
168 	 }
169 	 else
170 	 {
171 	     strcpy(buf+strlen(node->str1)+1,node->str2);
172 	 }
173 	 /* free the strings */
174 	 free(node->str1);
175 	 free(node->str2);
176 	 entry = GetLibraryEntryMemory (menu);
177 	 entry->ListEntry = strdup(buf);
178 	 done_node = node;
179 	 node = node->next;
180 	 free(done_node);
181      }
182  }
183 
184 
185 /* forward function declarations */
186  static int yylex(void);
187  static void yyerror(const char *);
188  static void PopC(void);
189 %}
190 
191 %name-prefix "edif"
192 
193 %union {
194     char* s;
195     pair_list* pl;
196     str_pair* ps;
197 }
198 
199 %type <s> Int Ident Str Keyword Name _Name
200 %type <ps>  PortRef _PortRef NetNameDef NameDef
201 %type <ps> Rename _Joined
202 %type <s>__Rename _Rename NameRef
203 %type <s> InstanceRef InstNameRef Member PortNameRef
204 %type <pl> Net _Net Joined
205 
206 %token	<s>	EDIF_TOK_IDENT
207 %token	<s>	EDIF_TOK_INT
208 %token	<s>	EDIF_TOK_KEYWORD
209 %token	<s>	EDIF_TOK_STR
210 
211 %token		EDIF_TOK_ANGLE
212 %token		EDIF_TOK_BEHAVIOR
213 %token		EDIF_TOK_CALCULATED
214 %token		EDIF_TOK_CAPACITANCE
215 %token		EDIF_TOK_CENTERCENTER
216 %token		EDIF_TOK_CENTERLEFT
217 %token		EDIF_TOK_CENTERRIGHT
218 %token		EDIF_TOK_CHARGE
219 %token		EDIF_TOK_CONDUCTANCE
220 %token		EDIF_TOK_CURRENT
221 %token		EDIF_TOK_DISTANCE
222 %token		EDIF_TOK_DOCUMENT
223 %token		EDIF_TOK_ENERGY
224 %token		EDIF_TOK_EXTEND
225 %token		EDIF_TOK_FLUX
226 %token		EDIF_TOK_FREQUENCY
227 %token		EDIF_TOK_GENERIC
228 %token		EDIF_TOK_GRAPHIC
229 %token		EDIF_TOK_INDUCTANCE
230 %token		EDIF_TOK_INOUT
231 %token		EDIF_TOK_INPUT
232 %token		EDIF_TOK_LOGICMODEL
233 %token		EDIF_TOK_LOWERCENTER
234 %token		EDIF_TOK_LOWERLEFT
235 %token		EDIF_TOK_LOWERRIGHT
236 %token		EDIF_TOK_MASKLAYOUT
237 %token		EDIF_TOK_MASS
238 %token		EDIF_TOK_MEASURED
239 %token		EDIF_TOK_MX
240 %token		EDIF_TOK_MXR90
241 %token		EDIF_TOK_MY
242 %token		EDIF_TOK_MYR90
243 %token		EDIF_TOK_NETLIST
244 %token		EDIF_TOK_OUTPUT
245 %token		EDIF_TOK_PCBLAYOUT
246 %token		EDIF_TOK_POWER
247 %token		EDIF_TOK_R0
248 %token		EDIF_TOK_R180
249 %token		EDIF_TOK_R270
250 %token		EDIF_TOK_R90
251 %token		EDIF_TOK_REQUIRED
252 %token		EDIF_TOK_RESISTANCE
253 %token		EDIF_TOK_RIPPER
254 %token		EDIF_TOK_ROUND
255 %token		EDIF_TOK_SCHEMATIC
256 %token		EDIF_TOK_STRANGER
257 %token		EDIF_TOK_SYMBOLIC
258 %token		EDIF_TOK_TEMPERATURE
259 %token		EDIF_TOK_TIE
260 %token		EDIF_TOK_TIME
261 %token		EDIF_TOK_TRUNCATE
262 %token		EDIF_TOK_UPPERCENTER
263 %token		EDIF_TOK_UPPERLEFT
264 %token		EDIF_TOK_UPPERRIGHT
265 %token		EDIF_TOK_VOLTAGE
266 
267 %token		EDIF_TOK_ACLOAD
268 %token		EDIF_TOK_AFTER
269 %token		EDIF_TOK_ANNOTATE
270 %token		EDIF_TOK_APPLY
271 %token		EDIF_TOK_ARC
272 %token		EDIF_TOK_ARRAY
273 %token		EDIF_TOK_ARRAYMACRO
274 %token		EDIF_TOK_ARRAYRELATEDINFO
275 %token		EDIF_TOK_ARRAYSITE
276 %token		EDIF_TOK_ATLEAST
277 %token		EDIF_TOK_ATMOST
278 %token		EDIF_TOK_AUTHOR
279 %token		EDIF_TOK_BASEARRAY
280 %token		EDIF_TOK_BECOMES
281 %token		EDIF_TOK_BETWEEN
282 %token		EDIF_TOK_BOOLEAN
283 %token		EDIF_TOK_BOOLEANDISPLAY
284 %token		EDIF_TOK_BOOLEANMAP
285 %token		EDIF_TOK_BORDERPATTERN
286 %token		EDIF_TOK_BORDERWIDTH
287 %token		EDIF_TOK_BOUNDINGBOX
288 %token		EDIF_TOK_CELL
289 %token		EDIF_TOK_CELLREF
290 %token		EDIF_TOK_CELLTYPE
291 %token		EDIF_TOK_CHANGE
292 %token		EDIF_TOK_CIRCLE
293 %token		EDIF_TOK_COLOR
294 %token		EDIF_TOK_COMMENT
295 %token		EDIF_TOK_COMMENTGRAPHICS
296 %token		EDIF_TOK_COMPOUND
297 %token		EDIF_TOK_CONNECTLOCATION
298 %token		EDIF_TOK_CONTENTS
299 %token		EDIF_TOK_CORNERTYPE
300 %token		EDIF_TOK_CRITICALITY
301 %token		EDIF_TOK_CURRENTMAP
302 %token		EDIF_TOK_CURVE
303 %token		EDIF_TOK_CYCLE
304 %token		EDIF_TOK_DATAORIGIN
305 %token		EDIF_TOK_DCFANINLOAD
306 %token		EDIF_TOK_DCFANOUTLOAD
307 %token		EDIF_TOK_DCMAXFANIN
308 %token		EDIF_TOK_DCMAXFANOUT
309 %token		EDIF_TOK_DELAY
310 %token		EDIF_TOK_DELTA
311 %token		EDIF_TOK_DERIVATION
312 %token		EDIF_TOK_DESIGN
313 %token		EDIF_TOK_DESIGNATOR
314 %token		EDIF_TOK_DIFFERENCE
315 %token		EDIF_TOK_DIRECTION
316 %token		EDIF_TOK_DISPLAY
317 %token		EDIF_TOK_DOMINATES
318 %token		EDIF_TOK_DOT
319 %token		EDIF_TOK_DURATION
320 %token		EDIF_TOK_E
321 %token		EDIF_TOK_EDIF
322 %token		EDIF_TOK_EDIFLEVEL
323 %token		EDIF_TOK_EDIFVERSION
324 %token		EDIF_TOK_ENCLOSUREDISTANCE
325 %token		EDIF_TOK_ENDTYPE
326 %token		EDIF_TOK_ENTRY
327 %token		EDIF_TOK_EVENT
328 %token		EDIF_TOK_EXACTLY
329 %token		EDIF_TOK_EXTERNAL
330 %token		EDIF_TOK_FABRICATE
331 %token		EDIF_TOK_FALSE
332 %token		EDIF_TOK_FIGURE
333 %token		EDIF_TOK_FIGUREAREA
334 %token		EDIF_TOK_FIGUREGROUP
335 %token		EDIF_TOK_FIGUREGROUPOBJECT
336 %token		EDIF_TOK_FIGUREGROUPOVERRIDE
337 %token		EDIF_TOK_FIGUREGROUPREF
338 %token		EDIF_TOK_FIGUREPERIMETER
339 %token		EDIF_TOK_FIGUREWIDTH
340 %token		EDIF_TOK_FILLPATTERN
341 %token		EDIF_TOK_FOLLOW
342 %token		EDIF_TOK_FORBIDDENEVENT
343 %token		EDIF_TOK_GLOBALPORTREF
344 %token		EDIF_TOK_GREATERTHAN
345 %token		EDIF_TOK_GRIDMAP
346 %token		EDIF_TOK_IGNORE
347 %token		EDIF_TOK_INCLUDEFIGUREGROUP
348 %token		EDIF_TOK_INITIAL
349 %token		EDIF_TOK_INSTANCE
350 %token		EDIF_TOK_INSTANCEBACKANNOTATE
351 %token		EDIF_TOK_INSTANCEGROUP
352 %token		EDIF_TOK_INSTANCEMAP
353 %token		EDIF_TOK_INSTANCEREF
354 %token		EDIF_TOK_INTEGER
355 %token		EDIF_TOK_INTEGERDISPLAY
356 %token		EDIF_TOK_INTERFACE
357 %token		EDIF_TOK_INTERFIGUREGROUPSPACING
358 %token		EDIF_TOK_INTERSECTION
359 %token		EDIF_TOK_INTRAFIGUREGROUPSPACING
360 %token		EDIF_TOK_INVERSE
361 %token		EDIF_TOK_ISOLATED
362 %token		EDIF_TOK_JOINED
363 %token		EDIF_TOK_JUSTIFY
364 %token		EDIF_TOK_KEYWORDDISPLAY
365 %token		EDIF_TOK_KEYWORDLEVEL
366 %token		EDIF_TOK_KEYWORDMAP
367 %token		EDIF_TOK_LESSTHAN
368 %token		EDIF_TOK_LIBRARY
369 %token		EDIF_TOK_LIBRARYREF
370 %token		EDIF_TOK_LISTOFNETS
371 %token		EDIF_TOK_LISTOFPORTS
372 %token		EDIF_TOK_LOADDELAY
373 %token		EDIF_TOK_LOGICASSIGN
374 %token		EDIF_TOK_LOGICINPUT
375 %token		EDIF_TOK_LOGICLIST
376 %token		EDIF_TOK_LOGICMAPINPUT
377 %token		EDIF_TOK_LOGICMAPOUTPUT
378 %token		EDIF_TOK_LOGICONEOF
379 %token		EDIF_TOK_LOGICOUTPUT
380 %token		EDIF_TOK_LOGICPORT
381 %token		EDIF_TOK_LOGICREF
382 %token		EDIF_TOK_LOGICVALUE
383 %token		EDIF_TOK_LOGICWAVEFORM
384 %token		EDIF_TOK_MAINTAIN
385 %token		EDIF_TOK_MATCH
386 %token		EDIF_TOK_MEMBER
387 %token		EDIF_TOK_MINOMAX
388 %token		EDIF_TOK_MINOMAXDISPLAY
389 %token		EDIF_TOK_MNM
390 %token		EDIF_TOK_MULTIPLEVALUESET
391 %token		EDIF_TOK_MUSTJOIN
392 %token		EDIF_TOK_NAME
393 %token		EDIF_TOK_NET
394 %token		EDIF_TOK_NETBACKANNOTATE
395 %token		EDIF_TOK_NETBUNDLE
396 %token		EDIF_TOK_NETDELAY
397 %token		EDIF_TOK_NETGROUP
398 %token		EDIF_TOK_NETMAP
399 %token		EDIF_TOK_NETREF
400 %token		EDIF_TOK_NOCHANGE
401 %token		EDIF_TOK_NONPERMUTABLE
402 %token		EDIF_TOK_NOTALLOWED
403 %token		EDIF_TOK_NOTCHSPACING
404 %token		EDIF_TOK_NUMBER
405 %token		EDIF_TOK_NUMBERDEFINITION
406 %token		EDIF_TOK_NUMBERDISPLAY
407 %token		EDIF_TOK_OFFPAGECONNECTOR
408 %token		EDIF_TOK_OFFSETEVENT
409 %token		EDIF_TOK_OPENSHAPE
410 %token		EDIF_TOK_ORIENTATION
411 %token		EDIF_TOK_ORIGIN
412 %token		EDIF_TOK_OVERHANGDISTANCE
413 %token		EDIF_TOK_OVERLAPDISTANCE
414 %token		EDIF_TOK_OVERSIZE
415 %token		EDIF_TOK_OWNER
416 %token		EDIF_TOK_PAGE
417 %token		EDIF_TOK_PAGESIZE
418 %token		EDIF_TOK_PARAMETER
419 %token		EDIF_TOK_PARAMETERASSIGN
420 %token		EDIF_TOK_PARAMETERDISPLAY
421 %token		EDIF_TOK_PATH
422 %token		EDIF_TOK_PATHDELAY
423 %token		EDIF_TOK_PATHWIDTH
424 %token		EDIF_TOK_PERMUTABLE
425 %token		EDIF_TOK_PHYSICALDESIGNRULE
426 %token		EDIF_TOK_PLUG
427 %token		EDIF_TOK_POINT
428 %token		EDIF_TOK_POINTDISPLAY
429 %token		EDIF_TOK_POINTLIST
430 %token		EDIF_TOK_POLYGON
431 %token		EDIF_TOK_PORT
432 %token		EDIF_TOK_PORTBACKANNOTATE
433 %token		EDIF_TOK_PORTBUNDLE
434 %token		EDIF_TOK_PORTDELAY
435 %token		EDIF_TOK_PORTGROUP
436 %token		EDIF_TOK_PORTIMPLEMENTATION
437 %token		EDIF_TOK_PORTINSTANCE
438 %token		EDIF_TOK_PORTLIST
439 %token		EDIF_TOK_PORTLISTALIAS
440 %token		EDIF_TOK_PORTMAP
441 %token		EDIF_TOK_PORTREF
442 %token		EDIF_TOK_PROGRAM
443 %token		EDIF_TOK_PROPERTY
444 %token		EDIF_TOK_PROPERTYDISPLAY
445 %token		EDIF_TOK_PROTECTIONFRAME
446 %token		EDIF_TOK_PT
447 %token		EDIF_TOK_RANGEVECTOR
448 %token		EDIF_TOK_RECTANGLE
449 %token		EDIF_TOK_RECTANGLESIZE
450 %token		EDIF_TOK_RENAME
451 %token		EDIF_TOK_RESOLVES
452 %token		EDIF_TOK_SCALE
453 %token		EDIF_TOK_SCALEX
454 %token		EDIF_TOK_SCALEY
455 %token		EDIF_TOK_SECTION
456 %token		EDIF_TOK_SHAPE
457 %token		EDIF_TOK_SIMULATE
458 %token		EDIF_TOK_SIMULATIONINFO
459 %token		EDIF_TOK_SINGLEVALUESET
460 %token		EDIF_TOK_SITE
461 %token		EDIF_TOK_SOCKET
462 %token		EDIF_TOK_SOCKETSET
463 %token		EDIF_TOK_STATUS
464 %token		EDIF_TOK_STEADY
465 %token		EDIF_TOK_STRING
466 %token		EDIF_TOK_STRINGDISPLAY
467 %token		EDIF_TOK_STRONG
468 %token		EDIF_TOK_SYMBOL
469 %token		EDIF_TOK_SYMMETRY
470 %token		EDIF_TOK_TABLE
471 %token		EDIF_TOK_TABLEDEFAULT
472 %token		EDIF_TOK_TECHNOLOGY
473 %token		EDIF_TOK_TEXTHEIGHT
474 %token		EDIF_TOK_TIMEINTERVAL
475 %token		EDIF_TOK_TIMESTAMP
476 %token		EDIF_TOK_TIMING
477 %token		EDIF_TOK_TRANSFORM
478 %token		EDIF_TOK_TRANSITION
479 %token		EDIF_TOK_TRIGGER
480 %token		EDIF_TOK_TRUE
481 %token		EDIF_TOK_UNCONSTRAINED
482 %token		EDIF_TOK_UNDEFINED
483 %token		EDIF_TOK_UNION
484 %token		EDIF_TOK_UNIT
485 %token		EDIF_TOK_UNUSED
486 %token		EDIF_TOK_USERDATA
487 %token		EDIF_TOK_VERSION
488 %token		EDIF_TOK_VIEW
489 %token		EDIF_TOK_VIEWLIST
490 %token		EDIF_TOK_VIEWMAP
491 %token		EDIF_TOK_VIEWREF
492 %token		EDIF_TOK_VIEWTYPE
493 %token		EDIF_TOK_VISIBLE
494 %token		EDIF_TOK_VOLTAGEMAP
495 %token		EDIF_TOK_WAVEVALUE
496 %token		EDIF_TOK_WEAK
497 %token		EDIF_TOK_WEAKJOINED
498 %token		EDIF_TOK_WHEN
499 %token		EDIF_TOK_WRITTEN
500 
501 %start	Edif
502 
503 %%
504 
505 PopC :		')' { PopC(); }
506      ;
507 
508 Edif :		EDIF_TOK_EDIF EdifFileName EdifVersion EdifLevel KeywordMap _Edif PopC
509      ;
510 
511 _Edif :
512       |		_Edif Status
513       |		_Edif External
514       |		_Edif Library
515       |		_Edif Design
516       |		_Edif Comment
517       |		_Edif UserData
518       ;
519 
520 EdifFileName :	NameDef { str_pair_free($1); }
521 	     ;
522 
523 EdifLevel :	EDIF_TOK_EDIFLEVEL Int PopC { free($2); }
524 	  ;
525 
526 EdifVersion :	EDIF_TOK_EDIFVERSION Int Int Int PopC
527 { free($2); free($3); free($4); }
528 	    ;
529 
530 AcLoad :	EDIF_TOK_ACLOAD _AcLoad PopC
531        ;
532 
533 _AcLoad :	MiNoMaValue
534 	|	MiNoMaDisp
535 	;
536 
537 After :		EDIF_TOK_AFTER _After PopC
538       ;
539 
540 _After :	MiNoMaValue
541        |	_After Follow
542        |	_After Maintain
543        |	_After LogicAssn
544        |	_After Comment
545        |	_After UserData
546        ;
547 
548 Annotate :	EDIF_TOK_ANNOTATE _Annotate PopC
549 	 ;
550 
551 _Annotate :	Str { free($1); }
552 	  |	StrDisplay
553 	  ;
554 
555 Apply :		EDIF_TOK_APPLY _Apply PopC
556       ;
557 
558 _Apply :	Cycle
559        |	_Apply LogicIn
560        |	_Apply LogicOut
561        |	_Apply Comment
562        |	_Apply UserData
563        ;
564 
565 Arc :		EDIF_TOK_ARC PointValue PointValue PointValue PopC
566     ;
567 
568 Array :		EDIF_TOK_ARRAY NameDef Int _Array PopC { str_pair_free($2); free($3); }
569       ;
570 
571 _Array :
572        |	Int { free($1); }
573        ;
574 
575 ArrayMacro :	EDIF_TOK_ARRAYMACRO Plug PopC
576 	   ;
577 
578 ArrayRelInfo :	EDIF_TOK_ARRAYRELATEDINFO _ArrayRelInfo PopC
579 	     ;
580 
581 _ArrayRelInfo :	BaseArray
582 	      |	ArraySite
583 	      |	ArrayMacro
584 	      |	_ArrayRelInfo Comment
585 	      |	_ArrayRelInfo UserData
586 	      ;
587 
588 ArraySite :	EDIF_TOK_ARRAYSITE Socket PopC
589 	  ;
590 
591 AtLeast :	EDIF_TOK_ATLEAST ScaledInt PopC
592 	;
593 
594 AtMost :	EDIF_TOK_ATMOST ScaledInt PopC
595        ;
596 
597 Author :	EDIF_TOK_AUTHOR Str PopC { free($2); }
598        ;
599 
600 BaseArray :	EDIF_TOK_BASEARRAY PopC
601 	  ;
602 
603 Becomes :	EDIF_TOK_BECOMES _Becomes PopC
604 	;
605 
606 _Becomes :	LogicNameRef
607 	 |	LogicList
608 	 |	LogicOneOf
609 	 ;
610 
611 Between :	EDIF_TOK_BETWEEN __Between _Between PopC
612 	;
613 
614 __Between :	AtLeast
615 	  |	GreaterThan
616 	  ;
617 
618 _Between :	AtMost
619 	 |	LessThan
620 	 ;
621 
622 Boolean :	EDIF_TOK_BOOLEAN _Boolean PopC
623 	;
624 
625 _Boolean :
626 	 |	_Boolean BooleanValue
627 	 |	_Boolean BooleanDisp
628 	 |	_Boolean Boolean
629 	 ;
630 
631 BooleanDisp :	EDIF_TOK_BOOLEANDISPLAY _BooleanDisp PopC
632 	    ;
633 
634 _BooleanDisp :	BooleanValue
635 	     |	_BooleanDisp Display
636 	     ;
637 
638 BooleanMap :	EDIF_TOK_BOOLEANMAP BooleanValue PopC
639 	   ;
640 
641 BooleanValue :	True
642 	     |	False
643 	     ;
644 
645 BorderPat :	EDIF_TOK_BORDERPATTERN Int Int Boolean PopC { free($2); free($3); }
646 	  ;
647 
648 BorderWidth :	EDIF_TOK_BORDERWIDTH Int PopC { free($2); }
649 	    ;
650 
651 BoundBox :	EDIF_TOK_BOUNDINGBOX Rectangle PopC
652 	 ;
653 
654 Cell :		EDIF_TOK_CELL CellNameDef _Cell PopC
655      ;
656 
657 _Cell :		CellType
658       |		_Cell Status
659       |		_Cell ViewMap
660       |		_Cell View
661       |		_Cell Comment
662       |		_Cell UserData
663       |		_Cell Property
664       ;
665 
666 CellNameDef :	NameDef { str_pair_free($1); }
667 	    ;
668 
669 CellRef :	EDIF_TOK_CELLREF CellNameRef _CellRef PopC
670 	;
671 
672 _CellRef :
673 	 |	LibraryRef
674 	 ;
675 
676 CellNameRef :	NameRef { free($1); }
677 	    ;
678 
679 CellType :	EDIF_TOK_CELLTYPE _CellType PopC
680 	 ;
681 
682 _CellType :	EDIF_TOK_TIE
683 	  |	EDIF_TOK_RIPPER
684 	  |	EDIF_TOK_GENERIC
685 	  ;
686 
687 Change :	EDIF_TOK_CHANGE __Change _Change PopC
688        ;
689 
690 __Change :	PortNameRef
691 	 |	PortRef { str_pair_free($1); }
692 	 |	PortList
693 	 ;
694 
695 _Change :
696 	|	Becomes
697 	|	Transition
698 	;
699 
700 Circle :	EDIF_TOK_CIRCLE PointValue PointValue _Circle PopC
701        ;
702 
703 _Circle :
704 	|	_Circle Property
705 	;
706 
707 Color :		EDIF_TOK_COLOR ScaledInt ScaledInt ScaledInt PopC
708       ;
709 
710 Comment :	EDIF_TOK_COMMENT _Comment PopC
711 	;
712 
713 _Comment :
714 	 |	_Comment Str { free($2); }
715 	 ;
716 
717 CommGraph :	EDIF_TOK_COMMENTGRAPHICS _CommGraph PopC
718           ;
719 
720 _CommGraph :
721 	   |	_CommGraph Annotate
722 	   |	_CommGraph Figure
723 	   |	_CommGraph Instance
724 	   |	_CommGraph BoundBox
725 	   |	_CommGraph Property
726 	   |	_CommGraph Comment
727 	   |	_CommGraph UserData
728 	   ;
729 
730 Compound :	EDIF_TOK_COMPOUND LogicNameRef PopC
731 	 ;
732 
733 Contents :	EDIF_TOK_CONTENTS _Contents PopC
734 	 ;
735 
736 _Contents :
737 	  |	_Contents Instance
738 	  |	_Contents OffPageConn
739 	  |	_Contents Figure
740 	  |	_Contents Section
741 	  |	_Contents Net
742 	  |	_Contents NetBundle
743 	  |	_Contents Page
744 	  |	_Contents CommGraph
745 	  |	_Contents PortImpl
746 	  |	_Contents Timing
747 	  |	_Contents Simulate
748 	  |	_Contents When
749 	  |	_Contents Follow
750 	  |	_Contents LogicPort
751 	  |	_Contents BoundBox
752 	  |	_Contents Comment
753 	  |	_Contents UserData
754 	  ;
755 
756 ConnectLoc :	EDIF_TOK_CONNECTLOCATION _ConnectLoc PopC
757 	   ;
758 
759 _ConnectLoc :
760 	    |	Figure
761 	    ;
762 
763 CornerType :	EDIF_TOK_CORNERTYPE _CornerType PopC
764 	   ;
765 
766 _CornerType :	EDIF_TOK_EXTEND
767 	    |	EDIF_TOK_ROUND
768 	    |	EDIF_TOK_TRUNCATE
769 	    ;
770 
771 Criticality :	EDIF_TOK_CRITICALITY _Criticality PopC
772 	    ;
773 
774 _Criticality :	Int { free($1); }
775 	     |	IntDisplay
776 	     ;
777 
778 CurrentMap :	EDIF_TOK_CURRENTMAP MiNoMaValue PopC
779 	   ;
780 
781 Curve :		EDIF_TOK_CURVE _Curve PopC
782       ;
783 
784 _Curve :
785        |	_Curve Arc
786        |	_Curve PointValue
787        ;
788 
789 Cycle :		EDIF_TOK_CYCLE Int _Cycle PopC { free($2); }
790       ;
791 
792 _Cycle :
793        |	Duration
794        ;
795 
796 DataOrigin :	EDIF_TOK_DATAORIGIN Str _DataOrigin PopC { free($2); }
797 	   ;
798 
799 _DataOrigin :
800 	    |	Version
801 	    ;
802 
803 DcFanInLoad :	EDIF_TOK_DCFANINLOAD _DcFanInLoad PopC
804 	    ;
805 
806 _DcFanInLoad :	ScaledInt
807 	     |	NumbDisplay
808 	     ;
809 
810 DcFanOutLoad :	EDIF_TOK_DCFANOUTLOAD _DcFanOutLoad PopC
811 	     ;
812 
813 _DcFanOutLoad :	ScaledInt
814 	      |	NumbDisplay
815 	      ;
816 
817 DcMaxFanIn :	EDIF_TOK_DCMAXFANIN _DcMaxFanIn PopC
818 	   ;
819 
820 _DcMaxFanIn :	ScaledInt
821 	    |	NumbDisplay
822 	    ;
823 
824 DcMaxFanOut :	EDIF_TOK_DCMAXFANOUT _DcMaxFanOut PopC
825 	    ;
826 
827 _DcMaxFanOut :	ScaledInt
828 	     |	NumbDisplay
829 	     ;
830 
831 Delay :		EDIF_TOK_DELAY _Delay PopC
832       ;
833 
834 _Delay :	MiNoMaValue
835        |	MiNoMaDisp
836        ;
837 
838 Delta :		EDIF_TOK_DELTA _Delta PopC
839       ;
840 
841 _Delta :
842        |	_Delta PointValue
843        ;
844 
845 Derivation :	EDIF_TOK_DERIVATION _Derivation PopC
846 	   ;
847 
848 _Derivation :	EDIF_TOK_CALCULATED
849 	    |	EDIF_TOK_MEASURED
850 	    |	EDIF_TOK_REQUIRED
851 	    ;
852 
853 Design :	EDIF_TOK_DESIGN DesignNameDef _Design PopC
854        ;
855 
856 _Design :	CellRef
857 	|	_Design Status
858 	|	_Design Comment
859 	|	_Design Property
860 	|	_Design UserData
861 	;
862 
863 Designator :	EDIF_TOK_DESIGNATOR _Designator PopC
864 	   ;
865 
866 _Designator :	Str { free($1); }
867 	    |	StrDisplay
868 	    ;
869 
870 DesignNameDef :	NameDef { str_pair_free($1); }
871 	      ;
872 
873 DesignRule :	EDIF_TOK_PHYSICALDESIGNRULE _DesignRule PopC
874 	   ;
875 
876 _DesignRule :
877 	    |	_DesignRule FigureWidth
878 	    |	_DesignRule FigureArea
879 	    |	_DesignRule RectSize
880 	    |	_DesignRule FigurePerim
881 	    |	_DesignRule OverlapDist
882 	    |	_DesignRule OverhngDist
883 	    |	_DesignRule EncloseDist
884 	    |	_DesignRule InterFigGrp
885 	    |	_DesignRule IntraFigGrp
886 	    |	_DesignRule NotchSpace
887 	    |	_DesignRule NotAllowed
888 	    |	_DesignRule FigGrp
889 	    |	_DesignRule Comment
890 	    |	_DesignRule UserData
891 	    ;
892 
893 Difference :	EDIF_TOK_DIFFERENCE _Difference PopC
894 	   ;
895 
896 _Difference :	FigGrpRef
897 	    |	FigureOp
898 	    |	_Difference FigGrpRef
899 	    |	_Difference FigureOp
900 	    ;
901 
902 Direction :	EDIF_TOK_DIRECTION _Direction PopC
903 	  ;
904 
905 _Direction :	EDIF_TOK_INOUT
906 	   |	EDIF_TOK_INPUT
907 	   |	EDIF_TOK_OUTPUT
908 	   ;
909 
910 Display :	EDIF_TOK_DISPLAY _Display _DisplayJust _DisplayOrien _DisplayOrg PopC
911 	;
912 
913 _Display :	FigGrpNameRef
914 	 |	FigGrpOver
915 	 ;
916 
917 _DisplayJust :
918 	     |	Justify
919 	     ;
920 
921 _DisplayOrien :
922 	      |	Orientation
923 	      ;
924 
925 _DisplayOrg :
926 	    |	Origin
927 	    ;
928 
929 Dominates :	EDIF_TOK_DOMINATES _Dominates PopC
930 	  ;
931 
932 _Dominates :
933 	   |	_Dominates LogicNameRef
934 	   ;
935 
936 Dot :		EDIF_TOK_DOT _Dot PopC
937     ;
938 
939 _Dot :		PointValue
940      |		_Dot Property
941      ;
942 
943 Duration :	EDIF_TOK_DURATION ScaledInt PopC
944 	 ;
945 
946 EncloseDist :	EDIF_TOK_ENCLOSUREDISTANCE RuleNameDef FigGrpObj FigGrpObj _EncloseDist
947 		PopC
948 	    ;
949 
950 _EncloseDist :	Range
951 	     |	SingleValSet
952 	     |	_EncloseDist Comment
953 	     |	_EncloseDist UserData
954 	     ;
955 
956 EndType :	EDIF_TOK_ENDTYPE _EndType PopC
957 	;
958 
959 _EndType :	EDIF_TOK_EXTEND
960 	 |	EDIF_TOK_ROUND
961 	 |	EDIF_TOK_TRUNCATE
962 	 ;
963 
964 Entry :		EDIF_TOK_ENTRY ___Entry __Entry _Entry
965 		PopC
966       ;
967 
968 ___Entry :	Match
969 	 |	Change
970 	 |	Steady
971 	 ;
972 
973 __Entry :	LogicRef
974 	|	PortRef { str_pair_free($1); }
975 	|	NoChange
976 	|	Table
977 	;
978 
979 _Entry :
980        |	Delay
981        |	LoadDelay
982        ;
983 
984 Event :		EDIF_TOK_EVENT _Event PopC
985       ;
986 
987 _Event :	PortRef { str_pair_free($1); }
988        |	PortList
989        |	PortGroup
990        |	NetRef
991        |	NetGroup
992        |	_Event Transition
993        |	_Event Becomes
994        ;
995 
996 Exactly :	EDIF_TOK_EXACTLY ScaledInt PopC
997 	;
998 
999 External :	EDIF_TOK_EXTERNAL LibNameDef EdifLevel _External PopC
1000 	 ;
1001 
1002 _External :	Technology
1003 	  |	_External Status
1004 	  |	_External Cell
1005 	  |	_External Comment
1006 	  |	_External UserData
1007 	  ;
1008 
1009 Fabricate :	EDIF_TOK_FABRICATE LayerNameDef FigGrpNameRef PopC
1010 	  ;
1011 
1012 False :		EDIF_TOK_FALSE PopC
1013       ;
1014 
1015 FigGrp :	EDIF_TOK_FIGUREGROUP _FigGrp PopC
1016        ;
1017 
1018 _FigGrp :	FigGrpNameDef
1019 	|	_FigGrp CornerType
1020 	|	_FigGrp EndType
1021 	|	_FigGrp PathWidth
1022 	|	_FigGrp BorderWidth
1023 	|	_FigGrp Color
1024 	|	_FigGrp FillPattern
1025 	|	_FigGrp BorderPat
1026 	|	_FigGrp TextHeight
1027 	|	_FigGrp Visible
1028 	|	_FigGrp Comment
1029 	|	_FigGrp Property
1030 	|	_FigGrp UserData
1031 	|	_FigGrp IncFigGrp
1032 	;
1033 
1034 FigGrpNameDef :	NameDef { str_pair_free($1); }
1035 	      ;
1036 
1037 FigGrpNameRef :	NameRef { free($1); }
1038 	      ;
1039 
1040 FigGrpObj :	EDIF_TOK_FIGUREGROUPOBJECT _FigGrpObj PopC
1041 	  ;
1042 
1043 _FigGrpObj :	FigGrpNameRef
1044 	   |	FigGrpRef
1045 	   |	FigureOp
1046 	   ;
1047 
1048 FigGrpOver :	EDIF_TOK_FIGUREGROUPOVERRIDE _FigGrpOver PopC
1049 	   ;
1050 
1051 _FigGrpOver :	FigGrpNameRef
1052 	    |	_FigGrpOver CornerType
1053 	    |	_FigGrpOver EndType
1054 	    |	_FigGrpOver PathWidth
1055 	    |	_FigGrpOver BorderWidth
1056 	    |	_FigGrpOver Color
1057 	    |	_FigGrpOver FillPattern
1058 	    |	_FigGrpOver BorderPat
1059 	    |	_FigGrpOver TextHeight
1060 	    |	_FigGrpOver Visible
1061 	    |	_FigGrpOver Comment
1062 	    |	_FigGrpOver Property
1063 	    |	_FigGrpOver UserData
1064 	    ;
1065 
1066 FigGrpRef :	EDIF_TOK_FIGUREGROUPREF FigGrpNameRef _FigGrpRef PopC
1067 	  ;
1068 
1069 _FigGrpRef :
1070 	   |	LibraryRef
1071 	   ;
1072 
1073 Figure :	EDIF_TOK_FIGURE _Figure PopC
1074        ;
1075 
1076 _Figure :	FigGrpNameDef
1077 	|	FigGrpOver
1078 	|	_Figure Circle
1079 	|	_Figure Dot
1080 	|	_Figure OpenShape
1081 	|	_Figure Path
1082 	|	_Figure Polygon
1083 	|	_Figure Rectangle
1084 	|	_Figure Shape
1085 	|	_Figure Comment
1086 	|	_Figure UserData
1087 	;
1088 
1089 FigureArea :	EDIF_TOK_FIGUREAREA RuleNameDef FigGrpObj _FigureArea PopC
1090 	   ;
1091 
1092 _FigureArea :	Range
1093 	    |	SingleValSet
1094 	    |	_FigureArea Comment
1095 	    |	_FigureArea UserData
1096 	    ;
1097 
1098 FigureOp :	Intersection
1099 	 |	Union
1100 	 |	Difference
1101 	 |	Inverse
1102 	 |	Oversize
1103 	 ;
1104 
1105 FigurePerim :	EDIF_TOK_FIGUREPERIMETER RuleNameDef FigGrpObj _FigurePerim PopC
1106 	    ;
1107 
1108 _FigurePerim :	Range
1109 	     |	SingleValSet
1110 	     |	_FigurePerim Comment
1111 	     |	_FigurePerim UserData
1112 	     ;
1113 
1114 FigureWidth :	EDIF_TOK_FIGUREWIDTH RuleNameDef FigGrpObj _FigureWidth PopC
1115 	    ;
1116 
1117 _FigureWidth :	Range
1118 	     |	SingleValSet
1119 	     |	_FigureWidth Comment
1120 	     |	_FigureWidth UserData
1121 	     ;
1122 
1123 FillPattern :	EDIF_TOK_FILLPATTERN Int Int Boolean PopC { free($2); free($3); }
1124 	    ;
1125 
1126 Follow :	EDIF_TOK_FOLLOW __Follow _Follow PopC
1127        ;
1128 
1129 __Follow :	PortNameRef
1130 	 |	PortRef { str_pair_free($1); }
1131 	 ;
1132 
1133 _Follow :	PortRef { str_pair_free($1); }
1134 	|	Table
1135 	|	_Follow Delay
1136 	|	_Follow LoadDelay
1137 	;
1138 
1139 Forbidden :	EDIF_TOK_FORBIDDENEVENT _Forbidden PopC
1140 	  ;
1141 
1142 _Forbidden :	TimeIntval
1143 	   |	_Forbidden Event
1144 	   ;
1145 
1146 Form :		Keyword _Form ')' { free($1); }
1147      ;
1148 
1149 _Form :
1150       |		_Form Int { free($2); }
1151       |		_Form Str { free($2); }
1152       |		_Form Ident { free($2); }
1153       |		_Form Form
1154       ;
1155 
1156 GlobPortRef :	EDIF_TOK_GLOBALPORTREF PortNameRef PopC
1157 	    ;
1158 
1159 GreaterThan :	EDIF_TOK_GREATERTHAN ScaledInt PopC
1160 	    ;
1161 
1162 GridMap :	EDIF_TOK_GRIDMAP ScaledInt ScaledInt PopC
1163 	;
1164 
1165 Ignore :	EDIF_TOK_IGNORE PopC
1166        ;
1167 
1168 IncFigGrp :	EDIF_TOK_INCLUDEFIGUREGROUP _IncFigGrp PopC
1169 	  ;
1170 
1171 _IncFigGrp :	FigGrpRef
1172 	   |	FigureOp
1173 	   ;
1174 
1175 Initial :	EDIF_TOK_INITIAL PopC
1176 	;
1177 
1178 Instance :	EDIF_TOK_INSTANCE InstNameDef _Instance PopC
1179 	 ;
1180 
1181 _Instance :	ViewRef
1182 	  |	ViewList
1183 	  |	_Instance Transform
1184 	  |	_Instance ParamAssign
1185 	  |	_Instance PortInst
1186 	  |	_Instance Timing
1187 	  |	_Instance Designator
1188 	  |	_Instance Property
1189 	  |	_Instance Comment
1190 	  |	_Instance UserData
1191 	  ;
1192 
1193 InstanceRef :	EDIF_TOK_INSTANCEREF InstNameRef _InstanceRef PopC { $$=$2; }
1194 	    ;
1195 
1196 _InstanceRef :
1197 |	InstanceRef { free($1); }
1198 	     |	ViewRef
1199 	     ;
1200 
1201 InstBackAn :	EDIF_TOK_INSTANCEBACKANNOTATE _InstBackAn PopC
1202 	   ;
1203 
1204 _InstBackAn :	InstanceRef { free($1); }
1205 	    |	_InstBackAn Designator
1206 	    |	_InstBackAn Timing
1207 	    |	_InstBackAn Property
1208 	    |	_InstBackAn Comment
1209 	    ;
1210 
1211 InstGroup :	EDIF_TOK_INSTANCEGROUP _InstGroup PopC
1212 	  ;
1213 
1214 _InstGroup :
1215 	   |	_InstGroup InstanceRef { free($2); }
1216 	   ;
1217 
1218 InstMap :	EDIF_TOK_INSTANCEMAP _InstMap PopC
1219 	;
1220 
1221 _InstMap :
1222 	 |	_InstMap InstanceRef { free($2); }
1223 	 |	_InstMap InstGroup
1224 	 |	_InstMap Comment
1225 	 |	_InstMap UserData
1226 	 ;
1227 
1228 InstNameDef :	NameDef { str_pair_free($1); }
1229 	    |	Array
1230 	    ;
1231 
1232 InstNameRef :	NameRef { $$=$1; }
1233 	    |	Member
1234 	    ;
1235 
1236 IntDisplay :	EDIF_TOK_INTEGERDISPLAY _IntDisplay PopC
1237 	   ;
1238 
1239 _IntDisplay :	Int { free($1); }
1240 	    |	_IntDisplay Display
1241 	    ;
1242 
1243 Integer :	EDIF_TOK_INTEGER _Integer PopC
1244 	;
1245 
1246 _Integer :
1247 	 |	_Integer Int { free($2); }
1248 	 |	_Integer IntDisplay
1249 	 |	_Integer Integer
1250 	 ;
1251 
1252 Interface :	EDIF_TOK_INTERFACE _Interface PopC
1253 	  ;
1254 
1255 _Interface :
1256 	   |	_Interface Port
1257 	   |	_Interface PortBundle
1258 	   |	_Interface Symbol
1259 	   |	_Interface ProtectFrame
1260 	   |	_Interface ArrayRelInfo
1261 	   |	_Interface Parameter
1262 	   |	_Interface Joined { pair_list_free($2); }
1263 	   |	_Interface MustJoin
1264 	   |	_Interface WeakJoined
1265 	   |	_Interface Permutable
1266 	   |	_Interface Timing
1267 	   |	_Interface Simulate
1268 	   |	_Interface Designator
1269 	   |	_Interface Property
1270 	   |	_Interface Comment
1271 	   |	_Interface UserData
1272 	   ;
1273 
1274 InterFigGrp :	EDIF_TOK_INTERFIGUREGROUPSPACING RuleNameDef FigGrpObj FigGrpObj
1275 		_InterFigGrp PopC
1276 	    ;
1277 
1278 _InterFigGrp :	Range
1279 	     |	SingleValSet
1280 	     |	_InterFigGrp Comment
1281 	     |	_InterFigGrp UserData
1282 	     ;
1283 
1284 Intersection :	EDIF_TOK_INTERSECTION _Intersection PopC
1285 	     ;
1286 
1287 _Intersection :	FigGrpRef
1288 	      |	FigureOp
1289 	      |	_Intersection FigGrpRef
1290 	      |	_Intersection FigureOp
1291 	      ;
1292 
1293 IntraFigGrp :	EDIF_TOK_INTRAFIGUREGROUPSPACING RuleNameDef FigGrpObj _IntraFigGrp PopC
1294 	    ;
1295 
1296 _IntraFigGrp :	Range
1297 	     |	SingleValSet
1298 	     |	_IntraFigGrp Comment
1299 	     |	_IntraFigGrp UserData
1300 	     ;
1301 
1302 Inverse :	EDIF_TOK_INVERSE _Inverse PopC
1303 	;
1304 
1305 _Inverse :	FigGrpRef
1306 	 |	FigureOp
1307 	 ;
1308 
1309 Isolated :	EDIF_TOK_ISOLATED PopC
1310 	 ;
1311 
1312 Joined :	EDIF_TOK_JOINED _Joined PopC { $$ = new_pair_list($2); }
1313        ;
1314 
1315 _Joined : { $$=NULL; }
1316 |	_Joined PortRef { $2->next = $1; $$ = $2; }
1317 	|	_Joined PortList
1318 	|	_Joined GlobPortRef
1319 	;
1320 
1321 Justify :	EDIF_TOK_JUSTIFY _Justify PopC
1322 	;
1323 
1324 _Justify :	EDIF_TOK_CENTERCENTER
1325 	 |	EDIF_TOK_CENTERLEFT
1326 	 |	EDIF_TOK_CENTERRIGHT
1327 	 |	EDIF_TOK_LOWERCENTER
1328 	 |	EDIF_TOK_LOWERLEFT
1329 	 |	EDIF_TOK_LOWERRIGHT
1330 	 |	EDIF_TOK_UPPERCENTER
1331 	 |	EDIF_TOK_UPPERLEFT
1332 	 |	EDIF_TOK_UPPERRIGHT
1333 	 ;
1334 
1335 KeywordDisp :	EDIF_TOK_KEYWORDDISPLAY _KeywordDisp PopC
1336 	    ;
1337 
1338 _KeywordDisp :	KeywordName
1339 	     |	_KeywordDisp Display
1340 	     ;
1341 
1342 KeywordLevel :	EDIF_TOK_KEYWORDLEVEL Int PopC { free($2); }
1343 	     ;
1344 
1345 KeywordMap :	EDIF_TOK_KEYWORDMAP _KeywordMap PopC
1346 	   ;
1347 
1348 _KeywordMap :	KeywordLevel
1349 	    |	_KeywordMap Comment
1350 	    ;
1351 
1352 KeywordName :	Ident { free($1); }
1353 	    ;
1354 
1355 LayerNameDef :	NameDef { str_pair_free($1); }
1356 	     ;
1357 
1358 LessThan :	EDIF_TOK_LESSTHAN ScaledInt PopC
1359 	 ;
1360 
1361 LibNameDef :	NameDef { str_pair_free($1); }
1362 	   ;
1363 
1364 LibNameRef :	NameRef { free($1); }
1365 	   ;
1366 
1367 Library :	EDIF_TOK_LIBRARY LibNameDef EdifLevel _Library PopC
1368 	;
1369 
1370 _Library :	Technology
1371 	 |	_Library Status
1372 	 |	_Library Cell
1373 	 |	_Library Comment
1374 	 |	_Library UserData
1375 	 ;
1376 
1377 LibraryRef :	EDIF_TOK_LIBRARYREF LibNameRef PopC
1378 	   ;
1379 
1380 ListOfNets :	EDIF_TOK_LISTOFNETS _ListOfNets PopC
1381 	   ;
1382 
1383 _ListOfNets :
1384 	    |	_ListOfNets Net
1385 	    ;
1386 
1387 ListOfPorts :	EDIF_TOK_LISTOFPORTS _ListOfPorts PopC
1388 	    ;
1389 
1390 _ListOfPorts :
1391 	     |	_ListOfPorts Port
1392 	     |	_ListOfPorts PortBundle
1393 	     ;
1394 
1395 LoadDelay :	EDIF_TOK_LOADDELAY _LoadDelay _LoadDelay PopC
1396 	  ;
1397 
1398 _LoadDelay :	MiNoMaValue
1399 	   |	MiNoMaDisp
1400 	   ;
1401 
1402 LogicAssn :	EDIF_TOK_LOGICASSIGN ___LogicAssn __LogicAssn _LogicAssn PopC
1403 	  ;
1404 
1405 ___LogicAssn :	PortNameRef
1406 	     |	PortRef { str_pair_free($1); }
1407 	     ;
1408 
1409 __LogicAssn :	PortRef { str_pair_free($1); }
1410 	    |	LogicRef
1411 	    |	Table
1412 	    ;
1413 
1414 _LogicAssn :
1415 	   |	Delay
1416 	   |	LoadDelay
1417 	   ;
1418 
1419 LogicIn :	EDIF_TOK_LOGICINPUT _LogicIn PopC
1420 	;
1421 
1422 _LogicIn :	PortList
1423 	 |	PortRef { str_pair_free($1); }
1424 	 |	PortNameRef
1425 	 |	_LogicIn LogicWave
1426 	 ;
1427 
1428 LogicList :	EDIF_TOK_LOGICLIST _LogicList PopC
1429 	  ;
1430 
1431 _LogicList :
1432 	   |	_LogicList LogicNameRef
1433 	   |	_LogicList LogicOneOf
1434 	   |	_LogicList Ignore
1435 	   ;
1436 
1437 LogicMapIn :	EDIF_TOK_LOGICMAPINPUT _LogicMapIn PopC
1438 	   ;
1439 
1440 _LogicMapIn :
1441 	    |	_LogicMapIn LogicNameRef
1442 	    ;
1443 
1444 LogicMapOut :	EDIF_TOK_LOGICMAPOUTPUT _LogicMapOut PopC
1445 	    ;
1446 
1447 _LogicMapOut :
1448 	     |	_LogicMapOut LogicNameRef
1449 	     ;
1450 
1451 LogicNameDef :	NameDef { str_pair_free($1); }
1452 	     ;
1453 
1454 LogicNameRef :	NameRef { free($1); }
1455 	     ;
1456 
1457 LogicOneOf :	EDIF_TOK_LOGICONEOF _LogicOneOf PopC
1458 	   ;
1459 
1460 _LogicOneOf :
1461 	    |	_LogicOneOf LogicNameRef
1462 	    |	_LogicOneOf LogicList
1463 	    ;
1464 
1465 LogicOut :	EDIF_TOK_LOGICOUTPUT _LogicOut PopC
1466 	 ;
1467 
1468 _LogicOut :	PortList
1469 	  |	PortRef { str_pair_free($1); }
1470 	  |	PortNameRef
1471 	  |	_LogicOut LogicWave
1472 	  ;
1473 
1474 LogicPort :	EDIF_TOK_LOGICPORT _LogicPort PopC
1475 	  ;
1476 
1477 _LogicPort :	PortNameDef
1478 	   |	_LogicPort Property
1479 	   |	_LogicPort Comment
1480 	   |	_LogicPort UserData
1481 	   ;
1482 
1483 LogicRef :	EDIF_TOK_LOGICREF LogicNameRef _LogicRef PopC
1484 	 ;
1485 
1486 _LogicRef :
1487 	  |	LibraryRef
1488 	  ;
1489 
1490 LogicValue :	EDIF_TOK_LOGICVALUE _LogicValue PopC
1491 	   ;
1492 
1493 _LogicValue :	LogicNameDef
1494 	    |	_LogicValue VoltageMap
1495 	    |	_LogicValue CurrentMap
1496 	    |	_LogicValue BooleanMap
1497 	    |	_LogicValue Compound
1498 	    |	_LogicValue Weak
1499 	    |	_LogicValue Strong
1500 	    |	_LogicValue Dominates
1501 	    |	_LogicValue LogicMapOut
1502 	    |	_LogicValue LogicMapIn
1503 	    |	_LogicValue Isolated
1504 	    |	_LogicValue Resolves
1505 	    |	_LogicValue Property
1506 	    |	_LogicValue Comment
1507 	    |	_LogicValue UserData
1508 	    ;
1509 
1510 LogicWave :	EDIF_TOK_LOGICWAVEFORM _LogicWave PopC
1511 	  ;
1512 
1513 _LogicWave :
1514 	   |	_LogicWave LogicNameRef
1515 	   |	_LogicWave LogicList
1516 	   |	_LogicWave LogicOneOf
1517 	   |	_LogicWave Ignore
1518 	   ;
1519 
1520 Maintain :	EDIF_TOK_MAINTAIN __Maintain _Maintain PopC
1521 	 ;
1522 
1523 __Maintain :	PortNameRef
1524 	   |	PortRef { str_pair_free($1); }
1525 	   ;
1526 
1527 _Maintain :
1528 	  |	Delay
1529 	  |	LoadDelay
1530 	  ;
1531 
1532 Match :		EDIF_TOK_MATCH __Match _Match PopC
1533       ;
1534 
1535 __Match :	PortNameRef
1536 	|	PortRef { str_pair_free($1); }
1537 	|	PortList
1538 	;
1539 
1540 _Match :	LogicNameRef
1541        |	LogicList
1542        |	LogicOneOf
1543        ;
1544 
1545 Member :	EDIF_TOK_MEMBER NameRef _Member PopC  { free($2); }
1546        ;
1547 
1548 _Member :	Int { free($1); }
1549 	|	_Member Int { free($2); }
1550 	;
1551 
1552 MiNoMa :	EDIF_TOK_MINOMAX _MiNoMa PopC
1553        ;
1554 
1555 _MiNoMa :
1556 	|	_MiNoMa MiNoMaValue
1557 	|	_MiNoMa MiNoMaDisp
1558 	|	_MiNoMa MiNoMa
1559 	;
1560 
1561 MiNoMaDisp :	EDIF_TOK_MINOMAXDISPLAY _MiNoMaDisp PopC
1562 	   ;
1563 
1564 _MiNoMaDisp :	MiNoMaValue
1565 	    |	_MiNoMaDisp Display
1566 	    ;
1567 
1568 MiNoMaValue :	Mnm
1569 	    |	ScaledInt
1570 	    ;
1571 
1572 Mnm :		EDIF_TOK_MNM _Mnm _Mnm _Mnm PopC
1573     ;
1574 
1575 _Mnm :		ScaledInt
1576      |		Undefined
1577      |		Unconstrained
1578      ;
1579 
1580 MultValSet :	EDIF_TOK_MULTIPLEVALUESET _MultValSet PopC
1581 	   ;
1582 
1583 _MultValSet :
1584 	    |	_MultValSet RangeVector
1585 	    ;
1586 
1587 MustJoin :	EDIF_TOK_MUSTJOIN _MustJoin PopC
1588 	 ;
1589 
1590 _MustJoin :
1591 	  |	_MustJoin PortRef { str_pair_free($2); }
1592 	  |	_MustJoin PortList
1593 	  |	_MustJoin WeakJoined
1594 	  |	_MustJoin Joined { pair_list_free($2); }
1595 	  ;
1596 
1597 Name :		EDIF_TOK_NAME _Name PopC { $$=$2; }
1598      ;
1599 
1600 _Name :		Ident { $$=$1; }
1601       |		_Name Display
1602       ;
1603 
1604 NameDef :	Ident { $$ = new_str_pair($1,NULL); }
1605 	|	Name { $$ = new_str_pair($1,NULL); }
1606 |	Rename { $$=$1; }
1607 	;
1608 
1609 NameRef :	Ident { $$=$1; }
1610 	|	Name { $$=$1; }
1611 	;
1612 
1613 Net :		EDIF_TOK_NET NetNameDef _Net PopC { define_pcb_net($2, $3); }
1614     ;
1615 
1616 _Net :		Joined { $$=$1; }
1617      |		_Net Criticality
1618      |		_Net NetDelay
1619      |		_Net Figure
1620      |		_Net Net
1621      |		_Net Instance
1622      |		_Net CommGraph
1623      |		_Net Property
1624      |		_Net Comment
1625      |		_Net UserData
1626      ;
1627 
1628 NetBackAn :	EDIF_TOK_NETBACKANNOTATE _NetBackAn PopC
1629 	  ;
1630 
1631 _NetBackAn :	NetRef
1632 	   |	_NetBackAn NetDelay
1633 	   |	_NetBackAn Criticality
1634 	   |	_NetBackAn Property
1635 	   |	_NetBackAn Comment
1636 	   ;
1637 
1638 NetBundle :	EDIF_TOK_NETBUNDLE NetNameDef _NetBundle PopC { str_pair_free($2); }
1639 	  ;
1640 
1641 _NetBundle :	ListOfNets
1642 	   |	_NetBundle Figure
1643 	   |	_NetBundle CommGraph
1644 	   |	_NetBundle Property
1645 	   |	_NetBundle Comment
1646 	   |	_NetBundle UserData
1647 	   ;
1648 
1649 NetDelay :	EDIF_TOK_NETDELAY Derivation _NetDelay PopC
1650 	 ;
1651 
1652 _NetDelay :	Delay
1653 	  |	_NetDelay Transition
1654 	  |	_NetDelay Becomes
1655 	  ;
1656 
1657 NetGroup :	EDIF_TOK_NETGROUP _NetGroup PopC
1658 	 ;
1659 
1660 _NetGroup :
1661 	  |	_NetGroup NetNameRef
1662 	  |	_NetGroup NetRef
1663 	  ;
1664 
1665 NetMap :	EDIF_TOK_NETMAP _NetMap PopC
1666        ;
1667 
1668 _NetMap :
1669 	|	_NetMap NetRef
1670 	|	_NetMap NetGroup
1671 	|	_NetMap Comment
1672 	|	_NetMap UserData
1673 	;
1674 
1675 NetNameDef :	NameDef { $$=$1; }
1676 |	Array { $$=NULL; }
1677 
1678 	   ;
1679 
1680 NetNameRef :	NameRef { free($1); }
1681 	   |	Member
1682 	   ;
1683 
1684 NetRef :	EDIF_TOK_NETREF NetNameRef _NetRef PopC
1685        ;
1686 
1687 _NetRef :
1688 	|	NetRef
1689 	|	InstanceRef { free($1); }
1690 	|	ViewRef
1691 	;
1692 
1693 NoChange :	EDIF_TOK_NOCHANGE PopC
1694 	 ;
1695 
1696 NonPermut :	EDIF_TOK_NONPERMUTABLE _NonPermut PopC
1697 	  ;
1698 
1699 _NonPermut :
1700 	   |	_NonPermut PortRef { str_pair_free($2); }
1701 	   |	_NonPermut Permutable
1702 	   ;
1703 
1704 NotAllowed :	EDIF_TOK_NOTALLOWED RuleNameDef _NotAllowed PopC
1705 	   ;
1706 
1707 _NotAllowed :	FigGrpObj
1708 	    |	_NotAllowed Comment
1709 	    |	_NotAllowed UserData
1710 	    ;
1711 
1712 NotchSpace :	EDIF_TOK_NOTCHSPACING RuleNameDef FigGrpObj _NotchSpace PopC
1713 	   ;
1714 
1715 _NotchSpace :	Range
1716 	    |	SingleValSet
1717 	    |	_NotchSpace Comment
1718 	    |	_NotchSpace UserData
1719 	    ;
1720 
1721 Number :	EDIF_TOK_NUMBER _Number PopC
1722        ;
1723 
1724 _Number :
1725 	|	_Number ScaledInt
1726 	|	_Number NumbDisplay
1727 	|	_Number Number
1728 	;
1729 
1730 NumbDisplay :	EDIF_TOK_NUMBERDISPLAY _NumbDisplay PopC
1731 	    ;
1732 
1733 _NumbDisplay :	ScaledInt
1734 	     |	_NumbDisplay Display
1735 	     ;
1736 
1737 NumberDefn :	EDIF_TOK_NUMBERDEFINITION _NumberDefn PopC
1738 	   ;
1739 
1740 _NumberDefn :
1741 	    |	_NumberDefn Scale
1742 	    |	_NumberDefn GridMap
1743 	    |	_NumberDefn Comment
1744 	    ;
1745 
1746 OffPageConn :	EDIF_TOK_OFFPAGECONNECTOR _OffPageConn PopC
1747 	    ;
1748 
1749 _OffPageConn :	PortNameDef
1750 	     |	_OffPageConn Unused
1751 	     |	_OffPageConn Property
1752 	     |	_OffPageConn Comment
1753 	     |	_OffPageConn UserData
1754 	     ;
1755 
1756 OffsetEvent :	EDIF_TOK_OFFSETEVENT Event ScaledInt PopC
1757 	    ;
1758 
1759 OpenShape :	EDIF_TOK_OPENSHAPE _OpenShape PopC
1760 	  ;
1761 
1762 _OpenShape :	Curve
1763 	   |	_OpenShape Property
1764 	   ;
1765 
1766 Orientation :	EDIF_TOK_ORIENTATION _Orientation PopC
1767 	    ;
1768 
1769 _Orientation :	EDIF_TOK_R0
1770 	     |	EDIF_TOK_R90
1771 	     |	EDIF_TOK_R180
1772 	     |	EDIF_TOK_R270
1773 	     |	EDIF_TOK_MX
1774 	     |	EDIF_TOK_MY
1775 	     |	EDIF_TOK_MYR90
1776 	     |	EDIF_TOK_MXR90
1777 	     ;
1778 
1779 Origin :	EDIF_TOK_ORIGIN PointValue PopC
1780        ;
1781 
1782 OverhngDist :	EDIF_TOK_OVERHANGDISTANCE RuleNameDef FigGrpObj FigGrpObj _OverhngDist
1783 		PopC
1784 	    ;
1785 
1786 _OverhngDist :	Range
1787 	     |	SingleValSet
1788 	     |	_OverhngDist Comment
1789 	     |	_OverhngDist UserData
1790 	     ;
1791 
1792 OverlapDist :	EDIF_TOK_OVERLAPDISTANCE RuleNameDef FigGrpObj FigGrpObj _OverlapDist
1793 		PopC
1794 	    ;
1795 
1796 _OverlapDist :	Range
1797 	     |	SingleValSet
1798 	     |	_OverlapDist Comment
1799 	     |	_OverlapDist UserData
1800 	     ;
1801 
1802 Oversize :	EDIF_TOK_OVERSIZE Int _Oversize CornerType PopC { free($2); }
1803 	 ;
1804 
1805 _Oversize :	FigGrpRef
1806 	  |	FigureOp
1807 	  ;
1808 
1809 Owner :		EDIF_TOK_OWNER Str PopC { free($2); }
1810       ;
1811 
1812 Page :		EDIF_TOK_PAGE _Page PopC
1813      ;
1814 
1815 _Page :		InstNameDef
1816       |		_Page Instance
1817       |		_Page Net
1818       |		_Page NetBundle
1819       |		_Page CommGraph
1820       |		_Page PortImpl
1821       |		_Page PageSize
1822       |		_Page BoundBox
1823       |		_Page Comment
1824       |		_Page UserData
1825       ;
1826 
1827 PageSize :	EDIF_TOK_PAGESIZE Rectangle PopC
1828 	 ;
1829 
1830 ParamDisp :	EDIF_TOK_PARAMETERDISPLAY _ParamDisp PopC
1831 	  ;
1832 
1833 _ParamDisp :	ValueNameRef
1834 	   |	_ParamDisp Display
1835 	   ;
1836 
1837 Parameter :	EDIF_TOK_PARAMETER ValueNameDef TypedValue _Parameter PopC
1838 	  ;
1839 
1840 _Parameter :
1841 	   |	Unit
1842 	   ;
1843 
1844 ParamAssign :	EDIF_TOK_PARAMETERASSIGN ValueNameRef TypedValue PopC
1845 	    ;
1846 
1847 Path :		EDIF_TOK_PATH _Path PopC
1848      ;
1849 
1850 _Path :		PointList
1851       |		_Path Property
1852       ;
1853 
1854 PathDelay :	EDIF_TOK_PATHDELAY _PathDelay PopC
1855 	  ;
1856 
1857 _PathDelay :	Delay
1858 	   |	_PathDelay Event
1859 	   ;
1860 
1861 PathWidth :	EDIF_TOK_PATHWIDTH Int PopC { free($2); }
1862 	  ;
1863 
1864 Permutable :	EDIF_TOK_PERMUTABLE _Permutable PopC
1865 	   ;
1866 
1867 _Permutable :
1868 	    |	_Permutable PortRef { str_pair_free($2); }
1869 	    |	_Permutable Permutable
1870 	    |	_Permutable NonPermut
1871 	    ;
1872 
1873 Plug :		EDIF_TOK_PLUG _Plug PopC
1874      ;
1875 
1876 _Plug :
1877       |		_Plug SocketSet
1878       ;
1879 
1880 Point :		EDIF_TOK_POINT _Point PopC
1881       ;
1882 
1883 _Point :
1884        |	_Point PointValue
1885        |	_Point PointDisp
1886        |	_Point Point
1887        ;
1888 
1889 PointDisp :	EDIF_TOK_POINTDISPLAY _PointDisp PopC
1890 	  ;
1891 
1892 _PointDisp :	PointValue
1893 	   |	_PointDisp Display
1894 	   ;
1895 
1896 PointList :	EDIF_TOK_POINTLIST _PointList PopC
1897 	  ;
1898 
1899 _PointList :
1900 	   |	_PointList PointValue
1901 	   ;
1902 
1903 PointValue : 	EDIF_TOK_PT Int Int PopC { free($2); free($3); }
1904 	   ;
1905 
1906 Polygon :	EDIF_TOK_POLYGON _Polygon PopC
1907 	;
1908 
1909 _Polygon :	PointList
1910 	 |	_Polygon Property
1911 	 ;
1912 
1913 Port :		EDIF_TOK_PORT _Port PopC
1914      ;
1915 
1916 _Port :		PortNameDef
1917       |		_Port Direction
1918       |		_Port Unused
1919       |		_Port PortDelay
1920       |		_Port Designator
1921       |		_Port DcFanInLoad
1922       |		_Port DcFanOutLoad
1923       |		_Port DcMaxFanIn
1924       |		_Port DcMaxFanOut
1925       |		_Port AcLoad
1926       |		_Port Property
1927       |		_Port Comment
1928       |		_Port UserData
1929       ;
1930 
1931 PortBackAn :	EDIF_TOK_PORTBACKANNOTATE _PortBackAn PopC
1932 	   ;
1933 
1934 _PortBackAn :	PortRef { str_pair_free($1); }
1935 	    |	_PortBackAn Designator
1936 	    |	_PortBackAn PortDelay
1937 	    |	_PortBackAn DcFanInLoad
1938 	    |	_PortBackAn DcFanOutLoad
1939 	    |	_PortBackAn DcMaxFanIn
1940 	    |	_PortBackAn DcMaxFanOut
1941 	    |	_PortBackAn AcLoad
1942 	    |	_PortBackAn Property
1943 	    |	_PortBackAn Comment
1944 	    ;
1945 
1946 PortBundle :	EDIF_TOK_PORTBUNDLE PortNameDef _PortBundle PopC
1947 	   ;
1948 
1949 _PortBundle :	ListOfPorts
1950 	    |	_PortBundle Property
1951 	    |	_PortBundle Comment
1952 	    |	_PortBundle UserData
1953 	    ;
1954 
1955 PortDelay :	EDIF_TOK_PORTDELAY Derivation _PortDelay PopC
1956 	  ;
1957 
1958 _PortDelay :	Delay
1959 	   |	LoadDelay
1960 	   |	_PortDelay Transition
1961 	   |	_PortDelay Becomes
1962 	   ;
1963 
1964 PortGroup :	EDIF_TOK_PORTGROUP _PortGroup PopC
1965 	  ;
1966 
1967 _PortGroup :
1968 	   |	_PortGroup PortNameRef
1969 	   |	_PortGroup PortRef { str_pair_free($2); }
1970 	   ;
1971 
1972 PortImpl :	EDIF_TOK_PORTIMPLEMENTATION _PortImpl PopC
1973 	 ;
1974 
1975 _PortImpl :	PortRef { str_pair_free($1); }
1976 	  |	PortNameRef
1977 	  |	_PortImpl ConnectLoc
1978 	  |	_PortImpl Figure
1979 	  |	_PortImpl Instance
1980 	  |	_PortImpl CommGraph
1981 	  |	_PortImpl PropDisplay
1982 	  |	_PortImpl KeywordDisp
1983 	  |	_PortImpl Property
1984 	  |	_PortImpl UserData
1985 	  |	_PortImpl Comment
1986 	  ;
1987 
1988 PortInst :	EDIF_TOK_PORTINSTANCE _PortInst PopC
1989 	 ;
1990 
1991 _PortInst :	PortRef { str_pair_free($1); }
1992 	  |	PortNameRef
1993 	  |	_PortInst Unused
1994 	  |	_PortInst PortDelay
1995 	  |	_PortInst Designator
1996 	  |	_PortInst DcFanInLoad
1997 	  |	_PortInst DcFanOutLoad
1998 	  |	_PortInst DcMaxFanIn
1999 	  |	_PortInst DcMaxFanOut
2000 	  |	_PortInst AcLoad
2001 	  |	_PortInst Property
2002 	  |	_PortInst Comment
2003 	  |	_PortInst UserData
2004 	  ;
2005 
2006 PortList :	EDIF_TOK_PORTLIST _PortList PopC
2007 	 ;
2008 
2009 _PortList :
2010 	  |	_PortList PortRef { str_pair_free($2); }
2011 	  |	_PortList PortNameRef
2012 	  ;
2013 
2014 PortListAls :	EDIF_TOK_PORTLISTALIAS PortNameDef PortList PopC
2015 	    ;
2016 
2017 PortMap :	EDIF_TOK_PORTMAP _PortMap PopC
2018 	;
2019 
2020 _PortMap :
2021 	 |	_PortMap PortRef { str_pair_free($2); }
2022 	 |	_PortMap PortGroup
2023 	 |	_PortMap Comment
2024 	 |	_PortMap UserData
2025 	 ;
2026 
2027 PortNameDef :	NameDef { str_pair_free($1); }
2028 	    |	Array
2029 	    ;
2030 
2031 PortNameRef :	NameRef { $$=$1; }
2032 	    |	Member
2033 	    ;
2034 
2035 PortRef :	EDIF_TOK_PORTREF PortNameRef _PortRef PopC
2036 {
2037     if ($3)
2038     {
2039 	$$ = new_str_pair($3->str1,$2);
2040 	free($3);
2041     }
2042     else
2043     {
2044 	/* handle port with no instance by passing up the chain */
2045 	$$ = new_str_pair(NULL,$2);
2046     }
2047 }
2048 	;
2049 
2050 _PortRef : { $$=NULL; }
2051 	 |	PortRef { $$=$1; }
2052 	 |	InstanceRef { $$ = new_str_pair($1,NULL); }
2053 	 |	ViewRef { $$=NULL; }
2054 	 ;
2055 
2056 Program :	EDIF_TOK_PROGRAM Str _Program PopC
2057 	;
2058 
2059 _Program :
2060 	 |	Version
2061 	 ;
2062 
2063 PropDisplay :	EDIF_TOK_PROPERTYDISPLAY _PropDisplay PopC
2064 	    ;
2065 
2066 _PropDisplay :	PropNameRef
2067 	     |	_PropDisplay Display
2068 	     ;
2069 
2070 Property :	EDIF_TOK_PROPERTY PropNameDef _Property PopC
2071 	 ;
2072 
2073 _Property :	TypedValue
2074 	  |	_Property Owner
2075 	  |	_Property Unit
2076 	  |	_Property Property
2077 	  |	_Property Comment
2078 	  ;
2079 
2080 PropNameDef :	NameDef { str_pair_free($1); }
2081 	    ;
2082 
2083 PropNameRef :	NameRef { free($1); }
2084 	    ;
2085 
2086 ProtectFrame :	EDIF_TOK_PROTECTIONFRAME _ProtectFrame PopC
2087 	     ;
2088 
2089 _ProtectFrame :
2090 	      |	_ProtectFrame PortImpl
2091 	      |	_ProtectFrame Figure
2092 	      |	_ProtectFrame Instance
2093 	      |	_ProtectFrame CommGraph
2094 	      |	_ProtectFrame BoundBox
2095 	      |	_ProtectFrame PropDisplay
2096 	      |	_ProtectFrame KeywordDisp
2097 	      |	_ProtectFrame ParamDisp
2098 	      |	_ProtectFrame Property
2099 	      |	_ProtectFrame Comment
2100 	      |	_ProtectFrame UserData
2101 	      ;
2102 
2103 Range :		LessThan
2104       |		GreaterThan
2105       |		AtMost
2106       |		AtLeast
2107       |		Exactly
2108       |		Between
2109       ;
2110 
2111 RangeVector :	EDIF_TOK_RANGEVECTOR _RangeVector PopC
2112 	    ;
2113 
2114 _RangeVector :
2115 	     |	_RangeVector Range
2116 	     |	_RangeVector SingleValSet
2117 	     ;
2118 
2119 Rectangle :	EDIF_TOK_RECTANGLE PointValue _Rectangle PopC
2120 	  ;
2121 
2122 _Rectangle :	PointValue
2123 	   |	_Rectangle Property
2124 	   ;
2125 
2126 RectSize :	EDIF_TOK_RECTANGLESIZE RuleNameDef FigGrpObj _RectSize PopC
2127 	 ;
2128 
2129 _RectSize :	RangeVector
2130 	  |	MultValSet
2131 	  |	_RectSize Comment
2132 	  |	_RectSize UserData
2133 	  ;
2134 
2135 Rename :	EDIF_TOK_RENAME __Rename _Rename PopC
2136 { $$ = new_str_pair($2,$3); }
2137        ;
2138 
2139 __Rename :	Ident { $$=$1; }
2140 	 |	Name { $$=$1; }
2141 	 ;
2142 
2143 _Rename :	Str { $$=$1; }
2144 	|	StrDisplay { $$=NULL; }
2145 	;
2146 
2147 Resolves :	EDIF_TOK_RESOLVES _Resolves PopC
2148 	 ;
2149 
2150 _Resolves :
2151 	  |	_Resolves LogicNameRef
2152 	  ;
2153 
2154 RuleNameDef :	NameDef { str_pair_free($1); }
2155 	    ;
2156 
2157 Scale :		EDIF_TOK_SCALE ScaledInt ScaledInt Unit PopC
2158       ;
2159 
2160 ScaledInt :	Int { free($1); }
2161 	  |	EDIF_TOK_E Int Int PopC { free($2); free($3); }
2162 	  ;
2163 
2164 ScaleX :	EDIF_TOK_SCALEX Int Int PopC { free($2); free($3); }
2165        ;
2166 
2167 ScaleY :	EDIF_TOK_SCALEY Int Int PopC { free($2); free($3); }
2168        ;
2169 
2170 Section :	EDIF_TOK_SECTION _Section PopC
2171 	;
2172 
2173 _Section :	Str { free($1); }
2174 	 |	_Section Section
2175 	 |	_Section Str { free($2); }
2176 	 |	_Section Instance
2177 	 ;
2178 
2179 Shape :		EDIF_TOK_SHAPE _Shape PopC
2180       ;
2181 
2182 _Shape :	Curve
2183        |	_Shape Property
2184        ;
2185 
2186 SimNameDef :	NameDef { str_pair_free($1); }
2187 	   ;
2188 
2189 Simulate :	EDIF_TOK_SIMULATE _Simulate PopC
2190 	 ;
2191 
2192 _Simulate :	SimNameDef
2193 	  |	_Simulate PortListAls
2194 	  |	_Simulate WaveValue
2195 	  |	_Simulate Apply
2196 	  |	_Simulate Comment
2197 	  |	_Simulate UserData
2198 	  ;
2199 
2200 SimulInfo :	EDIF_TOK_SIMULATIONINFO _SimulInfo PopC
2201 	  ;
2202 
2203 _SimulInfo :
2204 	   |	_SimulInfo LogicValue
2205 	   |	_SimulInfo Comment
2206 	   |	_SimulInfo UserData
2207 	   ;
2208 
2209 SingleValSet :	EDIF_TOK_SINGLEVALUESET _SingleValSet PopC
2210 	     ;
2211 
2212 _SingleValSet :
2213 	      |	Range
2214 	      ;
2215 
2216 Site :		EDIF_TOK_SITE ViewRef _Site PopC
2217      ;
2218 
2219 _Site :
2220       |		Transform
2221       ;
2222 
2223 Socket :	EDIF_TOK_SOCKET _Socket PopC
2224        ;
2225 
2226 _Socket :
2227 	|	Symmetry
2228 	;
2229 
2230 SocketSet :	EDIF_TOK_SOCKETSET _SocketSet PopC
2231 	  ;
2232 
2233 _SocketSet :	Symmetry
2234 	   |	_SocketSet Site
2235 	   ;
2236 
2237 Status :	EDIF_TOK_STATUS _Status PopC
2238        ;
2239 
2240 _Status :
2241 	|	_Status Written
2242 	|	_Status Comment
2243 	|	_Status UserData
2244 	;
2245 
2246 Steady :	EDIF_TOK_STEADY __Steady _Steady PopC
2247        ;
2248 
2249 __Steady :	PortNameRef
2250 	 |	PortRef { str_pair_free($1); }
2251 	 |	PortList
2252 	 ;
2253 
2254 _Steady :	Duration
2255 	|	_Steady Transition
2256 	|	_Steady Becomes
2257 	;
2258 
2259 StrDisplay :	EDIF_TOK_STRINGDISPLAY _StrDisplay PopC
2260 	   ;
2261 
2262 String :	EDIF_TOK_STRING _String PopC
2263        ;
2264 
2265 _String :
2266 	|	_String Str { free($2); }
2267 	|	_String StrDisplay
2268 	|	_String String
2269 	;
2270 
2271 _StrDisplay :	Str { free($1); }
2272 	    |	_StrDisplay Display
2273 	    ;
2274 
2275 Strong :	EDIF_TOK_STRONG LogicNameRef PopC
2276        ;
2277 
2278 Symbol :	EDIF_TOK_SYMBOL _Symbol PopC
2279        ;
2280 
2281 _Symbol :
2282 	|	_Symbol PortImpl
2283 	|	_Symbol Figure
2284 	|	_Symbol Instance
2285 	|	_Symbol CommGraph
2286 	|	_Symbol Annotate
2287 	|	_Symbol PageSize
2288 	|	_Symbol BoundBox
2289 	|	_Symbol PropDisplay
2290 	|	_Symbol KeywordDisp
2291 	|	_Symbol ParamDisp
2292 	|	_Symbol Property
2293 	|	_Symbol Comment
2294 	|	_Symbol UserData
2295 	;
2296 
2297 Symmetry :	EDIF_TOK_SYMMETRY _Symmetry PopC
2298 	 ;
2299 
2300 _Symmetry :
2301 	  |	_Symmetry Transform
2302 	  ;
2303 
2304 Table :		EDIF_TOK_TABLE _Table PopC
2305       ;
2306 
2307 _Table :
2308        |	_Table Entry
2309        |	_Table TableDeflt
2310        ;
2311 
2312 TableDeflt :	EDIF_TOK_TABLEDEFAULT __TableDeflt _TableDeflt PopC
2313 	   ;
2314 
2315 __TableDeflt :	LogicRef
2316 	     |	PortRef { str_pair_free($1); }
2317 	     |	NoChange
2318 	     |	Table
2319 	     ;
2320 
2321 _TableDeflt :
2322 	    |	Delay
2323 	    |	LoadDelay
2324 	    ;
2325 
2326 Technology :	EDIF_TOK_TECHNOLOGY _Technology PopC
2327 	   ;
2328 
2329 _Technology :	NumberDefn
2330 	    |	_Technology FigGrp
2331 	    |	_Technology Fabricate
2332 	    |	_Technology SimulInfo
2333 	    |	_Technology DesignRule
2334 	    |	_Technology Comment
2335 	    |	_Technology UserData
2336 	    ;
2337 
2338 TextHeight :	EDIF_TOK_TEXTHEIGHT Int PopC { free($2); }
2339 	   ;
2340 
2341 TimeIntval :	EDIF_TOK_TIMEINTERVAL __TimeIntval _TimeIntval PopC
2342 	   ;
2343 
2344 __TimeIntval :	Event
2345 	     |	OffsetEvent
2346 	     ;
2347 
2348 _TimeIntval :	Event
2349 	    |	OffsetEvent
2350 	    |	Duration
2351 	    ;
2352 
2353 TimeStamp :	EDIF_TOK_TIMESTAMP Int Int Int Int Int Int PopC
2354 { free($2); free($3); free($4); free($5); free($6); free($7); }
2355 	  ;
2356 
2357 Timing :	EDIF_TOK_TIMING _Timing PopC
2358        ;
2359 
2360 _Timing :	Derivation
2361 	|	_Timing PathDelay
2362 	|	_Timing Forbidden
2363 	|	_Timing Comment
2364 	|	_Timing UserData
2365 	;
2366 
2367 Transform :	EDIF_TOK_TRANSFORM _TransX _TransY _TransDelta _TransOrien _TransOrg
2368 		PopC
2369 	  ;
2370 
2371 _TransX :
2372 	|	ScaleX
2373 	;
2374 
2375 _TransY :
2376 	|	ScaleY
2377 	;
2378 
2379 _TransDelta :
2380 	    |	Delta
2381 	    ;
2382 
2383 _TransOrien :
2384 	    |	Orientation
2385 	    ;
2386 
2387 _TransOrg :
2388 	  |	Origin
2389 	  ;
2390 
2391 Transition :	EDIF_TOK_TRANSITION _Transition _Transition PopC
2392 	   ;
2393 
2394 _Transition :	LogicNameRef
2395 	    |	LogicList
2396 	    |	LogicOneOf
2397 	    ;
2398 
2399 Trigger :	EDIF_TOK_TRIGGER _Trigger PopC
2400 	;
2401 
2402 _Trigger :
2403 	 |	_Trigger Change
2404 	 |	_Trigger Steady
2405 	 |	_Trigger Initial
2406 	 ;
2407 
2408 True :		EDIF_TOK_TRUE PopC
2409      ;
2410 
2411 TypedValue :	Boolean
2412 	   |	Integer
2413 	   |	MiNoMa
2414 	   |	Number
2415 	   |	Point
2416 	   |	String
2417 	   ;
2418 
2419 Unconstrained :	EDIF_TOK_UNCONSTRAINED PopC
2420 	      ;
2421 
2422 Undefined :	EDIF_TOK_UNDEFINED PopC
2423 	  ;
2424 
2425 Union :		EDIF_TOK_UNION _Union PopC
2426       ;
2427 
2428 _Union :	FigGrpRef
2429        |	FigureOp
2430        |	_Union FigGrpRef
2431        |	_Union FigureOp
2432        ;
2433 
2434 Unit :		EDIF_TOK_UNIT _Unit PopC
2435      ;
2436 
2437 _Unit :		EDIF_TOK_DISTANCE
2438       |		EDIF_TOK_CAPACITANCE
2439       |		EDIF_TOK_CURRENT
2440       |		EDIF_TOK_RESISTANCE
2441       |		EDIF_TOK_TEMPERATURE
2442       |		EDIF_TOK_TIME
2443       |		EDIF_TOK_VOLTAGE
2444       |		EDIF_TOK_MASS
2445       |		EDIF_TOK_FREQUENCY
2446       |		EDIF_TOK_INDUCTANCE
2447       |		EDIF_TOK_ENERGY
2448       |		EDIF_TOK_POWER
2449       |		EDIF_TOK_CHARGE
2450       |		EDIF_TOK_CONDUCTANCE
2451       |		EDIF_TOK_FLUX
2452       |		EDIF_TOK_ANGLE
2453       ;
2454 
2455 Unused :	EDIF_TOK_UNUSED PopC
2456        ;
2457 
2458 UserData :	EDIF_TOK_USERDATA _UserData PopC
2459 	 ;
2460 
2461 _UserData :	Ident { free($1); }
2462 	  |	_UserData Int { free($2); }
2463 	  |	_UserData Str { free($2); }
2464 	  |	_UserData Ident { free($2); }
2465 	  |	_UserData Form
2466 	  ;
2467 
2468 ValueNameDef :	NameDef { str_pair_free($1); }
2469 	     |	Array
2470 	     ;
2471 
2472 ValueNameRef :	NameRef { free($1); }
2473 	     |	Member
2474 	     ;
2475 
2476 Version :	EDIF_TOK_VERSION Str PopC { free($2); }
2477 	;
2478 
2479 View :		EDIF_TOK_VIEW ViewNameDef ViewType _View PopC
2480      ;
2481 
2482 _View :		Interface
2483       |		_View Status
2484       |		_View Contents
2485       |		_View Comment
2486       |		_View Property
2487       |		_View UserData
2488       ;
2489 
2490 ViewList :	EDIF_TOK_VIEWLIST _ViewList PopC
2491 	 ;
2492 
2493 _ViewList :
2494 	  |	_ViewList ViewRef
2495 	  |	_ViewList ViewList
2496 	  ;
2497 
2498 ViewMap :	EDIF_TOK_VIEWMAP _ViewMap PopC
2499 	;
2500 
2501 _ViewMap :
2502 	 |	_ViewMap PortMap
2503 	 |	_ViewMap PortBackAn
2504 	 |	_ViewMap InstMap
2505 	 |	_ViewMap InstBackAn
2506 	 |	_ViewMap NetMap
2507 	 |	_ViewMap NetBackAn
2508 	 |	_ViewMap Comment
2509 	 |	_ViewMap UserData
2510 	 ;
2511 
2512 ViewNameDef :	NameDef { str_pair_free($1); }
2513 	    ;
2514 
2515 ViewNameRef :	NameRef { free($1); }
2516 	    ;
2517 
2518 ViewRef :	EDIF_TOK_VIEWREF ViewNameRef _ViewRef PopC
2519 	;
2520 
2521 _ViewRef :
2522 	 |	CellRef
2523 	 ;
2524 
2525 ViewType :	EDIF_TOK_VIEWTYPE _ViewType PopC
2526 	 ;
2527 
2528 _ViewType :	EDIF_TOK_MASKLAYOUT
2529 	  |	EDIF_TOK_PCBLAYOUT
2530 	  |	EDIF_TOK_NETLIST
2531 	  |	EDIF_TOK_SCHEMATIC
2532 	  |	EDIF_TOK_SYMBOLIC
2533 	  |	EDIF_TOK_BEHAVIOR
2534 	  |	EDIF_TOK_LOGICMODEL
2535 	  |	EDIF_TOK_DOCUMENT
2536 	  |	EDIF_TOK_GRAPHIC
2537 	  |	EDIF_TOK_STRANGER
2538 	  ;
2539 
2540 Visible :	EDIF_TOK_VISIBLE BooleanValue PopC
2541 	;
2542 
2543 VoltageMap :	EDIF_TOK_VOLTAGEMAP MiNoMaValue PopC
2544 	   ;
2545 
2546 WaveValue :	EDIF_TOK_WAVEVALUE LogicNameDef ScaledInt LogicWave PopC
2547 	  ;
2548 
2549 Weak :		EDIF_TOK_WEAK LogicNameRef PopC
2550      ;
2551 
2552 WeakJoined :	EDIF_TOK_WEAKJOINED _WeakJoined PopC
2553 	   ;
2554 
2555 _WeakJoined :
2556 	    |	_WeakJoined PortRef { str_pair_free($2); }
2557 	    |	_WeakJoined PortList
2558 	    |	_WeakJoined Joined { pair_list_free($2); }
2559 	    ;
2560 
2561 When :		EDIF_TOK_WHEN _When PopC
2562      ;
2563 
2564 _When :		Trigger
2565       |		_When After
2566       |		_When Follow
2567       |		_When Maintain
2568       |		_When LogicAssn
2569       |		_When Comment
2570       |		_When UserData
2571       ;
2572 
2573 Written :	EDIF_TOK_WRITTEN _Written PopC
2574 	;
2575 
2576 _Written :	TimeStamp
2577 	 |	_Written Author
2578 	 |	_Written Program
2579 	 |	_Written DataOrigin
2580 	 |	_Written Property
2581 	 |	_Written Comment
2582 	 |	_Written UserData
2583 	 ;
2584 
2585 Ident :		EDIF_TOK_IDENT { $$=$1; }
2586       ;
2587 
2588 Str :		EDIF_TOK_STR { $$=$1; }
2589     ;
2590 
2591 Int :		EDIF_TOK_INT { $$=$1; }
2592     ;
2593 
2594 Keyword :	EDIF_TOK_KEYWORD	{ $$=$1; }
2595 	;
2596 
2597 %%
2598 /*
2599  *	xmalloc:
2600  *
2601  *	  Garbage function for 'alloca()'.
2602  */
2603 char *xmalloc(int siz)
2604 {
2605   return ((char *)Malloc(siz));
2606 }
2607 /*
2608  *	Token & context carriers:
2609  *
2610  *	  These are the linkage pointers for threading this context garbage
2611  *	for converting identifiers into parser tokens.
2612  */
2613 typedef struct TokenCar {
2614   struct TokenCar *Next;	/* pointer to next carrier */
2615   struct Token *Token;		/* associated token */
2616 } TokenCar;
2617 typedef struct UsedCar {
2618   struct UsedCar *Next;		/* pointer to next carrier */
2619   short Code;			/* used '%token' value */
2620 } UsedCar;
2621 typedef struct ContextCar {
2622   struct ContextCar *Next;	/* pointer to next carrier */
2623   struct Context *Context;	/* associated context */
2624   union {
2625     int Single;			/* single usage flag (context tree) */
2626     struct UsedCar *Used;	/* single used list (context stack) */
2627   } u;
2628 } ContextCar;
2629 /*
2630  *	Token definitions:
2631  *
2632  *	  This associates the '%token' codings with strings which are to
2633  *	be free standing tokens. Doesn't have to be in sorted order but the
2634  *	strings must be in lower case.
2635  */
2636 typedef struct Token {
2637   char *Name;			/* token name */
2638   int Code;			/* '%token' value */
2639   struct Token *Next;		/* hash table linkage */
2640 } Token;
2641 static Token TokenDef[] = {
2642   {"angle",		EDIF_TOK_ANGLE},
2643   {"behavior",		EDIF_TOK_BEHAVIOR},
2644   {"calculated",	EDIF_TOK_CALCULATED},
2645   {"capacitance",	EDIF_TOK_CAPACITANCE},
2646   {"centercenter",	EDIF_TOK_CENTERCENTER},
2647   {"centerleft",	EDIF_TOK_CENTERLEFT},
2648   {"centerright",	EDIF_TOK_CENTERRIGHT},
2649   {"charge",		EDIF_TOK_CHARGE},
2650   {"conductance",	EDIF_TOK_CONDUCTANCE},
2651   {"current",		EDIF_TOK_CURRENT},
2652   {"distance",		EDIF_TOK_DISTANCE},
2653   {"document",		EDIF_TOK_DOCUMENT},
2654   {"energy",		EDIF_TOK_ENERGY},
2655   {"extend",		EDIF_TOK_EXTEND},
2656   {"flux",		EDIF_TOK_FLUX},
2657   {"frequency",		EDIF_TOK_FREQUENCY},
2658   {"generic",		EDIF_TOK_GENERIC},
2659   {"graphic",		EDIF_TOK_GRAPHIC},
2660   {"inductance",	EDIF_TOK_INDUCTANCE},
2661   {"inout",		EDIF_TOK_INOUT},
2662   {"input",		EDIF_TOK_INPUT},
2663   {"logicmodel",	EDIF_TOK_LOGICMODEL},
2664   {"lowercenter",	EDIF_TOK_LOWERCENTER},
2665   {"lowerleft",		EDIF_TOK_LOWERLEFT},
2666   {"lowerright",	EDIF_TOK_LOWERRIGHT},
2667   {"masklayout",	EDIF_TOK_MASKLAYOUT},
2668   {"mass",		EDIF_TOK_MASS},
2669   {"measured",		EDIF_TOK_MEASURED},
2670   {"mx",		EDIF_TOK_MX},
2671   {"mxr90",		EDIF_TOK_MXR90},
2672   {"my",		EDIF_TOK_MY},
2673   {"myr90",		EDIF_TOK_MYR90},
2674   {"netlist",		EDIF_TOK_NETLIST},
2675   {"output",		EDIF_TOK_OUTPUT},
2676   {"pcblayout",		EDIF_TOK_PCBLAYOUT},
2677   {"power",		EDIF_TOK_POWER},
2678   {"r0",		EDIF_TOK_R0},
2679   {"r180",		EDIF_TOK_R180},
2680   {"r270",		EDIF_TOK_R270},
2681   {"r90",		EDIF_TOK_R90},
2682   {"required",		EDIF_TOK_REQUIRED},
2683   {"resistance",	EDIF_TOK_RESISTANCE},
2684   {"ripper",		EDIF_TOK_RIPPER},
2685   {"round",		EDIF_TOK_ROUND},
2686   {"schematic",		EDIF_TOK_SCHEMATIC},
2687   {"stranger",		EDIF_TOK_STRANGER},
2688   {"symbolic",		EDIF_TOK_SYMBOLIC},
2689   {"temperature",	EDIF_TOK_TEMPERATURE},
2690   {"tie",		EDIF_TOK_TIE},
2691   {"time",		EDIF_TOK_TIME},
2692   {"truncate",		EDIF_TOK_TRUNCATE},
2693   {"uppercenter",	EDIF_TOK_UPPERCENTER},
2694   {"upperleft",		EDIF_TOK_UPPERLEFT},
2695   {"upperright",	EDIF_TOK_UPPERRIGHT},
2696   {"voltage",		EDIF_TOK_VOLTAGE}
2697 };
2698 static int TokenDefSize = sizeof(TokenDef) / sizeof(Token);
2699 /*
2700  *	Token enable definitions:
2701  *
2702  *	  There is one array for each set of tokens enabled by a
2703  *	particular context (barf). Another array is used to bind
2704  *	these arrays to a context.
2705  */
2706 static short e_CellType[] = {EDIF_TOK_TIE, EDIF_TOK_RIPPER, EDIF_TOK_GENERIC};
2707 static short e_CornerType[] = {EDIF_TOK_EXTEND, EDIF_TOK_TRUNCATE,
2708 			       EDIF_TOK_ROUND};
2709 static short e_Derivation[] = {EDIF_TOK_CALCULATED, EDIF_TOK_MEASURED,
2710 			       EDIF_TOK_REQUIRED};
2711 static short e_Direction[] = {EDIF_TOK_INPUT, EDIF_TOK_OUTPUT,
2712 			      EDIF_TOK_INOUT};
2713 static short e_EndType[] = {EDIF_TOK_EXTEND, EDIF_TOK_TRUNCATE,
2714 			    EDIF_TOK_ROUND};
2715 static short e_Justify[] = {EDIF_TOK_CENTERCENTER, EDIF_TOK_CENTERLEFT,
2716 			    EDIF_TOK_CENTERRIGHT, EDIF_TOK_LOWERCENTER,
2717 			    EDIF_TOK_LOWERLEFT, EDIF_TOK_LOWERRIGHT,
2718 			    EDIF_TOK_UPPERCENTER, EDIF_TOK_UPPERLEFT,
2719 			    EDIF_TOK_UPPERRIGHT};
2720 static short e_Orientation[] = {EDIF_TOK_R0, EDIF_TOK_R90, EDIF_TOK_R180,
2721 				EDIF_TOK_R270, EDIF_TOK_MX, EDIF_TOK_MY,
2722 				EDIF_TOK_MXR90, EDIF_TOK_MYR90};
2723 static short e_Unit[] = {EDIF_TOK_DISTANCE, EDIF_TOK_CAPACITANCE,
2724 			 EDIF_TOK_CURRENT, EDIF_TOK_RESISTANCE,
2725 			 EDIF_TOK_TEMPERATURE, EDIF_TOK_TIME,
2726 			 EDIF_TOK_VOLTAGE, EDIF_TOK_MASS, EDIF_TOK_FREQUENCY,
2727 			 EDIF_TOK_INDUCTANCE, EDIF_TOK_ENERGY,
2728 			 EDIF_TOK_POWER, EDIF_TOK_CHARGE,
2729 			 EDIF_TOK_CONDUCTANCE, EDIF_TOK_FLUX, EDIF_TOK_ANGLE};
2730 static short e_ViewType[] = {EDIF_TOK_MASKLAYOUT, EDIF_TOK_PCBLAYOUT,
2731 			     EDIF_TOK_NETLIST, EDIF_TOK_SCHEMATIC,
2732 			     EDIF_TOK_SYMBOLIC, EDIF_TOK_BEHAVIOR,
2733 			     EDIF_TOK_LOGICMODEL, EDIF_TOK_DOCUMENT,
2734 			     EDIF_TOK_GRAPHIC, EDIF_TOK_STRANGER};
2735 /*
2736  *	Token tying table:
2737  *
2738  *	  This binds enabled tokens to a context.
2739  */
2740 typedef struct Tie {
2741   short *Enable;		/* pointer to enable array */
2742   short Origin;			/* '%token' value of context */
2743   short EnableSize;		/* size of enabled array */
2744 } Tie;
2745 #define	TE(e,o)			{e,o,sizeof(e)/sizeof(short)}
2746 static Tie TieDef[] = {
2747   TE(e_CellType,	EDIF_TOK_CELLTYPE),
2748   TE(e_CornerType,	EDIF_TOK_CORNERTYPE),
2749   TE(e_Derivation,	EDIF_TOK_DERIVATION),
2750   TE(e_Direction,	EDIF_TOK_DIRECTION),
2751   TE(e_EndType,		EDIF_TOK_ENDTYPE),
2752   TE(e_Justify,		EDIF_TOK_JUSTIFY),
2753   TE(e_Orientation,	EDIF_TOK_ORIENTATION),
2754   TE(e_Unit,		EDIF_TOK_UNIT),
2755   TE(e_ViewType,	EDIF_TOK_VIEWTYPE)
2756 };
2757 static int TieDefSize = sizeof(TieDef) / sizeof(Tie);
2758 /*
2759  *	Context definitions:
2760  *
2761  *	  This associates keyword strings with '%token' values. It
2762  *	also creates a pretty much empty header for later building of
2763  *	the context tree. Again they needn't be sorted, but strings
2764  *	must be lower case.
2765  */
2766 typedef struct Context {
2767   char *Name;			/* keyword name */
2768   short Code;			/* '%token' value */
2769   short Flags;			/* special operation flags */
2770   struct ContextCar *Context;	/* contexts which can be moved to */
2771   struct TokenCar *Token;	/* active tokens */
2772   struct Context *Next;		/* hash table linkage */
2773 } Context;
2774 static Context ContextDef[] = {
2775   {"",				0},		/* start context */
2776   {"acload",			EDIF_TOK_ACLOAD},
2777   {"after",			EDIF_TOK_AFTER},
2778   {"annotate",			EDIF_TOK_ANNOTATE},
2779   {"apply",			EDIF_TOK_APPLY},
2780   {"arc",			EDIF_TOK_ARC},
2781   {"array",			EDIF_TOK_ARRAY},
2782   {"arraymacro",		EDIF_TOK_ARRAYMACRO},
2783   {"arrayrelatedinfo",		EDIF_TOK_ARRAYRELATEDINFO},
2784   {"arraysite",			EDIF_TOK_ARRAYSITE},
2785   {"atleast",			EDIF_TOK_ATLEAST},
2786   {"atmost",			EDIF_TOK_ATMOST},
2787   {"author",			EDIF_TOK_AUTHOR},
2788   {"basearray",			EDIF_TOK_BASEARRAY},
2789   {"becomes",			EDIF_TOK_BECOMES},
2790   {"between",			EDIF_TOK_BETWEEN},
2791   {"boolean",			EDIF_TOK_BOOLEAN},
2792   {"booleandisplay",		EDIF_TOK_BOOLEANDISPLAY},
2793   {"booleanmap",		EDIF_TOK_BOOLEANMAP},
2794   {"borderpattern",		EDIF_TOK_BORDERPATTERN},
2795   {"borderwidth",		EDIF_TOK_BORDERWIDTH},
2796   {"boundingbox",		EDIF_TOK_BOUNDINGBOX},
2797   {"cell",			EDIF_TOK_CELL},
2798   {"cellref",			EDIF_TOK_CELLREF},
2799   {"celltype",			EDIF_TOK_CELLTYPE},
2800   {"change",			EDIF_TOK_CHANGE},
2801   {"circle",			EDIF_TOK_CIRCLE},
2802   {"color",			EDIF_TOK_COLOR},
2803   {"comment",			EDIF_TOK_COMMENT},
2804   {"commentgraphics",		EDIF_TOK_COMMENTGRAPHICS},
2805   {"compound",			EDIF_TOK_COMPOUND},
2806   {"connectlocation",		EDIF_TOK_CONNECTLOCATION},
2807   {"contents",			EDIF_TOK_CONTENTS},
2808   {"cornertype",		EDIF_TOK_CORNERTYPE},
2809   {"criticality",		EDIF_TOK_CRITICALITY},
2810   {"currentmap",		EDIF_TOK_CURRENTMAP},
2811   {"curve",			EDIF_TOK_CURVE},
2812   {"cycle",			EDIF_TOK_CYCLE},
2813   {"dataorigin",		EDIF_TOK_DATAORIGIN},
2814   {"dcfaninload",		EDIF_TOK_DCFANINLOAD},
2815   {"dcfanoutload",		EDIF_TOK_DCFANOUTLOAD},
2816   {"dcmaxfanin",		EDIF_TOK_DCMAXFANIN},
2817   {"dcmaxfanout",		EDIF_TOK_DCMAXFANOUT},
2818   {"delay",			EDIF_TOK_DELAY},
2819   {"delta",			EDIF_TOK_DELTA},
2820   {"derivation",		EDIF_TOK_DERIVATION},
2821   {"design",			EDIF_TOK_DESIGN},
2822   {"designator",		EDIF_TOK_DESIGNATOR},
2823   {"difference",		EDIF_TOK_DIFFERENCE},
2824   {"direction",			EDIF_TOK_DIRECTION},
2825   {"display",			EDIF_TOK_DISPLAY},
2826   {"dominates",			EDIF_TOK_DOMINATES},
2827   {"dot",			EDIF_TOK_DOT},
2828   {"duration",			EDIF_TOK_DURATION},
2829   {"e",				EDIF_TOK_E},
2830   {"edif",			EDIF_TOK_EDIF},
2831   {"ediflevel",			EDIF_TOK_EDIFLEVEL},
2832   {"edifversion",		EDIF_TOK_EDIFVERSION},
2833   {"enclosuredistance",		EDIF_TOK_ENCLOSUREDISTANCE},
2834   {"endtype",			EDIF_TOK_ENDTYPE},
2835   {"entry",			EDIF_TOK_ENTRY},
2836   {"exactly",			EDIF_TOK_EXACTLY},
2837   {"external",			EDIF_TOK_EXTERNAL},
2838   {"fabricate",			EDIF_TOK_FABRICATE},
2839   {"false",			EDIF_TOK_FALSE},
2840   {"figure",			EDIF_TOK_FIGURE},
2841   {"figurearea",		EDIF_TOK_FIGUREAREA},
2842   {"figuregroup",		EDIF_TOK_FIGUREGROUP},
2843   {"figuregroupobject",		EDIF_TOK_FIGUREGROUPOBJECT},
2844   {"figuregroupoverride",	EDIF_TOK_FIGUREGROUPOVERRIDE},
2845   {"figuregroupref",		EDIF_TOK_FIGUREGROUPREF},
2846   {"figureperimeter",		EDIF_TOK_FIGUREPERIMETER},
2847   {"figurewidth",		EDIF_TOK_FIGUREWIDTH},
2848   {"fillpattern",		EDIF_TOK_FILLPATTERN},
2849   {"follow",			EDIF_TOK_FOLLOW},
2850   {"forbiddenevent",		EDIF_TOK_FORBIDDENEVENT},
2851   {"globalportref",		EDIF_TOK_GLOBALPORTREF},
2852   {"greaterthan",		EDIF_TOK_GREATERTHAN},
2853   {"gridmap",			EDIF_TOK_GRIDMAP},
2854   {"ignore",			EDIF_TOK_IGNORE},
2855   {"includefiguregroup",	EDIF_TOK_INCLUDEFIGUREGROUP},
2856   {"initial",			EDIF_TOK_INITIAL},
2857   {"instance",			EDIF_TOK_INSTANCE},
2858   {"instancebackannotate",	EDIF_TOK_INSTANCEBACKANNOTATE},
2859   {"instancegroup",		EDIF_TOK_INSTANCEGROUP},
2860   {"instancemap",		EDIF_TOK_INSTANCEMAP},
2861   {"instanceref",		EDIF_TOK_INSTANCEREF},
2862   {"integer",			EDIF_TOK_INTEGER},
2863   {"integerdisplay",		EDIF_TOK_INTEGERDISPLAY},
2864   {"interface",			EDIF_TOK_INTERFACE},
2865   {"interfiguregroupspacing",	EDIF_TOK_INTERFIGUREGROUPSPACING},
2866   {"intersection",		EDIF_TOK_INTERSECTION},
2867   {"intrafiguregroupspacing",	EDIF_TOK_INTRAFIGUREGROUPSPACING},
2868   {"inverse",			EDIF_TOK_INVERSE},
2869   {"isolated",			EDIF_TOK_ISOLATED},
2870   {"joined",			EDIF_TOK_JOINED},
2871   {"justify",			EDIF_TOK_JUSTIFY},
2872   {"keyworddisplay",		EDIF_TOK_KEYWORDDISPLAY},
2873   {"keywordlevel",		EDIF_TOK_KEYWORDLEVEL},
2874   {"keywordmap",		EDIF_TOK_KEYWORDMAP},
2875   {"lessthan",			EDIF_TOK_LESSTHAN},
2876   {"library",			EDIF_TOK_LIBRARY},
2877   {"libraryref",		EDIF_TOK_LIBRARYREF},
2878   {"listofnets",		EDIF_TOK_LISTOFNETS},
2879   {"listofports",		EDIF_TOK_LISTOFPORTS},
2880   {"loaddelay",			EDIF_TOK_LOADDELAY},
2881   {"logicassign",		EDIF_TOK_LOGICASSIGN},
2882   {"logicinput",		EDIF_TOK_LOGICINPUT},
2883   {"logiclist",			EDIF_TOK_LOGICLIST},
2884   {"logicmapinput",		EDIF_TOK_LOGICMAPINPUT},
2885   {"logicmapoutput",		EDIF_TOK_LOGICMAPOUTPUT},
2886   {"logiconeof",		EDIF_TOK_LOGICONEOF},
2887   {"logicoutput",		EDIF_TOK_LOGICOUTPUT},
2888   {"logicport",			EDIF_TOK_LOGICPORT},
2889   {"logicref",			EDIF_TOK_LOGICREF},
2890   {"logicvalue",		EDIF_TOK_LOGICVALUE},
2891   {"logicwaveform",		EDIF_TOK_LOGICWAVEFORM},
2892   {"maintain",			EDIF_TOK_MAINTAIN},
2893   {"match",			EDIF_TOK_MATCH},
2894   {"member",			EDIF_TOK_MEMBER},
2895   {"minomax",			EDIF_TOK_MINOMAX},
2896   {"minomaxdisplay",		EDIF_TOK_MINOMAXDISPLAY},
2897   {"mnm",			EDIF_TOK_MNM},
2898   {"multiplevalueset",		EDIF_TOK_MULTIPLEVALUESET},
2899   {"mustjoin",			EDIF_TOK_MUSTJOIN},
2900   {"name",			EDIF_TOK_NAME},
2901   {"net",			EDIF_TOK_NET},
2902   {"netbackannotate",		EDIF_TOK_NETBACKANNOTATE},
2903   {"netbundle",			EDIF_TOK_NETBUNDLE},
2904   {"netdelay",			EDIF_TOK_NETDELAY},
2905   {"netgroup",			EDIF_TOK_NETGROUP},
2906   {"netmap",			EDIF_TOK_NETMAP},
2907   {"netref",			EDIF_TOK_NETREF},
2908   {"nochange",			EDIF_TOK_NOCHANGE},
2909   {"nonpermutable",		EDIF_TOK_NONPERMUTABLE},
2910   {"notallowed",		EDIF_TOK_NOTALLOWED},
2911   {"notchspacing",		EDIF_TOK_NOTCHSPACING},
2912   {"number",			EDIF_TOK_NUMBER},
2913   {"numberdefinition",		EDIF_TOK_NUMBERDEFINITION},
2914   {"numberdisplay",		EDIF_TOK_NUMBERDISPLAY},
2915   {"offpageconnector",		EDIF_TOK_OFFPAGECONNECTOR},
2916   {"offsetevent",		EDIF_TOK_OFFSETEVENT},
2917   {"openshape",			EDIF_TOK_OPENSHAPE},
2918   {"orientation",		EDIF_TOK_ORIENTATION},
2919   {"origin",			EDIF_TOK_ORIGIN},
2920   {"overhangdistance",		EDIF_TOK_OVERHANGDISTANCE},
2921   {"overlapdistance",		EDIF_TOK_OVERLAPDISTANCE},
2922   {"oversize",			EDIF_TOK_OVERSIZE},
2923   {"owner",			EDIF_TOK_OWNER},
2924   {"page",			EDIF_TOK_PAGE},
2925   {"pagesize",			EDIF_TOK_PAGESIZE},
2926   {"parameter",			EDIF_TOK_PARAMETER},
2927   {"parameterassign",		EDIF_TOK_PARAMETERASSIGN},
2928   {"parameterdisplay",		EDIF_TOK_PARAMETERDISPLAY},
2929   {"path",			EDIF_TOK_PATH},
2930   {"pathdelay",			EDIF_TOK_PATHDELAY},
2931   {"pathwidth",			EDIF_TOK_PATHWIDTH},
2932   {"permutable",		EDIF_TOK_PERMUTABLE},
2933   {"physicaldesignrule",	EDIF_TOK_PHYSICALDESIGNRULE},
2934   {"plug",			EDIF_TOK_PLUG},
2935   {"point",			EDIF_TOK_POINT},
2936   {"pointdisplay",		EDIF_TOK_POINTDISPLAY},
2937   {"pointlist",			EDIF_TOK_POINTLIST},
2938   {"polygon",			EDIF_TOK_POLYGON},
2939   {"port",			EDIF_TOK_PORT},
2940   {"portbackannotate",		EDIF_TOK_PORTBACKANNOTATE},
2941   {"portbundle",		EDIF_TOK_PORTBUNDLE},
2942   {"portdelay",			EDIF_TOK_PORTDELAY},
2943   {"portgroup",			EDIF_TOK_PORTGROUP},
2944   {"portimplementation",	EDIF_TOK_PORTIMPLEMENTATION},
2945   {"portinstance",		EDIF_TOK_PORTINSTANCE},
2946   {"portlist",			EDIF_TOK_PORTLIST},
2947   {"portlistalias",		EDIF_TOK_PORTLISTALIAS},
2948   {"portmap",			EDIF_TOK_PORTMAP},
2949   {"portref",			EDIF_TOK_PORTREF},
2950   {"program",			EDIF_TOK_PROGRAM},
2951   {"property",			EDIF_TOK_PROPERTY},
2952   {"propertydisplay",		EDIF_TOK_PROPERTYDISPLAY},
2953   {"protectionframe",		EDIF_TOK_PROTECTIONFRAME},
2954   {"pt",			EDIF_TOK_PT},
2955   {"rangevector",		EDIF_TOK_RANGEVECTOR},
2956   {"rectangle",			EDIF_TOK_RECTANGLE},
2957   {"rectanglesize",		EDIF_TOK_RECTANGLESIZE},
2958   {"rename",			EDIF_TOK_RENAME},
2959   {"resolves",			EDIF_TOK_RESOLVES},
2960   {"scale",			EDIF_TOK_SCALE},
2961   {"scalex",			EDIF_TOK_SCALEX},
2962   {"scaley",			EDIF_TOK_SCALEY},
2963   {"section",			EDIF_TOK_SECTION},
2964   {"shape",			EDIF_TOK_SHAPE},
2965   {"simulate",			EDIF_TOK_SIMULATE},
2966   {"simulationinfo",		EDIF_TOK_SIMULATIONINFO},
2967   {"singlevalueset",		EDIF_TOK_SINGLEVALUESET},
2968   {"site",			EDIF_TOK_SITE},
2969   {"socket",			EDIF_TOK_SOCKET},
2970   {"socketset",			EDIF_TOK_SOCKETSET},
2971   {"status",			EDIF_TOK_STATUS},
2972   {"steady",			EDIF_TOK_STEADY},
2973   {"string",			EDIF_TOK_STRING},
2974   {"stringdisplay",		EDIF_TOK_STRINGDISPLAY},
2975   {"strong",			EDIF_TOK_STRONG},
2976   {"symbol",			EDIF_TOK_SYMBOL},
2977   {"symmetry",			EDIF_TOK_SYMMETRY},
2978   {"table",			EDIF_TOK_TABLE},
2979   {"tabledefault",		EDIF_TOK_TABLEDEFAULT},
2980   {"technology",		EDIF_TOK_TECHNOLOGY},
2981   {"textheight",		EDIF_TOK_TEXTHEIGHT},
2982   {"timeinterval",		EDIF_TOK_TIMEINTERVAL},
2983   {"timestamp",			EDIF_TOK_TIMESTAMP},
2984   {"timing",			EDIF_TOK_TIMING},
2985   {"transform",			EDIF_TOK_TRANSFORM},
2986   {"transition",		EDIF_TOK_TRANSITION},
2987   {"trigger",			EDIF_TOK_TRIGGER},
2988   {"true",			EDIF_TOK_TRUE},
2989   {"unconstrained",		EDIF_TOK_UNCONSTRAINED},
2990   {"undefined",			EDIF_TOK_UNDEFINED},
2991   {"union",			EDIF_TOK_UNION},
2992   {"unit",			EDIF_TOK_UNIT},
2993   {"unused",			EDIF_TOK_UNUSED},
2994   {"userdata",			EDIF_TOK_USERDATA},
2995   {"version",			EDIF_TOK_VERSION},
2996   {"view",			EDIF_TOK_VIEW},
2997   {"viewlist",			EDIF_TOK_VIEWLIST},
2998   {"viewmap",			EDIF_TOK_VIEWMAP},
2999   {"viewref",			EDIF_TOK_VIEWREF},
3000   {"viewtype",			EDIF_TOK_VIEWTYPE},
3001   {"visible",			EDIF_TOK_VISIBLE},
3002   {"voltagemap",		EDIF_TOK_VOLTAGEMAP},
3003   {"wavevalue",			EDIF_TOK_WAVEVALUE},
3004   {"weak",			EDIF_TOK_WEAK},
3005   {"weakjoined",		EDIF_TOK_WEAKJOINED},
3006   {"when",			EDIF_TOK_WHEN},
3007   {"written",			EDIF_TOK_WRITTEN}
3008 };
3009 static int ContextDefSize = sizeof(ContextDef) / sizeof(Context);
3010 /*
3011  *	Context follower tables:
3012  *
3013  *	  This is pretty ugly, an array is defined for each context
3014  *	which has following context levels. Yet another table is used
3015  *	to bind these arrays to the originating contexts.
3016  *	  Arrays are declared as:
3017  *
3018  *		static short f_<Context name>[] = { ... };
3019  *
3020  *	The array entries are the '%token' values for all keywords which
3021  *	can be reached from the <Context name> context. Like I said, ugly,
3022  *	but it works.
3023  *	  A negative entry means that the follow can only occur once within
3024  *	the specified context.
3025  */
3026 static short f_NULL[] = {EDIF_TOK_EDIF};
3027 static short f_Edif[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME, EDIF_TOK_EDIFVERSION,
3028 			 EDIF_TOK_EDIFLEVEL, EDIF_TOK_KEYWORDMAP,
3029 			 -EDIF_TOK_STATUS, EDIF_TOK_EXTERNAL,
3030 			 EDIF_TOK_LIBRARY, EDIF_TOK_DESIGN, EDIF_TOK_COMMENT,
3031 			 EDIF_TOK_USERDATA};
3032 static short f_AcLoad[] = {EDIF_TOK_MNM, EDIF_TOK_E, EDIF_TOK_MINOMAXDISPLAY};
3033 static short f_After[] = {EDIF_TOK_MNM, EDIF_TOK_E, EDIF_TOK_FOLLOW,
3034 			  EDIF_TOK_MAINTAIN, EDIF_TOK_LOGICASSIGN,
3035 			  EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3036 static short f_Annotate[] = {EDIF_TOK_STRINGDISPLAY};
3037 static short f_Apply[] = {EDIF_TOK_CYCLE, EDIF_TOK_LOGICINPUT,
3038 			  EDIF_TOK_LOGICOUTPUT, EDIF_TOK_COMMENT,
3039 			  EDIF_TOK_USERDATA};
3040 static short f_Arc[] = {EDIF_TOK_PT};
3041 static short f_Array[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME};
3042 static short f_ArrayMacro[] = {EDIF_TOK_PLUG};
3043 static short f_ArrayRelatedInfo[] = {EDIF_TOK_BASEARRAY, EDIF_TOK_ARRAYSITE,
3044 				     EDIF_TOK_ARRAYMACRO, EDIF_TOK_COMMENT,
3045 				     EDIF_TOK_USERDATA};
3046 static short f_ArraySite[] = {EDIF_TOK_SOCKET};
3047 static short f_AtLeast[] = {EDIF_TOK_E};
3048 static short f_AtMost[] = {EDIF_TOK_E};
3049 static short f_Becomes[] = {EDIF_TOK_NAME, EDIF_TOK_LOGICLIST,
3050 			    EDIF_TOK_LOGICONEOF};
3051 /*
3052 static short f_Between[] = {EDIF_TOK_ATLEAST, EDIF_TOK_GREATERTHAN,
3053 			    EDIF_TOK_ATMOST, EDIF_TOK_LESSTHAN};
3054 */
3055 static short f_Boolean[] = {EDIF_TOK_FALSE, EDIF_TOK_TRUE,
3056 			    EDIF_TOK_BOOLEANDISPLAY, EDIF_TOK_BOOLEAN};
3057 static short f_BooleanDisplay[] = {EDIF_TOK_FALSE, EDIF_TOK_TRUE,
3058 				   EDIF_TOK_DISPLAY};
3059 static short f_BooleanMap[] = {EDIF_TOK_FALSE, EDIF_TOK_TRUE};
3060 static short f_BorderPattern[] = {EDIF_TOK_BOOLEAN};
3061 static short f_BoundingBox[] = {EDIF_TOK_RECTANGLE};
3062 static short f_Cell[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME, EDIF_TOK_CELLTYPE,
3063 			 -EDIF_TOK_STATUS, -EDIF_TOK_VIEWMAP, EDIF_TOK_VIEW,
3064 			 EDIF_TOK_COMMENT, EDIF_TOK_USERDATA,
3065 			 EDIF_TOK_PROPERTY};
3066 static short f_CellRef[] = {EDIF_TOK_NAME, EDIF_TOK_LIBRARYREF};
3067 static short f_Change[] = {EDIF_TOK_NAME, EDIF_TOK_PORTREF, EDIF_TOK_PORTLIST,
3068 			   EDIF_TOK_BECOMES, EDIF_TOK_TRANSITION};
3069 static short f_Circle[] = {EDIF_TOK_PT, EDIF_TOK_PROPERTY};
3070 static short f_Color[] = {EDIF_TOK_E};
3071 static short f_CommentGraphics[] = {EDIF_TOK_ANNOTATE, EDIF_TOK_FIGURE,
3072 				    EDIF_TOK_INSTANCE, -EDIF_TOK_BOUNDINGBOX,
3073 				    EDIF_TOK_PROPERTY, EDIF_TOK_COMMENT,
3074 				    EDIF_TOK_USERDATA};
3075 static short f_Compound[] = {EDIF_TOK_NAME};
3076 static short f_ConnectLocation[] = {EDIF_TOK_FIGURE};
3077 static short f_Contents[] = {EDIF_TOK_INSTANCE, EDIF_TOK_OFFPAGECONNECTOR,
3078 			     EDIF_TOK_FIGURE, EDIF_TOK_SECTION, EDIF_TOK_NET,
3079 			     EDIF_TOK_NETBUNDLE, EDIF_TOK_PAGE,
3080 			     EDIF_TOK_COMMENTGRAPHICS,
3081 			     EDIF_TOK_PORTIMPLEMENTATION,
3082 			     EDIF_TOK_TIMING, EDIF_TOK_SIMULATE,
3083 			     EDIF_TOK_WHEN, EDIF_TOK_FOLLOW,
3084 			     EDIF_TOK_LOGICPORT, -EDIF_TOK_BOUNDINGBOX,
3085 			     EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3086 static short f_Criticality[] = {EDIF_TOK_INTEGERDISPLAY};
3087 static short f_CurrentMap[] = {EDIF_TOK_MNM, EDIF_TOK_E};
3088 static short f_Curve[] = {EDIF_TOK_ARC, EDIF_TOK_PT};
3089 static short f_Cycle[] = {EDIF_TOK_DURATION};
3090 static short f_DataOrigin[] = {EDIF_TOK_VERSION};
3091 static short f_DcFanInLoad[] = {EDIF_TOK_E, EDIF_TOK_NUMBERDISPLAY};
3092 static short f_DcFanOutLoad[] = {EDIF_TOK_E, EDIF_TOK_NUMBERDISPLAY};
3093 static short f_DcMaxFanIn[] = {EDIF_TOK_E, EDIF_TOK_NUMBERDISPLAY};
3094 static short f_DcMaxFanOut[] = {EDIF_TOK_E, EDIF_TOK_NUMBERDISPLAY};
3095 static short f_Delay[] = {EDIF_TOK_MNM, EDIF_TOK_E};
3096 static short f_Delta[] = {EDIF_TOK_PT};
3097 static short f_Design[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME, EDIF_TOK_CELLREF,
3098 			   EDIF_TOK_STATUS, EDIF_TOK_COMMENT,
3099 			   EDIF_TOK_PROPERTY, EDIF_TOK_USERDATA};
3100 static short f_Designator[] = {EDIF_TOK_STRINGDISPLAY};
3101 static short f_Difference[] = {EDIF_TOK_FIGUREGROUPREF, EDIF_TOK_INTERSECTION,
3102 			       EDIF_TOK_UNION, EDIF_TOK_DIFFERENCE,
3103 			       EDIF_TOK_INVERSE, EDIF_TOK_OVERSIZE};
3104 static short f_Display[] = {EDIF_TOK_NAME, EDIF_TOK_FIGUREGROUPOVERRIDE,
3105 			    EDIF_TOK_JUSTIFY, EDIF_TOK_ORIENTATION,
3106 			    EDIF_TOK_ORIGIN};
3107 static short f_Dominates[] = {EDIF_TOK_NAME};
3108 static short f_Dot[] = {EDIF_TOK_PT, EDIF_TOK_PROPERTY};
3109 static short f_Duration[] = {EDIF_TOK_E};
3110 static short f_EnclosureDistance[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3111 				      EDIF_TOK_FIGUREGROUPOBJECT,
3112 				      EDIF_TOK_LESSTHAN, EDIF_TOK_GREATERTHAN,
3113 				      EDIF_TOK_ATMOST, EDIF_TOK_ATLEAST,
3114 				      EDIF_TOK_EXACTLY, EDIF_TOK_BETWEEN,
3115 				      EDIF_TOK_SINGLEVALUESET,
3116 				      EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3117 static short f_Entry[] = {EDIF_TOK_MATCH, EDIF_TOK_CHANGE, EDIF_TOK_STEADY,
3118 			  EDIF_TOK_LOGICREF, EDIF_TOK_PORTREF,
3119 			  EDIF_TOK_NOCHANGE, EDIF_TOK_TABLE,
3120 			  EDIF_TOK_DELAY, EDIF_TOK_LOADDELAY};
3121 static short f_Exactly[] = {EDIF_TOK_E};
3122 static short f_External[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3123 			     EDIF_TOK_EDIFLEVEL, EDIF_TOK_TECHNOLOGY,
3124 			     -EDIF_TOK_STATUS, EDIF_TOK_CELL, EDIF_TOK_COMMENT,
3125 			     EDIF_TOK_USERDATA};
3126 static short f_Fabricate[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME};
3127 static short f_Figure[] = {EDIF_TOK_NAME, EDIF_TOK_FIGUREGROUPOVERRIDE,
3128 			   EDIF_TOK_CIRCLE, EDIF_TOK_DOT, EDIF_TOK_OPENSHAPE,
3129 			   EDIF_TOK_PATH, EDIF_TOK_POLYGON,
3130 			   EDIF_TOK_RECTANGLE, EDIF_TOK_SHAPE,
3131 			   EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3132 static short f_FigureArea[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3133 			       EDIF_TOK_FIGUREGROUPOBJECT, EDIF_TOK_LESSTHAN,
3134 			       EDIF_TOK_GREATERTHAN, EDIF_TOK_ATMOST,
3135 			       EDIF_TOK_ATLEAST, EDIF_TOK_EXACTLY,
3136 			       EDIF_TOK_BETWEEN, EDIF_TOK_SINGLEVALUESET,
3137 			       EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3138 static short f_FigureGroup[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3139 				-EDIF_TOK_CORNERTYPE, -EDIF_TOK_ENDTYPE,
3140 				-EDIF_TOK_PATHWIDTH, -EDIF_TOK_BORDERWIDTH,
3141 				-EDIF_TOK_COLOR, -EDIF_TOK_FILLPATTERN,
3142 				-EDIF_TOK_BORDERPATTERN, -EDIF_TOK_TEXTHEIGHT,
3143 				-EDIF_TOK_VISIBLE, EDIF_TOK_INCLUDEFIGUREGROUP,
3144 				EDIF_TOK_COMMENT, EDIF_TOK_PROPERTY,
3145 				EDIF_TOK_USERDATA};
3146 static short f_FigureGroupObject[] = {EDIF_TOK_NAME,
3147 				      EDIF_TOK_FIGUREGROUPOBJECT,
3148 				      EDIF_TOK_INTERSECTION, EDIF_TOK_UNION,
3149 				      EDIF_TOK_DIFFERENCE, EDIF_TOK_INVERSE,
3150 				      EDIF_TOK_OVERSIZE};
3151 static short f_FigureGroupOverride[] = {EDIF_TOK_NAME, -EDIF_TOK_CORNERTYPE,
3152 					-EDIF_TOK_ENDTYPE, -EDIF_TOK_PATHWIDTH,
3153 					-EDIF_TOK_BORDERWIDTH, -EDIF_TOK_COLOR,
3154 					-EDIF_TOK_FILLPATTERN,
3155 					-EDIF_TOK_TEXTHEIGHT,
3156 					-EDIF_TOK_BORDERPATTERN,
3157 					EDIF_TOK_VISIBLE, EDIF_TOK_COMMENT,
3158 					EDIF_TOK_PROPERTY, EDIF_TOK_USERDATA};
3159 static short f_FigureGroupRef[] = {EDIF_TOK_NAME, EDIF_TOK_LIBRARYREF};
3160 static short f_FigurePerimeter[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3161 				    EDIF_TOK_FIGUREGROUPOBJECT,
3162 				    EDIF_TOK_LESSTHAN, EDIF_TOK_GREATERTHAN,
3163 				    EDIF_TOK_ATMOST, EDIF_TOK_ATLEAST,
3164 				    EDIF_TOK_EXACTLY, EDIF_TOK_BETWEEN,
3165 				    EDIF_TOK_SINGLEVALUESET, EDIF_TOK_COMMENT,
3166 				    EDIF_TOK_USERDATA};
3167 static short f_FigureWidth[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3168 				EDIF_TOK_FIGUREGROUPOBJECT, EDIF_TOK_LESSTHAN,
3169 				EDIF_TOK_GREATERTHAN, EDIF_TOK_ATMOST,
3170 				EDIF_TOK_ATLEAST, EDIF_TOK_EXACTLY,
3171 				EDIF_TOK_BETWEEN, EDIF_TOK_SINGLEVALUESET,
3172 				EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3173 static short f_FillPattern[] = {EDIF_TOK_BOOLEAN};
3174 static short f_Follow[] = {EDIF_TOK_NAME, EDIF_TOK_PORTREF, EDIF_TOK_TABLE,
3175 			   EDIF_TOK_DELAY, EDIF_TOK_LOADDELAY};
3176 static short f_ForbiddenEvent[] = {EDIF_TOK_TIMEINTERVAL, EDIF_TOK_EVENT};
3177 static short f_GlobalPortRef[] = {EDIF_TOK_NAME};
3178 static short f_GreaterThan[] = {EDIF_TOK_E};
3179 static short f_GridMap[] = {EDIF_TOK_E};
3180 static short f_IncludeFigureGroup[] = {EDIF_TOK_FIGUREGROUPREF,
3181 				       EDIF_TOK_INTERSECTION, EDIF_TOK_UNION,
3182 				       EDIF_TOK_DIFFERENCE, EDIF_TOK_INVERSE,
3183 				       EDIF_TOK_OVERSIZE};
3184 static short f_Instance[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME, EDIF_TOK_ARRAY,
3185 			     EDIF_TOK_VIEWREF, EDIF_TOK_VIEWLIST,
3186 			     -EDIF_TOK_TRANSFORM, EDIF_TOK_PARAMETERASSIGN,
3187 			     EDIF_TOK_PORTINSTANCE, EDIF_TOK_TIMING,
3188 			     -EDIF_TOK_DESIGNATOR, EDIF_TOK_PROPERTY,
3189 			     EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3190 static short f_InstanceBackAnnotate[] = {EDIF_TOK_INSTANCEREF,
3191 					 -EDIF_TOK_DESIGNATOR, EDIF_TOK_TIMING,
3192 					 EDIF_TOK_PROPERTY, EDIF_TOK_COMMENT};
3193 static short f_InstanceGroup[] = {EDIF_TOK_INSTANCEREF};
3194 static short f_InstanceMap[] = {EDIF_TOK_INSTANCEREF, EDIF_TOK_INSTANCEGROUP,
3195 				EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3196 static short f_InstanceRef[] = {EDIF_TOK_NAME, EDIF_TOK_MEMBER,
3197 				EDIF_TOK_INSTANCEREF, EDIF_TOK_VIEWREF};
3198 static short f_Integer[] = {EDIF_TOK_INTEGERDISPLAY, EDIF_TOK_INTEGER};
3199 static short f_IntegerDisplay[] = {EDIF_TOK_DISPLAY};
3200 static short f_Interface[] = {EDIF_TOK_PORT, EDIF_TOK_PORTBUNDLE,
3201 			      -EDIF_TOK_SYMBOL, -EDIF_TOK_PROTECTIONFRAME,
3202 			      -EDIF_TOK_ARRAYRELATEDINFO, EDIF_TOK_PARAMETER,
3203 			      EDIF_TOK_JOINED, EDIF_TOK_MUSTJOIN,
3204 			      EDIF_TOK_WEAKJOINED, EDIF_TOK_PERMUTABLE,
3205 			      EDIF_TOK_TIMING, EDIF_TOK_SIMULATE,
3206 			      -EDIF_TOK_DESIGNATOR, EDIF_TOK_PROPERTY,
3207 			      EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3208 static short f_InterFigureGroupSpacing[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3209 					    EDIF_TOK_FIGUREGROUPOBJECT,
3210 					    EDIF_TOK_LESSTHAN,
3211 					    EDIF_TOK_GREATERTHAN,
3212 					    EDIF_TOK_ATMOST,
3213 					    EDIF_TOK_ATLEAST, EDIF_TOK_EXACTLY,
3214 					    EDIF_TOK_BETWEEN,
3215 					    EDIF_TOK_SINGLEVALUESET,
3216 					    EDIF_TOK_COMMENT,
3217 					    EDIF_TOK_USERDATA};
3218 static short f_Intersection[] = {EDIF_TOK_FIGUREGROUPREF,
3219 				 EDIF_TOK_INTERSECTION, EDIF_TOK_UNION,
3220 				 EDIF_TOK_DIFFERENCE, EDIF_TOK_INVERSE,
3221 				 EDIF_TOK_OVERSIZE};
3222 static short f_IntraFigureGroupSpacing[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3223 					    EDIF_TOK_FIGUREGROUPOBJECT,
3224 					    EDIF_TOK_LESSTHAN,
3225 					    EDIF_TOK_GREATERTHAN,
3226 					    EDIF_TOK_ATMOST, EDIF_TOK_ATLEAST,
3227 					    EDIF_TOK_EXACTLY, EDIF_TOK_BETWEEN,
3228 					    EDIF_TOK_SINGLEVALUESET,
3229 					    EDIF_TOK_COMMENT,
3230 					    EDIF_TOK_USERDATA};
3231 static short f_Inverse[] = {EDIF_TOK_FIGUREGROUPREF, EDIF_TOK_INTERSECTION,
3232 			    EDIF_TOK_UNION, EDIF_TOK_DIFFERENCE,
3233 			    EDIF_TOK_INVERSE, EDIF_TOK_OVERSIZE};
3234 static short f_Joined[] = {EDIF_TOK_PORTREF, EDIF_TOK_PORTLIST,
3235 			   EDIF_TOK_GLOBALPORTREF};
3236 static short f_KeywordDisplay[] = {EDIF_TOK_DISPLAY};
3237 static short f_KeywordMap[] = {EDIF_TOK_KEYWORDLEVEL, EDIF_TOK_COMMENT};
3238 static short f_LessThan[] = {EDIF_TOK_E};
3239 static short f_Library[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME, EDIF_TOK_EDIFLEVEL,
3240 			    EDIF_TOK_TECHNOLOGY, -EDIF_TOK_STATUS,
3241 			    EDIF_TOK_CELL, EDIF_TOK_COMMENT,
3242 			    EDIF_TOK_USERDATA};
3243 static short f_LibraryRef[] = {EDIF_TOK_NAME};
3244 static short f_ListOfNets[] = {EDIF_TOK_NET};
3245 static short f_ListOfPorts[] = {EDIF_TOK_PORT, EDIF_TOK_PORTBUNDLE};
3246 static short f_LoadDelay[] = {EDIF_TOK_MNM, EDIF_TOK_E, EDIF_TOK_MINOMAXDISPLAY};
3247 static short f_LogicAssign[] = {EDIF_TOK_NAME, EDIF_TOK_PORTREF,
3248 				EDIF_TOK_LOGICREF, EDIF_TOK_TABLE,
3249 				EDIF_TOK_DELAY, EDIF_TOK_LOADDELAY};
3250 static short f_LogicInput[] = {EDIF_TOK_PORTLIST, EDIF_TOK_PORTREF,
3251 			       EDIF_TOK_NAME, EDIF_TOK_LOGICWAVEFORM};
3252 static short f_LogicList[] = {EDIF_TOK_NAME, EDIF_TOK_LOGICONEOF,
3253 			      EDIF_TOK_IGNORE};
3254 static short f_LogicMapInput[] = {EDIF_TOK_LOGICREF};
3255 static short f_LogicMapOutput[] = {EDIF_TOK_LOGICREF};
3256 static short f_LogicOneOf[] = {EDIF_TOK_NAME, EDIF_TOK_LOGICLIST};
3257 static short f_LogicOutput[] = {EDIF_TOK_PORTLIST, EDIF_TOK_PORTREF,
3258 				EDIF_TOK_NAME, EDIF_TOK_LOGICWAVEFORM};
3259 static short f_LogicPort[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3260 			      EDIF_TOK_PROPERTY, EDIF_TOK_COMMENT,
3261 			      EDIF_TOK_USERDATA};
3262 static short f_LogicRef[] = {EDIF_TOK_NAME, EDIF_TOK_LIBRARYREF};
3263 static short f_LogicValue[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3264 			       -EDIF_TOK_VOLTAGEMAP, -EDIF_TOK_CURRENTMAP,
3265 			       -EDIF_TOK_BOOLEANMAP, -EDIF_TOK_COMPOUND,
3266 			       -EDIF_TOK_WEAK ,-EDIF_TOK_STRONG,
3267 			       -EDIF_TOK_DOMINATES, -EDIF_TOK_LOGICMAPOUTPUT,
3268 			       -EDIF_TOK_LOGICMAPINPUT,
3269 			       -EDIF_TOK_ISOLATED, EDIF_TOK_RESOLVES,
3270 			       EDIF_TOK_PROPERTY, EDIF_TOK_COMMENT,
3271 			       EDIF_TOK_USERDATA};
3272 static short f_LogicWaveform[] = {EDIF_TOK_NAME, EDIF_TOK_LOGICLIST,
3273 				  EDIF_TOK_LOGICONEOF, EDIF_TOK_IGNORE};
3274 static short f_Maintain[] = {EDIF_TOK_NAME, EDIF_TOK_PORTREF, EDIF_TOK_DELAY,
3275 			     EDIF_TOK_LOADDELAY};
3276 static short f_Match[] = {EDIF_TOK_NAME, EDIF_TOK_PORTREF, EDIF_TOK_PORTLIST,
3277 			  EDIF_TOK_LOGICLIST, EDIF_TOK_LOGICONEOF};
3278 static short f_Member[] = {EDIF_TOK_NAME};
3279 static short f_MiNoMax[] = {EDIF_TOK_MNM, EDIF_TOK_E, EDIF_TOK_MINOMAXDISPLAY,
3280 			    EDIF_TOK_MINOMAX};
3281 static short f_MiNoMaxDisplay[] = {EDIF_TOK_MNM, EDIF_TOK_E, EDIF_TOK_DISPLAY};
3282 static short f_Mnm[] = {EDIF_TOK_E, EDIF_TOK_UNDEFINED,
3283 			EDIF_TOK_UNCONSTRAINED};
3284 static short f_MultipleValueSet[] = {EDIF_TOK_RANGEVECTOR};
3285 static short f_MustJoin[] = {EDIF_TOK_PORTREF, EDIF_TOK_PORTLIST,
3286 			     EDIF_TOK_WEAKJOINED, EDIF_TOK_JOINED};
3287 static short f_Name[] = {EDIF_TOK_DISPLAY};
3288 static short f_Net[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME, -EDIF_TOK_CRITICALITY,
3289 			EDIF_TOK_NETDELAY, EDIF_TOK_FIGURE, EDIF_TOK_NET,
3290 			EDIF_TOK_INSTANCE, EDIF_TOK_COMMENTGRAPHICS,
3291 			EDIF_TOK_PROPERTY, EDIF_TOK_COMMENT,
3292 			EDIF_TOK_USERDATA, EDIF_TOK_JOINED, EDIF_TOK_ARRAY};
3293 static short f_NetBackAnnotate[] = {EDIF_TOK_NETREF, EDIF_TOK_NETDELAY,
3294 				    -EDIF_TOK_CRITICALITY, EDIF_TOK_PROPERTY,
3295 				    EDIF_TOK_COMMENT};
3296 static short f_NetBundle[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME, EDIF_TOK_ARRAY,
3297 			      EDIF_TOK_LISTOFNETS, EDIF_TOK_FIGURE,
3298 			      EDIF_TOK_COMMENTGRAPHICS, EDIF_TOK_PROPERTY,
3299 			      EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3300 static short f_NetDelay[] = {EDIF_TOK_DERIVATION, EDIF_TOK_DELAY,
3301 			     EDIF_TOK_TRANSITION, EDIF_TOK_BECOMES};
3302 static short f_NetGroup[] = {EDIF_TOK_NAME, EDIF_TOK_MEMBER, EDIF_TOK_NETREF};
3303 static short f_NetMap[] = {EDIF_TOK_NETREF, EDIF_TOK_NETGROUP,
3304 			   EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3305 static short f_NetRef[] = {EDIF_TOK_NAME, EDIF_TOK_MEMBER, EDIF_TOK_NETREF,
3306 			   EDIF_TOK_INSTANCEREF, EDIF_TOK_VIEWREF};
3307 static short f_NonPermutable[] = {EDIF_TOK_PORTREF, EDIF_TOK_PERMUTABLE};
3308 static short f_NotAllowed[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3309 			       EDIF_TOK_FIGUREGROUPOBJECT, EDIF_TOK_COMMENT,
3310 			       EDIF_TOK_USERDATA};
3311 static short f_NotchSpacing[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3312 				 EDIF_TOK_FIGUREGROUPOBJECT, EDIF_TOK_LESSTHAN,
3313 				 EDIF_TOK_GREATERTHAN, EDIF_TOK_ATMOST,
3314 				 EDIF_TOK_ATLEAST, EDIF_TOK_EXACTLY,
3315 				 EDIF_TOK_BETWEEN, EDIF_TOK_SINGLEVALUESET,
3316 				 EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3317 static short f_Number[] = {EDIF_TOK_E, EDIF_TOK_NUMBERDISPLAY, EDIF_TOK_NUMBER};
3318 static short f_NumberDefinition[] = {EDIF_TOK_SCALE, -EDIF_TOK_GRIDMAP,
3319 				     EDIF_TOK_COMMENT};
3320 static short f_NumberDisplay[] = {EDIF_TOK_E, EDIF_TOK_DISPLAY};
3321 static short f_OffPageConnector[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3322 				     -EDIF_TOK_UNUSED, EDIF_TOK_PROPERTY,
3323 				     EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3324 static short f_OffsetEvent[] = {EDIF_TOK_EVENT, EDIF_TOK_E};
3325 static short f_OpenShape[] = {EDIF_TOK_CURVE, EDIF_TOK_PROPERTY};
3326 static short f_Origin[] = {EDIF_TOK_PT};
3327 static short f_OverhangDistance[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3328 				     EDIF_TOK_FIGUREGROUPOBJECT, EDIF_TOK_LESSTHAN,
3329 				     EDIF_TOK_GREATERTHAN, EDIF_TOK_ATMOST,
3330 				     EDIF_TOK_ATLEAST, EDIF_TOK_EXACTLY,
3331 				     EDIF_TOK_BETWEEN, EDIF_TOK_SINGLEVALUESET,
3332 				     EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3333 static short f_OverlapDistance[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3334 				    EDIF_TOK_FIGUREGROUPOBJECT, EDIF_TOK_LESSTHAN,
3335 				    EDIF_TOK_GREATERTHAN, EDIF_TOK_ATMOST,
3336 				    EDIF_TOK_ATLEAST, EDIF_TOK_EXACTLY,
3337 				    EDIF_TOK_BETWEEN, EDIF_TOK_SINGLEVALUESET,
3338 				    EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3339 static short f_Oversize[] = {EDIF_TOK_FIGUREGROUPREF, EDIF_TOK_INTERSECTION,
3340 			     EDIF_TOK_UNION, EDIF_TOK_DIFFERENCE,
3341 			     EDIF_TOK_INVERSE, EDIF_TOK_OVERSIZE,
3342 			     EDIF_TOK_CORNERTYPE};
3343 static short f_Page[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME, EDIF_TOK_ARRAY,
3344 			 EDIF_TOK_INSTANCE, EDIF_TOK_NET, EDIF_TOK_NETBUNDLE,
3345 			 EDIF_TOK_COMMENTGRAPHICS, EDIF_TOK_PORTIMPLEMENTATION,
3346 			 -EDIF_TOK_PAGESIZE, -EDIF_TOK_BOUNDINGBOX,
3347 			 EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3348 static short f_PageSize[] = {EDIF_TOK_RECTANGLE};
3349 static short f_Parameter[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME, EDIF_TOK_ARRAY,
3350 			      EDIF_TOK_BOOLEAN, EDIF_TOK_INTEGER,
3351 			      EDIF_TOK_MINOMAX, EDIF_TOK_NUMBER,
3352 			      EDIF_TOK_POINT, EDIF_TOK_STRING};
3353 static short f_ParameterAssign[] = {EDIF_TOK_NAME, EDIF_TOK_MEMBER,
3354 				    EDIF_TOK_BOOLEAN, EDIF_TOK_INTEGER,
3355 				    EDIF_TOK_MINOMAX, EDIF_TOK_NUMBER, EDIF_TOK_POINT,
3356 				    EDIF_TOK_STRING};
3357 static short f_ParameterDisplay[] = {EDIF_TOK_NAME, EDIF_TOK_MEMBER,
3358 				     EDIF_TOK_DISPLAY};
3359 static short f_Path[] = {EDIF_TOK_POINTLIST, EDIF_TOK_PROPERTY};
3360 static short f_PathDelay[] = {EDIF_TOK_DELAY, EDIF_TOK_EVENT};
3361 static short f_Permutable[] = {EDIF_TOK_PORTREF, EDIF_TOK_PERMUTABLE,
3362 			       EDIF_TOK_NONPERMUTABLE};
3363 static short f_PhysicalDesignRule[] = {EDIF_TOK_FIGUREWIDTH,
3364 				       EDIF_TOK_FIGUREAREA,
3365 				       EDIF_TOK_RECTANGLESIZE,
3366 				       EDIF_TOK_FIGUREPERIMETER,
3367 				       EDIF_TOK_OVERLAPDISTANCE,
3368 				       EDIF_TOK_OVERHANGDISTANCE,
3369 				       EDIF_TOK_ENCLOSUREDISTANCE,
3370 				       EDIF_TOK_INTERFIGUREGROUPSPACING,
3371 				       EDIF_TOK_NOTCHSPACING,
3372 				       EDIF_TOK_INTRAFIGUREGROUPSPACING,
3373 				       EDIF_TOK_NOTALLOWED,
3374 				       EDIF_TOK_FIGUREGROUP, EDIF_TOK_COMMENT,
3375 				       EDIF_TOK_USERDATA};
3376 static short f_Plug[] = {EDIF_TOK_SOCKETSET};
3377 static short f_Point[] = {EDIF_TOK_PT, EDIF_TOK_POINTDISPLAY,
3378 			  EDIF_TOK_POINT};
3379 static short f_PointDisplay[] = {EDIF_TOK_PT, EDIF_TOK_DISPLAY};
3380 static short f_PointList[] = {EDIF_TOK_PT};
3381 static short f_Polygon[] = {EDIF_TOK_POINTLIST, EDIF_TOK_PROPERTY};
3382 static short f_Port[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME, EDIF_TOK_ARRAY,
3383 			 -EDIF_TOK_DIRECTION, -EDIF_TOK_UNUSED,
3384 			 EDIF_TOK_PORTDELAY, -EDIF_TOK_DESIGNATOR,
3385 			 -EDIF_TOK_DCFANINLOAD, -EDIF_TOK_DCFANOUTLOAD,
3386 			 -EDIF_TOK_DCMAXFANIN, -EDIF_TOK_DCMAXFANOUT,
3387 			 -EDIF_TOK_ACLOAD, EDIF_TOK_PROPERTY,
3388 			 EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3389 static short f_PortBackAnnotate[] = {EDIF_TOK_PORTREF, -EDIF_TOK_DESIGNATOR,
3390 				     EDIF_TOK_PORTDELAY, -EDIF_TOK_DCFANINLOAD,
3391 				     -EDIF_TOK_DCFANOUTLOAD,
3392 				     -EDIF_TOK_DCMAXFANIN,
3393 				     -EDIF_TOK_DCMAXFANOUT, -EDIF_TOK_ACLOAD,
3394 				     EDIF_TOK_PROPERTY, EDIF_TOK_COMMENT};
3395 static short f_PortBundle[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME, EDIF_TOK_ARRAY,
3396 			       EDIF_TOK_LISTOFPORTS, EDIF_TOK_PROPERTY,
3397 			       EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3398 static short f_PortDelay[] = {EDIF_TOK_DERIVATION, EDIF_TOK_DELAY,
3399 			      EDIF_TOK_LOADDELAY, EDIF_TOK_TRANSITION,
3400 			      EDIF_TOK_BECOMES};
3401 static short f_PortGroup[] = {EDIF_TOK_NAME, EDIF_TOK_MEMBER,
3402 			      EDIF_TOK_PORTREF};
3403 static short f_PortImplementation[] = {EDIF_TOK_PORTREF, EDIF_TOK_NAME, EDIF_TOK_MEMBER,
3404 				       -EDIF_TOK_CONNECTLOCATION,
3405 				       EDIF_TOK_FIGURE, EDIF_TOK_INSTANCE,
3406 				       EDIF_TOK_COMMENTGRAPHICS,
3407 				       EDIF_TOK_PROPERTYDISPLAY,
3408 				       EDIF_TOK_KEYWORDDISPLAY,
3409 				       EDIF_TOK_PROPERTY,
3410 				       EDIF_TOK_USERDATA, EDIF_TOK_COMMENT};
3411 static short f_PortInstance[] = {EDIF_TOK_PORTREF, EDIF_TOK_NAME,
3412 				 EDIF_TOK_MEMBER, -EDIF_TOK_UNUSED,
3413 				 EDIF_TOK_PORTDELAY, -EDIF_TOK_DESIGNATOR,
3414 				 -EDIF_TOK_DCFANINLOAD,
3415 				 -EDIF_TOK_DCFANOUTLOAD, -EDIF_TOK_DCMAXFANIN,
3416 				 -EDIF_TOK_DCMAXFANOUT, -EDIF_TOK_ACLOAD,
3417 				 EDIF_TOK_PROPERTY, EDIF_TOK_COMMENT,
3418 				 EDIF_TOK_USERDATA};
3419 static short f_PortList[] = {EDIF_TOK_PORTREF, EDIF_TOK_NAME,
3420 			     EDIF_TOK_MEMBER};
3421 static short f_PortListAlias[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3422 				  EDIF_TOK_ARRAY, EDIF_TOK_PORTLIST};
3423 static short f_PortMap[] = {EDIF_TOK_PORTREF, EDIF_TOK_PORTGROUP,
3424 			    EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3425 static short f_PortRef[] = {EDIF_TOK_NAME, EDIF_TOK_MEMBER,
3426 			    EDIF_TOK_PORTREF, EDIF_TOK_INSTANCEREF,
3427 			    EDIF_TOK_VIEWREF};
3428 static short f_Program[] = {EDIF_TOK_VERSION};
3429 static short f_Property[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME, EDIF_TOK_BOOLEAN,
3430 			     EDIF_TOK_INTEGER, EDIF_TOK_MINOMAX,
3431 			     EDIF_TOK_NUMBER, EDIF_TOK_POINT, EDIF_TOK_STRING,
3432 			     -EDIF_TOK_OWNER, -EDIF_TOK_UNIT,
3433 			     EDIF_TOK_PROPERTY, EDIF_TOK_COMMENT};
3434 static short f_PropertyDisplay[] = {EDIF_TOK_NAME, EDIF_TOK_DISPLAY};
3435 static short f_ProtectionFrame[] = {EDIF_TOK_PORTIMPLEMENTATION,
3436 				    EDIF_TOK_FIGURE, EDIF_TOK_INSTANCE,
3437 				    EDIF_TOK_COMMENTGRAPHICS,
3438 				    -EDIF_TOK_BOUNDINGBOX,
3439 				    EDIF_TOK_PROPERTYDISPLAY,
3440 				    EDIF_TOK_KEYWORDDISPLAY,
3441 				    EDIF_TOK_PARAMETERDISPLAY,
3442 				    EDIF_TOK_PROPERTY, EDIF_TOK_COMMENT,
3443 				    EDIF_TOK_USERDATA};
3444 static short f_RangeVector[] = {EDIF_TOK_LESSTHAN, EDIF_TOK_GREATERTHAN,
3445 				EDIF_TOK_ATMOST, EDIF_TOK_ATLEAST,
3446 				EDIF_TOK_EXACTLY, EDIF_TOK_BETWEEN,
3447 				EDIF_TOK_SINGLEVALUESET};
3448 static short f_Rectangle[] = {EDIF_TOK_PT, EDIF_TOK_PROPERTY};
3449 static short f_RectangleSize[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3450 				  EDIF_TOK_FIGUREGROUPOBJECT,
3451 				  EDIF_TOK_RANGEVECTOR,
3452 				  EDIF_TOK_MULTIPLEVALUESET,EDIF_TOK_COMMENT,
3453 				  EDIF_TOK_USERDATA};
3454 static short f_Rename[] = {EDIF_TOK_NAME, EDIF_TOK_STRINGDISPLAY};
3455 static short f_Resolves[] = {EDIF_TOK_NAME};
3456 static short f_Scale[] = {EDIF_TOK_E, EDIF_TOK_UNIT};
3457 static short f_Section[] = {EDIF_TOK_SECTION, EDIF_TOK_INSTANCE};
3458 static short f_Shape[] = {EDIF_TOK_CURVE, EDIF_TOK_PROPERTY};
3459 static short f_Simulate[] = {EDIF_TOK_NAME, EDIF_TOK_PORTLISTALIAS,
3460 			     EDIF_TOK_WAVEVALUE, EDIF_TOK_APPLY,
3461 			     EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3462 static short f_SimulationInfo[] = {EDIF_TOK_LOGICVALUE, EDIF_TOK_COMMENT,
3463 				   EDIF_TOK_USERDATA};
3464 static short f_SingleValueSet[] = {EDIF_TOK_LESSTHAN, EDIF_TOK_GREATERTHAN,
3465 				   EDIF_TOK_ATMOST, EDIF_TOK_ATLEAST,
3466 				   EDIF_TOK_EXACTLY, EDIF_TOK_BETWEEN};
3467 static short f_Site[] = {EDIF_TOK_VIEWREF, EDIF_TOK_TRANSFORM};
3468 static short f_Socket[] = {EDIF_TOK_SYMMETRY};
3469 static short f_SocketSet[] = {EDIF_TOK_SYMMETRY, EDIF_TOK_SITE};
3470 static short f_Status[] = {EDIF_TOK_WRITTEN, EDIF_TOK_COMMENT,
3471 			   EDIF_TOK_USERDATA};
3472 static short f_Steady[] = {EDIF_TOK_NAME, EDIF_TOK_MEMBER, EDIF_TOK_PORTREF,
3473 			   EDIF_TOK_PORTLIST, EDIF_TOK_DURATION,
3474 			   EDIF_TOK_TRANSITION, EDIF_TOK_BECOMES};
3475 static short f_String[] = {EDIF_TOK_STRINGDISPLAY, EDIF_TOK_STRING};
3476 static short f_StringDisplay[] = {EDIF_TOK_DISPLAY};
3477 static short f_Strong[] = {EDIF_TOK_NAME};
3478 static short f_Symbol[] = {EDIF_TOK_PORTIMPLEMENTATION, EDIF_TOK_FIGURE,
3479 			   EDIF_TOK_INSTANCE, EDIF_TOK_COMMENTGRAPHICS,
3480 			   EDIF_TOK_ANNOTATE, -EDIF_TOK_PAGESIZE,
3481 			   -EDIF_TOK_BOUNDINGBOX, EDIF_TOK_PROPERTYDISPLAY,
3482 			   EDIF_TOK_KEYWORDDISPLAY, EDIF_TOK_PARAMETERDISPLAY,
3483 			   EDIF_TOK_PROPERTY, EDIF_TOK_COMMENT,
3484 			   EDIF_TOK_USERDATA};
3485 static short f_Symmetry[] = {EDIF_TOK_TRANSFORM};
3486 static short f_Table[] = {EDIF_TOK_ENTRY, EDIF_TOK_TABLEDEFAULT};
3487 static short f_TableDefault[] = {EDIF_TOK_LOGICREF, EDIF_TOK_PORTREF,
3488 				 EDIF_TOK_NOCHANGE, EDIF_TOK_TABLE,
3489 				 EDIF_TOK_DELAY, EDIF_TOK_LOADDELAY};
3490 static short f_Technology[] = {EDIF_TOK_NUMBERDEFINITION, EDIF_TOK_FIGUREGROUP,
3491 			       EDIF_TOK_FABRICATE, -EDIF_TOK_SIMULATIONINFO,
3492 			       EDIF_TOK_COMMENT, EDIF_TOK_USERDATA,
3493 			       -EDIF_TOK_PHYSICALDESIGNRULE};
3494 static short f_TimeInterval[] = {EDIF_TOK_EVENT, EDIF_TOK_OFFSETEVENT,
3495 				 EDIF_TOK_DURATION};
3496 static short f_Timing[] = {EDIF_TOK_DERIVATION, EDIF_TOK_PATHDELAY,
3497 			   EDIF_TOK_FORBIDDENEVENT, EDIF_TOK_COMMENT,
3498 			   EDIF_TOK_USERDATA};
3499 static short f_Transform[] = {EDIF_TOK_SCALEX, EDIF_TOK_SCALEY, EDIF_TOK_DELTA,
3500 			      EDIF_TOK_ORIENTATION, EDIF_TOK_ORIGIN};
3501 static short f_Transition[] = {EDIF_TOK_NAME, EDIF_TOK_LOGICLIST,
3502 			       EDIF_TOK_LOGICONEOF};
3503 static short f_Trigger[] = {EDIF_TOK_CHANGE, EDIF_TOK_STEADY,
3504 			    EDIF_TOK_INITIAL};
3505 static short f_Union[] = {EDIF_TOK_FIGUREGROUPREF, EDIF_TOK_INTERSECTION,
3506 			  EDIF_TOK_UNION, EDIF_TOK_DIFFERENCE,
3507 			  EDIF_TOK_INVERSE, EDIF_TOK_OVERSIZE};
3508 static short f_View[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME, EDIF_TOK_VIEWTYPE,
3509 			 EDIF_TOK_INTERFACE, -EDIF_TOK_STATUS,
3510 			 -EDIF_TOK_CONTENTS, EDIF_TOK_COMMENT,
3511 			 EDIF_TOK_PROPERTY, EDIF_TOK_USERDATA};
3512 static short f_ViewList[] = {EDIF_TOK_VIEWREF, EDIF_TOK_VIEWLIST};
3513 static short f_ViewMap[] = {EDIF_TOK_PORTMAP, EDIF_TOK_PORTBACKANNOTATE,
3514 			    EDIF_TOK_INSTANCEMAP,
3515 			    EDIF_TOK_INSTANCEBACKANNOTATE, EDIF_TOK_NETMAP,
3516 			    EDIF_TOK_NETBACKANNOTATE, EDIF_TOK_COMMENT,
3517 			    EDIF_TOK_USERDATA};
3518 static short f_ViewRef[] = {EDIF_TOK_NAME, EDIF_TOK_CELLREF};
3519 static short f_Visible[] = {EDIF_TOK_FALSE, EDIF_TOK_TRUE};
3520 static short f_VoltageMap[] = {EDIF_TOK_MNM, EDIF_TOK_E};
3521 static short f_WaveValue[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME, EDIF_TOK_E,
3522 			      EDIF_TOK_LOGICWAVEFORM};
3523 static short f_Weak[] = {EDIF_TOK_NAME};
3524 static short f_WeakJoined[] = {EDIF_TOK_PORTREF, EDIF_TOK_PORTLIST,
3525 			       EDIF_TOK_JOINED};
3526 static short f_When[] = {EDIF_TOK_TRIGGER, EDIF_TOK_AFTER,
3527 			 EDIF_TOK_FOLLOW, EDIF_TOK_MAINTAIN,
3528 			 EDIF_TOK_LOGICASSIGN, EDIF_TOK_COMMENT,
3529 			 EDIF_TOK_USERDATA};
3530 static short f_Written[] = {EDIF_TOK_TIMESTAMP, EDIF_TOK_AUTHOR,
3531 			    EDIF_TOK_PROGRAM, EDIF_TOK_DATAORIGIN,
3532 			    EDIF_TOK_PROPERTY, EDIF_TOK_COMMENT,
3533 			    EDIF_TOK_USERDATA};
3534 /*
3535  *	Context binding table:
3536  *
3537  *	  This binds context follower arrays to their originating context.
3538  */
3539 typedef struct Binder {
3540   short *Follower;		/* pointer to follower array */
3541   short Origin;			/* '%token' value of origin */
3542   short FollowerSize;		/* size of follower array */
3543 } Binder;
3544 #define	BE(f,o)			{f,o,sizeof(f)/sizeof(short)}
3545 static Binder BinderDef[] = {
3546   BE(f_NULL,			0),
3547   BE(f_Edif,			EDIF_TOK_EDIF),
3548   BE(f_AcLoad,			EDIF_TOK_ACLOAD),
3549   BE(f_After,			EDIF_TOK_AFTER),
3550   BE(f_Annotate,		EDIF_TOK_ANNOTATE),
3551   BE(f_Apply,			EDIF_TOK_APPLY),
3552   BE(f_Arc,			EDIF_TOK_ARC),
3553   BE(f_Array,			EDIF_TOK_ARRAY),
3554   BE(f_ArrayMacro,		EDIF_TOK_ARRAYMACRO),
3555   BE(f_ArrayRelatedInfo,	EDIF_TOK_ARRAYRELATEDINFO),
3556   BE(f_ArraySite,		EDIF_TOK_ARRAYSITE),
3557   BE(f_AtLeast,			EDIF_TOK_ATLEAST),
3558   BE(f_AtMost,			EDIF_TOK_ATMOST),
3559   BE(f_Becomes,			EDIF_TOK_BECOMES),
3560   BE(f_Boolean,			EDIF_TOK_BOOLEAN),
3561   BE(f_BooleanDisplay,		EDIF_TOK_BOOLEANDISPLAY),
3562   BE(f_BooleanMap,		EDIF_TOK_BOOLEANMAP),
3563   BE(f_BorderPattern,		EDIF_TOK_BORDERPATTERN),
3564   BE(f_BoundingBox,		EDIF_TOK_BOUNDINGBOX),
3565   BE(f_Cell,			EDIF_TOK_CELL),
3566   BE(f_CellRef,			EDIF_TOK_CELLREF),
3567   BE(f_Change,			EDIF_TOK_CHANGE),
3568   BE(f_Circle,			EDIF_TOK_CIRCLE),
3569   BE(f_Color,			EDIF_TOK_COLOR),
3570   BE(f_CommentGraphics,		EDIF_TOK_COMMENTGRAPHICS),
3571   BE(f_Compound,		EDIF_TOK_COMPOUND),
3572   BE(f_ConnectLocation,		EDIF_TOK_CONNECTLOCATION),
3573   BE(f_Contents,		EDIF_TOK_CONTENTS),
3574   BE(f_Criticality,		EDIF_TOK_CRITICALITY),
3575   BE(f_CurrentMap,		EDIF_TOK_CURRENTMAP),
3576   BE(f_Curve,			EDIF_TOK_CURVE),
3577   BE(f_Cycle,			EDIF_TOK_CYCLE),
3578   BE(f_DataOrigin,		EDIF_TOK_DATAORIGIN),
3579   BE(f_DcFanInLoad,		EDIF_TOK_DCFANINLOAD),
3580   BE(f_DcFanOutLoad,		EDIF_TOK_DCFANOUTLOAD),
3581   BE(f_DcMaxFanIn,		EDIF_TOK_DCMAXFANIN),
3582   BE(f_DcMaxFanOut,		EDIF_TOK_DCMAXFANOUT),
3583   BE(f_Delay,			EDIF_TOK_DELAY),
3584   BE(f_Delta,			EDIF_TOK_DELTA),
3585   BE(f_Design,			EDIF_TOK_DESIGN),
3586   BE(f_Designator,		EDIF_TOK_DESIGNATOR),
3587   BE(f_Difference,		EDIF_TOK_DIFFERENCE),
3588   BE(f_Display,			EDIF_TOK_DISPLAY),
3589   BE(f_Dominates,		EDIF_TOK_DOMINATES),
3590   BE(f_Dot,			EDIF_TOK_DOT),
3591   BE(f_Duration,		EDIF_TOK_DURATION),
3592   BE(f_EnclosureDistance,	EDIF_TOK_ENCLOSUREDISTANCE),
3593   BE(f_Entry,			EDIF_TOK_ENTRY),
3594   BE(f_Exactly,			EDIF_TOK_EXACTLY),
3595   BE(f_External,		EDIF_TOK_EXTERNAL),
3596   BE(f_Fabricate,		EDIF_TOK_FABRICATE),
3597   BE(f_Figure,			EDIF_TOK_FIGURE),
3598   BE(f_FigureArea,		EDIF_TOK_FIGUREAREA),
3599   BE(f_FigureGroup,		EDIF_TOK_FIGUREGROUP),
3600   BE(f_FigureGroupObject,	EDIF_TOK_FIGUREGROUPOBJECT),
3601   BE(f_FigureGroupOverride,	EDIF_TOK_FIGUREGROUPOVERRIDE),
3602   BE(f_FigureGroupRef,		EDIF_TOK_FIGUREGROUPREF),
3603   BE(f_FigurePerimeter,		EDIF_TOK_FIGUREPERIMETER),
3604   BE(f_FigureWidth,		EDIF_TOK_FIGUREWIDTH),
3605   BE(f_FillPattern,		EDIF_TOK_FILLPATTERN),
3606   BE(f_Follow,			EDIF_TOK_FOLLOW),
3607   BE(f_ForbiddenEvent,		EDIF_TOK_FORBIDDENEVENT),
3608   BE(f_GlobalPortRef,		EDIF_TOK_GLOBALPORTREF),
3609   BE(f_GreaterThan,		EDIF_TOK_GREATERTHAN),
3610   BE(f_GridMap,			EDIF_TOK_GRIDMAP),
3611   BE(f_IncludeFigureGroup,	EDIF_TOK_INCLUDEFIGUREGROUP),
3612   BE(f_Instance,		EDIF_TOK_INSTANCE),
3613   BE(f_InstanceBackAnnotate,	EDIF_TOK_INSTANCEBACKANNOTATE),
3614   BE(f_InstanceGroup,		EDIF_TOK_INSTANCEGROUP),
3615   BE(f_InstanceMap,		EDIF_TOK_INSTANCEMAP),
3616   BE(f_InstanceRef,		EDIF_TOK_INSTANCEREF),
3617   BE(f_Integer,			EDIF_TOK_INTEGER),
3618   BE(f_IntegerDisplay,		EDIF_TOK_INTEGERDISPLAY),
3619   BE(f_InterFigureGroupSpacing,	EDIF_TOK_INTERFIGUREGROUPSPACING),
3620   BE(f_Interface,		EDIF_TOK_INTERFACE),
3621   BE(f_Intersection,		EDIF_TOK_INTERSECTION),
3622   BE(f_IntraFigureGroupSpacing,	EDIF_TOK_INTRAFIGUREGROUPSPACING),
3623   BE(f_Inverse,			EDIF_TOK_INVERSE),
3624   BE(f_Joined,			EDIF_TOK_JOINED),
3625   BE(f_KeywordDisplay,		EDIF_TOK_KEYWORDDISPLAY),
3626   BE(f_KeywordMap,		EDIF_TOK_KEYWORDMAP),
3627   BE(f_LessThan,		EDIF_TOK_LESSTHAN),
3628   BE(f_Library,			EDIF_TOK_LIBRARY),
3629   BE(f_LibraryRef,		EDIF_TOK_LIBRARYREF),
3630   BE(f_ListOfNets,		EDIF_TOK_LISTOFNETS),
3631   BE(f_ListOfPorts,		EDIF_TOK_LISTOFPORTS),
3632   BE(f_LoadDelay,		EDIF_TOK_LOADDELAY),
3633   BE(f_LogicAssign,		EDIF_TOK_LOGICASSIGN),
3634   BE(f_LogicInput,		EDIF_TOK_LOGICINPUT),
3635   BE(f_LogicList,		EDIF_TOK_LOGICLIST),
3636   BE(f_LogicMapInput,		EDIF_TOK_LOGICMAPINPUT),
3637   BE(f_LogicMapOutput,		EDIF_TOK_LOGICMAPOUTPUT),
3638   BE(f_LogicOneOf,		EDIF_TOK_LOGICONEOF),
3639   BE(f_LogicOutput,		EDIF_TOK_LOGICOUTPUT),
3640   BE(f_LogicPort,		EDIF_TOK_LOGICPORT),
3641   BE(f_LogicRef,		EDIF_TOK_LOGICREF),
3642   BE(f_LogicValue,		EDIF_TOK_LOGICVALUE),
3643   BE(f_LogicWaveform,		EDIF_TOK_LOGICWAVEFORM),
3644   BE(f_Maintain,		EDIF_TOK_MAINTAIN),
3645   BE(f_Match,			EDIF_TOK_MATCH),
3646   BE(f_Member,			EDIF_TOK_MEMBER),
3647   BE(f_MiNoMax,			EDIF_TOK_MINOMAX),
3648   BE(f_MiNoMaxDisplay,		EDIF_TOK_MINOMAXDISPLAY),
3649   BE(f_Mnm,			EDIF_TOK_MNM),
3650   BE(f_MultipleValueSet,	EDIF_TOK_MULTIPLEVALUESET),
3651   BE(f_MustJoin,		EDIF_TOK_MUSTJOIN),
3652   BE(f_Name,			EDIF_TOK_NAME),
3653   BE(f_Net,			EDIF_TOK_NET),
3654   BE(f_NetBackAnnotate,		EDIF_TOK_NETBACKANNOTATE),
3655   BE(f_NetBundle,		EDIF_TOK_NETBUNDLE),
3656   BE(f_NetDelay,		EDIF_TOK_NETDELAY),
3657   BE(f_NetGroup,		EDIF_TOK_NETGROUP),
3658   BE(f_NetMap,			EDIF_TOK_NETMAP),
3659   BE(f_NetRef,			EDIF_TOK_NETREF),
3660   BE(f_NonPermutable,		EDIF_TOK_NONPERMUTABLE),
3661   BE(f_NotAllowed,		EDIF_TOK_NOTALLOWED),
3662   BE(f_NotchSpacing,		EDIF_TOK_NOTCHSPACING),
3663   BE(f_Number,			EDIF_TOK_NUMBER),
3664   BE(f_NumberDefinition,	EDIF_TOK_NUMBERDEFINITION),
3665   BE(f_NumberDisplay,		EDIF_TOK_NUMBERDISPLAY),
3666   BE(f_OffPageConnector,	EDIF_TOK_OFFPAGECONNECTOR),
3667   BE(f_OffsetEvent,		EDIF_TOK_OFFSETEVENT),
3668   BE(f_OpenShape,		EDIF_TOK_OPENSHAPE),
3669   BE(f_Origin,			EDIF_TOK_ORIGIN),
3670   BE(f_OverhangDistance,	EDIF_TOK_OVERHANGDISTANCE),
3671   BE(f_OverlapDistance,		EDIF_TOK_OVERLAPDISTANCE),
3672   BE(f_Oversize,		EDIF_TOK_OVERSIZE),
3673   BE(f_Page,			EDIF_TOK_PAGE),
3674   BE(f_PageSize,		EDIF_TOK_PAGESIZE),
3675   BE(f_Parameter,		EDIF_TOK_PARAMETER),
3676   BE(f_ParameterAssign,		EDIF_TOK_PARAMETERASSIGN),
3677   BE(f_ParameterDisplay,	EDIF_TOK_PARAMETERDISPLAY),
3678   BE(f_Path,			EDIF_TOK_PATH),
3679   BE(f_PathDelay,		EDIF_TOK_PATHDELAY),
3680   BE(f_Permutable,		EDIF_TOK_PERMUTABLE),
3681   BE(f_PhysicalDesignRule,	EDIF_TOK_PHYSICALDESIGNRULE),
3682   BE(f_Plug,			EDIF_TOK_PLUG),
3683   BE(f_Point,			EDIF_TOK_POINT),
3684   BE(f_PointDisplay,		EDIF_TOK_POINTDISPLAY),
3685   BE(f_PointList,		EDIF_TOK_POINTLIST),
3686   BE(f_Polygon,			EDIF_TOK_POLYGON),
3687   BE(f_Port,			EDIF_TOK_PORT),
3688   BE(f_PortBackAnnotate,	EDIF_TOK_PORTBACKANNOTATE),
3689   BE(f_PortBundle,		EDIF_TOK_PORTBUNDLE),
3690   BE(f_PortDelay,		EDIF_TOK_PORTDELAY),
3691   BE(f_PortGroup,		EDIF_TOK_PORTGROUP),
3692   BE(f_PortImplementation,	EDIF_TOK_PORTIMPLEMENTATION),
3693   BE(f_PortInstance,		EDIF_TOK_PORTINSTANCE),
3694   BE(f_PortList,		EDIF_TOK_PORTLIST),
3695   BE(f_PortListAlias,		EDIF_TOK_PORTLISTALIAS),
3696   BE(f_PortMap,			EDIF_TOK_PORTMAP),
3697   BE(f_PortRef,			EDIF_TOK_PORTREF),
3698   BE(f_Program,			EDIF_TOK_PROGRAM),
3699   BE(f_Property,		EDIF_TOK_PROPERTY),
3700   BE(f_PropertyDisplay,		EDIF_TOK_PROPERTYDISPLAY),
3701   BE(f_ProtectionFrame,		EDIF_TOK_PROTECTIONFRAME),
3702   BE(f_RangeVector,		EDIF_TOK_RANGEVECTOR),
3703   BE(f_Rectangle,		EDIF_TOK_RECTANGLE),
3704   BE(f_RectangleSize,		EDIF_TOK_RECTANGLESIZE),
3705   BE(f_Rename,			EDIF_TOK_RENAME),
3706   BE(f_Resolves,		EDIF_TOK_RESOLVES),
3707   BE(f_Scale,			EDIF_TOK_SCALE),
3708   BE(f_Section,			EDIF_TOK_SECTION),
3709   BE(f_Shape,			EDIF_TOK_SHAPE),
3710   BE(f_Simulate,		EDIF_TOK_SIMULATE),
3711   BE(f_SimulationInfo,		EDIF_TOK_SIMULATIONINFO),
3712   BE(f_SingleValueSet,		EDIF_TOK_SINGLEVALUESET),
3713   BE(f_Site,			EDIF_TOK_SITE),
3714   BE(f_Socket,			EDIF_TOK_SOCKET),
3715   BE(f_SocketSet,		EDIF_TOK_SOCKETSET),
3716   BE(f_Status,			EDIF_TOK_STATUS),
3717   BE(f_Steady,			EDIF_TOK_STEADY),
3718   BE(f_String,			EDIF_TOK_STRING),
3719   BE(f_StringDisplay,		EDIF_TOK_STRINGDISPLAY),
3720   BE(f_Strong,			EDIF_TOK_STRONG),
3721   BE(f_Symbol,			EDIF_TOK_SYMBOL),
3722   BE(f_Symmetry,		EDIF_TOK_SYMMETRY),
3723   BE(f_Table,			EDIF_TOK_TABLE),
3724   BE(f_TableDefault,		EDIF_TOK_TABLEDEFAULT),
3725   BE(f_Technology,		EDIF_TOK_TECHNOLOGY),
3726   BE(f_TimeInterval,		EDIF_TOK_TIMEINTERVAL),
3727   BE(f_Timing,			EDIF_TOK_TIMING),
3728   BE(f_Transform,		EDIF_TOK_TRANSFORM),
3729   BE(f_Transition,		EDIF_TOK_TRANSITION),
3730   BE(f_Trigger,			EDIF_TOK_TRIGGER),
3731   BE(f_Union,			EDIF_TOK_UNION),
3732   BE(f_View,			EDIF_TOK_VIEW),
3733   BE(f_ViewList,		EDIF_TOK_VIEWLIST),
3734   BE(f_ViewMap,			EDIF_TOK_VIEWMAP),
3735   BE(f_ViewRef,			EDIF_TOK_VIEWREF),
3736   BE(f_Visible,			EDIF_TOK_VISIBLE),
3737   BE(f_VoltageMap,		EDIF_TOK_VOLTAGEMAP),
3738   BE(f_WaveValue,		EDIF_TOK_WAVEVALUE),
3739   BE(f_Weak,			EDIF_TOK_WEAK),
3740   BE(f_WeakJoined,		EDIF_TOK_WEAKJOINED),
3741   BE(f_When,			EDIF_TOK_WHEN),
3742   BE(f_Written,			EDIF_TOK_WRITTEN)
3743 };
3744 static int BinderDefSize = sizeof(BinderDef) / sizeof(Binder);
3745 /*
3746  *	Keyword table:
3747  *
3748  *	  This hash table holds all strings which may have to be matched
3749  *	to. WARNING: it is assumed that there is no overlap of the 'token'
3750  *	and 'context' strings.
3751  */
3752 typedef struct Keyword {
3753   struct Keyword *Next;	 	/* pointer to next entry */
3754   char *String;			/* pointer to associated string */
3755 } Keyword;
3756 #define	KEYWORD_HASH	127	/* hash table size */
3757 static Keyword *KeywordTable[KEYWORD_HASH];
3758 /*
3759  *	Enter keyword:
3760  *
3761  *	  The passed string is entered into the keyword hash table.
3762  */
EnterKeyword(char * str)3763 static void EnterKeyword(char * str)
3764 {
3765   /*
3766    *	Locals.
3767    */
3768   register Keyword *key;
3769   register unsigned int hsh;
3770   register char *cp;
3771   /*
3772    *	Create the hash code, and add an entry to the table.
3773    */
3774   for (hsh = 0, cp = str; *cp; hsh += hsh + *cp++);
3775   hsh %= KEYWORD_HASH;
3776   key = (Keyword *) Malloc(sizeof(Keyword));
3777   key->Next = KeywordTable[hsh];
3778   (KeywordTable[hsh] = key)->String = str;
3779 }
3780 /*
3781  *	Find keyword:
3782  *
3783  *	  The passed string is located within the keyword table. If an
3784  *	entry exists, then the value of the keyword string is returned. This
3785  *	is real useful for doing string comparisons by pointer value later.
3786  *	If there is no match, a NULL is returned.
3787  */
FindKeyword(char * str)3788 static char *FindKeyword(char * str)
3789 {
3790   /*
3791    *	Locals.
3792    */
3793   register Keyword *wlk,*owk;
3794   register unsigned int hsh;
3795   register char *cp;
3796   char lower[IDENT_LENGTH + 1];
3797   /*
3798    *	Create a lower case copy of the string.
3799    */
3800   for (cp = lower; *str;)
3801     if (isupper( (int) *str))
3802       *cp++ = tolower( (int) *str++);
3803     else
3804       *cp++ = *str++;
3805   *cp = '\0';
3806   /*
3807    *	Search the hash table for a match.
3808    */
3809   for (hsh = 0, cp = lower; *cp; hsh += hsh + *cp++);
3810   hsh %= KEYWORD_HASH;
3811   for (owk = NULL, wlk = KeywordTable[hsh]; wlk; wlk = (owk = wlk)->Next)
3812     if (!strcmp(wlk->String,lower)){
3813       /*
3814        *	Readjust the LRU.
3815        */
3816       if (owk){
3817       	owk->Next = wlk->Next;
3818       	wlk->Next = KeywordTable[hsh];
3819       	KeywordTable[hsh] = wlk;
3820       }
3821       return (wlk->String);
3822     }
3823   return (NULL);
3824 }
3825 /*
3826  *	Token hash table.
3827  */
3828 #define	TOKEN_HASH	51
3829 static Token *TokenHash[TOKEN_HASH];
3830 /*
3831  *	Find token:
3832  *
3833  *	  A pointer to the token of the passed code is returned. If
3834  *	no such beastie is present a NULL is returned instead.
3835  */
FindToken(register int cod)3836 static Token *FindToken(register int cod)
3837 {
3838   /*
3839    *	Locals.
3840    */
3841   register Token *wlk,*owk;
3842   register unsigned int hsh;
3843   /*
3844    *	Search the hash table for a matching token.
3845    */
3846   hsh = cod % TOKEN_HASH;
3847   for (owk = NULL, wlk = TokenHash[hsh]; wlk; wlk = (owk = wlk)->Next)
3848     if (cod == wlk->Code){
3849       if (owk){
3850       	owk->Next = wlk->Next;
3851       	wlk->Next = TokenHash[hsh];
3852       	TokenHash[hsh] = wlk;
3853       }
3854       break;
3855     }
3856   return (wlk);
3857 }
3858 /*
3859  *	Context hash table.
3860  */
3861 #define	CONTEXT_HASH	127
3862 static Context *ContextHash[CONTEXT_HASH];
3863 /*
3864  *	Find context:
3865  *
3866  *	  A pointer to the context of the passed code is returned. If
3867  *	no such beastie is present a NULL is returned instead.
3868  */
FindContext(register int cod)3869 static Context *FindContext(register int cod)
3870 {
3871   /*
3872    *	Locals.
3873    */
3874   register Context *wlk,*owk;
3875   register unsigned int hsh;
3876   /*
3877    *	Search the hash table for a matching context.
3878    */
3879   hsh = cod % CONTEXT_HASH;
3880   for (owk = NULL, wlk = ContextHash[hsh]; wlk; wlk = (owk = wlk)->Next)
3881     if (cod == wlk->Code){
3882       if (owk){
3883       	owk->Next = wlk->Next;
3884       	wlk->Next = ContextHash[hsh];
3885       	ContextHash[hsh] = wlk;
3886       }
3887       break;
3888     }
3889   return (wlk);
3890 }
3891 /*
3892  *	Parser state variables.
3893  */
3894 static FILE *Input = NULL;		/* input stream */
3895 static FILE *Error = NULL;		/* error stream */
3896 static char *InFile;			/* file name on the input stream */
3897 static long LineNumber;			/* current input line number */
3898 static ContextCar *CSP = NULL;		/* top of context stack */
3899 static char yytext[IDENT_LENGTH + 1];	/* token buffer */
3900 static char CharBuf[IDENT_LENGTH + 1];	/* garbage buffer */
3901 /*
3902  *	Token stacking variables.
3903  */
3904 #ifdef	DEBUG
3905 #define	TS_DEPTH	8
3906 #define	TS_MASK		(TS_DEPTH - 1)
3907 static unsigned int TSP = 0;		/* token stack pointer */
3908 static char *TokenStack[TS_DEPTH];	/* token name strings */
3909 static short TokenType[TS_DEPTH];	/* token types */
3910 /*
3911  *	Stack:
3912  *
3913  *	  Add a token to the debug stack. The passed string and type are
3914  *	what is to be pushed.
3915  */
Stack(char * str,int typ)3916 static int Stack(char * str, int typ)
3917 {
3918   /*
3919    *	Free any previous string, then push.
3920    */
3921   if (TokenStack[TSP & TS_MASK])
3922     Free(TokenStack[TSP & TS_MASK]);
3923   TokenStack[TSP & TS_MASK] = strcpy((char *)Malloc(strlen(str) + 1),str);
3924   TokenType[TSP & TS_MASK] = typ;
3925   TSP += 1;
3926   return 0;
3927 }
3928 /*
3929  *	Dump stack:
3930  *
3931  *	  This displays the last set of accumulated tokens.
3932  */
DumpStack()3933 static int DumpStack()
3934 {
3935   /*
3936    *	Locals.
3937    */
3938   register int i;
3939   register Context *cxt;
3940   register Token *tok;
3941   register char *nam;
3942   /*
3943    *	Run through the list displaying the oldest first.
3944    */
3945   fprintf(Error,"\n\n");
3946   for (i = 0; i < TS_DEPTH; i += 1)
3947     if (TokenStack[(TSP + i) & TS_MASK]){
3948       /*
3949        *	Get the type name string.
3950        */
3951       if ((cxt = FindContext(TokenType[(TSP + i) & TS_MASK])))
3952         nam = cxt->Name;
3953       else if ((tok = FindToken(TokenType[(TSP + i) & TS_MASK])))
3954         nam = tok->Name;
3955       else switch (TokenType[(TSP + i) & TS_MASK]){
3956       	case EDIF_TOK_IDENT:    nam = "IDENT";      break;
3957       	case EDIF_TOK_INT:      nam = "INT";        break;
3958       	case EDIF_TOK_KEYWORD:  nam = "KEYWORD";    break;
3959       	case EDIF_TOK_STR:      nam = "STR";        break;
3960       	default:                nam = "?";          break;
3961       }
3962       /*
3963        *	Now print the token state.
3964        */
3965       fprintf(Error,"%2d %-16.16s '%s'\n",TS_DEPTH - i,nam,
3966         TokenStack[(TSP + i) & TS_MASK]);
3967     }
3968   fprintf(Error,"\n");
3969   return 0;
3970 }
3971 #else
3972 #define	Stack(s,t)
3973 #endif	/* DEBUG */
3974 /*
3975  *	yyerror:
3976  *
3977  *	  Standard error reporter, it prints out the passed string
3978  *	preceeded by the current filename and line number.
3979  */
yyerror(const char * ers)3980 static void yyerror(const char *ers)
3981 {
3982 #ifdef	DEBUG
3983   DumpStack();
3984 #endif	/* DEBUG */
3985   fprintf(Error,"%s, line %ld: %s\n",InFile,LineNumber,ers);
3986 }
3987 /*
3988  *	String bucket definitions.
3989  */
3990 #define	BUCKET_SIZE	64
3991 typedef struct Bucket {
3992   struct Bucket *Next;			/* pointer to next bucket */
3993   int Index;				/* pointer to next free slot */
3994   char Data[BUCKET_SIZE];		/* string data */
3995 } Bucket;
3996 static Bucket *CurrentBucket = NULL;	/* string bucket list */
3997 static int StringSize = 0;		/* current string length */
3998 /*
3999  *	Push string:
4000  *
4001  *	  This adds the passed charater to the current string bucket.
4002  */
PushString(char chr)4003 static void PushString(char chr)
4004 {
4005   /*
4006    *	Locals.
4007    */
4008   register Bucket *bck;
4009   /*
4010    *	Make sure there is room for the push.
4011    */
4012   if ((bck = CurrentBucket)->Index >= BUCKET_SIZE){
4013     bck = (Bucket *) Malloc(sizeof(Bucket));
4014     bck->Next = CurrentBucket;
4015     (CurrentBucket = bck)->Index = 0;
4016   }
4017   /*
4018    *	Push the character.
4019    */
4020   bck->Data[bck->Index++] = chr;
4021   StringSize += 1;
4022 }
4023 /*
4024  *	Form string:
4025  *
4026  *	  This converts the current string bucket into a real live string,
4027  *	whose pointer is returned.
4028  */
FormString()4029 static char *FormString()
4030 {
4031   /*
4032    *	Locals.
4033    */
4034   register Bucket *bck;
4035   register char *cp;
4036   /*
4037    *	Allocate space for the string, set the pointer at the end.
4038    */
4039   cp = (char *) Malloc(StringSize + 1);
4040 
4041   cp += StringSize;
4042   *cp-- = '\0';
4043   /*
4044    *	Yank characters out of the bucket.
4045    */
4046   for (bck = CurrentBucket; bck->Index || bck->Next;){
4047     if (!bck->Index){
4048       CurrentBucket = bck->Next;
4049       Free(bck);
4050       bck = CurrentBucket;
4051     }
4052     *cp-- = bck->Data[--bck->Index];
4053   }
4054   /* reset buffer size  to zero */
4055   StringSize =0;
4056   return (cp + 1);
4057 }
4058 /*
4059  *	Parse EDIF:
4060  *
4061  *	  This builds the context tree and then calls the real parser.
4062  *	It is passed two file streams, the first is where the input comes
4063  *	from; the second is where error messages get printed.
4064  */
ParseEDIF(char * filename,FILE * err)4065 void ParseEDIF(char* filename,FILE* err)
4066 {
4067   /*
4068    *	Locals.
4069    */
4070   register int i;
4071   static int ContextDefined = 1;
4072   /*
4073    *	Set up the file state to something useful.
4074    */
4075   InFile = filename;
4076   Input = fopen(filename,"r");
4077   Error = err;
4078   LineNumber = 1;
4079   /*
4080    *	Define both the enabled token and context strings.
4081    */
4082   if (ContextDefined){
4083     for (i = TokenDefSize; i--; EnterKeyword(TokenDef[i].Name)){
4084       register unsigned int hsh;
4085       hsh = TokenDef[i].Code % TOKEN_HASH;
4086       TokenDef[i].Next = TokenHash[hsh];
4087       TokenHash[hsh] = &TokenDef[i];
4088     }
4089     for (i = ContextDefSize; i--; EnterKeyword(ContextDef[i].Name)){
4090       register unsigned int hsh;
4091       hsh = ContextDef[i].Code % CONTEXT_HASH;
4092       ContextDef[i].Next = ContextHash[hsh];
4093       ContextHash[hsh] = &ContextDef[i];
4094     }
4095     /*
4096      *	Build the context tree.
4097      */
4098     for (i = BinderDefSize; i--;){
4099       register Context *cxt;
4100       register int j;
4101       /*
4102        *	Define the current context to have carriers bound to it.
4103        */
4104       cxt = FindContext(BinderDef[i].Origin);
4105       for (j = BinderDef[i].FollowerSize; j--;){
4106         register ContextCar *cc;
4107         /*
4108          *	Add carriers to the current context.
4109          */
4110         cc = (ContextCar *) Malloc(sizeof(ContextCar));
4111         cc->Next = cxt->Context;
4112         (cxt->Context = cc)->Context =
4113           FindContext(ABS(BinderDef[i].Follower[j]));
4114         cc->u.Single = BinderDef[i].Follower[j] < 0;
4115       }
4116     }
4117     /*
4118      *	Build the token tree.
4119      */
4120     for (i = TieDefSize; i--;){
4121       register Context *cxt;
4122       register int j;
4123       /*
4124        *	Define the current context to have carriers bound to it.
4125        */
4126       cxt = FindContext(TieDef[i].Origin);
4127       for (j = TieDef[i].EnableSize; j--;){
4128         register TokenCar *tc;
4129         /*
4130          *	Add carriers to the current context.
4131          */
4132         tc = (TokenCar *) Malloc(sizeof(TokenCar));
4133         tc->Next = cxt->Token;
4134         (cxt->Token = tc)->Token = FindToken(TieDef[i].Enable[j]);
4135       }
4136     }
4137     /*
4138      *	Put a bogus context on the stack which has 'EDIF' as its
4139      *	follower.
4140      */
4141     CSP = (ContextCar *) Malloc(sizeof(ContextCar));
4142     CSP->Next = NULL;
4143     CSP->Context = FindContext(0);
4144     CSP->u.Used = NULL;
4145     ContextDefined = 0;
4146   }
4147   /*
4148    *	Create an initial, empty string bucket.
4149    */
4150   CurrentBucket = (Bucket *) Malloc(sizeof(Bucket));
4151   CurrentBucket->Next = 0;
4152   CurrentBucket->Index = 0;
4153   /*
4154    *	Fill the token stack with NULLs if debugging is enabled.
4155    */
4156 #ifdef	DEBUG
4157   for (i = TS_DEPTH; i--; TokenStack[i] = NULL)
4158     if (TokenStack[i])
4159       Free(TokenStack[i]);
4160   TSP = 0;
4161 #endif	/* DEBUG */
4162   /*
4163    *	Go parse things!
4164    */
4165   edifparse();
4166 }
4167 /*
4168  *	Match token:
4169  *
4170  *	  The passed string is looked up in the current context's token
4171  *	list to see if it is enabled. If so the token value is returned,
4172  *	if not then zero.
4173  */
MatchToken(register char * str)4174 static int MatchToken(register char * str)
4175 {
4176   /*
4177    *	Locals.
4178    */
4179   register TokenCar *wlk,*owk;
4180   /*
4181    *	Convert the string to the proper form, then search the token
4182    *	carrier list for a match.
4183    */
4184   str = FindKeyword(str);
4185   for (owk = NULL, wlk = CSP->Context->Token; wlk; wlk = (owk = wlk)->Next)
4186     if (str == wlk->Token->Name){
4187       if (owk){
4188         owk->Next = wlk->Next;
4189         wlk->Next = CSP->Context->Token;
4190         CSP->Context->Token = wlk;
4191       }
4192       return (wlk->Token->Code);
4193     }
4194   return (0);
4195 }
4196 /*
4197  *	Match context:
4198  *
4199  *	  If the passed keyword string is within the current context, the
4200  *	new context is pushed and token value is returned. A zero otherwise.
4201  */
MatchContext(register char * str)4202 static int MatchContext(register char * str)
4203 {
4204   /*
4205    *	Locals.
4206    */
4207   register ContextCar *wlk,*owk;
4208   /*
4209    *	See if the context is present.
4210    */
4211   str = FindKeyword(str);
4212   for (owk = NULL, wlk = CSP->Context->Context; wlk; wlk = (owk = wlk)->Next)
4213     if (str == wlk->Context->Name){
4214       if (owk){
4215       	owk->Next = wlk->Next;
4216       	wlk->Next = CSP->Context->Context;
4217       	CSP->Context->Context = wlk;
4218       }
4219       /*
4220        *	If a single context, make sure it isn't already used.
4221        */
4222       if (wlk->u.Single){
4223       	register UsedCar *usc;
4224       	for (usc = CSP->u.Used; usc; usc = usc->Next)
4225       	  if (usc->Code == wlk->Context->Code)
4226       	    break;
4227       	if (usc){
4228       	  sprintf(CharBuf,"'%s' is used more than once within '%s'",
4229       	    str,CSP->Context->Name);
4230       	  yyerror(CharBuf);
4231       	} else {
4232       	  usc = (UsedCar *) Malloc(sizeof(UsedCar));
4233       	  usc->Next = CSP->u.Used;
4234       	  (CSP->u.Used = usc)->Code = wlk->Context->Code;
4235       	}
4236       }
4237       /*
4238        *	Push the new context.
4239        */
4240       owk = (ContextCar *) Malloc(sizeof(ContextCar));
4241       owk->Next = CSP;
4242       (CSP = owk)->Context = wlk->Context;
4243       owk->u.Used = NULL;
4244       return (wlk->Context->Code);
4245     }
4246   return (0);
4247 }
4248 /*
4249  *	PopC:
4250  *
4251  *	  This pops the current context.
4252  */
PopC()4253 static void PopC()
4254 {
4255   /*
4256    *	Locals.
4257    */
4258   register UsedCar *usc;
4259   register ContextCar *csp;
4260   /*
4261    *	Release single markers and pop context.
4262    */
4263   while ( (usc = CSP->u.Used) ){
4264     CSP->u.Used = usc->Next;
4265     Free(usc);
4266   }
4267   csp = CSP->Next;
4268   Free(CSP);
4269   CSP = csp;
4270 }
4271 /*
4272  *	Lexical analyzer states.
4273  */
4274 #define	L_START		0
4275 #define	L_INT		1
4276 #define	L_IDENT		2
4277 #define	L_KEYWORD	3
4278 #define	L_STRING	4
4279 #define	L_KEYWORD2	5
4280 #define	L_ASCIICHAR	6
4281 #define	L_ASCIICHAR2	7
4282 /*
4283  *	yylex:
4284  *
4285  *	  This is the lexical analyzer called by the YACC/BISON parser.
4286  *	It returns a pretty restricted set of token types and does the
4287  *	context movement when acceptable keywords are found. The token
4288  *	value returned is a NULL terminated string to allocated storage
4289  *	(ie - it should get released some time) with some restrictions.
4290  *	  The token value for integers is strips a leading '+' if present.
4291  *	String token values have the leading and trailing '"'-s stripped.
4292  *	'%' conversion characters in string values are passed converted.
4293  *	The '(' and ')' characters do not have a token value.
4294  */
yylex()4295 static int yylex()
4296 {
4297   /*
4298    *	Locals.
4299    */
4300   register int c,s,l;
4301   /*
4302    *	Keep on sucking up characters until we find something which
4303    *	explicitly forces us out of this function.
4304    */
4305   for (s = L_START, l = 0; 1;){
4306     yytext[l++] = c = Getc(Input);
4307     switch (s){
4308       /*
4309        *	Starting state, look for something resembling a token.
4310        */
4311       case L_START:
4312         if (isdigit(c) || c == '-')
4313           s = L_INT;
4314         else if (isalpha(c) || c == '&')
4315           s = L_IDENT;
4316         else if (isspace(c)){
4317           if (c == '\n')
4318             LineNumber += 1;
4319           l = 0;
4320         } else if (c == '('){
4321           l = 0;
4322           s = L_KEYWORD;
4323         } else if (c == '"')
4324           s = L_STRING;
4325         else if (c == '+'){
4326           l = 0;				/* strip '+' */
4327           s = L_INT;
4328         } else if (c == EOF)
4329           return ('\0');
4330         else {
4331           yytext[1] = '\0';
4332           Stack(yytext,c);
4333           return (c);
4334         }
4335         break;
4336       /*
4337        *	Suck up the integer digits.
4338        */
4339       case L_INT:
4340         if (isdigit(c))
4341           break;
4342         Ungetc(c);
4343         yytext[--l] = '\0';
4344         yylval.s = strcpy((char *)Malloc(l + 1),yytext);
4345         Stack(yytext,EDIF_TOK_INT);
4346         return (EDIF_TOK_INT);
4347       /*
4348        *	Grab an identifier, see if the current context enables
4349        *	it with a specific token value.
4350        */
4351       case L_IDENT:
4352         if (isalpha(c) || isdigit(c) || c == '_')
4353           break;
4354         Ungetc(c);
4355         yytext[--l] = '\0';
4356         if (CSP->Context->Token && (c = MatchToken(yytext))){
4357           Stack(yytext,c);
4358           return (c);
4359         }
4360         yylval.s = strcpy((char *)Malloc(l + 1),yytext);
4361         Stack(yytext, EDIF_TOK_IDENT);
4362         return (EDIF_TOK_IDENT);
4363       /*
4364        *	Scan until you find the start of an identifier, discard
4365        *	any whitespace found. On no identifier, return a '('.
4366        */
4367       case L_KEYWORD:
4368         if (isalpha(c) || c == '&'){
4369           s = L_KEYWORD2;
4370           break;
4371         } else if (isspace(c)){
4372           l = 0;
4373           break;
4374         }
4375         Ungetc(c);
4376         Stack("(",'(');
4377         return ('(');
4378       /*
4379        *	Suck up the keyword identifier, if it matches the set of
4380        *	allowable contexts then return its token value and push
4381        *	the context, otherwise just return the identifier string.
4382        */
4383       case L_KEYWORD2:
4384         if (isalpha(c) || isdigit(c) || c == '_')
4385           break;
4386         Ungetc(c);
4387         yytext[--l] = '\0';
4388         if ( (c = MatchContext(yytext)) ){
4389           Stack(yytext,c);
4390           return (c);
4391         }
4392         yylval.s = strcpy((char *)Malloc(l + 1),yytext);
4393         Stack(yytext, EDIF_TOK_KEYWORD);
4394         return (EDIF_TOK_KEYWORD);
4395       /*
4396        *	Suck up string characters but once resolved they should
4397        *	be deposited in the string bucket because they can be
4398        *	arbitrarily long.
4399        */
4400       case L_STRING:
4401         if (c == '\n')
4402           LineNumber += 1;
4403         else if (c == '\r')
4404           ;
4405         else if (c == '"' || c == EOF){
4406           yylval.s = FormString();
4407           Stack(yylval.s, EDIF_TOK_STR);
4408           return (EDIF_TOK_STR);
4409         } else if (c == '%')
4410           s = L_ASCIICHAR;
4411         else
4412           PushString(c);
4413         l = 0;
4414         break;
4415       /*
4416        *	Skip white space and look for integers to be pushed
4417        *	as characters.
4418        */
4419       case L_ASCIICHAR:
4420         if (isdigit(c)){
4421           s = L_ASCIICHAR2;
4422           break;
4423         } else if (c == '%' || c == EOF)
4424           s = L_STRING;
4425         else if (c == '\n')
4426           LineNumber += 1;
4427         l = 0;
4428         break;
4429       /*
4430        *	Convert the accumulated integer into a char and push.
4431        */
4432       case L_ASCIICHAR2:
4433         if (isdigit(c))
4434           break;
4435         Ungetc(c);
4436         yytext[--l] = '\0';
4437         PushString(atoi(yytext));
4438         s = L_ASCIICHAR;
4439         l = 0;
4440         break;
4441     }
4442   }
4443 }
4444