SaC v1.4
new in v1.4:
-
•
support for non-recursive structs
-
•
support for gpukernel pragmas
-
•
support for tensor comprehensions
1 Program Structure
| prg | [ ( module | class ) ] [ interface ] | |
| [ structdef ] [ typedef ] [ objectdef ] | ||
| [ function ] |
2 Module Declarations
| module | module id [ deprecated str ] ; | |
| class | class id [ deprecated str ] ; classtype | |
| classtype | classtype type ; | |
| extern classtype ; [ interface_pragma ] |
3 Import / Export
| interface | ( import | use ) id : symbolset ; | |
| ( export | provide ) symbolset ; | ||
| symbolset | all [ except { ext_id [ , ext_id ] } ] | |
| { ext_id [ , ext_id ] } |
4 Structure Definitions
| structdef | struct id { [ type id [ , id ] ; ] } ; | |
5 Type Definitions
| typedef | loctypedef | |
| exttypedef | ||
| loctypedef | typedef type id ; | |
| exttypedef | external typedef id ; [ interface_pragma ] | |
6 Object Definitions
| objectdef | ( locobjdef | extobjdef ) | |
| locobjdef | objdef type id = funcall ; | |
| extobjdef | external objdef type id ; [ interface_pragma ] |
7 Function Declarations and Definitions
| function | extfundec [ ( interface_pragma | funtion_pragma ) ] | |
| specfundec [ function_pragma ] | ||
| fundef | ||
| main | ||
| extfundec | external varsignature ; | |
| specfundec | specialize fixsignature ; | |
| fundef | [ ( inline | noinline ) ] fixsignature [ function_pragma ] body | |
| fixsignature | fixrets ext_id ( fixargs ) | |
| operator_sig | ||
| varsignature | varrets ext_id ( varargs ) | |
| operator_sig | ||
| operator_sig | type ( ext_op ) ( arg ) | |
| type ( ext_op ) ( arg , arg ) | ||
| fixargs | ( arg [ , arg ] | [ void ] ) | |
| varargs | fixargs | |
| arg [ , arg ] , ... | ||
| arg | type [ & ] id | |
| fixrets | ( type [ , type ] | [ void ] ) | |
| varrets | fixrets | |
| type [ , type ] , ... | ||
| main | int main ( [ void ] ) body |
8 Function Bodies
| body | { [ cachesim_pragma ] [ vardec ] [ statement ] [ return ] } | |
| vardec | type id [ , id ] ; | |
| statement | ; | |
| assignment ; | ||
| funcall ; | ||
| withloop ; | ||
| cond | ||
| doloop | ||
| whileloop | ||
| forloop | ||
| return | return [ expr ] ; | |
| return ( [ exprs ] ) ; | ||
| assignment | assign_lhs [ , assign_lhs ] assign_op expr | |
| assign_lhs ( ++ | -- ) | ||
| assign_lhs | id | |
| assign_lhs [ exprs ] | ||
| assign_lhs . id | ||
| assign_op | ( = | += | -= | *= | /= | %= ) | |
| cond | if ( expr ) statementblock [ else statementblock ] | |
| doloop | do statementblock while ( expr ) ; | |
| whileloop | while ( expr ) statementblock | |
| forloop | for ( assignment [ , assignment ] | |
| ; expr ; assignment [ , assignment ] ) | ||
| statementblock | ||
| statementblock | { [ cachesim_pragma ] [ statement ] } | |
| statement |
9 Expressions
| exprs | expr [ , expr ] | |
| expr_or_dot | ( expr | . ) | |
| expr_or_mdot | ( expr | . | ... ) | |
| expr | const | |
| qual_ext_id | ||
| funcall | ||
| withloop | ||
| tensor_comp | ||
| array | ||
| struct | ||
| expr || expr | ||
| expr && expr | ||
| expr ? expr : expr | ||
| ( type ) expr | ||
| ( expr ) | ||
| arrray | [ [ exprs ] ] | |
| [ : type ] | ||
| expr [ [ expr_or_mdot [ , expr_or_mdot ] ] ] | ||
| struct | id { exprs } | |
| id { [ . id = expr [ , . id = expr ] ] } | ||
| expr . id | ||
| funcall | qual_ext_id ( [ exprs ] ) | |
| unary_prf ( expr ) | ||
| qual_ext_op expr | ||
| binary_prf ( expr , expr ) | ||
| expr qual_ext_op expr | ||
| ternary_prf ( expr , expr , expr ) | ||
| tensor_comp | { tc_def [ ; tc_def ] } | |
| tc_def | id -> expr [ tc_constraint ] | |
| [ [ id_or_mdot [ , id_or_mdot ] ] ] -> expr [ tc_constraint ] | ||
| tc_constraint | expr ( < | <= ) ( id | id_vec ) [ step expr [ width expr ] ] | |
| ( id | id_vec ) ( < | <= ) expr [ step expr [ width expr ] ] | ||
| expr ( < | <= ) ( id | id_vec ) ( < | <= ) expr | ||
| [ step expr [ width expr ] ] |
10 With-Loops
| withloop | with [ generators ] : operations | |
| generators | { [ withloop_pragma ] [ generator ] } | |
| generator | ( index_set ) [ generator_pragma ] [ { [ statement ] } ] : gen_exprs ; | |
| index_set | expr_or_dot ( < | <= ) index_vars ( < | <= ) expr_or_dot | |
| [ step expr [ width expr ] ] | ||
| index_vars | id [ = id_vec ] | |
| id_vec | ||
| id_vec | [ [ id [ , id ] ] ] | |
| gen_exprs | void | |
| expr | ||
| ( expr [ , expr ] ) | ||
| operations | void | |
| operation | ||
| ( operation [ , operation ] ) | ||
| operation | genarray ( expr [ , expr ] ) | |
| modarray ( expr ) | ||
| fold ( ( qual_ext_id | qual_ext_op ) [ ( exprs ) ] , expr ) | ||
| foldfix ( ( qual_ext_id | qual_ext_op ) [ ( exprs ) ] , expr , expr ) | ||
| propagate ( id ) |
11 Types
| type | basetype [ shape_spec ] | |
|---|---|---|
| shape_spec | [ * ] | |
| [ + ] | ||
| [ [ . [ , . ] ] ] | ||
| [ nums ] | ||
| basetype | simpletype | |
| usertype | ||
| structtype | ||
| simpletype | byte | |
| short | ||
| int | ||
| long | ||
| longlong | ||
| ubyte | ||
| ushort | ||
| uint | ||
| ulong | ||
| ulonglong | ||
| float | ||
| bool | ||
| char | ||
| double | ||
| structtype | [ id :: ] struct id | |
| usertype | [ id :: ] id | |
12 Identifiers
| id_or_mdot | ( id | . | ... ) | |
| qual_ext_id | [ id :: ] ext_id | |
| ext_id | ( id | reservedid ) | |
| reservedid | genarray | |
| modarray | ||
| fold | ||
| foldfix | ||
| propagate | ||
| all | ||
| except | ||
| qual_ext_op | [ id :: ] ext_op | |
| ext_op | ( op | reservedop ) | |
| reservedop | & | |
| && | ||
| || | ||
| ! | ||
| ~ | ||
| + | ||
| - | ||
| * | ||
| / | ||
| % | ||
| <= | ||
| < | ||
| >= | ||
| > | ||
| >> | ||
| << | ||
| ^ | ||
| ++ | ||
| -- |
13 Constants
| const | numbyte | |
| numshort | ||
| numint | ||
| numlong | ||
| numlonglong | ||
| numubyte | ||
| numushort | ||
| numuint | ||
| numulong | ||
| numulonglong | ||
| num | ||
| float | ||
| double | ||
| char | ||
| [ str ] | ||
| true | ||
| false | ||
| nums | [ num [ , num ] ] |
14 Builtin Operations
| unary_prf | ( _tob_S_ | _tos_S_ | _toi_S_ | _tol_S_ | _toll_S_ ) | |
| ( _toub_S_ | _tous_S_ | _toui_S_ | _toul_S_ | _toull_S_ ) | ||
| _tof_S_ | ||
| _tod_S_ | ||
| _toc_S_ | ||
| _tobool_S_ | ||
| ( _not_S_ | _not_V_ ) | ||
| ( _neg_S_ | _neg_V_ ) | ||
| ( _abs_S_ | _abs_V_ ) | ||
| _dim_A_ | ||
| _shape_A_ | ||
| ternary_prf | _modarray_AxVxS_ | |
| binary_prf | ( _add_SxS_ | _add_SxV_ | _add_VxS_ | _add_VxV_ ) | |
| ( _sub_SxS_ | _sub_SxV_ | _sub_VxS_ | _sub_VxV_ ) | ||
| ( _mul_SxS_ | _mul_SxV_ | _mul_VxS_ | _mul_VxV_ ) | ||
| ( _div_SxS_ | _div_SxV_ | _div_VxS_ | _div_VxV_ ) | ||
| ( _mod_SxS_ | _mod_SxV_ | _mod_VxS_ | _mod_VxV_ ) | ||
| ( _min_SxS_ | _min_SxV_ | _min_VxS_ | _min_VxV_ ) | ||
| ( _max_SxS_ | _max_SxV_ | _max_VxS_ | _max_VxV_ ) | ||
| ( _eq_SxS_ | _eq_SxV_ | _eq_VxS_ | _eq_VxV_ ) | ||
| ( _neq_SxS_ | _neq_SxV_ | _neq_VxS_ | _neq_VxV_ ) | ||
| ( _le_SxS_ | _le_SxV_ | _le_VxS_ | _le_VxV_ ) | ||
| ( _lt_SxS_ | _lt_SxV_ | _lt_VxS_ | _lt_VxV_ ) | ||
| ( _ge_SxS_ | _ge_SxV_ | _ge_VxS_ | _ge_VxV_ ) | ||
| ( _gt_SxS_ | _gt_SxV_ | _gt_VxS_ | _gt_VxV_ ) | ||
| ( _and_SxS_ | _and_SxV_ | _and_VxS_ | _and_VxV_ ) | ||
| ( _or_SxS_ | _or_SxV_ | _or_VxS_ | _or_VxV_ ) | ||
| _reshape_VxA_ | ||
| _sel_VxA_ | ||
| _take_SxV_ | ||
| _drop_SxV_ | ||
| _cat_VxV_ | ||
15 Pragmas
| interface_pragma | # pragma linkname str | |
| # pragma header str | ||
| # pragma linkwith [ str ] | ||
| # pragma linkobj [ str ] | ||
| # pragma copyfun str | ||
| # pragma freefun str | ||
| # pragma linksign [ nums ] | ||
| # pragma refcounting [ nums ] | ||
| # pragma effect qual_ext_id [ , qual_ext_id ] | ||
| withloop_pragma | # pragma wlcomp wc_funcall | |
| # pragma nocuda | ||
| generator_pragma | # pragma gpukernel GridBlock ( num , gk_funcall ) | |
| wc_funcall | Default | |
| All ( ) | ||
| Cubes ( ) | ||
| ConstSegs ( [ [ nums ] , [ nums ] , ] wc_funcall ) | ||
| NoBlocking ( wc_funcall ) | ||
| BvL0 ( [ [ nums ] , ] wc_funcall ) | ||
| BvL1 ( [ [ nums ] , ] wc_funcall ) | ||
| BvL2 ( [ [ nums ] , ] wc_funcall ) | ||
| Ubv ( [ [ nums ] , ] wc_funcall ) | ||
| Scheduling ( sched_param , wc_funcall ) | ||
| Tasksel ( tsel_param , wc_funcall ) | ||
| gk_funcall | Gen | |
| ShiftLB ( gk_funcall ) | ||
| CompressGrid ( [ nums ] , gk_funcall ) | ||
| Permute ( [ nums ] , gk_funcall ) | ||
| FoldLast2 ( gk_funcall ) | ||
| SplitLast ( num , gk_funcall ) | ||
| PadLast ( num , gk_funcall ) | ||
| cachesim_pragma | # pragma cachesim [ str ] | |
| function_pragma | # pragma recountdots | |
| # pragma noinline |