[comp.lsi] EDIF V 2 0 0 grammar

moto@ucbcad.berkeley.edu (EDIF Committee) (05/19/87)

Here as requested is the electronic copy of the EDIF BNF grammar:
(should go 1605 lines to <****END OF EDIF BNF****>)

EDIF ::= '(' 'EDIF'
        EDIFFileNameDef
        EDIFVersion
        EDIFLevel
        keywordMap
        { < status > | external | library | design | comment | userData }
        ')'

EDIFFileNameDef ::=
        nameDef

EDIFLevel ::= '(' 'EDIFLevel'
        integerToken
        ')'

EDIFVersion ::= '(' 'EDIFVersion'
        integerToken
        integerToken
        integerToken
        ')'

acLoad ::= '(' 'acLoad'
        ( miNoMaxValue | miNoMaxDisplay )
        ')'

after ::= '(' 'after'
        miNoMaxValue 
        { follow | maintain | logicAssign | comment | userData }
        ')'

annotate ::= '(' 'annotate'
        ( stringValue | stringDisplay )
        ')'

apply ::= '(' 'apply'
        cycle
        { logicInput | logicOutput | comment | userData }
        ')'

arc ::= '(' 'arc'
        pointValue
        pointValue
        pointValue
        ')'

array ::= '(' 'array'
        nameDef
        integerValue
        { integerValue }
        ')'

arrayMacro ::= '(' 'arrayMacro'
        plug
        ')'

arrayRelatedInfo ::= '(' 'arrayRelatedInfo'
        ( baseArray | arraySite | arrayMacro )
        { comment | userData }
        ')'

arraySite ::= '(' 'arraySite'
        socket
        ')'

atLeast ::= '(' 'atLeast'
        numberValue
        ')'

atMost ::= '(' 'atMost'
        numberValue
        ')'

author ::= '(' 'author'
        stringToken
        ')'

baseArray ::= '(' 'baseArray'
        ')'

becomes ::= '(' 'becomes'
        logicNameRef | logicList | logicOneOf
        ')'

between ::= '(' 'between'
        ( atLeast | greaterThan )
        ( atMost | lessThan )
        ')'

boolean ::= '(' 'boolean'
        { booleanValue | booleanDisplay | boolean }
        ')'

booleanDisplay ::= '(' 'booleanDisplay'
        booleanValue
        { display }
        ')'

booleanMap ::= '(' 'booleanMap'
        booleanValue
        ')'

booleanValue ::=
        false | true

borderPattern ::= '(' 'borderPattern'
        integerValue
        integerValue
        boolean
        ')'

borderWidth ::= '(' 'borderWidth'
        integerValue
        ')'

boundingBox ::= '(' 'boundingBox'
        rectangle
        ')'

cell ::= '(' 'cell'
        cellNameDef
        cellType
        { < status > | < viewMap > | view | comment | userData | property }
        ')'

cellNameDef ::=
        nameDef

cellNameRef ::=
        nameRef

cellRef ::= '(' 'cellRef'
        cellNameRef
        [ libraryRef ]
        ')'

cellType ::= '(' 'cellType'
        ( 'TIE' | 'RIPPER' | 'GENERIC' )
        ')'

change ::= '(' 'change'
        ( portNameRef | portRef | portList )
        [ becomes | transition ] 
        ')'

circle ::= '(' 'circle'
        pointValue
        pointValue
        { property }
        ')'

color ::= '(' 'color'
        scaledInteger
        scaledInteger
        scaledInteger
        ')'

comment ::= '(' 'comment'
        { stringToken }
        ')'

commentGraphics ::= '(' 'commentGraphics'
        { annotate | figure | instance | < boundingBox > | property
         | comment | userData }
        ')'

compound ::= '(' 'compound'
        { logicNameRef }
        ')'

connectLocation ::= '(' 'connectLocation'
        { figure }
        ')'

contents ::= '(' 'contents'
        { instance | offPageConnector | figure | section | net
         | netBundle | page | commentGraphics | portImplementation | timing
         | simulate | when | follow | logicPort | < boundingBox > | comment
         | userData }
        ')'

cornerType ::= '(' 'cornerType'
        ( 'EXTEND' | 'TRUNCATE' | 'ROUND' )
        ')'

criticality ::= '(' 'criticality'
        ( integerValue | integerDisplay )
        ')'

currentMap ::= '(' 'currentMap'
        miNoMaxValue 
        ')'

curve ::= '(' 'curve'
        { arc | pointValue }
        ')'

cycle ::= '(' 'cycle'
        integerValue
        [ duration ]
        ')'

dataOrigin ::= '(' 'dataOrigin'
        stringToken
        [ version ]
        ')'

