Fix poly_ComputeInteriorPoint() to work correctly for holes
[geda-pcb/gde.git] / src / edif.y
blob1bad8ff70ec07d062dd7f73994718040ca89924d
1 %{
2 /*
3 * PCB Edif parser based heavily on:
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>
21 /* for malloc, free, atoi */
22 #include <stdlib.h>
24 /* for strcpy */
25 #include <string.h>
27 #include <ctype.h>
29 #include "global.h"
30 #include "data.h"
31 /* from mymem.h, not include because of the malloc junk */
32 LibraryMenuTypePtr GetLibraryMenuMemory (LibraryTypePtr);
33 LibraryEntryTypePtr GetLibraryEntryMemory (LibraryMenuTypePtr);
36 * Local definitions.
38 #define IDENT_LENGTH 255
39 #define Malloc(s) malloc(s)
40 #define Free(p) free(p)
41 #define ABS(v) ((v) < 0 ? -(v) : (v))
42 #define Getc(s) getc(s)
43 #define Ungetc(c) ungetc(c,Input)
45 typedef struct _str_pair
47 char* str1;
48 char* str2;
49 struct _str_pair* next;
50 } str_pair;
52 typedef struct _pair_list
54 char* name;
55 str_pair* list;
56 } pair_list;
58 str_pair* new_str_pair(char* s1, char* s2)
60 str_pair* ps = malloc(sizeof(str_pair));
61 ps->str1 = s1;
62 ps->str2 = s2;
63 ps->next = NULL;
64 return ps;
67 pair_list* new_pair_list(str_pair* ps)
69 pair_list* pl = malloc(sizeof(pair_list));
70 pl->list = ps;
71 pl->name = NULL;
72 return pl;
75 void str_pair_free(str_pair* ps)
77 str_pair* node;
78 while ( ps )
80 free(ps->str1);
81 free(ps->str2);
82 node = ps;
83 ps = ps->next;
84 free(node);
88 void pair_list_free(pair_list* pl)
90 str_pair_free(pl->list);
91 free(pl->name);
92 free(pl);
95 void define_pcb_net(str_pair* name, pair_list* nodes)
97 int tl;
98 str_pair* done_node;
99 str_pair* node;
100 char* buf;
101 char* p;
102 LibraryEntryTypePtr entry;
103 LibraryMenuTypePtr menu = GetLibraryMenuMemory (&PCB->NetlistLib);
105 if ( !name->str1 )
107 /* no net name given, stop now */
108 /* if renamed str2 also exists and must be freed */
109 if ( name->str2 ) free(name->str2);
110 free(name);
111 pair_list_free(nodes);
112 return;
114 menu->Name = strdup (name->str1);
115 free(name->str1);
116 /* if renamed str2 also exists and must be freed */
117 if ( name->str2 ) free(name->str2);
118 free(name);
119 buf = malloc(256);
120 if ( !buf )
122 /* no memory */
123 pair_list_free(nodes);
124 return;
127 node = nodes->list;
128 free(nodes->name);
129 free(nodes);
130 while ( node )
132 /* check for node with no instance */
133 if ( !node->str1 )
135 /* toss it and move on */
136 free(node->str2);
137 done_node = node;
138 node = node->next;
139 free(done_node);
140 continue;
142 tl = strlen(node->str1) + strlen(node->str2);
143 if ( tl + 3 > 256 )
145 free(buf);
146 buf = malloc(tl+3);
147 if ( !buf )
149 /* no memory */
150 str_pair_free(node);
151 return;
154 strcpy(buf,node->str1);
155 /* make all upper case, because of PCB funky behaviour */
156 p=buf;
157 while ( *p )
159 *p = toupper( (int) *p);
160 p++;
162 /* add dash separating designator from node */
163 *(buf+strlen(node->str1)) = '-';
164 /* check for the edif number prefix */
165 if ( node->str2[0] == '&' )
167 /* skip number prefix */
168 strcpy(buf+strlen(node->str1)+1,node->str2 +1);
170 else
172 strcpy(buf+strlen(node->str1)+1,node->str2);
174 /* free the strings */
175 free(node->str1);
176 free(node->str2);
177 entry = GetLibraryEntryMemory (menu);
178 entry->ListEntry = strdup(buf);
179 done_node = node;
180 node = node->next;
181 free(done_node);
186 /* forward function declarations */
187 static int yylex(void);
188 static void yyerror(const char *);
189 static void PopC(void);
192 %name-prefix="edif"
194 %union {
195 char* s;
196 pair_list* pl;
197 str_pair* ps;
200 %type <s> Int Ident Str Keyword Name _Name
201 %type <ps> PortRef _PortRef NetNameDef NameDef
202 %type <ps> Rename _Joined
203 %type <s>__Rename _Rename NameRef
204 %type <s> InstanceRef InstNameRef Member PortNameRef
205 %type <pl> Net _Net Joined
207 %token <s> EDIF_TOK_IDENT
208 %token <s> EDIF_TOK_INT
209 %token <s> EDIF_TOK_KEYWORD
210 %token <s> EDIF_TOK_STR
212 %token EDIF_TOK_ANGLE
213 %token EDIF_TOK_BEHAVIOR
214 %token EDIF_TOK_CALCULATED
215 %token EDIF_TOK_CAPACITANCE
216 %token EDIF_TOK_CENTERCENTER
217 %token EDIF_TOK_CENTERLEFT
218 %token EDIF_TOK_CENTERRIGHT
219 %token EDIF_TOK_CHARGE
220 %token EDIF_TOK_CONDUCTANCE
221 %token EDIF_TOK_CURRENT
222 %token EDIF_TOK_DISTANCE
223 %token EDIF_TOK_DOCUMENT
224 %token EDIF_TOK_ENERGY
225 %token EDIF_TOK_EXTEND
226 %token EDIF_TOK_FLUX
227 %token EDIF_TOK_FREQUENCY
228 %token EDIF_TOK_GENERIC
229 %token EDIF_TOK_GRAPHIC
230 %token EDIF_TOK_INDUCTANCE
231 %token EDIF_TOK_INOUT
232 %token EDIF_TOK_INPUT
233 %token EDIF_TOK_LOGICMODEL
234 %token EDIF_TOK_LOWERCENTER
235 %token EDIF_TOK_LOWERLEFT
236 %token EDIF_TOK_LOWERRIGHT
237 %token EDIF_TOK_MASKLAYOUT
238 %token EDIF_TOK_MASS
239 %token EDIF_TOK_MEASURED
240 %token EDIF_TOK_MX
241 %token EDIF_TOK_MXR90
242 %token EDIF_TOK_MY
243 %token EDIF_TOK_MYR90
244 %token EDIF_TOK_NETLIST
245 %token EDIF_TOK_OUTPUT
246 %token EDIF_TOK_PCBLAYOUT
247 %token EDIF_TOK_POWER
248 %token EDIF_TOK_R0
249 %token EDIF_TOK_R180
250 %token EDIF_TOK_R270
251 %token EDIF_TOK_R90
252 %token EDIF_TOK_REQUIRED
253 %token EDIF_TOK_RESISTANCE
254 %token EDIF_TOK_RIPPER
255 %token EDIF_TOK_ROUND
256 %token EDIF_TOK_SCHEMATIC
257 %token EDIF_TOK_STRANGER
258 %token EDIF_TOK_SYMBOLIC
259 %token EDIF_TOK_TEMPERATURE
260 %token EDIF_TOK_TIE
261 %token EDIF_TOK_TIME
262 %token EDIF_TOK_TRUNCATE
263 %token EDIF_TOK_UPPERCENTER
264 %token EDIF_TOK_UPPERLEFT
265 %token EDIF_TOK_UPPERRIGHT
266 %token EDIF_TOK_VOLTAGE
268 %token EDIF_TOK_ACLOAD
269 %token EDIF_TOK_AFTER
270 %token EDIF_TOK_ANNOTATE
271 %token EDIF_TOK_APPLY
272 %token EDIF_TOK_ARC
273 %token EDIF_TOK_ARRAY
274 %token EDIF_TOK_ARRAYMACRO
275 %token EDIF_TOK_ARRAYRELATEDINFO
276 %token EDIF_TOK_ARRAYSITE
277 %token EDIF_TOK_ATLEAST
278 %token EDIF_TOK_ATMOST
279 %token EDIF_TOK_AUTHOR
280 %token EDIF_TOK_BASEARRAY
281 %token EDIF_TOK_BECOMES
282 %token EDIF_TOK_BETWEEN
283 %token EDIF_TOK_BOOLEAN
284 %token EDIF_TOK_BOOLEANDISPLAY
285 %token EDIF_TOK_BOOLEANMAP
286 %token EDIF_TOK_BORDERPATTERN
287 %token EDIF_TOK_BORDERWIDTH
288 %token EDIF_TOK_BOUNDINGBOX
289 %token EDIF_TOK_CELL
290 %token EDIF_TOK_CELLREF
291 %token EDIF_TOK_CELLTYPE
292 %token EDIF_TOK_CHANGE
293 %token EDIF_TOK_CIRCLE
294 %token EDIF_TOK_COLOR
295 %token EDIF_TOK_COMMENT
296 %token EDIF_TOK_COMMENTGRAPHICS
297 %token EDIF_TOK_COMPOUND
298 %token EDIF_TOK_CONNECTLOCATION
299 %token EDIF_TOK_CONTENTS
300 %token EDIF_TOK_CORNERTYPE
301 %token EDIF_TOK_CRITICALITY
302 %token EDIF_TOK_CURRENTMAP
303 %token EDIF_TOK_CURVE
304 %token EDIF_TOK_CYCLE
305 %token EDIF_TOK_DATAORIGIN
306 %token EDIF_TOK_DCFANINLOAD
307 %token EDIF_TOK_DCFANOUTLOAD
308 %token EDIF_TOK_DCMAXFANIN
309 %token EDIF_TOK_DCMAXFANOUT
310 %token EDIF_TOK_DELAY
311 %token EDIF_TOK_DELTA
312 %token EDIF_TOK_DERIVATION
313 %token EDIF_TOK_DESIGN
314 %token EDIF_TOK_DESIGNATOR
315 %token EDIF_TOK_DIFFERENCE
316 %token EDIF_TOK_DIRECTION
317 %token EDIF_TOK_DISPLAY
318 %token EDIF_TOK_DOMINATES
319 %token EDIF_TOK_DOT
320 %token EDIF_TOK_DURATION
321 %token EDIF_TOK_E
322 %token EDIF_TOK_EDIF
323 %token EDIF_TOK_EDIFLEVEL
324 %token EDIF_TOK_EDIFVERSION
325 %token EDIF_TOK_ENCLOSUREDISTANCE
326 %token EDIF_TOK_ENDTYPE
327 %token EDIF_TOK_ENTRY
328 %token EDIF_TOK_EVENT
329 %token EDIF_TOK_EXACTLY
330 %token EDIF_TOK_EXTERNAL
331 %token EDIF_TOK_FABRICATE
332 %token EDIF_TOK_FALSE
333 %token EDIF_TOK_FIGURE
334 %token EDIF_TOK_FIGUREAREA
335 %token EDIF_TOK_FIGUREGROUP
336 %token EDIF_TOK_FIGUREGROUPOBJECT
337 %token EDIF_TOK_FIGUREGROUPOVERRIDE
338 %token EDIF_TOK_FIGUREGROUPREF
339 %token EDIF_TOK_FIGUREPERIMETER
340 %token EDIF_TOK_FIGUREWIDTH
341 %token EDIF_TOK_FILLPATTERN
342 %token EDIF_TOK_FOLLOW
343 %token EDIF_TOK_FORBIDDENEVENT
344 %token EDIF_TOK_GLOBALPORTREF
345 %token EDIF_TOK_GREATERTHAN
346 %token EDIF_TOK_GRIDMAP
347 %token EDIF_TOK_IGNORE
348 %token EDIF_TOK_INCLUDEFIGUREGROUP
349 %token EDIF_TOK_INITIAL
350 %token EDIF_TOK_INSTANCE
351 %token EDIF_TOK_INSTANCEBACKANNOTATE
352 %token EDIF_TOK_INSTANCEGROUP
353 %token EDIF_TOK_INSTANCEMAP
354 %token EDIF_TOK_INSTANCEREF
355 %token EDIF_TOK_INTEGER
356 %token EDIF_TOK_INTEGERDISPLAY
357 %token EDIF_TOK_INTERFACE
358 %token EDIF_TOK_INTERFIGUREGROUPSPACING
359 %token EDIF_TOK_INTERSECTION
360 %token EDIF_TOK_INTRAFIGUREGROUPSPACING
361 %token EDIF_TOK_INVERSE
362 %token EDIF_TOK_ISOLATED
363 %token EDIF_TOK_JOINED
364 %token EDIF_TOK_JUSTIFY
365 %token EDIF_TOK_KEYWORDDISPLAY
366 %token EDIF_TOK_KEYWORDLEVEL
367 %token EDIF_TOK_KEYWORDMAP
368 %token EDIF_TOK_LESSTHAN
369 %token EDIF_TOK_LIBRARY
370 %token EDIF_TOK_LIBRARYREF
371 %token EDIF_TOK_LISTOFNETS
372 %token EDIF_TOK_LISTOFPORTS
373 %token EDIF_TOK_LOADDELAY
374 %token EDIF_TOK_LOGICASSIGN
375 %token EDIF_TOK_LOGICINPUT
376 %token EDIF_TOK_LOGICLIST
377 %token EDIF_TOK_LOGICMAPINPUT
378 %token EDIF_TOK_LOGICMAPOUTPUT
379 %token EDIF_TOK_LOGICONEOF
380 %token EDIF_TOK_LOGICOUTPUT
381 %token EDIF_TOK_LOGICPORT
382 %token EDIF_TOK_LOGICREF
383 %token EDIF_TOK_LOGICVALUE
384 %token EDIF_TOK_LOGICWAVEFORM
385 %token EDIF_TOK_MAINTAIN
386 %token EDIF_TOK_MATCH
387 %token EDIF_TOK_MEMBER
388 %token EDIF_TOK_MINOMAX
389 %token EDIF_TOK_MINOMAXDISPLAY
390 %token EDIF_TOK_MNM
391 %token EDIF_TOK_MULTIPLEVALUESET
392 %token EDIF_TOK_MUSTJOIN
393 %token EDIF_TOK_NAME
394 %token EDIF_TOK_NET
395 %token EDIF_TOK_NETBACKANNOTATE
396 %token EDIF_TOK_NETBUNDLE
397 %token EDIF_TOK_NETDELAY
398 %token EDIF_TOK_NETGROUP
399 %token EDIF_TOK_NETMAP
400 %token EDIF_TOK_NETREF
401 %token EDIF_TOK_NOCHANGE
402 %token EDIF_TOK_NONPERMUTABLE
403 %token EDIF_TOK_NOTALLOWED
404 %token EDIF_TOK_NOTCHSPACING
405 %token EDIF_TOK_NUMBER
406 %token EDIF_TOK_NUMBERDEFINITION
407 %token EDIF_TOK_NUMBERDISPLAY
408 %token EDIF_TOK_OFFPAGECONNECTOR
409 %token EDIF_TOK_OFFSETEVENT
410 %token EDIF_TOK_OPENSHAPE
411 %token EDIF_TOK_ORIENTATION
412 %token EDIF_TOK_ORIGIN
413 %token EDIF_TOK_OVERHANGDISTANCE
414 %token EDIF_TOK_OVERLAPDISTANCE
415 %token EDIF_TOK_OVERSIZE
416 %token EDIF_TOK_OWNER
417 %token EDIF_TOK_PAGE
418 %token EDIF_TOK_PAGESIZE
419 %token EDIF_TOK_PARAMETER
420 %token EDIF_TOK_PARAMETERASSIGN
421 %token EDIF_TOK_PARAMETERDISPLAY
422 %token EDIF_TOK_PATH
423 %token EDIF_TOK_PATHDELAY
424 %token EDIF_TOK_PATHWIDTH
425 %token EDIF_TOK_PERMUTABLE
426 %token EDIF_TOK_PHYSICALDESIGNRULE
427 %token EDIF_TOK_PLUG
428 %token EDIF_TOK_POINT
429 %token EDIF_TOK_POINTDISPLAY
430 %token EDIF_TOK_POINTLIST
431 %token EDIF_TOK_POLYGON
432 %token EDIF_TOK_PORT
433 %token EDIF_TOK_PORTBACKANNOTATE
434 %token EDIF_TOK_PORTBUNDLE
435 %token EDIF_TOK_PORTDELAY
436 %token EDIF_TOK_PORTGROUP
437 %token EDIF_TOK_PORTIMPLEMENTATION
438 %token EDIF_TOK_PORTINSTANCE
439 %token EDIF_TOK_PORTLIST
440 %token EDIF_TOK_PORTLISTALIAS
441 %token EDIF_TOK_PORTMAP
442 %token EDIF_TOK_PORTREF
443 %token EDIF_TOK_PROGRAM
444 %token EDIF_TOK_PROPERTY
445 %token EDIF_TOK_PROPERTYDISPLAY
446 %token EDIF_TOK_PROTECTIONFRAME
447 %token EDIF_TOK_PT
448 %token EDIF_TOK_RANGEVECTOR
449 %token EDIF_TOK_RECTANGLE
450 %token EDIF_TOK_RECTANGLESIZE
451 %token EDIF_TOK_RENAME
452 %token EDIF_TOK_RESOLVES
453 %token EDIF_TOK_SCALE
454 %token EDIF_TOK_SCALEX
455 %token EDIF_TOK_SCALEY
456 %token EDIF_TOK_SECTION
457 %token EDIF_TOK_SHAPE
458 %token EDIF_TOK_SIMULATE
459 %token EDIF_TOK_SIMULATIONINFO
460 %token EDIF_TOK_SINGLEVALUESET
461 %token EDIF_TOK_SITE
462 %token EDIF_TOK_SOCKET
463 %token EDIF_TOK_SOCKETSET
464 %token EDIF_TOK_STATUS
465 %token EDIF_TOK_STEADY
466 %token EDIF_TOK_STRING
467 %token EDIF_TOK_STRINGDISPLAY
468 %token EDIF_TOK_STRONG
469 %token EDIF_TOK_SYMBOL
470 %token EDIF_TOK_SYMMETRY
471 %token EDIF_TOK_TABLE
472 %token EDIF_TOK_TABLEDEFAULT
473 %token EDIF_TOK_TECHNOLOGY
474 %token EDIF_TOK_TEXTHEIGHT
475 %token EDIF_TOK_TIMEINTERVAL
476 %token EDIF_TOK_TIMESTAMP
477 %token EDIF_TOK_TIMING
478 %token EDIF_TOK_TRANSFORM
479 %token EDIF_TOK_TRANSITION
480 %token EDIF_TOK_TRIGGER
481 %token EDIF_TOK_TRUE
482 %token EDIF_TOK_UNCONSTRAINED
483 %token EDIF_TOK_UNDEFINED
484 %token EDIF_TOK_UNION
485 %token EDIF_TOK_UNIT
486 %token EDIF_TOK_UNUSED
487 %token EDIF_TOK_USERDATA
488 %token EDIF_TOK_VERSION
489 %token EDIF_TOK_VIEW
490 %token EDIF_TOK_VIEWLIST
491 %token EDIF_TOK_VIEWMAP
492 %token EDIF_TOK_VIEWREF
493 %token EDIF_TOK_VIEWTYPE
494 %token EDIF_TOK_VISIBLE
495 %token EDIF_TOK_VOLTAGEMAP
496 %token EDIF_TOK_WAVEVALUE
497 %token EDIF_TOK_WEAK
498 %token EDIF_TOK_WEAKJOINED
499 %token EDIF_TOK_WHEN
500 %token EDIF_TOK_WRITTEN
502 %start Edif
506 PopC : ')' { PopC(); }
509 Edif : EDIF_TOK_EDIF EdifFileName EdifVersion EdifLevel KeywordMap _Edif PopC
512 _Edif :
513 | _Edif Status
514 | _Edif External
515 | _Edif Library
516 | _Edif Design
517 | _Edif Comment
518 | _Edif UserData
521 EdifFileName : NameDef { str_pair_free($1); }
524 EdifLevel : EDIF_TOK_EDIFLEVEL Int PopC { free($2); }
527 EdifVersion : EDIF_TOK_EDIFVERSION Int Int Int PopC
528 { free($2); free($3); free($4); }
531 AcLoad : EDIF_TOK_ACLOAD _AcLoad PopC
534 _AcLoad : MiNoMaValue
535 | MiNoMaDisp
538 After : EDIF_TOK_AFTER _After PopC
541 _After : MiNoMaValue
542 | _After Follow
543 | _After Maintain
544 | _After LogicAssn
545 | _After Comment
546 | _After UserData
549 Annotate : EDIF_TOK_ANNOTATE _Annotate PopC
552 _Annotate : Str { free($1); }
553 | StrDisplay
556 Apply : EDIF_TOK_APPLY _Apply PopC
559 _Apply : Cycle
560 | _Apply LogicIn
561 | _Apply LogicOut
562 | _Apply Comment
563 | _Apply UserData
566 Arc : EDIF_TOK_ARC PointValue PointValue PointValue PopC
569 Array : EDIF_TOK_ARRAY NameDef Int _Array PopC { str_pair_free($2); free($3); }
572 _Array :
573 | Int { free($1); }
576 ArrayMacro : EDIF_TOK_ARRAYMACRO Plug PopC
579 ArrayRelInfo : EDIF_TOK_ARRAYRELATEDINFO _ArrayRelInfo PopC
582 _ArrayRelInfo : BaseArray
583 | ArraySite
584 | ArrayMacro
585 | _ArrayRelInfo Comment
586 | _ArrayRelInfo UserData
589 ArraySite : EDIF_TOK_ARRAYSITE Socket PopC
592 AtLeast : EDIF_TOK_ATLEAST ScaledInt PopC
595 AtMost : EDIF_TOK_ATMOST ScaledInt PopC
598 Author : EDIF_TOK_AUTHOR Str PopC { free($2); }
601 BaseArray : EDIF_TOK_BASEARRAY PopC
604 Becomes : EDIF_TOK_BECOMES _Becomes PopC
607 _Becomes : LogicNameRef
608 | LogicList
609 | LogicOneOf
612 Between : EDIF_TOK_BETWEEN __Between _Between PopC
615 __Between : AtLeast
616 | GreaterThan
619 _Between : AtMost
620 | LessThan
623 Boolean : EDIF_TOK_BOOLEAN _Boolean PopC
626 _Boolean :
627 | _Boolean BooleanValue
628 | _Boolean BooleanDisp
629 | _Boolean Boolean
632 BooleanDisp : EDIF_TOK_BOOLEANDISPLAY _BooleanDisp PopC
635 _BooleanDisp : BooleanValue
636 | _BooleanDisp Display
639 BooleanMap : EDIF_TOK_BOOLEANMAP BooleanValue PopC
642 BooleanValue : True
643 | False
646 BorderPat : EDIF_TOK_BORDERPATTERN Int Int Boolean PopC { free($2); free($3); }
649 BorderWidth : EDIF_TOK_BORDERWIDTH Int PopC { free($2); }
652 BoundBox : EDIF_TOK_BOUNDINGBOX Rectangle PopC
655 Cell : EDIF_TOK_CELL CellNameDef _Cell PopC
658 _Cell : CellType
659 | _Cell Status
660 | _Cell ViewMap
661 | _Cell View
662 | _Cell Comment
663 | _Cell UserData
664 | _Cell Property
667 CellNameDef : NameDef { str_pair_free($1); }
670 CellRef : EDIF_TOK_CELLREF CellNameRef _CellRef PopC
673 _CellRef :
674 | LibraryRef
677 CellNameRef : NameRef { free($1); }
680 CellType : EDIF_TOK_CELLTYPE _CellType PopC
683 _CellType : EDIF_TOK_TIE
684 | EDIF_TOK_RIPPER
685 | EDIF_TOK_GENERIC
688 Change : EDIF_TOK_CHANGE __Change _Change PopC
691 __Change : PortNameRef
692 | PortRef { str_pair_free($1); }
693 | PortList
696 _Change :
697 | Becomes
698 | Transition
701 Circle : EDIF_TOK_CIRCLE PointValue PointValue _Circle PopC
704 _Circle :
705 | _Circle Property
708 Color : EDIF_TOK_COLOR ScaledInt ScaledInt ScaledInt PopC
711 Comment : EDIF_TOK_COMMENT _Comment PopC
714 _Comment :
715 | _Comment Str { free($2); }
718 CommGraph : EDIF_TOK_COMMENTGRAPHICS _CommGraph PopC
721 _CommGraph :
722 | _CommGraph Annotate
723 | _CommGraph Figure
724 | _CommGraph Instance
725 | _CommGraph BoundBox
726 | _CommGraph Property
727 | _CommGraph Comment
728 | _CommGraph UserData
731 Compound : EDIF_TOK_COMPOUND LogicNameRef PopC
734 Contents : EDIF_TOK_CONTENTS _Contents PopC
737 _Contents :
738 | _Contents Instance
739 | _Contents OffPageConn
740 | _Contents Figure
741 | _Contents Section
742 | _Contents Net
743 | _Contents NetBundle
744 | _Contents Page
745 | _Contents CommGraph
746 | _Contents PortImpl
747 | _Contents Timing
748 | _Contents Simulate
749 | _Contents When
750 | _Contents Follow
751 | _Contents LogicPort
752 | _Contents BoundBox
753 | _Contents Comment
754 | _Contents UserData
757 ConnectLoc : EDIF_TOK_CONNECTLOCATION _ConnectLoc PopC
760 _ConnectLoc :
761 | Figure
764 CornerType : EDIF_TOK_CORNERTYPE _CornerType PopC
767 _CornerType : EDIF_TOK_EXTEND
768 | EDIF_TOK_ROUND
769 | EDIF_TOK_TRUNCATE
772 Criticality : EDIF_TOK_CRITICALITY _Criticality PopC
775 _Criticality : Int { free($1); }
776 | IntDisplay
779 CurrentMap : EDIF_TOK_CURRENTMAP MiNoMaValue PopC
782 Curve : EDIF_TOK_CURVE _Curve PopC
785 _Curve :
786 | _Curve Arc
787 | _Curve PointValue
790 Cycle : EDIF_TOK_CYCLE Int _Cycle PopC { free($2); }
793 _Cycle :
794 | Duration
797 DataOrigin : EDIF_TOK_DATAORIGIN Str _DataOrigin PopC { free($2); }
800 _DataOrigin :
801 | Version
804 DcFanInLoad : EDIF_TOK_DCFANINLOAD _DcFanInLoad PopC
807 _DcFanInLoad : ScaledInt
808 | NumbDisplay
811 DcFanOutLoad : EDIF_TOK_DCFANOUTLOAD _DcFanOutLoad PopC
814 _DcFanOutLoad : ScaledInt
815 | NumbDisplay
818 DcMaxFanIn : EDIF_TOK_DCMAXFANIN _DcMaxFanIn PopC
821 _DcMaxFanIn : ScaledInt
822 | NumbDisplay
825 DcMaxFanOut : EDIF_TOK_DCMAXFANOUT _DcMaxFanOut PopC
828 _DcMaxFanOut : ScaledInt
829 | NumbDisplay
832 Delay : EDIF_TOK_DELAY _Delay PopC
835 _Delay : MiNoMaValue
836 | MiNoMaDisp
839 Delta : EDIF_TOK_DELTA _Delta PopC
842 _Delta :
843 | _Delta PointValue
846 Derivation : EDIF_TOK_DERIVATION _Derivation PopC
849 _Derivation : EDIF_TOK_CALCULATED
850 | EDIF_TOK_MEASURED
851 | EDIF_TOK_REQUIRED
854 Design : EDIF_TOK_DESIGN DesignNameDef _Design PopC
857 _Design : CellRef
858 | _Design Status
859 | _Design Comment
860 | _Design Property
861 | _Design UserData
864 Designator : EDIF_TOK_DESIGNATOR _Designator PopC
867 _Designator : Str { free($1); }
868 | StrDisplay
871 DesignNameDef : NameDef { str_pair_free($1); }
874 DesignRule : EDIF_TOK_PHYSICALDESIGNRULE _DesignRule PopC
877 _DesignRule :
878 | _DesignRule FigureWidth
879 | _DesignRule FigureArea
880 | _DesignRule RectSize
881 | _DesignRule FigurePerim
882 | _DesignRule OverlapDist
883 | _DesignRule OverhngDist
884 | _DesignRule EncloseDist
885 | _DesignRule InterFigGrp
886 | _DesignRule IntraFigGrp
887 | _DesignRule NotchSpace
888 | _DesignRule NotAllowed
889 | _DesignRule FigGrp
890 | _DesignRule Comment
891 | _DesignRule UserData
894 Difference : EDIF_TOK_DIFFERENCE _Difference PopC
897 _Difference : FigGrpRef
898 | FigureOp
899 | _Difference FigGrpRef
900 | _Difference FigureOp
903 Direction : EDIF_TOK_DIRECTION _Direction PopC
906 _Direction : EDIF_TOK_INOUT
907 | EDIF_TOK_INPUT
908 | EDIF_TOK_OUTPUT
911 Display : EDIF_TOK_DISPLAY _Display _DisplayJust _DisplayOrien _DisplayOrg PopC
914 _Display : FigGrpNameRef
915 | FigGrpOver
918 _DisplayJust :
919 | Justify
922 _DisplayOrien :
923 | Orientation
926 _DisplayOrg :
927 | Origin
930 Dominates : EDIF_TOK_DOMINATES _Dominates PopC
933 _Dominates :
934 | _Dominates LogicNameRef
937 Dot : EDIF_TOK_DOT _Dot PopC
940 _Dot : PointValue
941 | _Dot Property
944 Duration : EDIF_TOK_DURATION ScaledInt PopC
947 EncloseDist : EDIF_TOK_ENCLOSUREDISTANCE RuleNameDef FigGrpObj FigGrpObj _EncloseDist
948 PopC
951 _EncloseDist : Range
952 | SingleValSet
953 | _EncloseDist Comment
954 | _EncloseDist UserData
957 EndType : EDIF_TOK_ENDTYPE _EndType PopC
960 _EndType : EDIF_TOK_EXTEND
961 | EDIF_TOK_ROUND
962 | EDIF_TOK_TRUNCATE
965 Entry : EDIF_TOK_ENTRY ___Entry __Entry _Entry
966 PopC
969 ___Entry : Match
970 | Change
971 | Steady
974 __Entry : LogicRef
975 | PortRef { str_pair_free($1); }
976 | NoChange
977 | Table
980 _Entry :
981 | Delay
982 | LoadDelay
985 Event : EDIF_TOK_EVENT _Event PopC
988 _Event : PortRef { str_pair_free($1); }
989 | PortList
990 | PortGroup
991 | NetRef
992 | NetGroup
993 | _Event Transition
994 | _Event Becomes
997 Exactly : EDIF_TOK_EXACTLY ScaledInt PopC
1000 External : EDIF_TOK_EXTERNAL LibNameDef EdifLevel _External PopC
1003 _External : Technology
1004 | _External Status
1005 | _External Cell
1006 | _External Comment
1007 | _External UserData
1010 Fabricate : EDIF_TOK_FABRICATE LayerNameDef FigGrpNameRef PopC
1013 False : EDIF_TOK_FALSE PopC
1016 FigGrp : EDIF_TOK_FIGUREGROUP _FigGrp PopC
1019 _FigGrp : FigGrpNameDef
1020 | _FigGrp CornerType
1021 | _FigGrp EndType
1022 | _FigGrp PathWidth
1023 | _FigGrp BorderWidth
1024 | _FigGrp Color
1025 | _FigGrp FillPattern
1026 | _FigGrp BorderPat
1027 | _FigGrp TextHeight
1028 | _FigGrp Visible
1029 | _FigGrp Comment
1030 | _FigGrp Property
1031 | _FigGrp UserData
1032 | _FigGrp IncFigGrp
1035 FigGrpNameDef : NameDef { str_pair_free($1); }
1038 FigGrpNameRef : NameRef { free($1); }
1041 FigGrpObj : EDIF_TOK_FIGUREGROUPOBJECT _FigGrpObj PopC
1044 _FigGrpObj : FigGrpNameRef
1045 | FigGrpRef
1046 | FigureOp
1049 FigGrpOver : EDIF_TOK_FIGUREGROUPOVERRIDE _FigGrpOver PopC
1052 _FigGrpOver : FigGrpNameRef
1053 | _FigGrpOver CornerType
1054 | _FigGrpOver EndType
1055 | _FigGrpOver PathWidth
1056 | _FigGrpOver BorderWidth
1057 | _FigGrpOver Color
1058 | _FigGrpOver FillPattern
1059 | _FigGrpOver BorderPat
1060 | _FigGrpOver TextHeight
1061 | _FigGrpOver Visible
1062 | _FigGrpOver Comment
1063 | _FigGrpOver Property
1064 | _FigGrpOver UserData
1067 FigGrpRef : EDIF_TOK_FIGUREGROUPREF FigGrpNameRef _FigGrpRef PopC
1070 _FigGrpRef :
1071 | LibraryRef
1074 Figure : EDIF_TOK_FIGURE _Figure PopC
1077 _Figure : FigGrpNameDef
1078 | FigGrpOver
1079 | _Figure Circle
1080 | _Figure Dot
1081 | _Figure OpenShape
1082 | _Figure Path
1083 | _Figure Polygon
1084 | _Figure Rectangle
1085 | _Figure Shape
1086 | _Figure Comment
1087 | _Figure UserData
1090 FigureArea : EDIF_TOK_FIGUREAREA RuleNameDef FigGrpObj _FigureArea PopC
1093 _FigureArea : Range
1094 | SingleValSet
1095 | _FigureArea Comment
1096 | _FigureArea UserData
1099 FigureOp : Intersection
1100 | Union
1101 | Difference
1102 | Inverse
1103 | Oversize
1106 FigurePerim : EDIF_TOK_FIGUREPERIMETER RuleNameDef FigGrpObj _FigurePerim PopC
1109 _FigurePerim : Range
1110 | SingleValSet
1111 | _FigurePerim Comment
1112 | _FigurePerim UserData
1115 FigureWidth : EDIF_TOK_FIGUREWIDTH RuleNameDef FigGrpObj _FigureWidth PopC
1118 _FigureWidth : Range
1119 | SingleValSet
1120 | _FigureWidth Comment
1121 | _FigureWidth UserData
1124 FillPattern : EDIF_TOK_FILLPATTERN Int Int Boolean PopC { free($2); free($3); }
1127 Follow : EDIF_TOK_FOLLOW __Follow _Follow PopC
1130 __Follow : PortNameRef
1131 | PortRef { str_pair_free($1); }
1134 _Follow : PortRef { str_pair_free($1); }
1135 | Table
1136 | _Follow Delay
1137 | _Follow LoadDelay
1140 Forbidden : EDIF_TOK_FORBIDDENEVENT _Forbidden PopC
1143 _Forbidden : TimeIntval
1144 | _Forbidden Event
1147 Form : Keyword _Form ')' { free($1); }
1150 _Form :
1151 | _Form Int { free($2); }
1152 | _Form Str { free($2); }
1153 | _Form Ident { free($2); }
1154 | _Form Form
1157 GlobPortRef : EDIF_TOK_GLOBALPORTREF PortNameRef PopC
1160 GreaterThan : EDIF_TOK_GREATERTHAN ScaledInt PopC
1163 GridMap : EDIF_TOK_GRIDMAP ScaledInt ScaledInt PopC
1166 Ignore : EDIF_TOK_IGNORE PopC
1169 IncFigGrp : EDIF_TOK_INCLUDEFIGUREGROUP _IncFigGrp PopC
1172 _IncFigGrp : FigGrpRef
1173 | FigureOp
1176 Initial : EDIF_TOK_INITIAL PopC
1179 Instance : EDIF_TOK_INSTANCE InstNameDef _Instance PopC
1182 _Instance : ViewRef
1183 | ViewList
1184 | _Instance Transform
1185 | _Instance ParamAssign
1186 | _Instance PortInst
1187 | _Instance Timing
1188 | _Instance Designator
1189 | _Instance Property
1190 | _Instance Comment
1191 | _Instance UserData
1194 InstanceRef : EDIF_TOK_INSTANCEREF InstNameRef _InstanceRef PopC { $$=$2; }
1197 _InstanceRef :
1198 | InstanceRef { free($1); }
1199 | ViewRef
1202 InstBackAn : EDIF_TOK_INSTANCEBACKANNOTATE _InstBackAn PopC
1205 _InstBackAn : InstanceRef { free($1); }
1206 | _InstBackAn Designator
1207 | _InstBackAn Timing
1208 | _InstBackAn Property
1209 | _InstBackAn Comment
1212 InstGroup : EDIF_TOK_INSTANCEGROUP _InstGroup PopC
1215 _InstGroup :
1216 | _InstGroup InstanceRef { free($2); }
1219 InstMap : EDIF_TOK_INSTANCEMAP _InstMap PopC
1222 _InstMap :
1223 | _InstMap InstanceRef { free($2); }
1224 | _InstMap InstGroup
1225 | _InstMap Comment
1226 | _InstMap UserData
1229 InstNameDef : NameDef { str_pair_free($1); }
1230 | Array
1233 InstNameRef : NameRef { $$=$1; }
1234 | Member
1237 IntDisplay : EDIF_TOK_INTEGERDISPLAY _IntDisplay PopC
1240 _IntDisplay : Int { free($1); }
1241 | _IntDisplay Display
1244 Integer : EDIF_TOK_INTEGER _Integer PopC
1247 _Integer :
1248 | _Integer Int { free($2); }
1249 | _Integer IntDisplay
1250 | _Integer Integer
1253 Interface : EDIF_TOK_INTERFACE _Interface PopC
1256 _Interface :
1257 | _Interface Port
1258 | _Interface PortBundle
1259 | _Interface Symbol
1260 | _Interface ProtectFrame
1261 | _Interface ArrayRelInfo
1262 | _Interface Parameter
1263 | _Interface Joined { pair_list_free($2); }
1264 | _Interface MustJoin
1265 | _Interface WeakJoined
1266 | _Interface Permutable
1267 | _Interface Timing
1268 | _Interface Simulate
1269 | _Interface Designator
1270 | _Interface Property
1271 | _Interface Comment
1272 | _Interface UserData
1275 InterFigGrp : EDIF_TOK_INTERFIGUREGROUPSPACING RuleNameDef FigGrpObj FigGrpObj
1276 _InterFigGrp PopC
1279 _InterFigGrp : Range
1280 | SingleValSet
1281 | _InterFigGrp Comment
1282 | _InterFigGrp UserData
1285 Intersection : EDIF_TOK_INTERSECTION _Intersection PopC
1288 _Intersection : FigGrpRef
1289 | FigureOp
1290 | _Intersection FigGrpRef
1291 | _Intersection FigureOp
1294 IntraFigGrp : EDIF_TOK_INTRAFIGUREGROUPSPACING RuleNameDef FigGrpObj _IntraFigGrp PopC
1297 _IntraFigGrp : Range
1298 | SingleValSet
1299 | _IntraFigGrp Comment
1300 | _IntraFigGrp UserData
1303 Inverse : EDIF_TOK_INVERSE _Inverse PopC
1306 _Inverse : FigGrpRef
1307 | FigureOp
1310 Isolated : EDIF_TOK_ISOLATED PopC
1313 Joined : EDIF_TOK_JOINED _Joined PopC { $$ = new_pair_list($2); }
1316 _Joined : { $$=NULL; }
1317 | _Joined PortRef { $2->next = $1; $$ = $2; }
1318 | _Joined PortList
1319 | _Joined GlobPortRef
1322 Justify : EDIF_TOK_JUSTIFY _Justify PopC
1325 _Justify : EDIF_TOK_CENTERCENTER
1326 | EDIF_TOK_CENTERLEFT
1327 | EDIF_TOK_CENTERRIGHT
1328 | EDIF_TOK_LOWERCENTER
1329 | EDIF_TOK_LOWERLEFT
1330 | EDIF_TOK_LOWERRIGHT
1331 | EDIF_TOK_UPPERCENTER
1332 | EDIF_TOK_UPPERLEFT
1333 | EDIF_TOK_UPPERRIGHT
1336 KeywordDisp : EDIF_TOK_KEYWORDDISPLAY _KeywordDisp PopC
1339 _KeywordDisp : KeywordName
1340 | _KeywordDisp Display
1343 KeywordLevel : EDIF_TOK_KEYWORDLEVEL Int PopC { free($2); }
1346 KeywordMap : EDIF_TOK_KEYWORDMAP _KeywordMap PopC
1349 _KeywordMap : KeywordLevel
1350 | _KeywordMap Comment
1353 KeywordName : Ident { free($1); }
1356 LayerNameDef : NameDef { str_pair_free($1); }
1359 LessThan : EDIF_TOK_LESSTHAN ScaledInt PopC
1362 LibNameDef : NameDef { str_pair_free($1); }
1365 LibNameRef : NameRef { free($1); }
1368 Library : EDIF_TOK_LIBRARY LibNameDef EdifLevel _Library PopC
1371 _Library : Technology
1372 | _Library Status
1373 | _Library Cell
1374 | _Library Comment
1375 | _Library UserData
1378 LibraryRef : EDIF_TOK_LIBRARYREF LibNameRef PopC
1381 ListOfNets : EDIF_TOK_LISTOFNETS _ListOfNets PopC
1384 _ListOfNets :
1385 | _ListOfNets Net
1388 ListOfPorts : EDIF_TOK_LISTOFPORTS _ListOfPorts PopC
1391 _ListOfPorts :
1392 | _ListOfPorts Port
1393 | _ListOfPorts PortBundle
1396 LoadDelay : EDIF_TOK_LOADDELAY _LoadDelay _LoadDelay PopC
1399 _LoadDelay : MiNoMaValue
1400 | MiNoMaDisp
1403 LogicAssn : EDIF_TOK_LOGICASSIGN ___LogicAssn __LogicAssn _LogicAssn PopC
1406 ___LogicAssn : PortNameRef
1407 | PortRef { str_pair_free($1); }
1410 __LogicAssn : PortRef { str_pair_free($1); }
1411 | LogicRef
1412 | Table
1415 _LogicAssn :
1416 | Delay
1417 | LoadDelay
1420 LogicIn : EDIF_TOK_LOGICINPUT _LogicIn PopC
1423 _LogicIn : PortList
1424 | PortRef { str_pair_free($1); }
1425 | PortNameRef
1426 | _LogicIn LogicWave
1429 LogicList : EDIF_TOK_LOGICLIST _LogicList PopC
1432 _LogicList :
1433 | _LogicList LogicNameRef
1434 | _LogicList LogicOneOf
1435 | _LogicList Ignore
1438 LogicMapIn : EDIF_TOK_LOGICMAPINPUT _LogicMapIn PopC
1441 _LogicMapIn :
1442 | _LogicMapIn LogicNameRef
1445 LogicMapOut : EDIF_TOK_LOGICMAPOUTPUT _LogicMapOut PopC
1448 _LogicMapOut :
1449 | _LogicMapOut LogicNameRef
1452 LogicNameDef : NameDef { str_pair_free($1); }
1455 LogicNameRef : NameRef { free($1); }
1458 LogicOneOf : EDIF_TOK_LOGICONEOF _LogicOneOf PopC
1461 _LogicOneOf :
1462 | _LogicOneOf LogicNameRef
1463 | _LogicOneOf LogicList
1466 LogicOut : EDIF_TOK_LOGICOUTPUT _LogicOut PopC
1469 _LogicOut : PortList
1470 | PortRef { str_pair_free($1); }
1471 | PortNameRef
1472 | _LogicOut LogicWave
1475 LogicPort : EDIF_TOK_LOGICPORT _LogicPort PopC
1478 _LogicPort : PortNameDef
1479 | _LogicPort Property
1480 | _LogicPort Comment
1481 | _LogicPort UserData
1484 LogicRef : EDIF_TOK_LOGICREF LogicNameRef _LogicRef PopC
1487 _LogicRef :
1488 | LibraryRef
1491 LogicValue : EDIF_TOK_LOGICVALUE _LogicValue PopC
1494 _LogicValue : LogicNameDef
1495 | _LogicValue VoltageMap
1496 | _LogicValue CurrentMap
1497 | _LogicValue BooleanMap
1498 | _LogicValue Compound
1499 | _LogicValue Weak
1500 | _LogicValue Strong
1501 | _LogicValue Dominates
1502 | _LogicValue LogicMapOut
1503 | _LogicValue LogicMapIn
1504 | _LogicValue Isolated
1505 | _LogicValue Resolves
1506 | _LogicValue Property
1507 | _LogicValue Comment
1508 | _LogicValue UserData
1511 LogicWave : EDIF_TOK_LOGICWAVEFORM _LogicWave PopC
1514 _LogicWave :
1515 | _LogicWave LogicNameRef
1516 | _LogicWave LogicList
1517 | _LogicWave LogicOneOf
1518 | _LogicWave Ignore
1521 Maintain : EDIF_TOK_MAINTAIN __Maintain _Maintain PopC
1524 __Maintain : PortNameRef
1525 | PortRef { str_pair_free($1); }
1528 _Maintain :
1529 | Delay
1530 | LoadDelay
1533 Match : EDIF_TOK_MATCH __Match _Match PopC
1536 __Match : PortNameRef
1537 | PortRef { str_pair_free($1); }
1538 | PortList
1541 _Match : LogicNameRef
1542 | LogicList
1543 | LogicOneOf
1546 Member : EDIF_TOK_MEMBER NameRef _Member PopC { free($2); }
1549 _Member : Int { free($1); }
1550 | _Member Int { free($2); }
1553 MiNoMa : EDIF_TOK_MINOMAX _MiNoMa PopC
1556 _MiNoMa :
1557 | _MiNoMa MiNoMaValue
1558 | _MiNoMa MiNoMaDisp
1559 | _MiNoMa MiNoMa
1562 MiNoMaDisp : EDIF_TOK_MINOMAXDISPLAY _MiNoMaDisp PopC
1565 _MiNoMaDisp : MiNoMaValue
1566 | _MiNoMaDisp Display
1569 MiNoMaValue : Mnm
1570 | ScaledInt
1573 Mnm : EDIF_TOK_MNM _Mnm _Mnm _Mnm PopC
1576 _Mnm : ScaledInt
1577 | Undefined
1578 | Unconstrained
1581 MultValSet : EDIF_TOK_MULTIPLEVALUESET _MultValSet PopC
1584 _MultValSet :
1585 | _MultValSet RangeVector
1588 MustJoin : EDIF_TOK_MUSTJOIN _MustJoin PopC
1591 _MustJoin :
1592 | _MustJoin PortRef { str_pair_free($2); }
1593 | _MustJoin PortList
1594 | _MustJoin WeakJoined
1595 | _MustJoin Joined { pair_list_free($2); }
1598 Name : EDIF_TOK_NAME _Name PopC { $$=$2; }
1601 _Name : Ident { $$=$1; }
1602 | _Name Display
1605 NameDef : Ident { $$ = new_str_pair($1,NULL); }
1606 | Name { $$ = new_str_pair($1,NULL); }
1607 | Rename { $$=$1; }
1610 NameRef : Ident { $$=$1; }
1611 | Name { $$=$1; }
1614 Net : EDIF_TOK_NET NetNameDef _Net PopC { define_pcb_net($2, $3); }
1617 _Net : Joined { $$=$1; }
1618 | _Net Criticality
1619 | _Net NetDelay
1620 | _Net Figure
1621 | _Net Net
1622 | _Net Instance
1623 | _Net CommGraph
1624 | _Net Property
1625 | _Net Comment
1626 | _Net UserData
1629 NetBackAn : EDIF_TOK_NETBACKANNOTATE _NetBackAn PopC
1632 _NetBackAn : NetRef
1633 | _NetBackAn NetDelay
1634 | _NetBackAn Criticality
1635 | _NetBackAn Property
1636 | _NetBackAn Comment
1639 NetBundle : EDIF_TOK_NETBUNDLE NetNameDef _NetBundle PopC { str_pair_free($2); }
1642 _NetBundle : ListOfNets
1643 | _NetBundle Figure
1644 | _NetBundle CommGraph
1645 | _NetBundle Property
1646 | _NetBundle Comment
1647 | _NetBundle UserData
1650 NetDelay : EDIF_TOK_NETDELAY Derivation _NetDelay PopC
1653 _NetDelay : Delay
1654 | _NetDelay Transition
1655 | _NetDelay Becomes
1658 NetGroup : EDIF_TOK_NETGROUP _NetGroup PopC
1661 _NetGroup :
1662 | _NetGroup NetNameRef
1663 | _NetGroup NetRef
1666 NetMap : EDIF_TOK_NETMAP _NetMap PopC
1669 _NetMap :
1670 | _NetMap NetRef
1671 | _NetMap NetGroup
1672 | _NetMap Comment
1673 | _NetMap UserData
1676 NetNameDef : NameDef { $$=$1; }
1677 | Array { $$=NULL; }
1681 NetNameRef : NameRef { free($1); }
1682 | Member
1685 NetRef : EDIF_TOK_NETREF NetNameRef _NetRef PopC
1688 _NetRef :
1689 | NetRef
1690 | InstanceRef { free($1); }
1691 | ViewRef
1694 NoChange : EDIF_TOK_NOCHANGE PopC
1697 NonPermut : EDIF_TOK_NONPERMUTABLE _NonPermut PopC
1700 _NonPermut :
1701 | _NonPermut PortRef { str_pair_free($2); }
1702 | _NonPermut Permutable
1705 NotAllowed : EDIF_TOK_NOTALLOWED RuleNameDef _NotAllowed PopC
1708 _NotAllowed : FigGrpObj
1709 | _NotAllowed Comment
1710 | _NotAllowed UserData
1713 NotchSpace : EDIF_TOK_NOTCHSPACING RuleNameDef FigGrpObj _NotchSpace PopC
1716 _NotchSpace : Range
1717 | SingleValSet
1718 | _NotchSpace Comment
1719 | _NotchSpace UserData
1722 Number : EDIF_TOK_NUMBER _Number PopC
1725 _Number :
1726 | _Number ScaledInt
1727 | _Number NumbDisplay
1728 | _Number Number
1731 NumbDisplay : EDIF_TOK_NUMBERDISPLAY _NumbDisplay PopC
1734 _NumbDisplay : ScaledInt
1735 | _NumbDisplay Display
1738 NumberDefn : EDIF_TOK_NUMBERDEFINITION _NumberDefn PopC
1741 _NumberDefn :
1742 | _NumberDefn Scale
1743 | _NumberDefn GridMap
1744 | _NumberDefn Comment
1747 OffPageConn : EDIF_TOK_OFFPAGECONNECTOR _OffPageConn PopC
1750 _OffPageConn : PortNameDef
1751 | _OffPageConn Unused
1752 | _OffPageConn Property
1753 | _OffPageConn Comment
1754 | _OffPageConn UserData
1757 OffsetEvent : EDIF_TOK_OFFSETEVENT Event ScaledInt PopC
1760 OpenShape : EDIF_TOK_OPENSHAPE _OpenShape PopC
1763 _OpenShape : Curve
1764 | _OpenShape Property
1767 Orientation : EDIF_TOK_ORIENTATION _Orientation PopC
1770 _Orientation : EDIF_TOK_R0
1771 | EDIF_TOK_R90
1772 | EDIF_TOK_R180
1773 | EDIF_TOK_R270
1774 | EDIF_TOK_MX
1775 | EDIF_TOK_MY
1776 | EDIF_TOK_MYR90
1777 | EDIF_TOK_MXR90
1780 Origin : EDIF_TOK_ORIGIN PointValue PopC
1783 OverhngDist : EDIF_TOK_OVERHANGDISTANCE RuleNameDef FigGrpObj FigGrpObj _OverhngDist
1784 PopC
1787 _OverhngDist : Range
1788 | SingleValSet
1789 | _OverhngDist Comment
1790 | _OverhngDist UserData
1793 OverlapDist : EDIF_TOK_OVERLAPDISTANCE RuleNameDef FigGrpObj FigGrpObj _OverlapDist
1794 PopC
1797 _OverlapDist : Range
1798 | SingleValSet
1799 | _OverlapDist Comment
1800 | _OverlapDist UserData
1803 Oversize : EDIF_TOK_OVERSIZE Int _Oversize CornerType PopC { free($2); }
1806 _Oversize : FigGrpRef
1807 | FigureOp
1810 Owner : EDIF_TOK_OWNER Str PopC { free($2); }
1813 Page : EDIF_TOK_PAGE _Page PopC
1816 _Page : InstNameDef
1817 | _Page Instance
1818 | _Page Net
1819 | _Page NetBundle
1820 | _Page CommGraph
1821 | _Page PortImpl
1822 | _Page PageSize
1823 | _Page BoundBox
1824 | _Page Comment
1825 | _Page UserData
1828 PageSize : EDIF_TOK_PAGESIZE Rectangle PopC
1831 ParamDisp : EDIF_TOK_PARAMETERDISPLAY _ParamDisp PopC
1834 _ParamDisp : ValueNameRef
1835 | _ParamDisp Display
1838 Parameter : EDIF_TOK_PARAMETER ValueNameDef TypedValue _Parameter PopC
1841 _Parameter :
1842 | Unit
1845 ParamAssign : EDIF_TOK_PARAMETERASSIGN ValueNameRef TypedValue PopC
1848 Path : EDIF_TOK_PATH _Path PopC
1851 _Path : PointList
1852 | _Path Property
1855 PathDelay : EDIF_TOK_PATHDELAY _PathDelay PopC
1858 _PathDelay : Delay
1859 | _PathDelay Event
1862 PathWidth : EDIF_TOK_PATHWIDTH Int PopC { free($2); }
1865 Permutable : EDIF_TOK_PERMUTABLE _Permutable PopC
1868 _Permutable :
1869 | _Permutable PortRef { str_pair_free($2); }
1870 | _Permutable Permutable
1871 | _Permutable NonPermut
1874 Plug : EDIF_TOK_PLUG _Plug PopC
1877 _Plug :
1878 | _Plug SocketSet
1881 Point : EDIF_TOK_POINT _Point PopC
1884 _Point :
1885 | _Point PointValue
1886 | _Point PointDisp
1887 | _Point Point
1890 PointDisp : EDIF_TOK_POINTDISPLAY _PointDisp PopC
1893 _PointDisp : PointValue
1894 | _PointDisp Display
1897 PointList : EDIF_TOK_POINTLIST _PointList PopC
1900 _PointList :
1901 | _PointList PointValue
1904 PointValue : EDIF_TOK_PT Int Int PopC { free($2); free($3); }
1907 Polygon : EDIF_TOK_POLYGON _Polygon PopC
1910 _Polygon : PointList
1911 | _Polygon Property
1914 Port : EDIF_TOK_PORT _Port PopC
1917 _Port : PortNameDef
1918 | _Port Direction
1919 | _Port Unused
1920 | _Port PortDelay
1921 | _Port Designator
1922 | _Port DcFanInLoad
1923 | _Port DcFanOutLoad
1924 | _Port DcMaxFanIn
1925 | _Port DcMaxFanOut
1926 | _Port AcLoad
1927 | _Port Property
1928 | _Port Comment
1929 | _Port UserData
1932 PortBackAn : EDIF_TOK_PORTBACKANNOTATE _PortBackAn PopC
1935 _PortBackAn : PortRef { str_pair_free($1); }
1936 | _PortBackAn Designator
1937 | _PortBackAn PortDelay
1938 | _PortBackAn DcFanInLoad
1939 | _PortBackAn DcFanOutLoad
1940 | _PortBackAn DcMaxFanIn
1941 | _PortBackAn DcMaxFanOut
1942 | _PortBackAn AcLoad
1943 | _PortBackAn Property
1944 | _PortBackAn Comment
1947 PortBundle : EDIF_TOK_PORTBUNDLE PortNameDef _PortBundle PopC
1950 _PortBundle : ListOfPorts
1951 | _PortBundle Property
1952 | _PortBundle Comment
1953 | _PortBundle UserData
1956 PortDelay : EDIF_TOK_PORTDELAY Derivation _PortDelay PopC
1959 _PortDelay : Delay
1960 | LoadDelay
1961 | _PortDelay Transition
1962 | _PortDelay Becomes
1965 PortGroup : EDIF_TOK_PORTGROUP _PortGroup PopC
1968 _PortGroup :
1969 | _PortGroup PortNameRef
1970 | _PortGroup PortRef { str_pair_free($2); }
1973 PortImpl : EDIF_TOK_PORTIMPLEMENTATION _PortImpl PopC
1976 _PortImpl : PortRef { str_pair_free($1); }
1977 | PortNameRef
1978 | _PortImpl ConnectLoc
1979 | _PortImpl Figure
1980 | _PortImpl Instance
1981 | _PortImpl CommGraph
1982 | _PortImpl PropDisplay
1983 | _PortImpl KeywordDisp
1984 | _PortImpl Property
1985 | _PortImpl UserData
1986 | _PortImpl Comment
1989 PortInst : EDIF_TOK_PORTINSTANCE _PortInst PopC
1992 _PortInst : PortRef { str_pair_free($1); }
1993 | PortNameRef
1994 | _PortInst Unused
1995 | _PortInst PortDelay
1996 | _PortInst Designator
1997 | _PortInst DcFanInLoad
1998 | _PortInst DcFanOutLoad
1999 | _PortInst DcMaxFanIn
2000 | _PortInst DcMaxFanOut
2001 | _PortInst AcLoad
2002 | _PortInst Property
2003 | _PortInst Comment
2004 | _PortInst UserData
2007 PortList : EDIF_TOK_PORTLIST _PortList PopC
2010 _PortList :
2011 | _PortList PortRef { str_pair_free($2); }
2012 | _PortList PortNameRef
2015 PortListAls : EDIF_TOK_PORTLISTALIAS PortNameDef PortList PopC
2018 PortMap : EDIF_TOK_PORTMAP _PortMap PopC
2021 _PortMap :
2022 | _PortMap PortRef { str_pair_free($2); }
2023 | _PortMap PortGroup
2024 | _PortMap Comment
2025 | _PortMap UserData
2028 PortNameDef : NameDef { str_pair_free($1); }
2029 | Array
2032 PortNameRef : NameRef { $$=$1; }
2033 | Member
2036 PortRef : EDIF_TOK_PORTREF PortNameRef _PortRef PopC
2038 if ($3)
2040 $$ = new_str_pair($3->str1,$2);
2041 free($3);
2043 else
2045 /* handle port with no instance by passing up the chain */
2046 $$ = new_str_pair(NULL,$2);
2051 _PortRef : { $$=NULL; }
2052 | PortRef { $$=$1; }
2053 | InstanceRef { $$ = new_str_pair($1,NULL); }
2054 | ViewRef { $$=NULL; }
2057 Program : EDIF_TOK_PROGRAM Str _Program PopC
2060 _Program :
2061 | Version
2064 PropDisplay : EDIF_TOK_PROPERTYDISPLAY _PropDisplay PopC
2067 _PropDisplay : PropNameRef
2068 | _PropDisplay Display
2071 Property : EDIF_TOK_PROPERTY PropNameDef _Property PopC
2074 _Property : TypedValue
2075 | _Property Owner
2076 | _Property Unit
2077 | _Property Property
2078 | _Property Comment
2081 PropNameDef : NameDef { str_pair_free($1); }
2084 PropNameRef : NameRef { free($1); }
2087 ProtectFrame : EDIF_TOK_PROTECTIONFRAME _ProtectFrame PopC
2090 _ProtectFrame :
2091 | _ProtectFrame PortImpl
2092 | _ProtectFrame Figure
2093 | _ProtectFrame Instance
2094 | _ProtectFrame CommGraph
2095 | _ProtectFrame BoundBox
2096 | _ProtectFrame PropDisplay
2097 | _ProtectFrame KeywordDisp
2098 | _ProtectFrame ParamDisp
2099 | _ProtectFrame Property
2100 | _ProtectFrame Comment
2101 | _ProtectFrame UserData
2104 Range : LessThan
2105 | GreaterThan
2106 | AtMost
2107 | AtLeast
2108 | Exactly
2109 | Between
2112 RangeVector : EDIF_TOK_RANGEVECTOR _RangeVector PopC
2115 _RangeVector :
2116 | _RangeVector Range
2117 | _RangeVector SingleValSet
2120 Rectangle : EDIF_TOK_RECTANGLE PointValue _Rectangle PopC
2123 _Rectangle : PointValue
2124 | _Rectangle Property
2127 RectSize : EDIF_TOK_RECTANGLESIZE RuleNameDef FigGrpObj _RectSize PopC
2130 _RectSize : RangeVector
2131 | MultValSet
2132 | _RectSize Comment
2133 | _RectSize UserData
2136 Rename : EDIF_TOK_RENAME __Rename _Rename PopC
2137 { $$ = new_str_pair($2,$3); }
2140 __Rename : Ident { $$=$1; }
2141 | Name { $$=$1; }
2144 _Rename : Str { $$=$1; }
2145 | StrDisplay { $$=NULL; }
2148 Resolves : EDIF_TOK_RESOLVES _Resolves PopC
2151 _Resolves :
2152 | _Resolves LogicNameRef
2155 RuleNameDef : NameDef { str_pair_free($1); }
2158 Scale : EDIF_TOK_SCALE ScaledInt ScaledInt Unit PopC
2161 ScaledInt : Int { free($1); }
2162 | EDIF_TOK_E Int Int PopC { free($2); free($3); }
2165 ScaleX : EDIF_TOK_SCALEX Int Int PopC { free($2); free($3); }
2168 ScaleY : EDIF_TOK_SCALEY Int Int PopC { free($2); free($3); }
2171 Section : EDIF_TOK_SECTION _Section PopC
2174 _Section : Str { free($1); }
2175 | _Section Section
2176 | _Section Str { free($2); }
2177 | _Section Instance
2180 Shape : EDIF_TOK_SHAPE _Shape PopC
2183 _Shape : Curve
2184 | _Shape Property
2187 SimNameDef : NameDef { str_pair_free($1); }
2190 Simulate : EDIF_TOK_SIMULATE _Simulate PopC
2193 _Simulate : SimNameDef
2194 | _Simulate PortListAls
2195 | _Simulate WaveValue
2196 | _Simulate Apply
2197 | _Simulate Comment
2198 | _Simulate UserData
2201 SimulInfo : EDIF_TOK_SIMULATIONINFO _SimulInfo PopC
2204 _SimulInfo :
2205 | _SimulInfo LogicValue
2206 | _SimulInfo Comment
2207 | _SimulInfo UserData
2210 SingleValSet : EDIF_TOK_SINGLEVALUESET _SingleValSet PopC
2213 _SingleValSet :
2214 | Range
2217 Site : EDIF_TOK_SITE ViewRef _Site PopC
2220 _Site :
2221 | Transform
2224 Socket : EDIF_TOK_SOCKET _Socket PopC
2227 _Socket :
2228 | Symmetry
2231 SocketSet : EDIF_TOK_SOCKETSET _SocketSet PopC
2234 _SocketSet : Symmetry
2235 | _SocketSet Site
2238 Status : EDIF_TOK_STATUS _Status PopC
2241 _Status :
2242 | _Status Written
2243 | _Status Comment
2244 | _Status UserData
2247 Steady : EDIF_TOK_STEADY __Steady _Steady PopC
2250 __Steady : PortNameRef
2251 | PortRef { str_pair_free($1); }
2252 | PortList
2255 _Steady : Duration
2256 | _Steady Transition
2257 | _Steady Becomes
2260 StrDisplay : EDIF_TOK_STRINGDISPLAY _StrDisplay PopC
2263 String : EDIF_TOK_STRING _String PopC
2266 _String :
2267 | _String Str { free($2); }
2268 | _String StrDisplay
2269 | _String String
2272 _StrDisplay : Str { free($1); }
2273 | _StrDisplay Display
2276 Strong : EDIF_TOK_STRONG LogicNameRef PopC
2279 Symbol : EDIF_TOK_SYMBOL _Symbol PopC
2282 _Symbol :
2283 | _Symbol PortImpl
2284 | _Symbol Figure
2285 | _Symbol Instance
2286 | _Symbol CommGraph
2287 | _Symbol Annotate
2288 | _Symbol PageSize
2289 | _Symbol BoundBox
2290 | _Symbol PropDisplay
2291 | _Symbol KeywordDisp
2292 | _Symbol ParamDisp
2293 | _Symbol Property
2294 | _Symbol Comment
2295 | _Symbol UserData
2298 Symmetry : EDIF_TOK_SYMMETRY _Symmetry PopC
2301 _Symmetry :
2302 | _Symmetry Transform
2305 Table : EDIF_TOK_TABLE _Table PopC
2308 _Table :
2309 | _Table Entry
2310 | _Table TableDeflt
2313 TableDeflt : EDIF_TOK_TABLEDEFAULT __TableDeflt _TableDeflt PopC
2316 __TableDeflt : LogicRef
2317 | PortRef { str_pair_free($1); }
2318 | NoChange
2319 | Table
2322 _TableDeflt :
2323 | Delay
2324 | LoadDelay
2327 Technology : EDIF_TOK_TECHNOLOGY _Technology PopC
2330 _Technology : NumberDefn
2331 | _Technology FigGrp
2332 | _Technology Fabricate
2333 | _Technology SimulInfo
2334 | _Technology DesignRule
2335 | _Technology Comment
2336 | _Technology UserData
2339 TextHeight : EDIF_TOK_TEXTHEIGHT Int PopC { free($2); }
2342 TimeIntval : EDIF_TOK_TIMEINTERVAL __TimeIntval _TimeIntval PopC
2345 __TimeIntval : Event
2346 | OffsetEvent
2349 _TimeIntval : Event
2350 | OffsetEvent
2351 | Duration
2354 TimeStamp : EDIF_TOK_TIMESTAMP Int Int Int Int Int Int PopC
2355 { free($2); free($3); free($4); free($5); free($6); free($7); }
2358 Timing : EDIF_TOK_TIMING _Timing PopC
2361 _Timing : Derivation
2362 | _Timing PathDelay
2363 | _Timing Forbidden
2364 | _Timing Comment
2365 | _Timing UserData
2368 Transform : EDIF_TOK_TRANSFORM _TransX _TransY _TransDelta _TransOrien _TransOrg
2369 PopC
2372 _TransX :
2373 | ScaleX
2376 _TransY :
2377 | ScaleY
2380 _TransDelta :
2381 | Delta
2384 _TransOrien :
2385 | Orientation
2388 _TransOrg :
2389 | Origin
2392 Transition : EDIF_TOK_TRANSITION _Transition _Transition PopC
2395 _Transition : LogicNameRef
2396 | LogicList
2397 | LogicOneOf
2400 Trigger : EDIF_TOK_TRIGGER _Trigger PopC
2403 _Trigger :
2404 | _Trigger Change
2405 | _Trigger Steady
2406 | _Trigger Initial
2409 True : EDIF_TOK_TRUE PopC
2412 TypedValue : Boolean
2413 | Integer
2414 | MiNoMa
2415 | Number
2416 | Point
2417 | String
2420 Unconstrained : EDIF_TOK_UNCONSTRAINED PopC
2423 Undefined : EDIF_TOK_UNDEFINED PopC
2426 Union : EDIF_TOK_UNION _Union PopC
2429 _Union : FigGrpRef
2430 | FigureOp
2431 | _Union FigGrpRef
2432 | _Union FigureOp
2435 Unit : EDIF_TOK_UNIT _Unit PopC
2438 _Unit : EDIF_TOK_DISTANCE
2439 | EDIF_TOK_CAPACITANCE
2440 | EDIF_TOK_CURRENT
2441 | EDIF_TOK_RESISTANCE
2442 | EDIF_TOK_TEMPERATURE
2443 | EDIF_TOK_TIME
2444 | EDIF_TOK_VOLTAGE
2445 | EDIF_TOK_MASS
2446 | EDIF_TOK_FREQUENCY
2447 | EDIF_TOK_INDUCTANCE
2448 | EDIF_TOK_ENERGY
2449 | EDIF_TOK_POWER
2450 | EDIF_TOK_CHARGE
2451 | EDIF_TOK_CONDUCTANCE
2452 | EDIF_TOK_FLUX
2453 | EDIF_TOK_ANGLE
2456 Unused : EDIF_TOK_UNUSED PopC
2459 UserData : EDIF_TOK_USERDATA _UserData PopC
2462 _UserData : Ident { free($1); }
2463 | _UserData Int { free($2); }
2464 | _UserData Str { free($2); }
2465 | _UserData Ident { free($2); }
2466 | _UserData Form
2469 ValueNameDef : NameDef { str_pair_free($1); }
2470 | Array
2473 ValueNameRef : NameRef { free($1); }
2474 | Member
2477 Version : EDIF_TOK_VERSION Str PopC { free($2); }
2480 View : EDIF_TOK_VIEW ViewNameDef ViewType _View PopC
2483 _View : Interface
2484 | _View Status
2485 | _View Contents
2486 | _View Comment
2487 | _View Property
2488 | _View UserData
2491 ViewList : EDIF_TOK_VIEWLIST _ViewList PopC
2494 _ViewList :
2495 | _ViewList ViewRef
2496 | _ViewList ViewList
2499 ViewMap : EDIF_TOK_VIEWMAP _ViewMap PopC
2502 _ViewMap :
2503 | _ViewMap PortMap
2504 | _ViewMap PortBackAn
2505 | _ViewMap InstMap
2506 | _ViewMap InstBackAn
2507 | _ViewMap NetMap
2508 | _ViewMap NetBackAn
2509 | _ViewMap Comment
2510 | _ViewMap UserData
2513 ViewNameDef : NameDef { str_pair_free($1); }
2516 ViewNameRef : NameRef { free($1); }
2519 ViewRef : EDIF_TOK_VIEWREF ViewNameRef _ViewRef PopC
2522 _ViewRef :
2523 | CellRef
2526 ViewType : EDIF_TOK_VIEWTYPE _ViewType PopC
2529 _ViewType : EDIF_TOK_MASKLAYOUT
2530 | EDIF_TOK_PCBLAYOUT
2531 | EDIF_TOK_NETLIST
2532 | EDIF_TOK_SCHEMATIC
2533 | EDIF_TOK_SYMBOLIC
2534 | EDIF_TOK_BEHAVIOR
2535 | EDIF_TOK_LOGICMODEL
2536 | EDIF_TOK_DOCUMENT
2537 | EDIF_TOK_GRAPHIC
2538 | EDIF_TOK_STRANGER
2541 Visible : EDIF_TOK_VISIBLE BooleanValue PopC
2544 VoltageMap : EDIF_TOK_VOLTAGEMAP MiNoMaValue PopC
2547 WaveValue : EDIF_TOK_WAVEVALUE LogicNameDef ScaledInt LogicWave PopC
2550 Weak : EDIF_TOK_WEAK LogicNameRef PopC
2553 WeakJoined : EDIF_TOK_WEAKJOINED _WeakJoined PopC
2556 _WeakJoined :
2557 | _WeakJoined PortRef { str_pair_free($2); }
2558 | _WeakJoined PortList
2559 | _WeakJoined Joined { pair_list_free($2); }
2562 When : EDIF_TOK_WHEN _When PopC
2565 _When : Trigger
2566 | _When After
2567 | _When Follow
2568 | _When Maintain
2569 | _When LogicAssn
2570 | _When Comment
2571 | _When UserData
2574 Written : EDIF_TOK_WRITTEN _Written PopC
2577 _Written : TimeStamp
2578 | _Written Author
2579 | _Written Program
2580 | _Written DataOrigin
2581 | _Written Property
2582 | _Written Comment
2583 | _Written UserData
2586 Ident : EDIF_TOK_IDENT { $$=$1; }
2589 Str : EDIF_TOK_STR { $$=$1; }
2592 Int : EDIF_TOK_INT { $$=$1; }
2595 Keyword : EDIF_TOK_KEYWORD { $$=$1; }
2600 * xmalloc:
2602 * Garbage function for 'alloca()'.
2604 char *xmalloc(siz)
2605 int siz;
2607 return (Malloc(siz));
2610 * Token & context carriers:
2612 * These are the linkage pointers for threading this context garbage
2613 * for converting identifiers into parser tokens.
2615 typedef struct TokenCar {
2616 struct TokenCar *Next; /* pointer to next carrier */
2617 struct Token *Token; /* associated token */
2618 } TokenCar;
2619 typedef struct UsedCar {
2620 struct UsedCar *Next; /* pointer to next carrier */
2621 short Code; /* used '%token' value */
2622 } UsedCar;
2623 typedef struct ContextCar {
2624 struct ContextCar *Next; /* pointer to next carrier */
2625 struct Context *Context; /* associated context */
2626 union {
2627 int Single; /* single usage flag (context tree) */
2628 struct UsedCar *Used; /* single used list (context stack) */
2629 } u;
2630 } ContextCar;
2632 * Token definitions:
2634 * This associates the '%token' codings with strings which are to
2635 * be free standing tokens. Doesn't have to be in sorted order but the
2636 * strings must be in lower case.
2638 typedef struct Token {
2639 char *Name; /* token name */
2640 int Code; /* '%token' value */
2641 struct Token *Next; /* hash table linkage */
2642 } Token;
2643 static Token TokenDef[] = {
2644 {"angle", EDIF_TOK_ANGLE},
2645 {"behavior", EDIF_TOK_BEHAVIOR},
2646 {"calculated", EDIF_TOK_CALCULATED},
2647 {"capacitance", EDIF_TOK_CAPACITANCE},
2648 {"centercenter", EDIF_TOK_CENTERCENTER},
2649 {"centerleft", EDIF_TOK_CENTERLEFT},
2650 {"centerright", EDIF_TOK_CENTERRIGHT},
2651 {"charge", EDIF_TOK_CHARGE},
2652 {"conductance", EDIF_TOK_CONDUCTANCE},
2653 {"current", EDIF_TOK_CURRENT},
2654 {"distance", EDIF_TOK_DISTANCE},
2655 {"document", EDIF_TOK_DOCUMENT},
2656 {"energy", EDIF_TOK_ENERGY},
2657 {"extend", EDIF_TOK_EXTEND},
2658 {"flux", EDIF_TOK_FLUX},
2659 {"frequency", EDIF_TOK_FREQUENCY},
2660 {"generic", EDIF_TOK_GENERIC},
2661 {"graphic", EDIF_TOK_GRAPHIC},
2662 {"inductance", EDIF_TOK_INDUCTANCE},
2663 {"inout", EDIF_TOK_INOUT},
2664 {"input", EDIF_TOK_INPUT},
2665 {"logicmodel", EDIF_TOK_LOGICMODEL},
2666 {"lowercenter", EDIF_TOK_LOWERCENTER},
2667 {"lowerleft", EDIF_TOK_LOWERLEFT},
2668 {"lowerright", EDIF_TOK_LOWERRIGHT},
2669 {"masklayout", EDIF_TOK_MASKLAYOUT},
2670 {"mass", EDIF_TOK_MASS},
2671 {"measured", EDIF_TOK_MEASURED},
2672 {"mx", EDIF_TOK_MX},
2673 {"mxr90", EDIF_TOK_MXR90},
2674 {"my", EDIF_TOK_MY},
2675 {"myr90", EDIF_TOK_MYR90},
2676 {"netlist", EDIF_TOK_NETLIST},
2677 {"output", EDIF_TOK_OUTPUT},
2678 {"pcblayout", EDIF_TOK_PCBLAYOUT},
2679 {"power", EDIF_TOK_POWER},
2680 {"r0", EDIF_TOK_R0},
2681 {"r180", EDIF_TOK_R180},
2682 {"r270", EDIF_TOK_R270},
2683 {"r90", EDIF_TOK_R90},
2684 {"required", EDIF_TOK_REQUIRED},
2685 {"resistance", EDIF_TOK_RESISTANCE},
2686 {"ripper", EDIF_TOK_RIPPER},
2687 {"round", EDIF_TOK_ROUND},
2688 {"schematic", EDIF_TOK_SCHEMATIC},
2689 {"stranger", EDIF_TOK_STRANGER},
2690 {"symbolic", EDIF_TOK_SYMBOLIC},
2691 {"temperature", EDIF_TOK_TEMPERATURE},
2692 {"tie", EDIF_TOK_TIE},
2693 {"time", EDIF_TOK_TIME},
2694 {"truncate", EDIF_TOK_TRUNCATE},
2695 {"uppercenter", EDIF_TOK_UPPERCENTER},
2696 {"upperleft", EDIF_TOK_UPPERLEFT},
2697 {"upperright", EDIF_TOK_UPPERRIGHT},
2698 {"voltage", EDIF_TOK_VOLTAGE}
2700 static int TokenDefSize = sizeof(TokenDef) / sizeof(Token);
2702 * Token enable definitions:
2704 * There is one array for each set of tokens enabled by a
2705 * particular context (barf). Another array is used to bind
2706 * these arrays to a context.
2708 static short e_CellType[] = {EDIF_TOK_TIE, EDIF_TOK_RIPPER, EDIF_TOK_GENERIC};
2709 static short e_CornerType[] = {EDIF_TOK_EXTEND, EDIF_TOK_TRUNCATE,
2710 EDIF_TOK_ROUND};
2711 static short e_Derivation[] = {EDIF_TOK_CALCULATED, EDIF_TOK_MEASURED,
2712 EDIF_TOK_REQUIRED};
2713 static short e_Direction[] = {EDIF_TOK_INPUT, EDIF_TOK_OUTPUT,
2714 EDIF_TOK_INOUT};
2715 static short e_EndType[] = {EDIF_TOK_EXTEND, EDIF_TOK_TRUNCATE,
2716 EDIF_TOK_ROUND};
2717 static short e_Justify[] = {EDIF_TOK_CENTERCENTER, EDIF_TOK_CENTERLEFT,
2718 EDIF_TOK_CENTERRIGHT, EDIF_TOK_LOWERCENTER,
2719 EDIF_TOK_LOWERLEFT, EDIF_TOK_LOWERRIGHT,
2720 EDIF_TOK_UPPERCENTER, EDIF_TOK_UPPERLEFT,
2721 EDIF_TOK_UPPERRIGHT};
2722 static short e_Orientation[] = {EDIF_TOK_R0, EDIF_TOK_R90, EDIF_TOK_R180,
2723 EDIF_TOK_R270, EDIF_TOK_MX, EDIF_TOK_MY,
2724 EDIF_TOK_MXR90, EDIF_TOK_MYR90};
2725 static short e_Unit[] = {EDIF_TOK_DISTANCE, EDIF_TOK_CAPACITANCE,
2726 EDIF_TOK_CURRENT, EDIF_TOK_RESISTANCE,
2727 EDIF_TOK_TEMPERATURE, EDIF_TOK_TIME,
2728 EDIF_TOK_VOLTAGE, EDIF_TOK_MASS, EDIF_TOK_FREQUENCY,
2729 EDIF_TOK_INDUCTANCE, EDIF_TOK_ENERGY,
2730 EDIF_TOK_POWER, EDIF_TOK_CHARGE,
2731 EDIF_TOK_CONDUCTANCE, EDIF_TOK_FLUX, EDIF_TOK_ANGLE};
2732 static short e_ViewType[] = {EDIF_TOK_MASKLAYOUT, EDIF_TOK_PCBLAYOUT,
2733 EDIF_TOK_NETLIST, EDIF_TOK_SCHEMATIC,
2734 EDIF_TOK_SYMBOLIC, EDIF_TOK_BEHAVIOR,
2735 EDIF_TOK_LOGICMODEL, EDIF_TOK_DOCUMENT,
2736 EDIF_TOK_GRAPHIC, EDIF_TOK_STRANGER};
2738 * Token tying table:
2740 * This binds enabled tokens to a context.
2742 typedef struct Tie {
2743 short *Enable; /* pointer to enable array */
2744 short Origin; /* '%token' value of context */
2745 short EnableSize; /* size of enabled array */
2746 } Tie;
2747 #define TE(e,o) {e,o,sizeof(e)/sizeof(short)}
2748 static Tie TieDef[] = {
2749 TE(e_CellType, EDIF_TOK_CELLTYPE),
2750 TE(e_CornerType, EDIF_TOK_CORNERTYPE),
2751 TE(e_Derivation, EDIF_TOK_DERIVATION),
2752 TE(e_Direction, EDIF_TOK_DIRECTION),
2753 TE(e_EndType, EDIF_TOK_ENDTYPE),
2754 TE(e_Justify, EDIF_TOK_JUSTIFY),
2755 TE(e_Orientation, EDIF_TOK_ORIENTATION),
2756 TE(e_Unit, EDIF_TOK_UNIT),
2757 TE(e_ViewType, EDIF_TOK_VIEWTYPE)
2759 static int TieDefSize = sizeof(TieDef) / sizeof(Tie);
2761 * Context definitions:
2763 * This associates keyword strings with '%token' values. It
2764 * also creates a pretty much empty header for later building of
2765 * the context tree. Again they needn't be sorted, but strings
2766 * must be lower case.
2768 typedef struct Context {
2769 char *Name; /* keyword name */
2770 short Code; /* '%token' value */
2771 short Flags; /* special operation flags */
2772 struct ContextCar *Context; /* contexts which can be moved to */
2773 struct TokenCar *Token; /* active tokens */
2774 struct Context *Next; /* hash table linkage */
2775 } Context;
2776 static Context ContextDef[] = {
2777 {"", 0}, /* start context */
2778 {"acload", EDIF_TOK_ACLOAD},
2779 {"after", EDIF_TOK_AFTER},
2780 {"annotate", EDIF_TOK_ANNOTATE},
2781 {"apply", EDIF_TOK_APPLY},
2782 {"arc", EDIF_TOK_ARC},
2783 {"array", EDIF_TOK_ARRAY},
2784 {"arraymacro", EDIF_TOK_ARRAYMACRO},
2785 {"arrayrelatedinfo", EDIF_TOK_ARRAYRELATEDINFO},
2786 {"arraysite", EDIF_TOK_ARRAYSITE},
2787 {"atleast", EDIF_TOK_ATLEAST},
2788 {"atmost", EDIF_TOK_ATMOST},
2789 {"author", EDIF_TOK_AUTHOR},
2790 {"basearray", EDIF_TOK_BASEARRAY},
2791 {"becomes", EDIF_TOK_BECOMES},
2792 {"between", EDIF_TOK_BETWEEN},
2793 {"boolean", EDIF_TOK_BOOLEAN},
2794 {"booleandisplay", EDIF_TOK_BOOLEANDISPLAY},
2795 {"booleanmap", EDIF_TOK_BOOLEANMAP},
2796 {"borderpattern", EDIF_TOK_BORDERPATTERN},
2797 {"borderwidth", EDIF_TOK_BORDERWIDTH},
2798 {"boundingbox", EDIF_TOK_BOUNDINGBOX},
2799 {"cell", EDIF_TOK_CELL},
2800 {"cellref", EDIF_TOK_CELLREF},
2801 {"celltype", EDIF_TOK_CELLTYPE},
2802 {"change", EDIF_TOK_CHANGE},
2803 {"circle", EDIF_TOK_CIRCLE},
2804 {"color", EDIF_TOK_COLOR},
2805 {"comment", EDIF_TOK_COMMENT},
2806 {"commentgraphics", EDIF_TOK_COMMENTGRAPHICS},
2807 {"compound", EDIF_TOK_COMPOUND},
2808 {"connectlocation", EDIF_TOK_CONNECTLOCATION},
2809 {"contents", EDIF_TOK_CONTENTS},
2810 {"cornertype", EDIF_TOK_CORNERTYPE},
2811 {"criticality", EDIF_TOK_CRITICALITY},
2812 {"currentmap", EDIF_TOK_CURRENTMAP},
2813 {"curve", EDIF_TOK_CURVE},
2814 {"cycle", EDIF_TOK_CYCLE},
2815 {"dataorigin", EDIF_TOK_DATAORIGIN},
2816 {"dcfaninload", EDIF_TOK_DCFANINLOAD},
2817 {"dcfanoutload", EDIF_TOK_DCFANOUTLOAD},
2818 {"dcmaxfanin", EDIF_TOK_DCMAXFANIN},
2819 {"dcmaxfanout", EDIF_TOK_DCMAXFANOUT},
2820 {"delay", EDIF_TOK_DELAY},
2821 {"delta", EDIF_TOK_DELTA},
2822 {"derivation", EDIF_TOK_DERIVATION},
2823 {"design", EDIF_TOK_DESIGN},
2824 {"designator", EDIF_TOK_DESIGNATOR},
2825 {"difference", EDIF_TOK_DIFFERENCE},
2826 {"direction", EDIF_TOK_DIRECTION},
2827 {"display", EDIF_TOK_DISPLAY},
2828 {"dominates", EDIF_TOK_DOMINATES},
2829 {"dot", EDIF_TOK_DOT},
2830 {"duration", EDIF_TOK_DURATION},
2831 {"e", EDIF_TOK_E},
2832 {"edif", EDIF_TOK_EDIF},
2833 {"ediflevel", EDIF_TOK_EDIFLEVEL},
2834 {"edifversion", EDIF_TOK_EDIFVERSION},
2835 {"enclosuredistance", EDIF_TOK_ENCLOSUREDISTANCE},
2836 {"endtype", EDIF_TOK_ENDTYPE},
2837 {"entry", EDIF_TOK_ENTRY},
2838 {"exactly", EDIF_TOK_EXACTLY},
2839 {"external", EDIF_TOK_EXTERNAL},
2840 {"fabricate", EDIF_TOK_FABRICATE},
2841 {"false", EDIF_TOK_FALSE},
2842 {"figure", EDIF_TOK_FIGURE},
2843 {"figurearea", EDIF_TOK_FIGUREAREA},
2844 {"figuregroup", EDIF_TOK_FIGUREGROUP},
2845 {"figuregroupobject", EDIF_TOK_FIGUREGROUPOBJECT},
2846 {"figuregroupoverride", EDIF_TOK_FIGUREGROUPOVERRIDE},
2847 {"figuregroupref", EDIF_TOK_FIGUREGROUPREF},
2848 {"figureperimeter", EDIF_TOK_FIGUREPERIMETER},
2849 {"figurewidth", EDIF_TOK_FIGUREWIDTH},
2850 {"fillpattern", EDIF_TOK_FILLPATTERN},
2851 {"follow", EDIF_TOK_FOLLOW},
2852 {"forbiddenevent", EDIF_TOK_FORBIDDENEVENT},
2853 {"globalportref", EDIF_TOK_GLOBALPORTREF},
2854 {"greaterthan", EDIF_TOK_GREATERTHAN},
2855 {"gridmap", EDIF_TOK_GRIDMAP},
2856 {"ignore", EDIF_TOK_IGNORE},
2857 {"includefiguregroup", EDIF_TOK_INCLUDEFIGUREGROUP},
2858 {"initial", EDIF_TOK_INITIAL},
2859 {"instance", EDIF_TOK_INSTANCE},
2860 {"instancebackannotate", EDIF_TOK_INSTANCEBACKANNOTATE},
2861 {"instancegroup", EDIF_TOK_INSTANCEGROUP},
2862 {"instancemap", EDIF_TOK_INSTANCEMAP},
2863 {"instanceref", EDIF_TOK_INSTANCEREF},
2864 {"integer", EDIF_TOK_INTEGER},
2865 {"integerdisplay", EDIF_TOK_INTEGERDISPLAY},
2866 {"interface", EDIF_TOK_INTERFACE},
2867 {"interfiguregroupspacing", EDIF_TOK_INTERFIGUREGROUPSPACING},
2868 {"intersection", EDIF_TOK_INTERSECTION},
2869 {"intrafiguregroupspacing", EDIF_TOK_INTRAFIGUREGROUPSPACING},
2870 {"inverse", EDIF_TOK_INVERSE},
2871 {"isolated", EDIF_TOK_ISOLATED},
2872 {"joined", EDIF_TOK_JOINED},
2873 {"justify", EDIF_TOK_JUSTIFY},
2874 {"keyworddisplay", EDIF_TOK_KEYWORDDISPLAY},
2875 {"keywordlevel", EDIF_TOK_KEYWORDLEVEL},
2876 {"keywordmap", EDIF_TOK_KEYWORDMAP},
2877 {"lessthan", EDIF_TOK_LESSTHAN},
2878 {"library", EDIF_TOK_LIBRARY},
2879 {"libraryref", EDIF_TOK_LIBRARYREF},
2880 {"listofnets", EDIF_TOK_LISTOFNETS},
2881 {"listofports", EDIF_TOK_LISTOFPORTS},
2882 {"loaddelay", EDIF_TOK_LOADDELAY},
2883 {"logicassign", EDIF_TOK_LOGICASSIGN},
2884 {"logicinput", EDIF_TOK_LOGICINPUT},
2885 {"logiclist", EDIF_TOK_LOGICLIST},
2886 {"logicmapinput", EDIF_TOK_LOGICMAPINPUT},
2887 {"logicmapoutput", EDIF_TOK_LOGICMAPOUTPUT},
2888 {"logiconeof", EDIF_TOK_LOGICONEOF},
2889 {"logicoutput", EDIF_TOK_LOGICOUTPUT},
2890 {"logicport", EDIF_TOK_LOGICPORT},
2891 {"logicref", EDIF_TOK_LOGICREF},
2892 {"logicvalue", EDIF_TOK_LOGICVALUE},
2893 {"logicwaveform", EDIF_TOK_LOGICWAVEFORM},
2894 {"maintain", EDIF_TOK_MAINTAIN},
2895 {"match", EDIF_TOK_MATCH},
2896 {"member", EDIF_TOK_MEMBER},
2897 {"minomax", EDIF_TOK_MINOMAX},
2898 {"minomaxdisplay", EDIF_TOK_MINOMAXDISPLAY},
2899 {"mnm", EDIF_TOK_MNM},
2900 {"multiplevalueset", EDIF_TOK_MULTIPLEVALUESET},
2901 {"mustjoin", EDIF_TOK_MUSTJOIN},
2902 {"name", EDIF_TOK_NAME},
2903 {"net", EDIF_TOK_NET},
2904 {"netbackannotate", EDIF_TOK_NETBACKANNOTATE},
2905 {"netbundle", EDIF_TOK_NETBUNDLE},
2906 {"netdelay", EDIF_TOK_NETDELAY},
2907 {"netgroup", EDIF_TOK_NETGROUP},
2908 {"netmap", EDIF_TOK_NETMAP},
2909 {"netref", EDIF_TOK_NETREF},
2910 {"nochange", EDIF_TOK_NOCHANGE},
2911 {"nonpermutable", EDIF_TOK_NONPERMUTABLE},
2912 {"notallowed", EDIF_TOK_NOTALLOWED},
2913 {"notchspacing", EDIF_TOK_NOTCHSPACING},
2914 {"number", EDIF_TOK_NUMBER},
2915 {"numberdefinition", EDIF_TOK_NUMBERDEFINITION},
2916 {"numberdisplay", EDIF_TOK_NUMBERDISPLAY},
2917 {"offpageconnector", EDIF_TOK_OFFPAGECONNECTOR},
2918 {"offsetevent", EDIF_TOK_OFFSETEVENT},
2919 {"openshape", EDIF_TOK_OPENSHAPE},
2920 {"orientation", EDIF_TOK_ORIENTATION},
2921 {"origin", EDIF_TOK_ORIGIN},
2922 {"overhangdistance", EDIF_TOK_OVERHANGDISTANCE},
2923 {"overlapdistance", EDIF_TOK_OVERLAPDISTANCE},
2924 {"oversize", EDIF_TOK_OVERSIZE},
2925 {"owner", EDIF_TOK_OWNER},
2926 {"page", EDIF_TOK_PAGE},
2927 {"pagesize", EDIF_TOK_PAGESIZE},
2928 {"parameter", EDIF_TOK_PARAMETER},
2929 {"parameterassign", EDIF_TOK_PARAMETERASSIGN},
2930 {"parameterdisplay", EDIF_TOK_PARAMETERDISPLAY},
2931 {"path", EDIF_TOK_PATH},
2932 {"pathdelay", EDIF_TOK_PATHDELAY},
2933 {"pathwidth", EDIF_TOK_PATHWIDTH},
2934 {"permutable", EDIF_TOK_PERMUTABLE},
2935 {"physicaldesignrule", EDIF_TOK_PHYSICALDESIGNRULE},
2936 {"plug", EDIF_TOK_PLUG},
2937 {"point", EDIF_TOK_POINT},
2938 {"pointdisplay", EDIF_TOK_POINTDISPLAY},
2939 {"pointlist", EDIF_TOK_POINTLIST},
2940 {"polygon", EDIF_TOK_POLYGON},
2941 {"port", EDIF_TOK_PORT},
2942 {"portbackannotate", EDIF_TOK_PORTBACKANNOTATE},
2943 {"portbundle", EDIF_TOK_PORTBUNDLE},
2944 {"portdelay", EDIF_TOK_PORTDELAY},
2945 {"portgroup", EDIF_TOK_PORTGROUP},
2946 {"portimplementation", EDIF_TOK_PORTIMPLEMENTATION},
2947 {"portinstance", EDIF_TOK_PORTINSTANCE},
2948 {"portlist", EDIF_TOK_PORTLIST},
2949 {"portlistalias", EDIF_TOK_PORTLISTALIAS},
2950 {"portmap", EDIF_TOK_PORTMAP},
2951 {"portref", EDIF_TOK_PORTREF},
2952 {"program", EDIF_TOK_PROGRAM},
2953 {"property", EDIF_TOK_PROPERTY},
2954 {"propertydisplay", EDIF_TOK_PROPERTYDISPLAY},
2955 {"protectionframe", EDIF_TOK_PROTECTIONFRAME},
2956 {"pt", EDIF_TOK_PT},
2957 {"rangevector", EDIF_TOK_RANGEVECTOR},
2958 {"rectangle", EDIF_TOK_RECTANGLE},
2959 {"rectanglesize", EDIF_TOK_RECTANGLESIZE},
2960 {"rename", EDIF_TOK_RENAME},
2961 {"resolves", EDIF_TOK_RESOLVES},
2962 {"scale", EDIF_TOK_SCALE},
2963 {"scalex", EDIF_TOK_SCALEX},
2964 {"scaley", EDIF_TOK_SCALEY},
2965 {"section", EDIF_TOK_SECTION},
2966 {"shape", EDIF_TOK_SHAPE},
2967 {"simulate", EDIF_TOK_SIMULATE},
2968 {"simulationinfo", EDIF_TOK_SIMULATIONINFO},
2969 {"singlevalueset", EDIF_TOK_SINGLEVALUESET},
2970 {"site", EDIF_TOK_SITE},
2971 {"socket", EDIF_TOK_SOCKET},
2972 {"socketset", EDIF_TOK_SOCKETSET},
2973 {"status", EDIF_TOK_STATUS},
2974 {"steady", EDIF_TOK_STEADY},
2975 {"string", EDIF_TOK_STRING},
2976 {"stringdisplay", EDIF_TOK_STRINGDISPLAY},
2977 {"strong", EDIF_TOK_STRONG},
2978 {"symbol", EDIF_TOK_SYMBOL},
2979 {"symmetry", EDIF_TOK_SYMMETRY},
2980 {"table", EDIF_TOK_TABLE},
2981 {"tabledefault", EDIF_TOK_TABLEDEFAULT},
2982 {"technology", EDIF_TOK_TECHNOLOGY},
2983 {"textheight", EDIF_TOK_TEXTHEIGHT},
2984 {"timeinterval", EDIF_TOK_TIMEINTERVAL},
2985 {"timestamp", EDIF_TOK_TIMESTAMP},
2986 {"timing", EDIF_TOK_TIMING},
2987 {"transform", EDIF_TOK_TRANSFORM},
2988 {"transition", EDIF_TOK_TRANSITION},
2989 {"trigger", EDIF_TOK_TRIGGER},
2990 {"true", EDIF_TOK_TRUE},
2991 {"unconstrained", EDIF_TOK_UNCONSTRAINED},
2992 {"undefined", EDIF_TOK_UNDEFINED},
2993 {"union", EDIF_TOK_UNION},
2994 {"unit", EDIF_TOK_UNIT},
2995 {"unused", EDIF_TOK_UNUSED},
2996 {"userdata", EDIF_TOK_USERDATA},
2997 {"version", EDIF_TOK_VERSION},
2998 {"view", EDIF_TOK_VIEW},
2999 {"viewlist", EDIF_TOK_VIEWLIST},
3000 {"viewmap", EDIF_TOK_VIEWMAP},
3001 {"viewref", EDIF_TOK_VIEWREF},
3002 {"viewtype", EDIF_TOK_VIEWTYPE},
3003 {"visible", EDIF_TOK_VISIBLE},
3004 {"voltagemap", EDIF_TOK_VOLTAGEMAP},
3005 {"wavevalue", EDIF_TOK_WAVEVALUE},
3006 {"weak", EDIF_TOK_WEAK},
3007 {"weakjoined", EDIF_TOK_WEAKJOINED},
3008 {"when", EDIF_TOK_WHEN},
3009 {"written", EDIF_TOK_WRITTEN}
3011 static int ContextDefSize = sizeof(ContextDef) / sizeof(Context);
3013 * Context follower tables:
3015 * This is pretty ugly, an array is defined for each context
3016 * which has following context levels. Yet another table is used
3017 * to bind these arrays to the originating contexts.
3018 * Arrays are declared as:
3020 * static short f_<Context name>[] = { ... };
3022 * The array entries are the '%token' values for all keywords which
3023 * can be reached from the <Context name> context. Like I said, ugly,
3024 * but it works.
3025 * A negative entry means that the follow can only occur once within
3026 * the specified context.
3028 static short f_NULL[] = {EDIF_TOK_EDIF};
3029 static short f_Edif[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME, EDIF_TOK_EDIFVERSION,
3030 EDIF_TOK_EDIFLEVEL, EDIF_TOK_KEYWORDMAP,
3031 -EDIF_TOK_STATUS, EDIF_TOK_EXTERNAL,
3032 EDIF_TOK_LIBRARY, EDIF_TOK_DESIGN, EDIF_TOK_COMMENT,
3033 EDIF_TOK_USERDATA};
3034 static short f_AcLoad[] = {EDIF_TOK_MNM, EDIF_TOK_E, EDIF_TOK_MINOMAXDISPLAY};
3035 static short f_After[] = {EDIF_TOK_MNM, EDIF_TOK_E, EDIF_TOK_FOLLOW,
3036 EDIF_TOK_MAINTAIN, EDIF_TOK_LOGICASSIGN,
3037 EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3038 static short f_Annotate[] = {EDIF_TOK_STRINGDISPLAY};
3039 static short f_Apply[] = {EDIF_TOK_CYCLE, EDIF_TOK_LOGICINPUT,
3040 EDIF_TOK_LOGICOUTPUT, EDIF_TOK_COMMENT,
3041 EDIF_TOK_USERDATA};
3042 static short f_Arc[] = {EDIF_TOK_PT};
3043 static short f_Array[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME};
3044 static short f_ArrayMacro[] = {EDIF_TOK_PLUG};
3045 static short f_ArrayRelatedInfo[] = {EDIF_TOK_BASEARRAY, EDIF_TOK_ARRAYSITE,
3046 EDIF_TOK_ARRAYMACRO, EDIF_TOK_COMMENT,
3047 EDIF_TOK_USERDATA};
3048 static short f_ArraySite[] = {EDIF_TOK_SOCKET};
3049 static short f_AtLeast[] = {EDIF_TOK_E};
3050 static short f_AtMost[] = {EDIF_TOK_E};
3051 static short f_Becomes[] = {EDIF_TOK_NAME, EDIF_TOK_LOGICLIST,
3052 EDIF_TOK_LOGICONEOF};
3054 static short f_Between[] = {EDIF_TOK_ATLEAST, EDIF_TOK_GREATERTHAN,
3055 EDIF_TOK_ATMOST, EDIF_TOK_LESSTHAN};
3057 static short f_Boolean[] = {EDIF_TOK_FALSE, EDIF_TOK_TRUE,
3058 EDIF_TOK_BOOLEANDISPLAY, EDIF_TOK_BOOLEAN};
3059 static short f_BooleanDisplay[] = {EDIF_TOK_FALSE, EDIF_TOK_TRUE,
3060 EDIF_TOK_DISPLAY};
3061 static short f_BooleanMap[] = {EDIF_TOK_FALSE, EDIF_TOK_TRUE};
3062 static short f_BorderPattern[] = {EDIF_TOK_BOOLEAN};
3063 static short f_BoundingBox[] = {EDIF_TOK_RECTANGLE};
3064 static short f_Cell[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME, EDIF_TOK_CELLTYPE,
3065 -EDIF_TOK_STATUS, -EDIF_TOK_VIEWMAP, EDIF_TOK_VIEW,
3066 EDIF_TOK_COMMENT, EDIF_TOK_USERDATA,
3067 EDIF_TOK_PROPERTY};
3068 static short f_CellRef[] = {EDIF_TOK_NAME, EDIF_TOK_LIBRARYREF};
3069 static short f_Change[] = {EDIF_TOK_NAME, EDIF_TOK_PORTREF, EDIF_TOK_PORTLIST,
3070 EDIF_TOK_BECOMES, EDIF_TOK_TRANSITION};
3071 static short f_Circle[] = {EDIF_TOK_PT, EDIF_TOK_PROPERTY};
3072 static short f_Color[] = {EDIF_TOK_E};
3073 static short f_CommentGraphics[] = {EDIF_TOK_ANNOTATE, EDIF_TOK_FIGURE,
3074 EDIF_TOK_INSTANCE, -EDIF_TOK_BOUNDINGBOX,
3075 EDIF_TOK_PROPERTY, EDIF_TOK_COMMENT,
3076 EDIF_TOK_USERDATA};
3077 static short f_Compound[] = {EDIF_TOK_NAME};
3078 static short f_ConnectLocation[] = {EDIF_TOK_FIGURE};
3079 static short f_Contents[] = {EDIF_TOK_INSTANCE, EDIF_TOK_OFFPAGECONNECTOR,
3080 EDIF_TOK_FIGURE, EDIF_TOK_SECTION, EDIF_TOK_NET,
3081 EDIF_TOK_NETBUNDLE, EDIF_TOK_PAGE,
3082 EDIF_TOK_COMMENTGRAPHICS,
3083 EDIF_TOK_PORTIMPLEMENTATION,
3084 EDIF_TOK_TIMING, EDIF_TOK_SIMULATE,
3085 EDIF_TOK_WHEN, EDIF_TOK_FOLLOW,
3086 EDIF_TOK_LOGICPORT, -EDIF_TOK_BOUNDINGBOX,
3087 EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3088 static short f_Criticality[] = {EDIF_TOK_INTEGERDISPLAY};
3089 static short f_CurrentMap[] = {EDIF_TOK_MNM, EDIF_TOK_E};
3090 static short f_Curve[] = {EDIF_TOK_ARC, EDIF_TOK_PT};
3091 static short f_Cycle[] = {EDIF_TOK_DURATION};
3092 static short f_DataOrigin[] = {EDIF_TOK_VERSION};
3093 static short f_DcFanInLoad[] = {EDIF_TOK_E, EDIF_TOK_NUMBERDISPLAY};
3094 static short f_DcFanOutLoad[] = {EDIF_TOK_E, EDIF_TOK_NUMBERDISPLAY};
3095 static short f_DcMaxFanIn[] = {EDIF_TOK_E, EDIF_TOK_NUMBERDISPLAY};
3096 static short f_DcMaxFanOut[] = {EDIF_TOK_E, EDIF_TOK_NUMBERDISPLAY};
3097 static short f_Delay[] = {EDIF_TOK_MNM, EDIF_TOK_E};
3098 static short f_Delta[] = {EDIF_TOK_PT};
3099 static short f_Design[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME, EDIF_TOK_CELLREF,
3100 EDIF_TOK_STATUS, EDIF_TOK_COMMENT,
3101 EDIF_TOK_PROPERTY, EDIF_TOK_USERDATA};
3102 static short f_Designator[] = {EDIF_TOK_STRINGDISPLAY};
3103 static short f_Difference[] = {EDIF_TOK_FIGUREGROUPREF, EDIF_TOK_INTERSECTION,
3104 EDIF_TOK_UNION, EDIF_TOK_DIFFERENCE,
3105 EDIF_TOK_INVERSE, EDIF_TOK_OVERSIZE};
3106 static short f_Display[] = {EDIF_TOK_NAME, EDIF_TOK_FIGUREGROUPOVERRIDE,
3107 EDIF_TOK_JUSTIFY, EDIF_TOK_ORIENTATION,
3108 EDIF_TOK_ORIGIN};
3109 static short f_Dominates[] = {EDIF_TOK_NAME};
3110 static short f_Dot[] = {EDIF_TOK_PT, EDIF_TOK_PROPERTY};
3111 static short f_Duration[] = {EDIF_TOK_E};
3112 static short f_EnclosureDistance[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3113 EDIF_TOK_FIGUREGROUPOBJECT,
3114 EDIF_TOK_LESSTHAN, EDIF_TOK_GREATERTHAN,
3115 EDIF_TOK_ATMOST, EDIF_TOK_ATLEAST,
3116 EDIF_TOK_EXACTLY, EDIF_TOK_BETWEEN,
3117 EDIF_TOK_SINGLEVALUESET,
3118 EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3119 static short f_Entry[] = {EDIF_TOK_MATCH, EDIF_TOK_CHANGE, EDIF_TOK_STEADY,
3120 EDIF_TOK_LOGICREF, EDIF_TOK_PORTREF,
3121 EDIF_TOK_NOCHANGE, EDIF_TOK_TABLE,
3122 EDIF_TOK_DELAY, EDIF_TOK_LOADDELAY};
3123 static short f_Exactly[] = {EDIF_TOK_E};
3124 static short f_External[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3125 EDIF_TOK_EDIFLEVEL, EDIF_TOK_TECHNOLOGY,
3126 -EDIF_TOK_STATUS, EDIF_TOK_CELL, EDIF_TOK_COMMENT,
3127 EDIF_TOK_USERDATA};
3128 static short f_Fabricate[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME};
3129 static short f_Figure[] = {EDIF_TOK_NAME, EDIF_TOK_FIGUREGROUPOVERRIDE,
3130 EDIF_TOK_CIRCLE, EDIF_TOK_DOT, EDIF_TOK_OPENSHAPE,
3131 EDIF_TOK_PATH, EDIF_TOK_POLYGON,
3132 EDIF_TOK_RECTANGLE, EDIF_TOK_SHAPE,
3133 EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3134 static short f_FigureArea[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3135 EDIF_TOK_FIGUREGROUPOBJECT, EDIF_TOK_LESSTHAN,
3136 EDIF_TOK_GREATERTHAN, EDIF_TOK_ATMOST,
3137 EDIF_TOK_ATLEAST, EDIF_TOK_EXACTLY,
3138 EDIF_TOK_BETWEEN, EDIF_TOK_SINGLEVALUESET,
3139 EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3140 static short f_FigureGroup[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3141 -EDIF_TOK_CORNERTYPE, -EDIF_TOK_ENDTYPE,
3142 -EDIF_TOK_PATHWIDTH, -EDIF_TOK_BORDERWIDTH,
3143 -EDIF_TOK_COLOR, -EDIF_TOK_FILLPATTERN,
3144 -EDIF_TOK_BORDERPATTERN, -EDIF_TOK_TEXTHEIGHT,
3145 -EDIF_TOK_VISIBLE, EDIF_TOK_INCLUDEFIGUREGROUP,
3146 EDIF_TOK_COMMENT, EDIF_TOK_PROPERTY,
3147 EDIF_TOK_USERDATA};
3148 static short f_FigureGroupObject[] = {EDIF_TOK_NAME,
3149 EDIF_TOK_FIGUREGROUPOBJECT,
3150 EDIF_TOK_INTERSECTION, EDIF_TOK_UNION,
3151 EDIF_TOK_DIFFERENCE, EDIF_TOK_INVERSE,
3152 EDIF_TOK_OVERSIZE};
3153 static short f_FigureGroupOverride[] = {EDIF_TOK_NAME, -EDIF_TOK_CORNERTYPE,
3154 -EDIF_TOK_ENDTYPE, -EDIF_TOK_PATHWIDTH,
3155 -EDIF_TOK_BORDERWIDTH, -EDIF_TOK_COLOR,
3156 -EDIF_TOK_FILLPATTERN,
3157 -EDIF_TOK_TEXTHEIGHT,
3158 -EDIF_TOK_BORDERPATTERN,
3159 EDIF_TOK_VISIBLE, EDIF_TOK_COMMENT,
3160 EDIF_TOK_PROPERTY, EDIF_TOK_USERDATA};
3161 static short f_FigureGroupRef[] = {EDIF_TOK_NAME, EDIF_TOK_LIBRARYREF};
3162 static short f_FigurePerimeter[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3163 EDIF_TOK_FIGUREGROUPOBJECT,
3164 EDIF_TOK_LESSTHAN, EDIF_TOK_GREATERTHAN,
3165 EDIF_TOK_ATMOST, EDIF_TOK_ATLEAST,
3166 EDIF_TOK_EXACTLY, EDIF_TOK_BETWEEN,
3167 EDIF_TOK_SINGLEVALUESET, EDIF_TOK_COMMENT,
3168 EDIF_TOK_USERDATA};
3169 static short f_FigureWidth[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3170 EDIF_TOK_FIGUREGROUPOBJECT, EDIF_TOK_LESSTHAN,
3171 EDIF_TOK_GREATERTHAN, EDIF_TOK_ATMOST,
3172 EDIF_TOK_ATLEAST, EDIF_TOK_EXACTLY,
3173 EDIF_TOK_BETWEEN, EDIF_TOK_SINGLEVALUESET,
3174 EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3175 static short f_FillPattern[] = {EDIF_TOK_BOOLEAN};
3176 static short f_Follow[] = {EDIF_TOK_NAME, EDIF_TOK_PORTREF, EDIF_TOK_TABLE,
3177 EDIF_TOK_DELAY, EDIF_TOK_LOADDELAY};
3178 static short f_ForbiddenEvent[] = {EDIF_TOK_TIMEINTERVAL, EDIF_TOK_EVENT};
3179 static short f_GlobalPortRef[] = {EDIF_TOK_NAME};
3180 static short f_GreaterThan[] = {EDIF_TOK_E};
3181 static short f_GridMap[] = {EDIF_TOK_E};
3182 static short f_IncludeFigureGroup[] = {EDIF_TOK_FIGUREGROUPREF,
3183 EDIF_TOK_INTERSECTION, EDIF_TOK_UNION,
3184 EDIF_TOK_DIFFERENCE, EDIF_TOK_INVERSE,
3185 EDIF_TOK_OVERSIZE};
3186 static short f_Instance[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME, EDIF_TOK_ARRAY,
3187 EDIF_TOK_VIEWREF, EDIF_TOK_VIEWLIST,
3188 -EDIF_TOK_TRANSFORM, EDIF_TOK_PARAMETERASSIGN,
3189 EDIF_TOK_PORTINSTANCE, EDIF_TOK_TIMING,
3190 -EDIF_TOK_DESIGNATOR, EDIF_TOK_PROPERTY,
3191 EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3192 static short f_InstanceBackAnnotate[] = {EDIF_TOK_INSTANCEREF,
3193 -EDIF_TOK_DESIGNATOR, EDIF_TOK_TIMING,
3194 EDIF_TOK_PROPERTY, EDIF_TOK_COMMENT};
3195 static short f_InstanceGroup[] = {EDIF_TOK_INSTANCEREF};
3196 static short f_InstanceMap[] = {EDIF_TOK_INSTANCEREF, EDIF_TOK_INSTANCEGROUP,
3197 EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3198 static short f_InstanceRef[] = {EDIF_TOK_NAME, EDIF_TOK_MEMBER,
3199 EDIF_TOK_INSTANCEREF, EDIF_TOK_VIEWREF};
3200 static short f_Integer[] = {EDIF_TOK_INTEGERDISPLAY, EDIF_TOK_INTEGER};
3201 static short f_IntegerDisplay[] = {EDIF_TOK_DISPLAY};
3202 static short f_Interface[] = {EDIF_TOK_PORT, EDIF_TOK_PORTBUNDLE,
3203 -EDIF_TOK_SYMBOL, -EDIF_TOK_PROTECTIONFRAME,
3204 -EDIF_TOK_ARRAYRELATEDINFO, EDIF_TOK_PARAMETER,
3205 EDIF_TOK_JOINED, EDIF_TOK_MUSTJOIN,
3206 EDIF_TOK_WEAKJOINED, EDIF_TOK_PERMUTABLE,
3207 EDIF_TOK_TIMING, EDIF_TOK_SIMULATE,
3208 -EDIF_TOK_DESIGNATOR, EDIF_TOK_PROPERTY,
3209 EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3210 static short f_InterFigureGroupSpacing[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3211 EDIF_TOK_FIGUREGROUPOBJECT,
3212 EDIF_TOK_LESSTHAN,
3213 EDIF_TOK_GREATERTHAN,
3214 EDIF_TOK_ATMOST,
3215 EDIF_TOK_ATLEAST, EDIF_TOK_EXACTLY,
3216 EDIF_TOK_BETWEEN,
3217 EDIF_TOK_SINGLEVALUESET,
3218 EDIF_TOK_COMMENT,
3219 EDIF_TOK_USERDATA};
3220 static short f_Intersection[] = {EDIF_TOK_FIGUREGROUPREF,
3221 EDIF_TOK_INTERSECTION, EDIF_TOK_UNION,
3222 EDIF_TOK_DIFFERENCE, EDIF_TOK_INVERSE,
3223 EDIF_TOK_OVERSIZE};
3224 static short f_IntraFigureGroupSpacing[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3225 EDIF_TOK_FIGUREGROUPOBJECT,
3226 EDIF_TOK_LESSTHAN,
3227 EDIF_TOK_GREATERTHAN,
3228 EDIF_TOK_ATMOST, EDIF_TOK_ATLEAST,
3229 EDIF_TOK_EXACTLY, EDIF_TOK_BETWEEN,
3230 EDIF_TOK_SINGLEVALUESET,
3231 EDIF_TOK_COMMENT,
3232 EDIF_TOK_USERDATA};
3233 static short f_Inverse[] = {EDIF_TOK_FIGUREGROUPREF, EDIF_TOK_INTERSECTION,
3234 EDIF_TOK_UNION, EDIF_TOK_DIFFERENCE,
3235 EDIF_TOK_INVERSE, EDIF_TOK_OVERSIZE};
3236 static short f_Joined[] = {EDIF_TOK_PORTREF, EDIF_TOK_PORTLIST,
3237 EDIF_TOK_GLOBALPORTREF};
3238 static short f_KeywordDisplay[] = {EDIF_TOK_DISPLAY};
3239 static short f_KeywordMap[] = {EDIF_TOK_KEYWORDLEVEL, EDIF_TOK_COMMENT};
3240 static short f_LessThan[] = {EDIF_TOK_E};
3241 static short f_Library[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME, EDIF_TOK_EDIFLEVEL,
3242 EDIF_TOK_TECHNOLOGY, -EDIF_TOK_STATUS,
3243 EDIF_TOK_CELL, EDIF_TOK_COMMENT,
3244 EDIF_TOK_USERDATA};
3245 static short f_LibraryRef[] = {EDIF_TOK_NAME};
3246 static short f_ListOfNets[] = {EDIF_TOK_NET};
3247 static short f_ListOfPorts[] = {EDIF_TOK_PORT, EDIF_TOK_PORTBUNDLE};
3248 static short f_LoadDelay[] = {EDIF_TOK_MNM, EDIF_TOK_E, EDIF_TOK_MINOMAXDISPLAY};
3249 static short f_LogicAssign[] = {EDIF_TOK_NAME, EDIF_TOK_PORTREF,
3250 EDIF_TOK_LOGICREF, EDIF_TOK_TABLE,
3251 EDIF_TOK_DELAY, EDIF_TOK_LOADDELAY};
3252 static short f_LogicInput[] = {EDIF_TOK_PORTLIST, EDIF_TOK_PORTREF,
3253 EDIF_TOK_NAME, EDIF_TOK_LOGICWAVEFORM};
3254 static short f_LogicList[] = {EDIF_TOK_NAME, EDIF_TOK_LOGICONEOF,
3255 EDIF_TOK_IGNORE};
3256 static short f_LogicMapInput[] = {EDIF_TOK_LOGICREF};
3257 static short f_LogicMapOutput[] = {EDIF_TOK_LOGICREF};
3258 static short f_LogicOneOf[] = {EDIF_TOK_NAME, EDIF_TOK_LOGICLIST};
3259 static short f_LogicOutput[] = {EDIF_TOK_PORTLIST, EDIF_TOK_PORTREF,
3260 EDIF_TOK_NAME, EDIF_TOK_LOGICWAVEFORM};
3261 static short f_LogicPort[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3262 EDIF_TOK_PROPERTY, EDIF_TOK_COMMENT,
3263 EDIF_TOK_USERDATA};
3264 static short f_LogicRef[] = {EDIF_TOK_NAME, EDIF_TOK_LIBRARYREF};
3265 static short f_LogicValue[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3266 -EDIF_TOK_VOLTAGEMAP, -EDIF_TOK_CURRENTMAP,
3267 -EDIF_TOK_BOOLEANMAP, -EDIF_TOK_COMPOUND,
3268 -EDIF_TOK_WEAK ,-EDIF_TOK_STRONG,
3269 -EDIF_TOK_DOMINATES, -EDIF_TOK_LOGICMAPOUTPUT,
3270 -EDIF_TOK_LOGICMAPINPUT,
3271 -EDIF_TOK_ISOLATED, EDIF_TOK_RESOLVES,
3272 EDIF_TOK_PROPERTY, EDIF_TOK_COMMENT,
3273 EDIF_TOK_USERDATA};
3274 static short f_LogicWaveform[] = {EDIF_TOK_NAME, EDIF_TOK_LOGICLIST,
3275 EDIF_TOK_LOGICONEOF, EDIF_TOK_IGNORE};
3276 static short f_Maintain[] = {EDIF_TOK_NAME, EDIF_TOK_PORTREF, EDIF_TOK_DELAY,
3277 EDIF_TOK_LOADDELAY};
3278 static short f_Match[] = {EDIF_TOK_NAME, EDIF_TOK_PORTREF, EDIF_TOK_PORTLIST,
3279 EDIF_TOK_LOGICLIST, EDIF_TOK_LOGICONEOF};
3280 static short f_Member[] = {EDIF_TOK_NAME};
3281 static short f_MiNoMax[] = {EDIF_TOK_MNM, EDIF_TOK_E, EDIF_TOK_MINOMAXDISPLAY,
3282 EDIF_TOK_MINOMAX};
3283 static short f_MiNoMaxDisplay[] = {EDIF_TOK_MNM, EDIF_TOK_E, EDIF_TOK_DISPLAY};
3284 static short f_Mnm[] = {EDIF_TOK_E, EDIF_TOK_UNDEFINED,
3285 EDIF_TOK_UNCONSTRAINED};
3286 static short f_MultipleValueSet[] = {EDIF_TOK_RANGEVECTOR};
3287 static short f_MustJoin[] = {EDIF_TOK_PORTREF, EDIF_TOK_PORTLIST,
3288 EDIF_TOK_WEAKJOINED, EDIF_TOK_JOINED};
3289 static short f_Name[] = {EDIF_TOK_DISPLAY};
3290 static short f_Net[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME, -EDIF_TOK_CRITICALITY,
3291 EDIF_TOK_NETDELAY, EDIF_TOK_FIGURE, EDIF_TOK_NET,
3292 EDIF_TOK_INSTANCE, EDIF_TOK_COMMENTGRAPHICS,
3293 EDIF_TOK_PROPERTY, EDIF_TOK_COMMENT,
3294 EDIF_TOK_USERDATA, EDIF_TOK_JOINED, EDIF_TOK_ARRAY};
3295 static short f_NetBackAnnotate[] = {EDIF_TOK_NETREF, EDIF_TOK_NETDELAY,
3296 -EDIF_TOK_CRITICALITY, EDIF_TOK_PROPERTY,
3297 EDIF_TOK_COMMENT};
3298 static short f_NetBundle[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME, EDIF_TOK_ARRAY,
3299 EDIF_TOK_LISTOFNETS, EDIF_TOK_FIGURE,
3300 EDIF_TOK_COMMENTGRAPHICS, EDIF_TOK_PROPERTY,
3301 EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3302 static short f_NetDelay[] = {EDIF_TOK_DERIVATION, EDIF_TOK_DELAY,
3303 EDIF_TOK_TRANSITION, EDIF_TOK_BECOMES};
3304 static short f_NetGroup[] = {EDIF_TOK_NAME, EDIF_TOK_MEMBER, EDIF_TOK_NETREF};
3305 static short f_NetMap[] = {EDIF_TOK_NETREF, EDIF_TOK_NETGROUP,
3306 EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3307 static short f_NetRef[] = {EDIF_TOK_NAME, EDIF_TOK_MEMBER, EDIF_TOK_NETREF,
3308 EDIF_TOK_INSTANCEREF, EDIF_TOK_VIEWREF};
3309 static short f_NonPermutable[] = {EDIF_TOK_PORTREF, EDIF_TOK_PERMUTABLE};
3310 static short f_NotAllowed[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3311 EDIF_TOK_FIGUREGROUPOBJECT, EDIF_TOK_COMMENT,
3312 EDIF_TOK_USERDATA};
3313 static short f_NotchSpacing[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3314 EDIF_TOK_FIGUREGROUPOBJECT, EDIF_TOK_LESSTHAN,
3315 EDIF_TOK_GREATERTHAN, EDIF_TOK_ATMOST,
3316 EDIF_TOK_ATLEAST, EDIF_TOK_EXACTLY,
3317 EDIF_TOK_BETWEEN, EDIF_TOK_SINGLEVALUESET,
3318 EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3319 static short f_Number[] = {EDIF_TOK_E, EDIF_TOK_NUMBERDISPLAY, EDIF_TOK_NUMBER};
3320 static short f_NumberDefinition[] = {EDIF_TOK_SCALE, -EDIF_TOK_GRIDMAP,
3321 EDIF_TOK_COMMENT};
3322 static short f_NumberDisplay[] = {EDIF_TOK_E, EDIF_TOK_DISPLAY};
3323 static short f_OffPageConnector[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3324 -EDIF_TOK_UNUSED, EDIF_TOK_PROPERTY,
3325 EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3326 static short f_OffsetEvent[] = {EDIF_TOK_EVENT, EDIF_TOK_E};
3327 static short f_OpenShape[] = {EDIF_TOK_CURVE, EDIF_TOK_PROPERTY};
3328 static short f_Origin[] = {EDIF_TOK_PT};
3329 static short f_OverhangDistance[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3330 EDIF_TOK_FIGUREGROUPOBJECT, EDIF_TOK_LESSTHAN,
3331 EDIF_TOK_GREATERTHAN, EDIF_TOK_ATMOST,
3332 EDIF_TOK_ATLEAST, EDIF_TOK_EXACTLY,
3333 EDIF_TOK_BETWEEN, EDIF_TOK_SINGLEVALUESET,
3334 EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3335 static short f_OverlapDistance[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3336 EDIF_TOK_FIGUREGROUPOBJECT, EDIF_TOK_LESSTHAN,
3337 EDIF_TOK_GREATERTHAN, EDIF_TOK_ATMOST,
3338 EDIF_TOK_ATLEAST, EDIF_TOK_EXACTLY,
3339 EDIF_TOK_BETWEEN, EDIF_TOK_SINGLEVALUESET,
3340 EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3341 static short f_Oversize[] = {EDIF_TOK_FIGUREGROUPREF, EDIF_TOK_INTERSECTION,
3342 EDIF_TOK_UNION, EDIF_TOK_DIFFERENCE,
3343 EDIF_TOK_INVERSE, EDIF_TOK_OVERSIZE,
3344 EDIF_TOK_CORNERTYPE};
3345 static short f_Page[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME, EDIF_TOK_ARRAY,
3346 EDIF_TOK_INSTANCE, EDIF_TOK_NET, EDIF_TOK_NETBUNDLE,
3347 EDIF_TOK_COMMENTGRAPHICS, EDIF_TOK_PORTIMPLEMENTATION,
3348 -EDIF_TOK_PAGESIZE, -EDIF_TOK_BOUNDINGBOX,
3349 EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3350 static short f_PageSize[] = {EDIF_TOK_RECTANGLE};
3351 static short f_Parameter[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME, EDIF_TOK_ARRAY,
3352 EDIF_TOK_BOOLEAN, EDIF_TOK_INTEGER,
3353 EDIF_TOK_MINOMAX, EDIF_TOK_NUMBER,
3354 EDIF_TOK_POINT, EDIF_TOK_STRING};
3355 static short f_ParameterAssign[] = {EDIF_TOK_NAME, EDIF_TOK_MEMBER,
3356 EDIF_TOK_BOOLEAN, EDIF_TOK_INTEGER,
3357 EDIF_TOK_MINOMAX, EDIF_TOK_NUMBER, EDIF_TOK_POINT,
3358 EDIF_TOK_STRING};
3359 static short f_ParameterDisplay[] = {EDIF_TOK_NAME, EDIF_TOK_MEMBER,
3360 EDIF_TOK_DISPLAY};
3361 static short f_Path[] = {EDIF_TOK_POINTLIST, EDIF_TOK_PROPERTY};
3362 static short f_PathDelay[] = {EDIF_TOK_DELAY, EDIF_TOK_EVENT};
3363 static short f_Permutable[] = {EDIF_TOK_PORTREF, EDIF_TOK_PERMUTABLE,
3364 EDIF_TOK_NONPERMUTABLE};
3365 static short f_PhysicalDesignRule[] = {EDIF_TOK_FIGUREWIDTH,
3366 EDIF_TOK_FIGUREAREA,
3367 EDIF_TOK_RECTANGLESIZE,
3368 EDIF_TOK_FIGUREPERIMETER,
3369 EDIF_TOK_OVERLAPDISTANCE,
3370 EDIF_TOK_OVERHANGDISTANCE,
3371 EDIF_TOK_ENCLOSUREDISTANCE,
3372 EDIF_TOK_INTERFIGUREGROUPSPACING,
3373 EDIF_TOK_NOTCHSPACING,
3374 EDIF_TOK_INTRAFIGUREGROUPSPACING,
3375 EDIF_TOK_NOTALLOWED,
3376 EDIF_TOK_FIGUREGROUP, EDIF_TOK_COMMENT,
3377 EDIF_TOK_USERDATA};
3378 static short f_Plug[] = {EDIF_TOK_SOCKETSET};
3379 static short f_Point[] = {EDIF_TOK_PT, EDIF_TOK_POINTDISPLAY,
3380 EDIF_TOK_POINT};
3381 static short f_PointDisplay[] = {EDIF_TOK_PT, EDIF_TOK_DISPLAY};
3382 static short f_PointList[] = {EDIF_TOK_PT};
3383 static short f_Polygon[] = {EDIF_TOK_POINTLIST, EDIF_TOK_PROPERTY};
3384 static short f_Port[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME, EDIF_TOK_ARRAY,
3385 -EDIF_TOK_DIRECTION, -EDIF_TOK_UNUSED,
3386 EDIF_TOK_PORTDELAY, -EDIF_TOK_DESIGNATOR,
3387 -EDIF_TOK_DCFANINLOAD, -EDIF_TOK_DCFANOUTLOAD,
3388 -EDIF_TOK_DCMAXFANIN, -EDIF_TOK_DCMAXFANOUT,
3389 -EDIF_TOK_ACLOAD, EDIF_TOK_PROPERTY,
3390 EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3391 static short f_PortBackAnnotate[] = {EDIF_TOK_PORTREF, -EDIF_TOK_DESIGNATOR,
3392 EDIF_TOK_PORTDELAY, -EDIF_TOK_DCFANINLOAD,
3393 -EDIF_TOK_DCFANOUTLOAD,
3394 -EDIF_TOK_DCMAXFANIN,
3395 -EDIF_TOK_DCMAXFANOUT, -EDIF_TOK_ACLOAD,
3396 EDIF_TOK_PROPERTY, EDIF_TOK_COMMENT};
3397 static short f_PortBundle[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME, EDIF_TOK_ARRAY,
3398 EDIF_TOK_LISTOFPORTS, EDIF_TOK_PROPERTY,
3399 EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3400 static short f_PortDelay[] = {EDIF_TOK_DERIVATION, EDIF_TOK_DELAY,
3401 EDIF_TOK_LOADDELAY, EDIF_TOK_TRANSITION,
3402 EDIF_TOK_BECOMES};
3403 static short f_PortGroup[] = {EDIF_TOK_NAME, EDIF_TOK_MEMBER,
3404 EDIF_TOK_PORTREF};
3405 static short f_PortImplementation[] = {EDIF_TOK_PORTREF, EDIF_TOK_NAME, EDIF_TOK_MEMBER,
3406 -EDIF_TOK_CONNECTLOCATION,
3407 EDIF_TOK_FIGURE, EDIF_TOK_INSTANCE,
3408 EDIF_TOK_COMMENTGRAPHICS,
3409 EDIF_TOK_PROPERTYDISPLAY,
3410 EDIF_TOK_KEYWORDDISPLAY,
3411 EDIF_TOK_PROPERTY,
3412 EDIF_TOK_USERDATA, EDIF_TOK_COMMENT};
3413 static short f_PortInstance[] = {EDIF_TOK_PORTREF, EDIF_TOK_NAME,
3414 EDIF_TOK_MEMBER, -EDIF_TOK_UNUSED,
3415 EDIF_TOK_PORTDELAY, -EDIF_TOK_DESIGNATOR,
3416 -EDIF_TOK_DCFANINLOAD,
3417 -EDIF_TOK_DCFANOUTLOAD, -EDIF_TOK_DCMAXFANIN,
3418 -EDIF_TOK_DCMAXFANOUT, -EDIF_TOK_ACLOAD,
3419 EDIF_TOK_PROPERTY, EDIF_TOK_COMMENT,
3420 EDIF_TOK_USERDATA};
3421 static short f_PortList[] = {EDIF_TOK_PORTREF, EDIF_TOK_NAME,
3422 EDIF_TOK_MEMBER};
3423 static short f_PortListAlias[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3424 EDIF_TOK_ARRAY, EDIF_TOK_PORTLIST};
3425 static short f_PortMap[] = {EDIF_TOK_PORTREF, EDIF_TOK_PORTGROUP,
3426 EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3427 static short f_PortRef[] = {EDIF_TOK_NAME, EDIF_TOK_MEMBER,
3428 EDIF_TOK_PORTREF, EDIF_TOK_INSTANCEREF,
3429 EDIF_TOK_VIEWREF};
3430 static short f_Program[] = {EDIF_TOK_VERSION};
3431 static short f_Property[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME, EDIF_TOK_BOOLEAN,
3432 EDIF_TOK_INTEGER, EDIF_TOK_MINOMAX,
3433 EDIF_TOK_NUMBER, EDIF_TOK_POINT, EDIF_TOK_STRING,
3434 -EDIF_TOK_OWNER, -EDIF_TOK_UNIT,
3435 EDIF_TOK_PROPERTY, EDIF_TOK_COMMENT};
3436 static short f_PropertyDisplay[] = {EDIF_TOK_NAME, EDIF_TOK_DISPLAY};
3437 static short f_ProtectionFrame[] = {EDIF_TOK_PORTIMPLEMENTATION,
3438 EDIF_TOK_FIGURE, EDIF_TOK_INSTANCE,
3439 EDIF_TOK_COMMENTGRAPHICS,
3440 -EDIF_TOK_BOUNDINGBOX,
3441 EDIF_TOK_PROPERTYDISPLAY,
3442 EDIF_TOK_KEYWORDDISPLAY,
3443 EDIF_TOK_PARAMETERDISPLAY,
3444 EDIF_TOK_PROPERTY, EDIF_TOK_COMMENT,
3445 EDIF_TOK_USERDATA};
3446 static short f_RangeVector[] = {EDIF_TOK_LESSTHAN, EDIF_TOK_GREATERTHAN,
3447 EDIF_TOK_ATMOST, EDIF_TOK_ATLEAST,
3448 EDIF_TOK_EXACTLY, EDIF_TOK_BETWEEN,
3449 EDIF_TOK_SINGLEVALUESET};
3450 static short f_Rectangle[] = {EDIF_TOK_PT, EDIF_TOK_PROPERTY};
3451 static short f_RectangleSize[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME,
3452 EDIF_TOK_FIGUREGROUPOBJECT,
3453 EDIF_TOK_RANGEVECTOR,
3454 EDIF_TOK_MULTIPLEVALUESET,EDIF_TOK_COMMENT,
3455 EDIF_TOK_USERDATA};
3456 static short f_Rename[] = {EDIF_TOK_NAME, EDIF_TOK_STRINGDISPLAY};
3457 static short f_Resolves[] = {EDIF_TOK_NAME};
3458 static short f_Scale[] = {EDIF_TOK_E, EDIF_TOK_UNIT};
3459 static short f_Section[] = {EDIF_TOK_SECTION, EDIF_TOK_INSTANCE};
3460 static short f_Shape[] = {EDIF_TOK_CURVE, EDIF_TOK_PROPERTY};
3461 static short f_Simulate[] = {EDIF_TOK_NAME, EDIF_TOK_PORTLISTALIAS,
3462 EDIF_TOK_WAVEVALUE, EDIF_TOK_APPLY,
3463 EDIF_TOK_COMMENT, EDIF_TOK_USERDATA};
3464 static short f_SimulationInfo[] = {EDIF_TOK_LOGICVALUE, EDIF_TOK_COMMENT,
3465 EDIF_TOK_USERDATA};
3466 static short f_SingleValueSet[] = {EDIF_TOK_LESSTHAN, EDIF_TOK_GREATERTHAN,
3467 EDIF_TOK_ATMOST, EDIF_TOK_ATLEAST,
3468 EDIF_TOK_EXACTLY, EDIF_TOK_BETWEEN};
3469 static short f_Site[] = {EDIF_TOK_VIEWREF, EDIF_TOK_TRANSFORM};
3470 static short f_Socket[] = {EDIF_TOK_SYMMETRY};
3471 static short f_SocketSet[] = {EDIF_TOK_SYMMETRY, EDIF_TOK_SITE};
3472 static short f_Status[] = {EDIF_TOK_WRITTEN, EDIF_TOK_COMMENT,
3473 EDIF_TOK_USERDATA};
3474 static short f_Steady[] = {EDIF_TOK_NAME, EDIF_TOK_MEMBER, EDIF_TOK_PORTREF,
3475 EDIF_TOK_PORTLIST, EDIF_TOK_DURATION,
3476 EDIF_TOK_TRANSITION, EDIF_TOK_BECOMES};
3477 static short f_String[] = {EDIF_TOK_STRINGDISPLAY, EDIF_TOK_STRING};
3478 static short f_StringDisplay[] = {EDIF_TOK_DISPLAY};
3479 static short f_Strong[] = {EDIF_TOK_NAME};
3480 static short f_Symbol[] = {EDIF_TOK_PORTIMPLEMENTATION, EDIF_TOK_FIGURE,
3481 EDIF_TOK_INSTANCE, EDIF_TOK_COMMENTGRAPHICS,
3482 EDIF_TOK_ANNOTATE, -EDIF_TOK_PAGESIZE,
3483 -EDIF_TOK_BOUNDINGBOX, EDIF_TOK_PROPERTYDISPLAY,
3484 EDIF_TOK_KEYWORDDISPLAY, EDIF_TOK_PARAMETERDISPLAY,
3485 EDIF_TOK_PROPERTY, EDIF_TOK_COMMENT,
3486 EDIF_TOK_USERDATA};
3487 static short f_Symmetry[] = {EDIF_TOK_TRANSFORM};
3488 static short f_Table[] = {EDIF_TOK_ENTRY, EDIF_TOK_TABLEDEFAULT};
3489 static short f_TableDefault[] = {EDIF_TOK_LOGICREF, EDIF_TOK_PORTREF,
3490 EDIF_TOK_NOCHANGE, EDIF_TOK_TABLE,
3491 EDIF_TOK_DELAY, EDIF_TOK_LOADDELAY};
3492 static short f_Technology[] = {EDIF_TOK_NUMBERDEFINITION, EDIF_TOK_FIGUREGROUP,
3493 EDIF_TOK_FABRICATE, -EDIF_TOK_SIMULATIONINFO,
3494 EDIF_TOK_COMMENT, EDIF_TOK_USERDATA,
3495 -EDIF_TOK_PHYSICALDESIGNRULE};
3496 static short f_TimeInterval[] = {EDIF_TOK_EVENT, EDIF_TOK_OFFSETEVENT,
3497 EDIF_TOK_DURATION};
3498 static short f_Timing[] = {EDIF_TOK_DERIVATION, EDIF_TOK_PATHDELAY,
3499 EDIF_TOK_FORBIDDENEVENT, EDIF_TOK_COMMENT,
3500 EDIF_TOK_USERDATA};
3501 static short f_Transform[] = {EDIF_TOK_SCALEX, EDIF_TOK_SCALEY, EDIF_TOK_DELTA,
3502 EDIF_TOK_ORIENTATION, EDIF_TOK_ORIGIN};
3503 static short f_Transition[] = {EDIF_TOK_NAME, EDIF_TOK_LOGICLIST,
3504 EDIF_TOK_LOGICONEOF};
3505 static short f_Trigger[] = {EDIF_TOK_CHANGE, EDIF_TOK_STEADY,
3506 EDIF_TOK_INITIAL};
3507 static short f_Union[] = {EDIF_TOK_FIGUREGROUPREF, EDIF_TOK_INTERSECTION,
3508 EDIF_TOK_UNION, EDIF_TOK_DIFFERENCE,
3509 EDIF_TOK_INVERSE, EDIF_TOK_OVERSIZE};
3510 static short f_View[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME, EDIF_TOK_VIEWTYPE,
3511 EDIF_TOK_INTERFACE, -EDIF_TOK_STATUS,
3512 -EDIF_TOK_CONTENTS, EDIF_TOK_COMMENT,
3513 EDIF_TOK_PROPERTY, EDIF_TOK_USERDATA};
3514 static short f_ViewList[] = {EDIF_TOK_VIEWREF, EDIF_TOK_VIEWLIST};
3515 static short f_ViewMap[] = {EDIF_TOK_PORTMAP, EDIF_TOK_PORTBACKANNOTATE,
3516 EDIF_TOK_INSTANCEMAP,
3517 EDIF_TOK_INSTANCEBACKANNOTATE, EDIF_TOK_NETMAP,
3518 EDIF_TOK_NETBACKANNOTATE, EDIF_TOK_COMMENT,
3519 EDIF_TOK_USERDATA};
3520 static short f_ViewRef[] = {EDIF_TOK_NAME, EDIF_TOK_CELLREF};
3521 static short f_Visible[] = {EDIF_TOK_FALSE, EDIF_TOK_TRUE};
3522 static short f_VoltageMap[] = {EDIF_TOK_MNM, EDIF_TOK_E};
3523 static short f_WaveValue[] = {EDIF_TOK_NAME, EDIF_TOK_RENAME, EDIF_TOK_E,
3524 EDIF_TOK_LOGICWAVEFORM};
3525 static short f_Weak[] = {EDIF_TOK_NAME};
3526 static short f_WeakJoined[] = {EDIF_TOK_PORTREF, EDIF_TOK_PORTLIST,
3527 EDIF_TOK_JOINED};
3528 static short f_When[] = {EDIF_TOK_TRIGGER, EDIF_TOK_AFTER,
3529 EDIF_TOK_FOLLOW, EDIF_TOK_MAINTAIN,
3530 EDIF_TOK_LOGICASSIGN, EDIF_TOK_COMMENT,
3531 EDIF_TOK_USERDATA};
3532 static short f_Written[] = {EDIF_TOK_TIMESTAMP, EDIF_TOK_AUTHOR,
3533 EDIF_TOK_PROGRAM, EDIF_TOK_DATAORIGIN,
3534 EDIF_TOK_PROPERTY, EDIF_TOK_COMMENT,
3535 EDIF_TOK_USERDATA};
3537 * Context binding table:
3539 * This binds context follower arrays to their originating context.
3541 typedef struct Binder {
3542 short *Follower; /* pointer to follower array */
3543 short Origin; /* '%token' value of origin */
3544 short FollowerSize; /* size of follower array */
3545 } Binder;
3546 #define BE(f,o) {f,o,sizeof(f)/sizeof(short)}
3547 static Binder BinderDef[] = {
3548 BE(f_NULL, 0),
3549 BE(f_Edif, EDIF_TOK_EDIF),
3550 BE(f_AcLoad, EDIF_TOK_ACLOAD),
3551 BE(f_After, EDIF_TOK_AFTER),
3552 BE(f_Annotate, EDIF_TOK_ANNOTATE),
3553 BE(f_Apply, EDIF_TOK_APPLY),
3554 BE(f_Arc, EDIF_TOK_ARC),
3555 BE(f_Array, EDIF_TOK_ARRAY),
3556 BE(f_ArrayMacro, EDIF_TOK_ARRAYMACRO),
3557 BE(f_ArrayRelatedInfo, EDIF_TOK_ARRAYRELATEDINFO),
3558 BE(f_ArraySite, EDIF_TOK_ARRAYSITE),
3559 BE(f_AtLeast, EDIF_TOK_ATLEAST),
3560 BE(f_AtMost, EDIF_TOK_ATMOST),
3561 BE(f_Becomes, EDIF_TOK_BECOMES),
3562 BE(f_Boolean, EDIF_TOK_BOOLEAN),
3563 BE(f_BooleanDisplay, EDIF_TOK_BOOLEANDISPLAY),
3564 BE(f_BooleanMap, EDIF_TOK_BOOLEANMAP),
3565 BE(f_BorderPattern, EDIF_TOK_BORDERPATTERN),
3566 BE(f_BoundingBox, EDIF_TOK_BOUNDINGBOX),
3567 BE(f_Cell, EDIF_TOK_CELL),
3568 BE(f_CellRef, EDIF_TOK_CELLREF),
3569 BE(f_Change, EDIF_TOK_CHANGE),
3570 BE(f_Circle, EDIF_TOK_CIRCLE),
3571 BE(f_Color, EDIF_TOK_COLOR),
3572 BE(f_CommentGraphics, EDIF_TOK_COMMENTGRAPHICS),
3573 BE(f_Compound, EDIF_TOK_COMPOUND),
3574 BE(f_ConnectLocation, EDIF_TOK_CONNECTLOCATION),
3575 BE(f_Contents, EDIF_TOK_CONTENTS),
3576 BE(f_Criticality, EDIF_TOK_CRITICALITY),
3577 BE(f_CurrentMap, EDIF_TOK_CURRENTMAP),
3578 BE(f_Curve, EDIF_TOK_CURVE),
3579 BE(f_Cycle, EDIF_TOK_CYCLE),
3580 BE(f_DataOrigin, EDIF_TOK_DATAORIGIN),
3581 BE(f_DcFanInLoad, EDIF_TOK_DCFANINLOAD),
3582 BE(f_DcFanOutLoad, EDIF_TOK_DCFANOUTLOAD),
3583 BE(f_DcMaxFanIn, EDIF_TOK_DCMAXFANIN),
3584 BE(f_DcMaxFanOut, EDIF_TOK_DCMAXFANOUT),
3585 BE(f_Delay, EDIF_TOK_DELAY),
3586 BE(f_Delta, EDIF_TOK_DELTA),
3587 BE(f_Design, EDIF_TOK_DESIGN),
3588 BE(f_Designator, EDIF_TOK_DESIGNATOR),
3589 BE(f_Difference, EDIF_TOK_DIFFERENCE),
3590 BE(f_Display, EDIF_TOK_DISPLAY),
3591 BE(f_Dominates, EDIF_TOK_DOMINATES),
3592 BE(f_Dot, EDIF_TOK_DOT),
3593 BE(f_Duration, EDIF_TOK_DURATION),
3594 BE(f_EnclosureDistance, EDIF_TOK_ENCLOSUREDISTANCE),
3595 BE(f_Entry, EDIF_TOK_ENTRY),
3596 BE(f_Exactly, EDIF_TOK_EXACTLY),
3597 BE(f_External, EDIF_TOK_EXTERNAL),
3598 BE(f_Fabricate, EDIF_TOK_FABRICATE),
3599 BE(f_Figure, EDIF_TOK_FIGURE),
3600 BE(f_FigureArea, EDIF_TOK_FIGUREAREA),
3601 BE(f_FigureGroup, EDIF_TOK_FIGUREGROUP),
3602 BE(f_FigureGroupObject, EDIF_TOK_FIGUREGROUPOBJECT),
3603 BE(f_FigureGroupOverride, EDIF_TOK_FIGUREGROUPOVERRIDE),
3604 BE(f_FigureGroupRef, EDIF_TOK_FIGUREGROUPREF),
3605 BE(f_FigurePerimeter, EDIF_TOK_FIGUREPERIMETER),
3606 BE(f_FigureWidth, EDIF_TOK_FIGUREWIDTH),
3607 BE(f_FillPattern, EDIF_TOK_FILLPATTERN),
3608 BE(f_Follow, EDIF_TOK_FOLLOW),
3609 BE(f_ForbiddenEvent, EDIF_TOK_FORBIDDENEVENT),
3610 BE(f_GlobalPortRef, EDIF_TOK_GLOBALPORTREF),
3611 BE(f_GreaterThan, EDIF_TOK_GREATERTHAN),
3612 BE(f_GridMap, EDIF_TOK_GRIDMAP),
3613 BE(f_IncludeFigureGroup, EDIF_TOK_INCLUDEFIGUREGROUP),
3614 BE(f_Instance, EDIF_TOK_INSTANCE),
3615 BE(f_InstanceBackAnnotate, EDIF_TOK_INSTANCEBACKANNOTATE),
3616 BE(f_InstanceGroup, EDIF_TOK_INSTANCEGROUP),
3617 BE(f_InstanceMap, EDIF_TOK_INSTANCEMAP),
3618 BE(f_InstanceRef, EDIF_TOK_INSTANCEREF),
3619 BE(f_Integer, EDIF_TOK_INTEGER),
3620 BE(f_IntegerDisplay, EDIF_TOK_INTEGERDISPLAY),
3621 BE(f_InterFigureGroupSpacing, EDIF_TOK_INTERFIGUREGROUPSPACING),
3622 BE(f_Interface, EDIF_TOK_INTERFACE),
3623 BE(f_Intersection, EDIF_TOK_INTERSECTION),
3624 BE(f_IntraFigureGroupSpacing, EDIF_TOK_INTRAFIGUREGROUPSPACING),
3625 BE(f_Inverse, EDIF_TOK_INVERSE),
3626 BE(f_Joined, EDIF_TOK_JOINED),
3627 BE(f_KeywordDisplay, EDIF_TOK_KEYWORDDISPLAY),
3628 BE(f_KeywordMap, EDIF_TOK_KEYWORDMAP),
3629 BE(f_LessThan, EDIF_TOK_LESSTHAN),
3630 BE(f_Library, EDIF_TOK_LIBRARY),
3631 BE(f_LibraryRef, EDIF_TOK_LIBRARYREF),
3632 BE(f_ListOfNets, EDIF_TOK_LISTOFNETS),
3633 BE(f_ListOfPorts, EDIF_TOK_LISTOFPORTS),
3634 BE(f_LoadDelay, EDIF_TOK_LOADDELAY),
3635 BE(f_LogicAssign, EDIF_TOK_LOGICASSIGN),
3636 BE(f_LogicInput, EDIF_TOK_LOGICINPUT),
3637 BE(f_LogicList, EDIF_TOK_LOGICLIST),
3638 BE(f_LogicMapInput, EDIF_TOK_LOGICMAPINPUT),
3639 BE(f_LogicMapOutput, EDIF_TOK_LOGICMAPOUTPUT),
3640 BE(f_LogicOneOf, EDIF_TOK_LOGICONEOF),
3641 BE(f_LogicOutput, EDIF_TOK_LOGICOUTPUT),
3642 BE(f_LogicPort, EDIF_TOK_LOGICPORT),
3643 BE(f_LogicRef, EDIF_TOK_LOGICREF),
3644 BE(f_LogicValue, EDIF_TOK_LOGICVALUE),
3645 BE(f_LogicWaveform, EDIF_TOK_LOGICWAVEFORM),
3646 BE(f_Maintain, EDIF_TOK_MAINTAIN),
3647 BE(f_Match, EDIF_TOK_MATCH),
3648 BE(f_Member, EDIF_TOK_MEMBER),
3649 BE(f_MiNoMax, EDIF_TOK_MINOMAX),
3650 BE(f_MiNoMaxDisplay, EDIF_TOK_MINOMAXDISPLAY),
3651 BE(f_Mnm, EDIF_TOK_MNM),
3652 BE(f_MultipleValueSet, EDIF_TOK_MULTIPLEVALUESET),
3653 BE(f_MustJoin, EDIF_TOK_MUSTJOIN),
3654 BE(f_Name, EDIF_TOK_NAME),
3655 BE(f_Net, EDIF_TOK_NET),
3656 BE(f_NetBackAnnotate, EDIF_TOK_NETBACKANNOTATE),
3657 BE(f_NetBundle, EDIF_TOK_NETBUNDLE),
3658 BE(f_NetDelay, EDIF_TOK_NETDELAY),
3659 BE(f_NetGroup, EDIF_TOK_NETGROUP),
3660 BE(f_NetMap, EDIF_TOK_NETMAP),
3661 BE(f_NetRef, EDIF_TOK_NETREF),
3662 BE(f_NonPermutable, EDIF_TOK_NONPERMUTABLE),
3663 BE(f_NotAllowed, EDIF_TOK_NOTALLOWED),
3664 BE(f_NotchSpacing, EDIF_TOK_NOTCHSPACING),
3665 BE(f_Number, EDIF_TOK_NUMBER),
3666 BE(f_NumberDefinition, EDIF_TOK_NUMBERDEFINITION),
3667 BE(f_NumberDisplay, EDIF_TOK_NUMBERDISPLAY),
3668 BE(f_OffPageConnector, EDIF_TOK_OFFPAGECONNECTOR),
3669 BE(f_OffsetEvent, EDIF_TOK_OFFSETEVENT),
3670 BE(f_OpenShape, EDIF_TOK_OPENSHAPE),
3671 BE(f_Origin, EDIF_TOK_ORIGIN),
3672 BE(f_OverhangDistance, EDIF_TOK_OVERHANGDISTANCE),
3673 BE(f_OverlapDistance, EDIF_TOK_OVERLAPDISTANCE),
3674 BE(f_Oversize, EDIF_TOK_OVERSIZE),
3675 BE(f_Page, EDIF_TOK_PAGE),
3676 BE(f_PageSize, EDIF_TOK_PAGESIZE),
3677 BE(f_Parameter, EDIF_TOK_PARAMETER),
3678 BE(f_ParameterAssign, EDIF_TOK_PARAMETERASSIGN),
3679 BE(f_ParameterDisplay, EDIF_TOK_PARAMETERDISPLAY),
3680 BE(f_Path, EDIF_TOK_PATH),
3681 BE(f_PathDelay, EDIF_TOK_PATHDELAY),
3682 BE(f_Permutable, EDIF_TOK_PERMUTABLE),
3683 BE(f_PhysicalDesignRule, EDIF_TOK_PHYSICALDESIGNRULE),
3684 BE(f_Plug, EDIF_TOK_PLUG),
3685 BE(f_Point, EDIF_TOK_POINT),
3686 BE(f_PointDisplay, EDIF_TOK_POINTDISPLAY),
3687 BE(f_PointList, EDIF_TOK_POINTLIST),
3688 BE(f_Polygon, EDIF_TOK_POLYGON),
3689 BE(f_Port, EDIF_TOK_PORT),
3690 BE(f_PortBackAnnotate, EDIF_TOK_PORTBACKANNOTATE),
3691 BE(f_PortBundle, EDIF_TOK_PORTBUNDLE),
3692 BE(f_PortDelay, EDIF_TOK_PORTDELAY),
3693 BE(f_PortGroup, EDIF_TOK_PORTGROUP),
3694 BE(f_PortImplementation, EDIF_TOK_PORTIMPLEMENTATION),
3695 BE(f_PortInstance, EDIF_TOK_PORTINSTANCE),
3696 BE(f_PortList, EDIF_TOK_PORTLIST),
3697 BE(f_PortListAlias, EDIF_TOK_PORTLISTALIAS),
3698 BE(f_PortMap, EDIF_TOK_PORTMAP),
3699 BE(f_PortRef, EDIF_TOK_PORTREF),
3700 BE(f_Program, EDIF_TOK_PROGRAM),
3701 BE(f_Property, EDIF_TOK_PROPERTY),
3702 BE(f_PropertyDisplay, EDIF_TOK_PROPERTYDISPLAY),
3703 BE(f_ProtectionFrame, EDIF_TOK_PROTECTIONFRAME),
3704 BE(f_RangeVector, EDIF_TOK_RANGEVECTOR),
3705 BE(f_Rectangle, EDIF_TOK_RECTANGLE),
3706 BE(f_RectangleSize, EDIF_TOK_RECTANGLESIZE),
3707 BE(f_Rename, EDIF_TOK_RENAME),
3708 BE(f_Resolves, EDIF_TOK_RESOLVES),
3709 BE(f_Scale, EDIF_TOK_SCALE),
3710 BE(f_Section, EDIF_TOK_SECTION),
3711 BE(f_Shape, EDIF_TOK_SHAPE),
3712 BE(f_Simulate, EDIF_TOK_SIMULATE),
3713 BE(f_SimulationInfo, EDIF_TOK_SIMULATIONINFO),
3714 BE(f_SingleValueSet, EDIF_TOK_SINGLEVALUESET),
3715 BE(f_Site, EDIF_TOK_SITE),
3716 BE(f_Socket, EDIF_TOK_SOCKET),
3717 BE(f_SocketSet, EDIF_TOK_SOCKETSET),
3718 BE(f_Status, EDIF_TOK_STATUS),
3719 BE(f_Steady, EDIF_TOK_STEADY),
3720 BE(f_String, EDIF_TOK_STRING),
3721 BE(f_StringDisplay, EDIF_TOK_STRINGDISPLAY),
3722 BE(f_Strong, EDIF_TOK_STRONG),
3723 BE(f_Symbol, EDIF_TOK_SYMBOL),
3724 BE(f_Symmetry, EDIF_TOK_SYMMETRY),
3725 BE(f_Table, EDIF_TOK_TABLE),
3726 BE(f_TableDefault, EDIF_TOK_TABLEDEFAULT),
3727 BE(f_Technology, EDIF_TOK_TECHNOLOGY),
3728 BE(f_TimeInterval, EDIF_TOK_TIMEINTERVAL),
3729 BE(f_Timing, EDIF_TOK_TIMING),
3730 BE(f_Transform, EDIF_TOK_TRANSFORM),
3731 BE(f_Transition, EDIF_TOK_TRANSITION),
3732 BE(f_Trigger, EDIF_TOK_TRIGGER),
3733 BE(f_Union, EDIF_TOK_UNION),
3734 BE(f_View, EDIF_TOK_VIEW),
3735 BE(f_ViewList, EDIF_TOK_VIEWLIST),
3736 BE(f_ViewMap, EDIF_TOK_VIEWMAP),
3737 BE(f_ViewRef, EDIF_TOK_VIEWREF),
3738 BE(f_Visible, EDIF_TOK_VISIBLE),
3739 BE(f_VoltageMap, EDIF_TOK_VOLTAGEMAP),
3740 BE(f_WaveValue, EDIF_TOK_WAVEVALUE),
3741 BE(f_Weak, EDIF_TOK_WEAK),
3742 BE(f_WeakJoined, EDIF_TOK_WEAKJOINED),
3743 BE(f_When, EDIF_TOK_WHEN),
3744 BE(f_Written, EDIF_TOK_WRITTEN)
3746 static int BinderDefSize = sizeof(BinderDef) / sizeof(Binder);
3748 * Keyword table:
3750 * This hash table holds all strings which may have to be matched
3751 * to. WARNING: it is assumed that there is no overlap of the 'token'
3752 * and 'context' strings.
3754 typedef struct Keyword {
3755 struct Keyword *Next; /* pointer to next entry */
3756 char *String; /* pointer to associated string */
3757 } Keyword;
3758 #define KEYWORD_HASH 127 /* hash table size */
3759 static Keyword *KeywordTable[KEYWORD_HASH];
3761 * Enter keyword:
3763 * The passed string is entered into the keyword hash table.
3765 static void EnterKeyword(str)
3766 char *str;
3769 * Locals.
3771 register Keyword *key;
3772 register unsigned int hsh;
3773 register char *cp;
3775 * Create the hash code, and add an entry to the table.
3777 for (hsh = 0, cp = str; *cp; hsh += hsh + *cp++);
3778 hsh %= KEYWORD_HASH;
3779 key = (Keyword *) Malloc(sizeof(Keyword));
3780 key->Next = KeywordTable[hsh];
3781 (KeywordTable[hsh] = key)->String = str;
3784 * Find keyword:
3786 * The passed string is located within the keyword table. If an
3787 * entry exists, then the value of the keyword string is returned. This
3788 * is real useful for doing string comparisons by pointer value later.
3789 * If there is no match, a NULL is returned.
3791 static char *FindKeyword(str)
3792 char *str;
3795 * Locals.
3797 register Keyword *wlk,*owk;
3798 register unsigned int hsh;
3799 register char *cp;
3800 char lower[IDENT_LENGTH + 1];
3802 * Create a lower case copy of the string.
3804 for (cp = lower; *str;)
3805 if (isupper( (int) *str))
3806 *cp++ = tolower( (int) *str++);
3807 else
3808 *cp++ = *str++;
3809 *cp = '\0';
3811 * Search the hash table for a match.
3813 for (hsh = 0, cp = lower; *cp; hsh += hsh + *cp++);
3814 hsh %= KEYWORD_HASH;
3815 for (owk = NULL, wlk = KeywordTable[hsh]; wlk; wlk = (owk = wlk)->Next)
3816 if (!strcmp(wlk->String,lower)){
3818 * Readjust the LRU.
3820 if (owk){
3821 owk->Next = wlk->Next;
3822 wlk->Next = KeywordTable[hsh];
3823 KeywordTable[hsh] = wlk;
3825 return (wlk->String);
3827 return (NULL);
3830 * Token hash table.
3832 #define TOKEN_HASH 51
3833 static Token *TokenHash[TOKEN_HASH];
3835 * Find token:
3837 * A pointer to the token of the passed code is returned. If
3838 * no such beastie is present a NULL is returned instead.
3840 static Token *FindToken(cod)
3841 register int cod;
3844 * Locals.
3846 register Token *wlk,*owk;
3847 register unsigned int hsh;
3849 * Search the hash table for a matching token.
3851 hsh = cod % TOKEN_HASH;
3852 for (owk = NULL, wlk = TokenHash[hsh]; wlk; wlk = (owk = wlk)->Next)
3853 if (cod == wlk->Code){
3854 if (owk){
3855 owk->Next = wlk->Next;
3856 wlk->Next = TokenHash[hsh];
3857 TokenHash[hsh] = wlk;
3859 break;
3861 return (wlk);
3864 * Context hash table.
3866 #define CONTEXT_HASH 127
3867 static Context *ContextHash[CONTEXT_HASH];
3869 * Find context:
3871 * A pointer to the context of the passed code is returned. If
3872 * no such beastie is present a NULL is returned instead.
3874 static Context *FindContext(cod)
3875 register int cod;
3878 * Locals.
3880 register Context *wlk,*owk;
3881 register unsigned int hsh;
3883 * Search the hash table for a matching context.
3885 hsh = cod % CONTEXT_HASH;
3886 for (owk = NULL, wlk = ContextHash[hsh]; wlk; wlk = (owk = wlk)->Next)
3887 if (cod == wlk->Code){
3888 if (owk){
3889 owk->Next = wlk->Next;
3890 wlk->Next = ContextHash[hsh];
3891 ContextHash[hsh] = wlk;
3893 break;
3895 return (wlk);
3898 * Token stacking variables.
3900 #ifdef DEBUG
3901 #define TS_DEPTH 8
3902 #define TS_MASK (TS_DEPTH - 1)
3903 static unsigned int TSP = 0; /* token stack pointer */
3904 static char *TokenStack[TS_DEPTH]; /* token name strings */
3905 static short TokenType[TS_DEPTH]; /* token types */
3907 * Stack:
3909 * Add a token to the debug stack. The passed string and type are
3910 * what is to be pushed.
3912 static Stack(str,typ)
3913 char *str;
3914 int typ;
3917 * Free any previous string, then push.
3919 if (TokenStack[TSP & TS_MASK])
3920 Free(TokenStack[TSP & TS_MASK]);
3921 TokenStack[TSP & TS_MASK] = strcpy(Malloc(strlen(str) + 1),str);
3922 TokenType[TSP & TS_MASK] = typ;
3923 TSP += 1;
3926 * Dump stack:
3928 * This displays the last set of accumulated tokens.
3930 static DumpStack()
3933 * Locals.
3935 register int i;
3936 register Context *cxt;
3937 register Token *tok;
3938 register char *nam;
3940 * Run through the list displaying the oldest first.
3942 fprintf(Error,"\n\n");
3943 for (i = 0; i < TS_DEPTH; i += 1)
3944 if (TokenStack[(TSP + i) & TS_MASK]){
3946 * Get the type name string.
3948 if (cxt = FindContext(TokenType[(TSP + i) & TS_MASK]))
3949 nam = cxt->Name;
3950 else if (tok = FindToken(TokenType[(TSP + i) & TS_MASK]))
3951 nam = tok->Name;
3952 else switch (TokenType[(TSP + i) & TS_MASK]){
3953 case IDENT: nam = "IDENT"; break;
3954 case INT: nam = "INT"; break;
3955 case KEYWORD: nam = "KEYWORD"; break;
3956 case STR: nam = "STR"; break;
3957 default: nam = "?"; break;
3960 * Now print the token state.
3962 fprintf(Error,"%2d %-16.16s '%s'\n",TS_DEPTH - i,nam,
3963 TokenStack[(TSP + i) & TS_MASK]);
3965 fprintf(Error,"\n");
3967 #else
3968 #define Stack(s,t)
3969 #endif /* DEBUG */
3971 * Parser state variables.
3973 static FILE *Input = NULL; /* input stream */
3974 static FILE *Error = NULL; /* error stream */
3975 static char *InFile; /* file name on the input stream */
3976 static long LineNumber; /* current input line number */
3977 static ContextCar *CSP = NULL; /* top of context stack */
3978 static char yytext[IDENT_LENGTH + 1]; /* token buffer */
3979 static char CharBuf[IDENT_LENGTH + 1]; /* garbage buffer */
3981 * yyerror:
3983 * Standard error reporter, it prints out the passed string
3984 * preceeded by the current filename and line number.
3986 static void yyerror(const char *ers)
3988 #ifdef DEBUG
3989 DumpStack();
3990 #endif /* DEBUG */
3991 fprintf(Error,"%s, line %ld: %s\n",InFile,LineNumber,ers);
3994 * String bucket definitions.
3996 #define BUCKET_SIZE 64
3997 typedef struct Bucket {
3998 struct Bucket *Next; /* pointer to next bucket */
3999 int Index; /* pointer to next free slot */
4000 char Data[BUCKET_SIZE]; /* string data */
4001 } Bucket;
4002 static Bucket *CurrentBucket = NULL; /* string bucket list */
4003 static int StringSize = 0; /* current string length */
4005 * Push string:
4007 * This adds the passed charater to the current string bucket.
4009 static void PushString(chr)
4010 char chr;
4013 * Locals.
4015 register Bucket *bck;
4017 * Make sure there is room for the push.
4019 if ((bck = CurrentBucket)->Index >= BUCKET_SIZE){
4020 bck = (Bucket *) Malloc(sizeof(Bucket));
4021 bck->Next = CurrentBucket;
4022 (CurrentBucket = bck)->Index = 0;
4025 * Push the character.
4027 bck->Data[bck->Index++] = chr;
4028 StringSize += 1;
4031 * Form string:
4033 * This converts the current string bucket into a real live string,
4034 * whose pointer is returned.
4036 static char *FormString()
4039 * Locals.
4041 register Bucket *bck;
4042 register char *cp;
4044 * Allocate space for the string, set the pointer at the end.
4046 cp = (char *) Malloc(StringSize + 1);
4048 cp += StringSize;
4049 *cp-- = '\0';
4051 * Yank characters out of the bucket.
4053 for (bck = CurrentBucket; bck->Index || bck->Next;){
4054 if (!bck->Index){
4055 CurrentBucket = bck->Next;
4056 Free(bck);
4057 bck = CurrentBucket;
4059 *cp-- = bck->Data[--bck->Index];
4061 /* reset buffer size to zero */
4062 StringSize =0;
4063 return (cp + 1);
4066 * Parse EDIF:
4068 * This builds the context tree and then calls the real parser.
4069 * It is passed two file streams, the first is where the input comes
4070 * from; the second is where error messages get printed.
4072 void ParseEDIF(char* filename,FILE* err)
4075 * Locals.
4077 register int i;
4078 static int ContextDefined = 1;
4080 * Set up the file state to something useful.
4082 InFile = filename;
4083 Input = fopen(filename,"r");
4084 Error = err;
4085 LineNumber = 1;
4087 * Define both the enabled token and context strings.
4089 if (ContextDefined){
4090 for (i = TokenDefSize; i--; EnterKeyword(TokenDef[i].Name)){
4091 register unsigned int hsh;
4092 hsh = TokenDef[i].Code % TOKEN_HASH;
4093 TokenDef[i].Next = TokenHash[hsh];
4094 TokenHash[hsh] = &TokenDef[i];
4096 for (i = ContextDefSize; i--; EnterKeyword(ContextDef[i].Name)){
4097 register unsigned int hsh;
4098 hsh = ContextDef[i].Code % CONTEXT_HASH;
4099 ContextDef[i].Next = ContextHash[hsh];
4100 ContextHash[hsh] = &ContextDef[i];
4103 * Build the context tree.
4105 for (i = BinderDefSize; i--;){
4106 register Context *cxt;
4107 register int j;
4109 * Define the current context to have carriers bound to it.
4111 cxt = FindContext(BinderDef[i].Origin);
4112 for (j = BinderDef[i].FollowerSize; j--;){
4113 register ContextCar *cc;
4115 * Add carriers to the current context.
4117 cc = (ContextCar *) Malloc(sizeof(ContextCar));
4118 cc->Next = cxt->Context;
4119 (cxt->Context = cc)->Context =
4120 FindContext(ABS(BinderDef[i].Follower[j]));
4121 cc->u.Single = BinderDef[i].Follower[j] < 0;
4125 * Build the token tree.
4127 for (i = TieDefSize; i--;){
4128 register Context *cxt;
4129 register int j;
4131 * Define the current context to have carriers bound to it.
4133 cxt = FindContext(TieDef[i].Origin);
4134 for (j = TieDef[i].EnableSize; j--;){
4135 register TokenCar *tc;
4137 * Add carriers to the current context.
4139 tc = (TokenCar *) Malloc(sizeof(TokenCar));
4140 tc->Next = cxt->Token;
4141 (cxt->Token = tc)->Token = FindToken(TieDef[i].Enable[j]);
4145 * Put a bogus context on the stack which has 'EDIF' as its
4146 * follower.
4148 CSP = (ContextCar *) Malloc(sizeof(ContextCar));
4149 CSP->Next = NULL;
4150 CSP->Context = FindContext(NULL);
4151 CSP->u.Used = NULL;
4152 ContextDefined = 0;
4155 * Create an initial, empty string bucket.
4157 CurrentBucket = (Bucket *) Malloc(sizeof(Bucket));
4158 CurrentBucket->Next = 0;
4159 CurrentBucket->Index = 0;
4161 * Fill the token stack with NULLs if debugging is enabled.
4163 #ifdef DEBUG
4164 for (i = TS_DEPTH; i--; TokenStack[i] = NULL)
4165 if (TokenStack[i])
4166 Free(TokenStack[i]);
4167 TSP = 0;
4168 #endif /* DEBUG */
4170 * Go parse things!
4172 edifparse();
4175 * Match token:
4177 * The passed string is looked up in the current context's token
4178 * list to see if it is enabled. If so the token value is returned,
4179 * if not then zero.
4181 static int MatchToken(str)
4182 register char *str;
4185 * Locals.
4187 register TokenCar *wlk,*owk;
4189 * Convert the string to the proper form, then search the token
4190 * carrier list for a match.
4192 str = FindKeyword(str);
4193 for (owk = NULL, wlk = CSP->Context->Token; wlk; wlk = (owk = wlk)->Next)
4194 if (str == wlk->Token->Name){
4195 if (owk){
4196 owk->Next = wlk->Next;
4197 wlk->Next = CSP->Context->Token;
4198 CSP->Context->Token = wlk;
4200 return (wlk->Token->Code);
4202 return (0);
4205 * Match context:
4207 * If the passed keyword string is within the current context, the
4208 * new context is pushed and token value is returned. A zero otherwise.
4210 static int MatchContext(str)
4211 register char *str;
4214 * Locals.
4216 register ContextCar *wlk,*owk;
4218 * See if the context is present.
4220 str = FindKeyword(str);
4221 for (owk = NULL, wlk = CSP->Context->Context; wlk; wlk = (owk = wlk)->Next)
4222 if (str == wlk->Context->Name){
4223 if (owk){
4224 owk->Next = wlk->Next;
4225 wlk->Next = CSP->Context->Context;
4226 CSP->Context->Context = wlk;
4229 * If a single context, make sure it isn't already used.
4231 if (wlk->u.Single){
4232 register UsedCar *usc;
4233 for (usc = CSP->u.Used; usc; usc = usc->Next)
4234 if (usc->Code == wlk->Context->Code)
4235 break;
4236 if (usc){
4237 sprintf(CharBuf,"'%s' is used more than once within '%s'",
4238 str,CSP->Context->Name);
4239 yyerror(CharBuf);
4240 } else {
4241 usc = (UsedCar *) Malloc(sizeof(UsedCar));
4242 usc->Next = CSP->u.Used;
4243 (CSP->u.Used = usc)->Code = wlk->Context->Code;
4247 * Push the new context.
4249 owk = (ContextCar *) Malloc(sizeof(ContextCar));
4250 owk->Next = CSP;
4251 (CSP = owk)->Context = wlk->Context;
4252 owk->u.Used = NULL;
4253 return (wlk->Context->Code);
4255 return (0);
4258 * PopC:
4260 * This pops the current context.
4262 static void PopC()
4265 * Locals.
4267 register UsedCar *usc;
4268 register ContextCar *csp;
4270 * Release single markers and pop context.
4272 while ( (usc = CSP->u.Used) ){
4273 CSP->u.Used = usc->Next;
4274 Free(usc);
4276 csp = CSP->Next;
4277 Free(CSP);
4278 CSP = csp;
4281 * Lexical analyzer states.
4283 #define L_START 0
4284 #define L_INT 1
4285 #define L_IDENT 2
4286 #define L_KEYWORD 3
4287 #define L_STRING 4
4288 #define L_KEYWORD2 5
4289 #define L_ASCIICHAR 6
4290 #define L_ASCIICHAR2 7
4292 * yylex:
4294 * This is the lexical analyzer called by the YACC/BISON parser.
4295 * It returns a pretty restricted set of token types and does the
4296 * context movement when acceptable keywords are found. The token
4297 * value returned is a NULL terminated string to allocated storage
4298 * (ie - it should get released some time) with some restrictions.
4299 * The token value for integers is strips a leading '+' if present.
4300 * String token values have the leading and trailing '"'-s stripped.
4301 * '%' conversion characters in string values are passed converted.
4302 * The '(' and ')' characters do not have a token value.
4304 static int yylex()
4307 * Locals.
4309 register int c,s,l;
4311 * Keep on sucking up characters until we find something which
4312 * explicitly forces us out of this function.
4314 for (s = L_START, l = 0; 1;){
4315 yytext[l++] = c = Getc(Input);
4316 switch (s){
4318 * Starting state, look for something resembling a token.
4320 case L_START:
4321 if (isdigit(c) || c == '-')
4322 s = L_INT;
4323 else if (isalpha(c) || c == '&')
4324 s = L_IDENT;
4325 else if (isspace(c)){
4326 if (c == '\n')
4327 LineNumber += 1;
4328 l = 0;
4329 } else if (c == '('){
4330 l = 0;
4331 s = L_KEYWORD;
4332 } else if (c == '"')
4333 s = L_STRING;
4334 else if (c == '+'){
4335 l = 0; /* strip '+' */
4336 s = L_INT;
4337 } else if (c == EOF)
4338 return ('\0');
4339 else {
4340 yytext[1] = '\0';
4341 Stack(yytext,c);
4342 return (c);
4344 break;
4346 * Suck up the integer digits.
4348 case L_INT:
4349 if (isdigit(c))
4350 break;
4351 Ungetc(c);
4352 yytext[--l] = '\0';
4353 yylval.s = strcpy(Malloc(l + 1),yytext);
4354 Stack(yytext,EDIF_TOK_INT);
4355 return (EDIF_TOK_INT);
4357 * Grab an identifier, see if the current context enables
4358 * it with a specific token value.
4360 case L_IDENT:
4361 if (isalpha(c) || isdigit(c) || c == '_')
4362 break;
4363 Ungetc(c);
4364 yytext[--l] = '\0';
4365 if (CSP->Context->Token && (c = MatchToken(yytext))){
4366 Stack(yytext,c);
4367 return (c);
4369 yylval.s = strcpy(Malloc(l + 1),yytext);
4370 Stack(yytext, EDIF_TOK_IDENT);
4371 return (EDIF_TOK_IDENT);
4373 * Scan until you find the start of an identifier, discard
4374 * any whitespace found. On no identifier, return a '('.
4376 case L_KEYWORD:
4377 if (isalpha(c) || c == '&'){
4378 s = L_KEYWORD2;
4379 break;
4380 } else if (isspace(c)){
4381 l = 0;
4382 break;
4384 Ungetc(c);
4385 Stack("(",'(');
4386 return ('(');
4388 * Suck up the keyword identifier, if it matches the set of
4389 * allowable contexts then return its token value and push
4390 * the context, otherwise just return the identifier string.
4392 case L_KEYWORD2:
4393 if (isalpha(c) || isdigit(c) || c == '_')
4394 break;
4395 Ungetc(c);
4396 yytext[--l] = '\0';
4397 if ( (c = MatchContext(yytext)) ){
4398 Stack(yytext,c);
4399 return (c);
4401 yylval.s = strcpy(Malloc(l + 1),yytext);
4402 Stack(yytext, EDIF_TOK_KEYWORD);
4403 return (EDIF_TOK_KEYWORD);
4405 * Suck up string characters but once resolved they should
4406 * be deposited in the string bucket because they can be
4407 * arbitrarily long.
4409 case L_STRING:
4410 if (c == '\n')
4411 LineNumber += 1;
4412 else if (c == '\r')
4414 else if (c == '"' || c == EOF){
4415 yylval.s = FormString();
4416 Stack(yylval.s, EDIF_TOK_STR);
4417 return (EDIF_TOK_STR);
4418 } else if (c == '%')
4419 s = L_ASCIICHAR;
4420 else
4421 PushString(c);
4422 l = 0;
4423 break;
4425 * Skip white space and look for integers to be pushed
4426 * as characters.
4428 case L_ASCIICHAR:
4429 if (isdigit(c)){
4430 s = L_ASCIICHAR2;
4431 break;
4432 } else if (c == '%' || c == EOF)
4433 s = L_STRING;
4434 else if (c == '\n')
4435 LineNumber += 1;
4436 l = 0;
4437 break;
4439 * Convert the accumulated integer into a char and push.
4441 case L_ASCIICHAR2:
4442 if (isdigit(c))
4443 break;
4444 Ungetc(c);
4445 yytext[--l] = '\0';
4446 PushString(atoi(yytext));
4447 s = L_ASCIICHAR;
4448 l = 0;
4449 break;