lexemes; begin string '"' ([~'"'] | ('"' '"'))+ '"'; opGT '>'; opLT '<'; opLprn '('; opRprn ')'; opPlus '+'; opMinus '-'; opMult '*'; opDiv "div"; cnst "MDL" | "VDD" | "VSS" | "TEMP" | "RT" | "FT" | "TSTEP" | "ISTEP" | "LD1" | "LD2" | "INHL" | "INLH" | "OUTHL" | "OUTLH" | "HIGHLVL" | "LOWLVL" | "GENSPICE" | "RUNSPICE" | "WRITERES" | "STUFFPMD" | "MULTICPU" | "INCREMENTAL" | "CHECKPLOT" | "WRITESIM" | "OFTHRSH" | "ORTHRSH" | "IFTHRSH" | "IRTHRSH" | "IGNOREGLITCH"; keyAnalyze "analyze" | "anal" | "ana" | "an" | "a" ; keyBegin "begin"; keyChar "characterize" | "char" | "ch" | "c" ; keyDefine "define" ; keyEvaluate "evaluate" | "eval" | "ev"; keyGenSpi "genspi" | "gen" | "ge" | "g"; keyHelp "help" | "h"; keyInclude ("include" | "source") [' ' tab]+ [~' ' tab eol ';']+; keyOldWave ('$' [~eol]+ eol)+; keyParse "parse"; keyPMD "pmd"; keyPMDtime "zerotiming"; keyPMDzcap "zerocap"; keyPMDcap "cap"; keyPMDfne "fne"; keyPMDlayout"layout"; keyQuery '?'; keyQuit "exit" | "quit" | "q"; keySet "set" | "se" | "s"; keyShow "show" | "sh"; keySim "wave" ; keyUpdate "update" | "u"; keyWait "wait"; keyEndOldFile "$$" [~eol]* {ignore}; # keyEOW '%' [~eol]* eol; unitpS "psec" | "ps"; unitnS "nsec" | "ns"; unituS "usec" | "us"; unitmS "msec" | "ms"; unitSec "sec"; unitaF "attoFarad" | "aF"; unitpF "picoFarad" | "pF"; unituF "microFarad" | "uF" | "mmF"; unitF "Farad" | "F"; unitmV "milliVolt" | "mVolt" | "mV"; unitV "volt" | "v"; # oldWave '$' ; # newWave "begin" ; symbol ['a'-'z'] ['a'-'z' '0'-'9' '_']*; cellname ('[' ['a'-'z']+ ']' ['a'-'z'] ['a'-'z' '0'-'9' '_']*) | (['a'-'z'] ['a'-'z' '0'-'9' '_']* '.' ['a'-'z']+) | ['a'-'z'] ['a'-'z' '0'-'9' '_']*; macro '&' [tab ' ']* '(' ' '* ([~Eol ',' ' ' tab ')']* (' '* ',' ' '* | ' '*))+ ')'; # spNode ['a'-'z']* '<' ['a'-'z' '0'-'9']+ '>'; # spDir '.' ['a'-'z'] ['a'-'z' '0'-'9'] *; number (['0'-'9']+ | '.' ['0'-'9']+ | ['0'-'9']+ '.' ['0'-'9']*) | ((['0'-'9']+ | '.' ['0'-'9']+ | ['0'-'9']+ '.' ['0'-'9']*) 'e' ((['+''-']['0'-'9']+) | ['0'-'9']+)); equals '='; colon ':'; dot '.'; comment '#' [~Eol]* {ignore}; white [',' ' ' tab eop eol]+ {ignore}; eos ';' {discard}; end; productions; begin session -> session seperator statement {Name=sessionA} | statement {Name=sessionC} ; seperator -> eos {Name=sepEos} | waveSpec {Name=sepWave} | define {Name=sepDefine}; statement -> analyze {Name=stmntAnalyze} | characterize {Name=stmntCharacterize} | # define {Name=stmntDefine} | evaluate {Name=stmntEvaluate} | genspi {Name=stmntGenSpi} | help {Name=stmntHelp} | keyQuit {Name=stmntQuit} | parse {Name=stmntParse} | pmd {Name=stmntPmd} | set {Name=stmntSet} | show {Name=stmntShow} | update {Name=stmntUpdate} | wait {Name=stmntWait} | # waveSpec {Name=stmntWaveSpec} | {Name=stmntNull}; # eos {Name=stmntEOS}; # Command-line type commands. analyze -> keyAnalyze word arglst {Name=analyzeA}| keyAnalyze cellname arglst {Name=analyzeB}; characterize -> keyChar word arglst {Name=characterizeA}| keyChar cellname arglst {Name=characterizeB}; define -> keyDefine {Name=define}; evaluate -> keyEvaluate exp {Name=evalA} ; genspi -> keyGenSpi word arglst {Name=genspiA}| keyGenSpi cellname arglst {Name=genspiB}; help -> keyHelp {Name=helpAll} | keyQuery {Name=queryAll} | keyHelp keyCommand {Name=helpCmd} | keyHelp cnst {Name=helpCnst}| keyQuery keyCommand {Name=queryCmd} | keyQuery cnst {Name=queryCnst}; parse -> keyParse argLst {Name=parseCmd}; pmd -> keyPmd word pmdCmdLst {Name=pmdCmdA} | keyPmd cellname pmdCmdLst {Name=pmdCmdB} ; set -> keySet cnstSym equals symbol {Name=setA} | cnst equals symbol {Name=setB} | keySet cnstSym equals exp {Name=setC} | cnst equals exp {Name=setD} ; # keySet cnstSym equals symbol {Name=setB} ; show -> keyShow arglst {Name=showA}| keyShow {Name=showB}| cnst {Name=showC}; update -> keyUpdate word arglst {Name=updateA}| keyUpdate cellname arglst {Name=updateB}; wait -> keyWait {Name=wait}; # Simulation specifications. waveSpec -> keySim symbol keyBegin {Name=newWaveSpec} | keyOldWave {Name=oldWaveSpec} ; # Miscellaneous elements. arglst -> arglst word {Name=twoArgs} | word {Name=oneArg}; explst -> explst exp {Name=twoExps} | exp {Name=oneExp} ; exp -> exp opMult exp {Name=expMult, precedence=2, LeftAssociative} | exp opDiv exp {Name=expDiv, precedence=2, LeftAssociative} | exp opPlus exp {Name=expAdd, precedence=1, LeftAssociative} | exp opMinus exp {Name=expSub, precedence=1, LeftAssociative} | opMinus exp {Name=expNeg, precedence=3, LeftAssociative} | opPlus exp {Name=expPos, precedence=3, LeftAssociative} | opLprn exp opRprn {Name=expGrp} | exp unit {Name=expScl, precedence=4, LeftAssociative} | number {Name=expNumber} | cnst {Name=expCnst} | symbol {Name=expSym} ; cnstSym -> cnst {Name=csCnst} | symbol {Name=csSymbol}; pmdCmdLst -> pmdCmdLst pmdCmd {Name=pmdCmdLstA} | pmdCmd {Name=pmdCmdLstB} ; pmdCmd -> keyPMDtime {Name=pmdCmdTime} | keyPMDzcap {Name=pmdCmdZCap} | keyPMDcap {Name=pmdCmdCap} | keyPMDfne {Name=pmdCmdFne} | keyPMDlayout {Name=pmdCmdLy} ; word -> cnst {Name=wordCnst} | symbol {Name=wordSym} | key {Name=wordKey} | unit {Name=wordUnit} | string {Name=wordString}; key -> keyCommand {Name=keyCommand} ; keyCommand -> keyAnalyze {Name=kyAnalyze}| keyChar {Name=kyChar} | keyDefine {Name=kyDef} | keyEvaluate {Name=kyEval} | keyGenSpi {Name=kyGenSpi} | keyHelp {Name=kyHelp} | keyInclude {Name=kyIncl} | keyQuery {Name=kyQuery} | keyQuit {Name=kyQuit} | keySet {Name=kySet} | keyShow {Name=kyShow} | keySim {Name=kySim} | keyUpdate {Name=kyUpdate} | keyWait {Name=kyWait} | keyPMDtime {Name=kyPmdTime} | keyPMDzcap {Name=kyPmdZCap} | keyPMDcap {Name=kyPmdCap} | keyPMDfne {Name=kyPmdFne} | keyPMDlayout {Name=kyPmdLy} ; unit -> unitpS {Name=utPS} | unitnS {Name=utNS} | unituS {Name=utUS} | unitmS {Name=utMs} | unitSec {Name=utSec}| unitaF {Name=utAF} | unitpF {Name=utPF} | unituF {Name=utUF} | unitF {Name=utF} | unitmV {Name=utMV} | unitV {Name=utV} ; end;