dcFaninLoad ::= '(' 'dcFaninLoad'
        ( numberValue | numberDisplay )
        ')'

dcFanoutLoad ::= '(' 'dcFanoutLoad'
        ( numberValue | numberDisplay )
        ')'

dcMaxFanin ::= '(' 'dcMaxFanin'
        ( numberValue | numberDisplay )
        ')'

dcMaxFanout ::= '(' 'dcMaxFanout'
        ( numberValue | numberDisplay )
        ')'

delay ::= '(' 'delay'
        ( miNoMaxValue | miNoMaxDisplay )
        ')'

delta ::= '(' 'delta'
        { pointValue }
        ')'

derivation ::= '(' 'derivation'
        ( 'CALCULATED' | 'MEASURED' | 'REQUIRED' )
        ')'

design ::= '(' 'design'
        designNameDef
        cellRef
        { < status > | comment | property | userData }
        ')'

designNameDef ::=
        nameDef

designator ::= '(' 'designator'
        ( stringValue | stringDisplay )
        ')'

difference ::= '(' 'difference'
        ( figureGroupRef | figureOp )
        { figureGroupRef | figureOp }
        ')'

direction ::= '(' 'direction'
        ( 'INPUT' | 'OUTPUT' | 'INOUT' )
        ')'

display ::= '(' 'display'
        ( figureGroupNameRef | figureGroupOverride )
        [ justify ]
        [ orientation ]
        [ origin ]
        ')'

dominates ::= '(' 'dominates'
        { logicNameRef }
        ')'

dot ::= '(' 'dot'
        pointValue
        { property }
        ')'

duration ::= '(' 'duration'
        numberValue 
        ')'

e ::= '(' 'e'
        integerToken
        integerToken
        ')'

enclosureDistance ::= '(' 'enclosureDistance'
        ruleNameDef
        figureGroupObject
        figureGroupObject
        ( range | singleValueSet )
        { comment | userData }
        ')'

endType ::= '(' 'endType'
        ( 'EXTEND' | 'TRUNCATE' | 'ROUND' )
        ')'

entry ::= '(' 'entry'
        ( match | change | steady )
        ( logicRef | portRef | noChange | table )
        [ delay | loadDelay ]
        ')'

event ::= '(' 'event'
        ( portRef | portList | portGroup | netRef | netGroup )
        { transition | becomes }
        ')'

exactly ::= '(' 'exactly'
        numberValue
        ')'

external ::= '(' 'external'
        libraryNameDef
        EDIFLevel
        technology
        { < status > | cell | comment | userData }
        ')'

fabricate ::= '(' 'fabricate'
        layerNameDef
        figureGroupNameRef
        ')'

false ::= '(' 'false'
        ')'

figure ::= '(' 'figure'
        ( figureGroupNameRef | figureGroupOverride )
        { circle | dot | openShape | path | polygon | rectangle | shape
         | comment | userData }
        ')'

figureArea ::= '(' 'figureArea'
        ruleNameDef
        figureGroupObject
        ( range | singleValueSet )
        { comment | userData }
        ')'

figureGroup ::= '(' 'figureGroup'
        figureGroupNameDef
        { < cornerType > | < endType > | < pathWidth > | < borderWidth >
         | < color > | < fillPattern > | < borderPattern > | < textHeight >
         | < visible > | includeFigureGroup | comment | property | userData }
        ')'

figureGroupNameDef ::=
        nameDef

figureGroupNameRef ::=
        nameRef

figureGroupObject ::= '(' 'figureGroupObject'
        ( figureGroupNameRef | figureGroupRef | figureOp )
        ')'

figureGroupOverride ::= '(' 'figureGroupOverride'
        figureGroupNameRef
        { < cornerType > | < endType > | < pathWidth > | < borderWidth >
         | < color > | < fillPattern > | < borderPattern > | < textHeight >
         | < visible > | comment | property | userData }
        ')'

figureGroupRef ::= '(' 'figureGroupRef'
        figureGroupNameRef
        [ libraryRef ]
        ')'

figureOp ::=
        intersection | union | difference | inverse | oversize

figurePerimeter ::= '(' 'figurePerimeter'
        ruleNameDef
        figureGroupObject
        ( range | singleValueSet )
        { comment | userData }
        ')'

figureWidth ::= '(' 'figureWidth'
        ruleNameDef
        figureGroupObject
        ( range | singleValueSet )
        { comment | userData }
        ')'

fillPattern ::= '(' 'fillPattern'
        integerValue
        integerValue
        boolean
        ')'

follow ::= '(' 'follow'
        ( portNameRef | portRef )
        ( portRef | table )
        [ delay | loadDelay ]
        ')'

