Difference between revisions of "GenAsm (language)"

From Mill Computing Wiki
Jump to: navigation, search
(Added inline functions, both for definition and call)
m (fixed link)
 
(22 intermediate revisions by 2 users not shown)
Line 1:Line 1:
The genAsm assembly language is a low-level [https://en.wikipedia.org/wiki/Dataflow_programming| dataflow language] for writing programs to be executed on the Mill processors. The language is accepted by the [[genAsm (assembler)|genAsm assembler]], which create ELF files suitable as input to the [[prelinker]] or [[specializer]]. The assembler is intended for use when high-level language compilers are unable to provide a desired access to Mill hardware facilities.
+
The [[genAsm]] assembly language is a low-level [https://en.wikipedia.org/wiki/Dataflow_programming dataflow language] for writing programs to be executed on the Mill processors. The language is accepted by the [[genAsm (assembler)|genAsm assembler]], which create ELF files suitable as input to the [[prelinker]] or [[specializer]]. The assembler is intended for use when high-level language compilers are unable to provide a desired access to Mill hardware facilities.
  
 
Syntax in [https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_Form EBNF]:
 
Syntax in [https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_Form EBNF]:
  
Terminal keywords and symbols are in quotes
+
  '''"''' ... '''"'''  terminal keyword or symbol
Meta-symbols are bold
+
 
   '''::='''      is defined as
 
   '''::='''      is defined as
 
   '''|'''        alternatives
 
   '''|'''        alternatives
Line 13:Line 12:
 
    
 
    
  
     program        ::=  "module", identifier, expDefs;
+
     program        ::=  "module", moduleId, serial;
     expDefs        ::=  expDef, {";", expDef};
+
     serial        ::=  [expDef], {";", [expDef]};
     expDef        ::=  expression | definition;
+
     expDef        ::=  expression |
     definition    ::=  functionDef;
+
                        definition |
     functionDef    ::=  ["inline"], "func", identifier, formals, [results], "{", expDefs, "}";
+
                        join, [expDef];
 +
     definition    ::=  functionDef | labelDef;
 +
     functionDef    ::=  ["inline"], "func", identifier, formals, [results], funcBody;
 +
    funcBody      ::=  ":", expression | "outcall" | "forward";
 
     formals        ::=  "(", [formal, {",", formal}], ")";
 
     formals        ::=  "(", [formal, {",", formal}], ")";
 
     formal        ::=  widthTag, identifier;
 
     formal        ::=  widthTag, identifier;
 
     widthTag      ::=  "b" | "h" | "w" | "d" | "q" | "bv" | "hv" | "wv" | "dv" | "qv";
 
     widthTag      ::=  "b" | "h" | "w" | "d" | "q" | "bv" | "hv" | "wv" | "dv" | "qv";
     results        ::=  "->", widthTag |
+
     results        ::=  widthPack;
                        "->", "(", [widthTag, {",", widthTag}], ")";
+
    widthPack      ::=  "{", [widthTag, {",", widthTag}], "}";
     expression    ::=  [secondary] |  
+
    labelDef      ::=  "label", [widthPack], identifier, "forward";
 +
     expression    ::=  secondary |  
 
                         expression, binding |  
 
                         expression, binding |  
                         expression, opId, [secondary] |
+
                         expression, gang, [secondary] |
                         expression, ["inline"], funcId, [secondary]
+
                         expression, ["inline"], funcId, [secondary] |
 +
                        expression, join |
 
                         expression, "?", expression, ":", expression;
 
                         expression, "?", expression, ":", expression;
 
     secondary      ::=  primary |  
 
     secondary      ::=  primary |  
                         secondary, "(", [expression, {",", expression}], ")";
+
                         secondary, "(", [expression, {",", expression}], ")" |
 +
                        secondary, widthPack;
 
     primary        ::=  widthTag |
 
     primary        ::=  widthTag |
                         [widthTag, ":"] number  |  
+
                         [widthTag, ":"], number  |  
 
                         boundId |  
 
                         boundId |  
                         i["inline"], funcId |  
+
                         ebbId |
                         opId |
+
                        ["inline"], funcId |  
                         "(" expression ")";
+
                         gang |
     binding        ::=  "-:" identifier |  
+
                         "(", expression, ")" |
                         "-:" "{", identifier, {",", identifier}, "}";
+
                        "begin", serial, "end" |
     opId          ::=  identifier
+
                        ifClause;
     boundId        ::=  identifier
+
     binding        ::=  "-:", identifier |  
     funcId        ::=  identifier
+
                         "-:", idenPack;
     identifier    ::=  alpha, {alnum}
+
    idenPack      ::=  "{", identifier, {",", identifier}, "}";
     alpha          ::=  "_" | <"a"-"z"> | <"A"-"Z">
+
    gang          ::=  opId, [".", opId];
     digit          ::=  <"0"-"9">
+
     opId          ::=  identifier;
     alnum         ::=  digit | alpha
+
    ebbId          ::=  identifier;
     comment        ::=  "//", {<char>}, <EOL> | "/*", {<char>}, "*/"
+
    join          ::=  ebbId, ":";
 +
    ifClause      ::=  "if", predPart, thenPart, {elifPart}, [elsePart], "fi";
 +
    predPart      ::=  serial;
 +
    thenPart      ::=  "then", serial;
 +
    elifPart      ::=  "elif", serial;
 +
    elsePart      ::=  "else", serial;
 +
     boundId        ::=  identifier;
 +
     funcId        ::=  identifier;
 +
     moduleId      ::=  identifier;
 +
     identifier    ::=  [qualification], name;
 +
    qualification  ::=  [qualification], name, "::";
 +
    name          ::=  alpha, {alnum};
 +
    alnum          ::=  decDigit | alpha;
 +
     alpha          ::=  "_" | <"a"-"z"> | <"A"-"Z">;
 +
     decDigit      ::=  <"0"-"9">;
 +
     number        ::=  decimal | hexadecimal | float;
 +
    decimal        ::=  decDigit, { decDigit };
 +
    hexadecimal    ::=  hexBase, hexDigit, { hexDigit };
 +
    hexBase        ::=  "0x" | "0X";
 +
    hexDigit      ::=  decDigit | <"a"-"f"> | <"A"-"F">;
 +
    float         ::=  decimal, ".", [decimal], [exponent] |
 +
                        decimal, [".", [decimal]], exponent;
 +
    exponent      ::=  "e", [sign], decimal |
 +
                        "E", [sign], decimal;
 +
    sign          ::=  "+" | "-";
 +
     comment        ::=  "//", {<char>}, <EOL> | "/*", {<char>}, "*/";

Latest revision as of 22:19, 12 January 2015

The genAsm assembly language is a low-level dataflow language for writing programs to be executed on the Mill processors. The language is accepted by the genAsm assembler, which create ELF files suitable as input to the prelinker or specializer. The assembler is intended for use when high-level language compilers are unable to provide a desired access to Mill hardware facilities.

Syntax in EBNF:

  " ... "   terminal keyword or symbol
  ::=       is defined as
  |         alternatives
  [ ... ]   option (zero or one times
  { ... }   repetition (zero or more times)
  ,         sequence (in order left-to-right)
  ;         end of definition
  
   program        ::=  "module", moduleId, serial;
   serial         ::=  [expDef], {";", [expDef]};
   expDef         ::=  expression |
                       definition |
                       join, [expDef];
   definition     ::=  functionDef | labelDef;
   functionDef    ::=  ["inline"], "func", identifier, formals, [results], funcBody;
   funcBody       ::=  ":", expression | "outcall" | "forward";
   formals        ::=  "(", [formal, {",", formal}], ")";
   formal         ::=  widthTag, identifier;
   widthTag       ::=  "b" | "h" | "w" | "d" | "q" | "bv" | "hv" | "wv" | "dv" | "qv";
   results        ::=  widthPack;
   widthPack      ::=  "{", [widthTag, {",", widthTag}], "}";
   labelDef       ::=  "label", [widthPack], identifier, "forward";
   expression     ::=  secondary | 
                       expression, binding | 
                       expression, gang, [secondary] |
                       expression, ["inline"], funcId, [secondary] |
                       expression, join |
                       expression, "?", expression, ":", expression;
   secondary      ::=  primary | 
                       secondary, "(", [expression, {",", expression}], ")" |
                       secondary, widthPack;
   primary        ::=  widthTag |
                       [widthTag, ":"], number  | 
                       boundId | 
                       ebbId |
                       ["inline"], funcId | 
                       gang |
                       "(", expression, ")" |
                       "begin", serial, "end" |
                       ifClause;
   binding        ::=  "-:", identifier | 
                       "-:", idenPack;
   idenPack       ::=  "{", identifier, {",", identifier}, "}";
   gang           ::=  opId, [".", opId];
   opId           ::=  identifier;
   ebbId          ::=  identifier;
   join           ::=  ebbId, ":";
   ifClause       ::=  "if", predPart, thenPart, {elifPart}, [elsePart], "fi";
   predPart       ::=  serial;
   thenPart       ::=  "then", serial;
   elifPart       ::=  "elif", serial;
   elsePart       ::=  "else", serial;
   boundId        ::=  identifier;
   funcId         ::=  identifier;
   moduleId       ::=  identifier;
   identifier     ::=  [qualification], name;
   qualification  ::=  [qualification], name, "::";
   name           ::=  alpha, {alnum};
   alnum          ::=  decDigit | alpha;
   alpha          ::=  "_" | <"a"-"z"> | <"A"-"Z">;
   decDigit       ::=  <"0"-"9">;
   number         ::=  decimal | hexadecimal | float;
   decimal        ::=  decDigit, { decDigit };
   hexadecimal    ::=  hexBase, hexDigit, { hexDigit };
   hexBase        ::=  "0x" | "0X";
   hexDigit       ::=  decDigit | <"a"-"f"> | <"A"-"F">;
   float          ::=  decimal, ".", [decimal], [exponent] |
                       decimal, [".", [decimal]], exponent;
   exponent       ::=  "e", [sign], decimal |
                       "E", [sign], decimal;
   sign           ::=  "+" | "-";
   comment        ::=  "//", {<char>}, <EOL> | "/*", {<char>}, "*/";