Subject: IBIS GRAMMAR

From: [email-masked] ( Bob Ross)
Date: Sat, 19 Feb 94 18:29:28 PST

To IBIS Members:

In December, 1993, Chris Reid asked if anyone had done a YACC grammar for 
IBIS.  Randy Harr responded in December with a grammar and also a proposal
for grouping functions to add some rigor to IBIS.  I have taken Randy's 
grammar and have added to it some details based on closer reading of IBIS
Version 1.1 and also based on running some tests with the Golden Parser.

Some of the versions of the grammar below have been sent out privately, and
I had planned to add a little more rigor before I posted it.  When I saw
that North Carolina State University planned a yacc/lex parser for IBIS
models, I sent Steve Lipa a version for information.  Perhaps the NCSU
version may evolve into an official version.  Anyway, it may take longer
than I intended to finish my version, so I am posting it as is, per the
brief discussion at the last forum.

I do favor having an official BNF grammar with IBIS.  In addition, I have
been trying to keep up with the BIRDS with a separate augmented grammar to help
observe that the proposed extensions are done in a manner consistent with
IBIS Version 1.1.

Some comments are in parenthesis "(  )" and are mostly notes to myself 
regarding some additional details which I have not formally captured.

At the end I include a section to isolate the "units" specification.  One
intent is to point out the the IBIS times 1000 multiplier is a lower case
"k" which actually is correct.  This is one added detail that needs to be
tracked since many products (and the DIE 0.9 Spec in which IBIS is referenced)
use upper case "K".

Bob Ross, Interconnectix, Inc.

DRAFT BNF FOR IBIS VERSION 1.1 - STILL UNDER DEVELOPMENT

Notation
--------

Terminals of the grammar are enclosed by apostrophes. They are the actual 
keyword used in the IBIS file format. Keywords are not case sensitive and 
are put in upper case in this definition only.

The vertical bar "|" separate alternatives. For example, A | B | C, represents 
exactly one occurrence of A or B or C.

Braces "{}" indicate zero or more occurrences of the enclosed syntactic 
construct. For example, { A } represents the empty sequence, as well as A , 
and A A, A A A, and so on.  Braces with plus "{}+" indicate one or more
occurrences of the enclosed syntactic construct.  Braces with question
mark "{}?" indicate zero or one occurrences of the enclosed syntactic
construct.

The terminals of IBIS file format are keyWord token and item token. They 
are defined as entries in the semantic definition for each section.

Definition
----------

$goal ::= ibisFileFormat

ibisFileFormat ::= fileHeaderSection sections `[` `END' `]'

fileHeaderSection ::= ibisVersion fileName FileVersion { fileHeaderItems }
                       (ibisVersion first or after comments, others any order)

fileHeaderItems ::= commentChar | date | source | notes | disclaimer

ibisVersion ::= `[` `IBIS Ver' `]' string

commentChar ::= `[` `comment char' `]' commentString        (0 to many)

commentString ::= character `_char'

fileName ::= `[` `File name' `]' fileNameString

fileNameString ::= string `.ibs'

fileVersion ::= `[` `File Rev' `]' string

date ::= `[` `date' `]' text                                (0 or 1)

source ::= `[` `source' `]' text                            (0 to many)

notes ::= `[` `notes' `]' text                              (0 or 1)

disclaimer ::= `[` `disclaimer' `]'                         (0 to many)

sections ::= section { section }

section ::= componentDefinitionSection | modelDefinitionSection

componentDefinitionSection ::= component manufacturer package pin
                                                     (last 3 any order)
component ::= `[' `component' `]'

manufacturer ::= `[` `manufacturer' `]' text

package ::= `[` `package' `]' package_RLC

package_RLC ::=  `R_pkg' typ_min_max | `L_pkg' typ_min_max |
`C_pkg' typ_min_max
                                         (one of each pair in any order)

typ_min_max ::= real real_na real_na

real_na ::= [ real | `NA' ]

pin ::= `[` `pin' `]' `signal_name' 'model_name' { `R_pin' `L_pin' `C_pin' }?
         { pin_entry }+
                
pin_entry ::= string string [model_identifier | `power' | `gnd' | `NC']
{ real_na real_na real_na }?
                                   (3 or 6 columns for all entries)
                                   (R_pin, L_pin, C_pin required if 6 columns)

modelDefinitionSection ::= `[` `model' `]' modelType modelEntry

modelEntry ::= [ polarity | enable | vinl | vinh | c_comp | 
voltage_range | pulldown | pullup | gndClamp | powerClamp | ramp ]

modelType :: =  `model_type'  [ `Input' | `Output' | `I/O' | `3-
state' | `Open_drain' ]

polarity ::= `[` `polarity' `]' [ `non-inverting' | `inverting' ]

enable ::= `enable'  [ `active-high' | `active-low' ]

vinl ::= `vinl' `=' voltage_spec

vinh ::= `vinh' `=' voltage_spec

voltage_spec ::= real [ `V' ]

c_comp ::= `c_comp' typ_min_max

voltage_range ::= `[` `voltage range' `]' typ_min_max

pulldown ::= `[` `pulldown' `]' viDefinitions

pullup ::= `[` `pullup' `]' viDefinitions

gndClamp ::= `[` `gnd_clamp' `]' viDefinitions

powerClamp ::= `[` `power_clamp' `]' viDefinitions

viDefinition ::= { real typ_min_max }

ramp ::= `[` `ramp' `]' { dvdtR | dvdtF }

dvdtR ::= `dV/dt_r' typ_min_max_rate

dvdtF ::= `dV/dt_r' typ_min_max_rate

typ_min_max_rate ::= rate [ rate | `NA' ] [ rate | `NA' ]

rate ::= real `/' real

real ::= real_number[ unit | { char } ]

unit ::= [ `p' | `n' | `u' | `m' | `k' | `M' | `G' ]{ char }

(etc. ...)