forbiddenEvent ::= '(' 'forbiddenEvent'
        timeInterval
        { event }
        ')'

form ::= '(' keywordNameRef
        { integerToken | stringToken | identifier | form }
        ')'

globalPortRef ::= '(' 'globalPortRef'
        portNameRef
        ')'

greaterThan ::= '(' 'greaterThan'
        numberValue
        ')'

gridMap ::= '(' 'gridMap'
        numberValue
        numberValue
        ')'

ignore ::= '(' 'ignore'
        ')'

includeFigureGroup ::= '(' 'includeFigureGroup'
        ( figureGroupRef | figureOp )
        ')'

initial ::= '(' 'initial'
        ')'

instance ::= '(' 'instance'
        instanceNameDef
        ( viewRef | viewList )
        { < transform > | parameterAssign | portInstance | timing
         | < designator > | property | comment | userData }
        ')'

instanceBackAnnotate ::= '(' 'instanceBackAnnotate'
        instanceRef
        { < designator > | timing | property | comment }
        ')'

instanceGroup ::= '(' 'instanceGroup'
        { instanceRef }
        ')'

instanceMap ::= '(' 'instanceMap'
        { instanceRef | instanceGroup | comment | userData }
        ')'

instanceNameDef ::=
        nameDef | array

instanceNameRef ::=
        nameRef | member

instanceRef ::= '(' 'instanceRef'
        instanceNameRef 
        [ instanceRef | viewRef ]
        ')'

integer ::= '(' 'integer'
        { integerValue | integerDisplay | integer }
        ')'

integerDisplay ::= '(' 'integerDisplay'
        integerValue
        { display }
        ')'

integerValue ::=
        integerToken

interFigureGroupSpacing ::= '(' 'interFigureGroupSpacing'
        ruleNameDef
        figureGroupObject
        figureGroupObject
        ( range | singleValueSet )
        { comment | userData }
        ')'

interface ::= '(' 'interface'
        { port | portBundle | < symbol > | < protectionFrame >
         | < arrayRelatedInfo > | parameter | joined | mustJoin
         | weakJoined | permutable | timing | simulate | < designator >
         | property | comment | userData }
        ')'

intersection ::= '(' 'intersection'
        ( figureGroupRef | figureOp )
        { figureGroupRef | figureOp }
        ')'

intraFigureGroupSpacing ::= '(' 'intraFigureGroupSpacing'
        ruleNameDef
        figureGroupObject
        ( range | singleValueSet )
        { comment | userData }
        ')'

inverse ::= '(' 'inverse'
        ( figureGroupRef | figureOp )
        ')'

isolated ::= '(' 'isolated'
        ')'

joined ::= '(' 'joined'
        { portRef | portList | globalPortRef }
        ')'

justify ::= '(' 'justify'
        ( 'UPPERLEFT' | 'UPPERCENTER' | 'UPPERRIGHT' | 'CENTERLEFT'
         | 'CENTERCENTER' | 'CENTERRIGHT' | 'LOWERLEFT' | 'LOWERCENTER'
         | 'LOWERRIGHT' )
        ')'

keywordDisplay ::= '(' 'keywordDisplay'
        keywordNameRef
        { display }
        ')'

keywordLevel ::= '(' 'keywordLevel'
        integerToken
        ')'

keywordMap ::= '(' 'keywordMap'
        keywordLevel
        { comment }
        ')'

keywordNameRef ::=
        identifier

layerNameDef ::=
        nameDef

lessThan ::= '(' 'lessThan'
        numberValue
        ')'

library ::= '(' 'library'
        libraryNameDef
        EDIFLevel
        technology
        { < status > | cell | comment | userData }
        ')'

libraryNameDef ::=
        nameDef

libraryNameRef ::=
        nameRef

libraryRef ::= '(' 'libraryRef'
        libraryNameRef
        ')'

listOfNets ::= '(' 'listOfNets'
        { net }
        ')'

listOfPorts ::= '(' 'listOfPorts'
        { port | portBundle }
        ')'

loadDelay ::= '(' 'loadDelay'
        ( miNoMaxValue | miNoMaxDisplay )
        ( miNoMaxValue | miNoMaxDisplay )
        ')'

logicAssign ::= '(' 'logicAssign'
        ( portNameRef | portRef )
        ( portRef | logicRef | table )
        [ delay | loadDelay ]
        ')'

logicInput ::= '(' 'logicInput'
        ( portList | portRef | portNameRef )
        logicWaveform
        ')'

logicList ::= '(' 'logicList'
        { logicNameRef | logicOneOf | ignore }
        ')'

logicMapInput ::= '(' 'logicMapInput'
        { logicRef }
        ')'

