source: proto/s2k/trunk/framework/input/grammar/scatter/b2k.scatter @ 3788

Last change on this file since 3788 was 3788, checked in by ksherdy, 5 years ago

Added basic graph code generation.

File size: 8.0 KB
RevLine 
[2834]1//
[3778]2// b2k - A very high-level IR for the expression of block-by-block parallel bit stream processing.
[2834]3//
[3778]4// 02-12-2012      Original definition.
5// 29-03-2013      Added IDISA function call.
6// 06-04-2013      Updated to Scatter with types.
[2834]7//
[2981]8//
[3778]9//
10// Tom Shermer <shermer at sfu dot ca>
11// Ken Herdy <ksherdy at sfu dot ca>
12//
[3004]13
[3778]14
[3192]15types {
[3699]16//    toolchain.s2k.lang.type.Type,
17//    toolchain.s2k.lang.type.PrimitiveType,
18//    toolchain.s2k.lang.type.StreamType,
[3192]19}
[3004]20
[2834]21context main {
[3699]22    recognizers {
23        Whitespace [IGNORE],
24        Integer [INTEGER_CONST],
25        Identifier [IDENTIFIER],        // Java identifiers. Produces Lextant Tokens for keywords.
26        Comment [IGNORE] "#" "\n",      // parabix2_pablo debugging only.
27        Comment [IGNORE] "//" "\n",
28        Comment [SQ_STRING] "'" "'",
29        Comment [IGNORE] "/*" "*/",     // Comment. Comment [STRING] "/*" "*/",
30        String [STRING],
31        Punctuator,
32        EndOfInput,
33    }
[2834]34
[3699]35    // t o k e n s
36    tokens {
[3782]37        GRAPH,
[3699]38        INIT,
39        KERNEL,
[3769]40        IN,
41        OUT,
42        INOUT,
[3699]43        FUNCTION,   
44        STRUCT,
45        INT,
46        VOID,
47        BOOL,
48        BITFIELD    "BitField",
[3778]49        BITBLOCK    "BitBlock",
[3699]50        //CODEBLOCK,
51        IF,
52        ELSE,
53        WHILE,
54        RETURN,
55        ASSIGN      "=",
56        LANGLE      "<",
57        RANGLE      ">",
58        LCURLY      "{",
59        RCURLY      "}",
60        LROUND      "(",
61        RROUND      ")",
62        LSQUARE     "[",
63        RSQUARE     "]",
64        COMMA       ",",
65        TERMINATOR  ";",
66        DOT         ".",
67    }
[2834]68}
69
70interfaces {
[3699]71    intValued {int value = 0;},
[2834]72}
73
74nodes {
[3699]75    assign {} [assignRest],
76    funcCall {} [funcCallRest],
77    idisaFuncCall {} [idisaFuncCallRest],
78    integerConstant{intValued;} [fieldWidthSpecifier ], // codeBlockWidthSpecifier ],
[3782]79    // primitiveType{} [intType voidType boolType bitBlockType], // KH: update S2B
[3699]80    fieldWidthType{int fieldWidth = 1;} [],
81    // codeBlockWidth{int codeBlockWidth = 128;} [],
[2834]82}
83
84grammar {
85   
[3788]86    program     -> (structDef | kernelDef) * graphDef ?;
[3699]87   
[2834]88    //
[3778]89    // s t r u c t   d e f i n i t i o n 
[3699]90    //
[3778]91    structDef           ->  STRUCT structName structDefBody TERMINATOR? ;
92    structDefBody       ->  LCURLY (structMember TERMINATOR)+ RCURLY ;
[3699]93    structMember        ->  structMemberType structMemberName ;
[3778]94    structMemberType    #-> bitBlockType ;
[3699]95    structMemberName    #-> identifier ;
[3161]96
[3699]97    //
[3778]98    // k e r n e l   d e f i n i t i o n
[3699]99    //
[3778]100    kernelDef           ->  KERNEL kernelName LCURLY kernelInitDef (kernelFuncDef)+ carryDeclare TERMINATOR RCURLY TERMINATOR? ; 
[3699]101    kernelName          #-> identifier ;
[3161]102
[3699]103    //
104    // k e r n e l   p r o p e r t i e s 
105    //
[3778]106    kernelInitDef       #-> INIT LCURLY kernelProperty* RCURLY TERMINATOR? ;
[3699]107    kernelProperty      ->  propertyName ASSIGN propertyValue TERMINATOR ;
108    propertyName        #-> identifier ;
109    propertyValue       ->  LSQUARE integerConstant (COMMA integerConstant)* RSQUARE ;
[3161]110
[3699]111    //
[3778]112    // k e r n e l   f u n c t i o n   d e f i n i t i o n
[3699]113    //
[3778]114    kernelFuncDef       ->  FUNCTION kernelFuncName LROUND kernelParameterList RROUND kernelFuncBody TERMINATOR? ;
115    kernelParameterList ->  (kernelParameter (COMMA kernelParameter)* )?;
116    kernelFuncName      #-> identifier ;
117    kernelParameter     ->  (kernelParameterMode)? type kernelParameterName ;
118    kernelParameterMode ->  (IN | OUT | INOUT) ;
119    kernelParameterName #-> identifier ;
120    kernelFuncBody      #-> blockStmt ;
[3769]121    carryDeclare                #-> expr; // KH: temp hack to append the CarryDeclare() macro
[3192]122
[3782]123    //
124    // s t r e a m   g r a p h  ( p i p e l i n e )  d e f i n i t i o n
125    //   
126    graphDef                    ->  GRAPH graphName LROUND graphParameterList RROUND graphBody TERMINATOR ? ;
127   
128    graphName                   #-> identifier ;
129    graphParameterList          ->  ( graphParameter (COMMA graphParameter)* ) ? ; // KH: implement as a 'modal' parameter
130    graphParameter              ->  graphParameterMode? type graphParameterName ;
131    graphParameterMode          ->  (IN | OUT | INOUT) ;
132    graphParameterName          #-> identifier ;
133   
[3788]134    graphBody                   ->  LCURLY graphVarDecls addKernelStmts RCURLY ;
[3782]135   
[3788]136    graphVarDecls               ->  ( structDecl | kernelDecl ) * ;
[3782]137    structDecl                  ->  structType structName TERMINATOR ;
138    kernelDecl                  ->  kernelType kernelName TERMINATOR ;
139    // graphDecl                ->  GRAPH graphName TERMINATOR ;
140       
[3788]141    addKernelStmts              ->  addKernelStmt * ;   
[3782]142    addKernelStmt               ->  kernelVarName kernelArgList ;
143    kernelVarName               #-> identifier ;
144    kernelArgList               ->  (kernelArgName (COMMA kernelArgName) *) ? ;
145    kernelArgName               #-> identifier ; 
146
[3699]147    //
148    // c o d e   b l o c k     // (32,64,128,256,...)
149    //
150    // codeBlock        ->  CODEBLOCK codeBlockWidthSpecifier! 
151    //                      { @codeBlockWidth = @:value; }
152    //                      blockStmt (TERMINATOR)? ;
153    //               
154    // codeBlockWidthSpecifier  #-> (LANGLE integerConstant RANGLE ) | (epsilon {@value = 128;}) ;
[3161]155
[3699]156    //
157    // s t a t e m e n t s
158    //
159    stmt                    #-> varDecl | funcCallOrAssignStmt | ifStmt | whileStmt | returnStmt  ;
160    funcCallOrAssignStmt    #-> expr (assignRest _promote_) ? TERMINATOR ; // KH: TODO Add Semantic Analysis pass to validate expr non-terminal is of function call node type   
161    idisaFuncCallArgList    ->  (expr (COMMA expr)*) ? ;
162    assignOperator          ->  ASSIGN ;                 
163    assignRest              ->  assignOperator^! expr ;               
164    ifStmt                  ->  IF LROUND expr RROUND blockStmt (ELSE blockStmt)? ;             
165    whileStmt               ->  WHILE LROUND expr RROUND blockStmt ;
166    returnStmt              ->  RETURN (expr) ? TERMINATOR ;
167    varDecl                 ->  type varName TERMINATOR ;
168    varName                 #-> identifier ;
169    blockStmt               ->  LCURLY stmt* RCURLY ;
170
171    //
172    // e x p r e s s i o n s
173    //   
[3778]174    expr                #-> LROUND expr RROUND
175                         | constant
176                         | compoundIdentifier ((funcCallRest _promote_) | (idisaFuncCallRest _promote_)) ? ;
[3699]177
178    constant            #->     stringConstant | integerConstant ;
179    integerConstant     ->      INTEGER_CONST {@value = @@value;} ;
180    stringConstant      ->      STRING | SQ_STRING ;
181    compoundIdentifier  #->     identifier (DOT^ identifier)* ;
182    identifier          ->      IDENTIFIER ;
183    funcCallRest        ->      LROUND^ funcCallArgList RROUND ;
184    funcCallArgList     ->      (expr (COMMA expr)*) ? ;
185    idisaFuncCallRest   ->      LANGLE^ fieldWidth RANGLE LROUND idisaFuncCallArgList RROUND;
186    fieldWidth          ->      integerConstant ; // fieldWidthSpecifier
187
188    //
189    // t y p e s
190    //
191    type                #-> primitiveType   |
192                            bitFieldType    |
[3782]193                            structType      |
194                            kernelType      ;
[3699]195
196    primitiveType       #->  ( intType | voidType | boolType | bitBlockType ) ;
197
198    intType             ->  INT ;       // { @type = {{PrimitiveType.INTEGER}}; } ;
199    voidType            ->  VOID ;      // { @type = {{PrimitiveType.VOID}}; } ;
200    boolType            ->  BOOL ;      // { @type = {{PrimitiveType.BOOL}}; } ;
201    bitBlockType        ->  BITBLOCK ;  // { @type = {{PrimitiveType.BITBLOCK}}; } ;
202   
203    bitFieldType        ->  BITFIELD  fieldWidthSpecifier!
204                                            {   @fieldWidth = @:value;
205                                            // @type = {{ new BitFieldType(%?) }} , @fieldWidth ;
206                                            } ;
207
208    fieldWidthSpecifier    #-> (LANGLE integerConstant RANGLE )
209                            | (epsilon {@value = 1;}) ;
210   
[3782]211    structType             ->  STRUCT structName ;
212    structName             #-> identifier ;
[3699]213   
[3782]214    kernelType             -> KERNEL kernelName ;
215    kernelName             #-> identifier ;
216   
[2834]217}
Note: See TracBrowser for help on using the repository browser.