logicMapOutput ::= '(' 'logicMapOutput'
        { logicRef }
        ')'

logicNameDef ::=
        nameDef

logicNameRef ::=
        nameRef

logicOneOf ::= '(' 'logicOneOf'
        { logicNameRef | logicList }
        ')'

logicOutput ::= '(' 'logicOutput'
        ( portList | portRef | portNameRef )
        logicWaveform
        ')'

logicPort ::= '(' 'logicPort'
        portNameDef
        { property | comment | userData }
        ')'

logicRef ::= '(' 'logicRef'
        logicNameRef
        [ libraryRef ]
        ')'

logicValue ::= '(' 'logicValue'
        logicNameDef
        { < voltageMap > | < currentMap > | < booleanMap > | < compound >
         | < weak > | < strong > | < dominates > | < logicMapOutput >
         | < logicMapInput > | < isolated > | resolves | property | comment
         | userData }
        ')'

logicWaveform ::= '(' 'logicWaveform'
        { logicNameRef | logicList | logicOneOf | ignore }
        ')'

maintain ::= '(' 'maintain'
        ( portNameRef | portRef )
        [ delay | loadDelay ]
        ')'

match ::= '(' 'match'
        ( portNameRef | portRef | portList )
        ( logicNameRef | logicList | logicOneOf )
        ')'

member ::= '(' 'member'
        nameRef
        integerValue
        { integerValue }
        ')'

miNoMax ::= '(' 'miNoMax'
        { miNoMaxValue | miNoMaxDisplay | miNoMax }
        ')'

miNoMaxDisplay ::= '(' 'miNoMaxDisplay'
        miNoMaxValue
        { display }
        ')'

miNoMaxValue ::=
        mnm | numberValue

mnm ::= '(' 'mnm'
        ( numberValue | undefined | unconstrained )
        ( numberValue | undefined | unconstrained ) 
        ( numberValue | undefined | unconstrained )
        ')'

multipleValueSet ::= '(' 'multipleValueSet'
        { rangeVector }
        ')'

mustJoin ::= '(' 'mustJoin'
        { portRef | portList | weakJoined | joined }
        ')'

name ::= '(' 'name'
        identifier
        { display }
        ')'

nameDef ::=
        identifier | name | rename

nameRef ::=
        identifier | name

net ::= '(' 'net'
        netNameDef
        joined
        { < criticality > | netDelay | figure | net | instance
         | commentGraphics | property | comment | userData }
        ')'

netBackAnnotate ::= '(' 'netBackAnnotate'
        netRef
        { netDelay | < criticality > | property | comment }
        ')'

netBundle ::= '(' 'netBundle'
        netNameDef
        listOfNets
        { figure | commentGraphics | property | comment | userData }
        ')'

netDelay ::= '(' 'netDelay'
        derivation
        delay
        { transition | becomes }
        ')'

netGroup ::= '(' 'netGroup'
        { netNameRef | netRef }
        ')'

netMap ::= '(' 'netMap'
        { netRef | netGroup | comment | userData }
        ')'

netNameDef ::=
        nameDef | array

netNameRef ::=
        nameRef | member

netRef ::= '(' 'netRef'
        netNameRef 
        [ netRef | instanceRef | viewRef ]
        ')'

noChange ::= '(' 'noChange'
        ')'

nonPermutable ::= '(' 'nonPermutable'
        { portRef | permutable }
        ')'

notAllowed ::= '(' 'notAllowed'
        ruleNameDef
        figureGroupObject
        { comment | userData }
        ')'

notchSpacing ::= '(' 'notchSpacing'
        ruleNameDef
        figureGroupObject
        ( range | singleValueSet )
        { comment | userData }
        ')'

number ::= '(' 'number'
        { numberValue | numberDisplay | number }
        ')'

numberDefinition ::= '(' 'numberDefinition'
        { scale | < gridMap > | comment }
        ')'

numberDisplay ::= '(' 'numberDisplay'
        numberValue
        { display }
        ')'

numberValue ::=
        scaledInteger

offPageConnector ::= '(' 'offPageConnector'
        portNameDef
        { < unused > | property | comment | userData }
        ')'

offsetEvent ::= '(' 'offsetEvent'
        event
        numberValue
        ')'

openShape ::= '(' 'openShape'
        curve
        { property }
        ')'

orientation ::= '(' 'orientation'
        ( 'R0' | 'R90' | 'R180' | 'R270' | 'MX' | 'MY' | 'MYR90' | 'MXR90' )
        ')'

origin ::= '(' 'origin'
        pointValue
        ')'

overhangDistance ::= '(' 'overhangDistance'
        ruleNameDef
        figureGroupObject
        figureGroupObject
        ( range | singleValueSet )
        { comment | userData }
        ')'

overlapDistance ::= '(' 'overlapDistance'
        ruleNameDef
        figureGroupObject
        figureGroupObject
        ( range | singleValueSet )
        { comment | userData }
        ')'

oversize ::= '(' 'oversize'
        integerValue
        ( figureGroupRef | figureOp )
        cornerType
        ')'

owner ::= '(' 'owner'
        stringToken
        ')'

page ::= '(' 'page'
        instanceNameDef
        { instance | net | netBundle | commentGraphics | portImplementation
         | < pageSize > | < boundingBox > | comment | userData }
        ')'

pageSize ::= '(' 'pageSize'
        rectangle
        ')'

parameter ::= '(' 'parameter'
        valueNameDef
        typedValue
        [ unit ]
        ')'

parameterAssign ::= '(' 'parameterAssign'
        valueNameRef
        typedValue
        ')'

parameterDisplay ::= '(' 'parameterDisplay'
        valueNameRef 
        { display }
        ')'

path ::= '(' 'path'
        pointList
        { property }
        ')'

pathDelay ::= '(' 'pathDelay'
        delay
        { event }
        ')'

pathWidth ::= '(' 'pathWidth'
        integerValue
        ')'

permutable ::= '(' 'permutable'
        { portRef | permutable | nonPermutable }
        ')'

physicalDesignRule ::= '(' 'physicalDesignRule'
        { figureWidth | figureArea | rectangleSize | figurePerimeter
         | overlapDistance | overhangDistance | enclosureDistance
         | interFigureGroupSpacing | intraFigureGroupSpacing | notchSpacing
         | notAllowed | figureGroup | comment | userData }
        ')'

plug ::= '(' 'plug'
        { socketSet }
        ')'

point ::= '(' 'point'
        { pointValue | pointDisplay | point }
        ')'

pointDisplay ::= '(' 'pointDisplay'
        pointValue
        { display }
        ')'

pointList ::= '(' 'pointList'
        { pointValue }
        ')'

pointValue ::=
        pt

polygon ::= '(' 'polygon'
        pointList
        { property }
        ')'

port ::= '(' 'port'
        portNameDef 
        { < direction > | < unused > | portDelay | < designator >
         | < dcFaninLoad > | < dcFanoutLoad > | < dcMaxFanin >
         | < dcMaxFanout > | < acLoad > | property | comment | userData }
        ')'

portBackAnnotate ::= '(' 'portBackAnnotate'
        portRef
        { < designator > | portDelay | < dcFaninLoad > | < dcFanoutLoad >
         | < dcMaxFanin > | < dcMaxFanout > | < acLoad > | property
         | comment }
        ')'

portBundle ::= '(' 'portBundle'
        portNameDef
        listOfPorts
        { property | comment | userData }
        ')'

portDelay ::= '(' 'portDelay'
        derivation
        ( delay | loadDelay )
        { transition | becomes }
        ')'

portGroup ::= '(' 'portGroup'
        { portNameRef | portRef }
        ')'

portImplementation ::= '(' 'portImplementation'
        ( portRef | portNameRef )
        { < connectLocation > | figure | instance | commentGraphics
         | propertyDisplay | keywordDisplay | property | userData | comment }
        ')'

portInstance ::= '(' 'portInstance'
        ( portRef | portNameRef )
        { < unused > | portDelay | < designator > | < dcFaninLoad >
         | < dcFanoutLoad > | < dcMaxFanin > | < dcMaxFanout > | < acLoad >
         | property | comment | userData }
        ')'

portList ::= '(' 'portList'
        { portRef | portNameRef }
        ')'

portListAlias ::= '(' 'portListAlias'
        portNameDef
        portList
        ')'

portMap ::= '(' 'portMap'
        { portRef | portGroup | comment | userData }
        ')'

portNameDef ::=
        nameDef | array

portNameRef ::=
        nameRef | member

portRef ::= '(' 'portRef'
        portNameRef
        [ portRef | instanceRef | viewRef ]
        ')'

program ::= '(' 'program'
        stringToken
        [ version ]
        ')'

property ::= '(' 'property'
        propertyNameDef
        typedValue
        { < owner > | < unit > | property | comment }
        ')'

propertyDisplay ::= '(' 'propertyDisplay'
        propertyNameRef
        { display }
        ')'

propertyNameDef ::=
        nameDef

propertyNameRef ::=
        nameRef

protectionFrame ::= '(' 'protectionFrame'
        { portImplementation | figure | instance | commentGraphics
         | < boundingBox > | propertyDisplay | keywordDisplay
         | parameterDisplay | property | comment | userData }
        ')'

pt ::= '(' 'pt'
        integerValue
        integerValue
        ')'

range ::=
        lessThan | greaterThan | atMost | atLeast | exactly | between

rangeVector ::= '(' 'rangeVector'
        { range | singleValueSet }
        ')'

rectangle ::= '(' 'rectangle'
        pointValue
        pointValue
        { property }
        ')'

rectangleSize ::= '(' 'rectangleSize'
        ruleNameDef
        figureGroupObject
        ( rangeVector | multipleValueSet )
        { comment | userData }
        ')'

rename ::= '(' 'rename'
        ( identifier | name )
        ( stringToken | stringDisplay )
        ')'

resolves ::= '(' 'resolves'
        { logicNameRef }
        ')'

ruleNameDef ::=
        nameDef

scale ::= '(' 'scale'
        numberValue
        numberValue
        unit
        ')'

scaleX ::= '(' 'scaleX'
        integerValue
        integerValue
        ')'

scaleY ::= '(' 'scaleY'
        integerValue
        integerValue
        ')'

scaledInteger ::= 
        integerToken | e

section ::= '(' 'section'
        stringValue
        { section | stringValue | instance }
        ')'

shape ::= '(' 'shape'
        curve
        { property }
        ')'

simulate ::= '(' 'simulate'
        simulateNameDef
        { portListAlias | waveValue | apply | comment | userData }
        ')'

simulateNameDef ::=
        nameDef

simulationInfo ::= '(' 'simulationInfo'
        { logicValue | comment | userData }
        ')'

singleValueSet ::= '(' 'singleValueSet'
        { range }
        ')'

site ::= '(' 'site'
        viewRef
        [ transform ]
        ')'

socket ::= '(' 'socket'
        [ symmetry ]
        ')'

socketSet ::= '(' 'socketSet'
        symmetry
        { site }
        ')'

status ::= '(' 'status'
        { written | comment | userData }
        ')'

steady ::= '(' 'steady'
        ( portNameRef | portRef | portList )
        duration
        [ transition | becomes ]
        ')'

string ::= '(' 'string'
        { stringValue | stringDisplay | string }
        ')'

stringDisplay ::= '(' 'stringDisplay'
        stringValue
        { display }
        ')'

stringValue ::=
        stringToken

strong ::= '(' 'strong'
        logicNameRef
        ')'

symbol ::= '(' 'symbol'
        { portImplementation | figure | instance | commentGraphics
         | annotate | < pageSize > | < boundingBox > | propertyDisplay
         | keywordDisplay | parameterDisplay | property | comment
         | userData }
        ')'

symmetry ::= '(' 'symmetry'
        { transform }
        ')'

table ::= '(' 'table'
        { entry | < tableDefault > }
        ')'

tableDefault ::= '(' 'tableDefault'
        ( logicRef | portRef | noChange | table )
        [ delay | loadDelay ]
        ')'

technology ::= '(' 'technology'
        numberDefinition
        { figureGroup | fabricate | < simulationInfo >
         | < physicalDesignRule > | comment | userData }
        ')'

textHeight ::= '(' 'textHeight'
        integerValue
        ')'

timeInterval ::= '(' 'timeInterval'
        ( event | offsetEvent )
        ( event | offsetEvent | duration )
        ')'

timeStamp ::= '(' 'timeStamp'
        integerToken
        integerToken
        integerToken
        integerToken
        integerToken
        integerToken
        ')'

timing ::= '(' 'timing'
        derivation
        { pathDelay | forbiddenEvent | comment | userData }
        ')'

transform ::= '(' 'transform'
        [ scaleX ]
        [ scaleY ]
        [ delta ]
        [ orientation ]
        [ origin ]
        ')'

transition ::= '(' 'transition'
        ( logicNameRef | logicList | logicOneOf )
        ( logicNameRef | logicList | logicOneOf )
        ')'

trigger ::= '(' 'trigger'
        { change | steady | initial }
        ')'

true ::= '(' 'true'
        ')'

typedValue ::= 
        boolean | integer | miNoMax | number | point | string

unconstrained ::= '(' 'unconstrained'
        ')'

undefined ::= '(' 'undefined'
        ')'

union ::= '(' 'union'
        ( figureGroupRef | figureOp )
        { figureGroupRef | figureOp }
        ')'

unit ::= '(' 'unit'
        ( 'DISTANCE' | 'CAPACITANCE' | 'CURRENT' | 'RESISTANCE' | 'TEMPERATURE'
         | 'TIME' | 'VOLTAGE' | 'MASS' | 'FREQUENCY' | 'INDUCTANCE'
         | 'ENERGY' | 'POWER' | 'CHARGE' | 'CONDUCTANCE' | 'FLUX' | 'ANGLE' )
        ')'

unused ::= '(' 'unused'
        ')'

userData ::= '(' 'userData'
        identifier
        { integerToken | stringToken | identifier | form }
        ')'

valueNameDef ::=
        nameDef | array

valueNameRef ::=
        nameRef | member

version ::= '(' 'version'
        stringToken
        ')'

view ::= '(' 'view'
        viewNameDef
        viewType
        interface
        { < status > | < contents > | comment | property | userData }
        ')'

viewList ::= '(' 'viewList'
        { viewRef | viewList }
        ')'

viewMap ::= '(' 'viewMap'
        { portMap | portBackAnnotate | instanceMap | instanceBackAnnotate
         | netMap | netBackAnnotate | comment | userData }
        ')'

viewNameDef ::=
        nameDef

viewNameRef ::=
        nameRef

viewRef ::= '(' 'viewRef'
        viewNameRef
        [ cellRef ]
        ')'

viewType ::= '(' 'viewType'
        ( 'MASKLAYOUT' | 'PCBLAYOUT' | 'NETLIST' | 'SCHEMATIC' | 'SYMBOLIC'
         | 'BEHAVIOR' | 'LOGICMODEL' | 'DOCUMENT' | 'GRAPHIC' | 'STRANGER' )
        ')'

visible ::= '(' 'visible'
        booleanValue
        ')'

voltageMap ::= '(' 'voltageMap'
        miNoMaxValue
        ')'

waveValue ::= '(' 'waveValue'
        logicNameDef
        numberValue
        logicWaveform
        ')'

weak ::= '(' 'weak'
        logicNameRef
        ')'

weakJoined ::= '(' 'weakJoined'
        { portRef | portList | joined }
        ')'

when ::= '(' 'when'
        trigger
        { after | follow | maintain | logicAssign | comment | userData }
        ')'

written ::= '(' 'written'
        timeStamp
        { < author > | < program > | < dataOrigin > | property | comment
         | userData }
        ')'

abs ::= '(' 'abs'
        numberValue
        ')'

and ::= '(' 'and'
        { booleanValue }
        ')'

booleanValue ::=
        false | true | valueNameRef | and | or | not | xor | equal
         | increasing | strictlyIncreasing

ceiling ::= '(' 'ceiling'
        numberValue
        ')'

concat ::= '(' 'concat'
        { stringValue }
        ')'

constant ::= '(' 'constant'
        valueNameDef 
        typedValue
        ')'

constraint ::= '(' 'constraint'
        booleanValue
        { property }
        ')'

contents ::= '(' 'contents'
        { instance | offPageConnector | figure | section | net
         | netBundle | page | commentGraphics | portImplementation | timing
         | simulate | when | follow | logicPort | < boundingBox >
         | constant | constraint | variable | comment | userData }
        ')'

divide ::= '(' 'divide'
        numberValue
        { numberValue }
        ')'

equal ::= '(' 'equal'
        numberValue
        { numberValue }
        ')'

fix ::= '(' 'fix'
        numberValue
        ')'

floor ::= '(' 'floor'
        numberValue
        ')'

increasing ::= '(' 'increasing'
        numberValue
        { numberValue }
        ')'

integerValue ::=
        integerToken | valueNameRef | floor | ceiling | fix | mod
         | xCoord | yCoord | abs | min | max | negate | subtract | sum
         | product

interface ::= '(' 'interface'
        { port | portBundle | < symbol > | < protectionFrame >
         | < arrayRelatedInfo > | parameter | joined | mustJoin
         | weakJoined | permutable | timing | simulate | < designator >
         | constant | constraint | variable | property | comment | userData }
        ')'

max ::= '(' 'max'
        numberValue
        { numberValue }
        ')'

min ::= '(' 'min'
        numberValue
        { numberValue }
        ')'

miNoMaxValue ::=
        mnm | numberValue

mod ::= '(' 'mod'
        integerValue
        integerValue
        ')'

negate ::= '(' 'negate'
        numberValue
        ')'

not ::= '(' 'not'
        booleanValue
        ')'

numberValue ::=
        scaledInteger | valueNameRef | floor | ceiling
         | fix | xCoord | yCoord | sum | product | subtract | divide | mod
         | abs | min | max | negate

or ::= '(' 'or'
        { booleanValue }
        ')'

page ::= '(' 'page'
        instanceNameDef
        { instance | net | netBundle | commentGraphics | portImplementation
         | < pageSize > | < boundingBox > | constant | constraint | variable
         | comment | userData }
        ')'

pointSubtract ::= '(' 'pointSubtract'
        pointValue
        { pointValue }
        ')'

pointSum ::= '(' 'pointSum'
        { pointValue }
        ')'

pointValue ::=
        pt | valueNameRef | pointSum | pointSubtract

product ::= '(' 'product'
        { numberValue }
        ')'

strictlyIncreasing ::= '(' 'strictlyIncreasing'
        numberValue
        { numberValue }
        ')'

stringValue ::=
        stringToken | valueNameRef | concat

subtract ::= '(' 'subtract'
        numberValue
        { numberValue }
        ')'

sum ::= '(' 'sum'
        { numberValue }
        ')'

technology ::= '(' 'technology'
        numberDefinition
        { figureGroup | fabricate | < simulationInfo >
         | < physicalDesignRule > | constant | constraint | comment
         | userData }
        ')'

variable ::= '(' 'variable'
        valueNameDef
        typedValue
        ')'

xCoord ::= '(' 'xCoord'
        pointValue
        ')'

xor ::= '(' 'xor'
        { booleanValue }
        ')'

yCoord ::= '(' 'yCoord'
        pointValue
        ')'

assign ::= '(' 'assign'
        valueNameRef 
        typedValue
        ')'

block ::= '(' 'block'
        { statement }
        ')'

contents ::= '(' 'contents'
        { instance | offPageConnector | figure | section | net
         | netBundle | page | commentGraphics | portImplementation | timing
         | simulate | when | follow | logicPort | < boundingBox >
         | constant | constraint | assign | block | if | iterate | variable
         | while | comment | userData }
        ')'

else ::= '(' 'else'
        { statement }
        ')'

escape ::= '(' 'escape'
        ')'

if ::= '(' 'if'
        booleanValue
        then
        [ else ]
        ')'

interface ::= '(' 'interface'
        { port | portBundle | < symbol > | < protectionFrame >
         | < arrayRelatedInfo > | joined | mustJoin | weakJoined
         | permutable | timing | simulate | < designator > | constant
         | constraint | parameter | variable | assign | block | if
         | iterate | while | property | comment | userData }
        ')'

iterate ::= '(' 'iterate'
        { statement }
        ')'

page ::= '(' 'page'
        instanceNameDef
        { instance | net | netBundle | commentGraphics | portImplementation
         | < pageSize > | < boundingBox > | constant | constraint | block
         | while | if | iterate | variable | assign | comment | userData }
        ')'

statement ::=
        assign | block | comment | commentGraphics
         | constant | constraint | escape | figure | follow | if
         | instance | iterate | net | netBundle | logicPort
         | offPageConnector | portImplementation | property | section
         | simulate | timing | userData | variable | when | while

technology ::= '(' 'technology'
        numberDefinition
        { figureGroup | fabricate | < simulationInfo >
         | < physicalDesignRule > | constant | constraint | block | if
         | iterate | while | comment | userData }
        ')'

then ::= '(' 'then'
        { statement }
        ')'

while ::= '(' 'while'
        booleanValue
        { statement }
        ')'

keywordAlias ::= '(' 'keywordAlias'
        keywordNameDef
        keywordNameRef
        ')'

keywordMap ::= '(' 'keywordMap'
        keywordLevel
        { keywordAlias | comment }
        ')'

keywordNameDef ::=
        identifier

actual ::= '(' 'actual'
        formalNameRef
        ')'

build ::= '(' 'build'
        keywordNameRef
        { literal | actual | build | comment }
        ')'

formal ::= '(' 'formal'
        formalNameDef
        [ optional ]
        ')'

formalNameDef ::=
        identifier

formalNameRef ::=
        identifier

generate ::= '(' 'generate'
        { literal | actual | build | comment }
        ')'

keywordDefine ::= '(' 'keywordDefine'
        keywordNameDef
        keywordParameters
        generate
        ')'

keywordMap ::= '(' 'keywordMap'
        keywordLevel
        { keywordAlias | keywordDefine | comment }
        ')'

keywordParameters ::= '(' 'keywordParameters'
        { formal }
        ')'

literal ::= '(' 'literal'
        { integerToken | stringToken | identifier | form }
        ')'

optional ::= '(' 'optional'
        ( literal | actual | build )
        ')'

build ::= '(' 'build'
        keywordNameRef
        { literal | actual | build | forEach | comment }
        ')'

collector ::= '(' 'collector'
        ')'

forEach ::= '(' 'forEach'
        ( formalNameRef | formalList )
        { build | actual | literal | forEach | comment }
        ')'

formal ::= '(' 'formal'
        formalNameDef
        [ optional | collector ]
        ')'

formalList ::= '(' 'formalList'
        { formalNameRef }
        ')'

generate ::= '(' 'generate'
        { literal | actual | build | forEach | comment }
        ')'


<***** END OF EDIF BNF*****>