2019-02-08 05:49:12 +01:00
|
|
|
{
|
2019-02-18 09:59:17 +01:00
|
|
|
module Language.SystemVerilog.Parser.Parse (descriptions) where
|
2019-02-08 05:49:12 +01:00
|
|
|
|
|
|
|
|
import Data.List
|
2019-02-10 00:35:15 +01:00
|
|
|
import Data.Maybe
|
2019-02-24 09:06:40 +01:00
|
|
|
|
2019-02-08 06:19:39 +01:00
|
|
|
import Language.SystemVerilog.AST
|
2019-03-04 08:58:00 +01:00
|
|
|
import Language.SystemVerilog.Parser.ParseDecl
|
2019-02-08 06:19:39 +01:00
|
|
|
import Language.SystemVerilog.Parser.Tokens
|
2019-02-08 05:49:12 +01:00
|
|
|
}
|
|
|
|
|
|
2019-02-18 09:59:17 +01:00
|
|
|
%name descriptions
|
2019-02-08 05:49:12 +01:00
|
|
|
%tokentype { Token }
|
|
|
|
|
%error { parseError }
|
|
|
|
|
|
2019-02-10 23:46:18 +01:00
|
|
|
%expect 0
|
2019-02-08 05:49:12 +01:00
|
|
|
|
|
|
|
|
%token
|
|
|
|
|
|
2019-02-18 06:26:43 +01:00
|
|
|
"always" { Token KW_always _ _ }
|
|
|
|
|
"always_comb" { Token KW_always_comb _ _ }
|
|
|
|
|
"always_ff" { Token KW_always_ff _ _ }
|
|
|
|
|
"always_latch" { Token KW_always_latch _ _ }
|
2019-03-22 06:31:43 +01:00
|
|
|
"and" { Token KW_and _ _ }
|
2019-03-05 00:25:14 +01:00
|
|
|
"assign" { Token KW_assign _ _ }
|
|
|
|
|
"automatic" { Token KW_automatic _ _ }
|
|
|
|
|
"begin" { Token KW_begin _ _ }
|
2019-03-22 21:57:13 +01:00
|
|
|
"bit" { Token KW_bit _ _ }
|
2019-03-22 06:31:43 +01:00
|
|
|
"buf" { Token KW_buf _ _ }
|
2019-03-22 21:57:13 +01:00
|
|
|
"byte" { Token KW_byte _ _ }
|
2019-03-05 00:25:14 +01:00
|
|
|
"case" { Token KW_case _ _ }
|
|
|
|
|
"casex" { Token KW_casex _ _ }
|
|
|
|
|
"casez" { Token KW_casez _ _ }
|
|
|
|
|
"default" { Token KW_default _ _ }
|
2019-03-18 17:37:46 +01:00
|
|
|
"defparam" { Token KW_defparam _ _ }
|
2019-03-05 03:32:30 +01:00
|
|
|
"do" { Token KW_do _ _ }
|
2019-03-05 00:25:14 +01:00
|
|
|
"else" { Token KW_else _ _ }
|
|
|
|
|
"end" { Token KW_end _ _ }
|
|
|
|
|
"endcase" { Token KW_endcase _ _ }
|
|
|
|
|
"endfunction" { Token KW_endfunction _ _ }
|
|
|
|
|
"endgenerate" { Token KW_endgenerate _ _ }
|
2019-03-04 08:58:00 +01:00
|
|
|
"endinterface" { Token KW_endinterface _ _ }
|
2019-03-05 00:25:14 +01:00
|
|
|
"endmodule" { Token KW_endmodule _ _ }
|
2019-03-07 19:58:20 +01:00
|
|
|
"endtask" { Token KW_endtask _ _ }
|
2019-03-05 00:25:14 +01:00
|
|
|
"enum" { Token KW_enum _ _ }
|
|
|
|
|
"for" { Token KW_for _ _ }
|
2019-03-05 03:32:30 +01:00
|
|
|
"forever" { Token KW_forever _ _ }
|
|
|
|
|
"function" { Token KW_function _ _ }
|
2019-03-05 00:25:14 +01:00
|
|
|
"generate" { Token KW_generate _ _ }
|
|
|
|
|
"genvar" { Token KW_genvar _ _ }
|
|
|
|
|
"if" { Token KW_if _ _ }
|
|
|
|
|
"initial" { Token KW_initial _ _ }
|
|
|
|
|
"inout" { Token KW_inout _ _ }
|
|
|
|
|
"input" { Token KW_input _ _ }
|
2019-03-22 21:57:13 +01:00
|
|
|
"int" { Token KW_int _ _ }
|
2019-03-05 00:25:14 +01:00
|
|
|
"integer" { Token KW_integer _ _ }
|
|
|
|
|
"interface" { Token KW_interface _ _ }
|
|
|
|
|
"localparam" { Token KW_localparam _ _ }
|
|
|
|
|
"logic" { Token KW_logic _ _ }
|
2019-03-22 21:57:13 +01:00
|
|
|
"longint" { Token KW_longint _ _ }
|
2019-03-05 00:25:14 +01:00
|
|
|
"modport" { Token KW_modport _ _ }
|
2019-03-05 03:32:30 +01:00
|
|
|
"module" { Token KW_module _ _ }
|
2019-03-22 06:31:43 +01:00
|
|
|
"nand" { Token KW_nand _ _ }
|
2019-03-05 00:25:14 +01:00
|
|
|
"negedge" { Token KW_negedge _ _ }
|
2019-03-22 06:31:43 +01:00
|
|
|
"nor" { Token KW_nor _ _ }
|
|
|
|
|
"not" { Token KW_not _ _ }
|
2019-03-05 00:25:14 +01:00
|
|
|
"or" { Token KW_or _ _ }
|
|
|
|
|
"output" { Token KW_output _ _ }
|
|
|
|
|
"packed" { Token KW_packed _ _ }
|
|
|
|
|
"parameter" { Token KW_parameter _ _ }
|
|
|
|
|
"posedge" { Token KW_posedge _ _ }
|
2019-03-22 21:57:13 +01:00
|
|
|
"real" { Token KW_real _ _ }
|
|
|
|
|
"realtime" { Token KW_realtime _ _ }
|
2019-03-05 00:25:14 +01:00
|
|
|
"reg" { Token KW_reg _ _ }
|
2019-03-05 03:32:30 +01:00
|
|
|
"repeat" { Token KW_repeat _ _ }
|
2019-03-05 00:25:14 +01:00
|
|
|
"return" { Token KW_return _ _ }
|
2019-03-22 21:57:13 +01:00
|
|
|
"shortint" { Token KW_shortint _ _ }
|
|
|
|
|
"shortreal" { Token KW_shortreal _ _ }
|
|
|
|
|
"signed" { Token KW_signed _ _ }
|
2019-03-05 00:25:14 +01:00
|
|
|
"static" { Token KW_static _ _ }
|
|
|
|
|
"struct" { Token KW_struct _ _ }
|
2019-03-22 21:57:13 +01:00
|
|
|
"supply0" { Token KW_supply0 _ _ }
|
|
|
|
|
"supply1" { Token KW_supply1 _ _ }
|
2019-03-07 19:58:20 +01:00
|
|
|
"task" { Token KW_task _ _ }
|
2019-03-22 21:57:13 +01:00
|
|
|
"time" { Token KW_time _ _ }
|
|
|
|
|
"tri" { Token KW_tri _ _ }
|
|
|
|
|
"tri0" { Token KW_tri0 _ _ }
|
|
|
|
|
"tri1" { Token KW_tri1 _ _ }
|
|
|
|
|
"triand" { Token KW_triand _ _ }
|
|
|
|
|
"trior" { Token KW_trior _ _ }
|
|
|
|
|
"trireg" { Token KW_trireg _ _ }
|
2019-03-05 00:25:14 +01:00
|
|
|
"typedef" { Token KW_typedef _ _ }
|
|
|
|
|
"unique" { Token KW_unique _ _ }
|
2019-03-22 21:57:13 +01:00
|
|
|
"unsigned" { Token KW_unsigned _ _ }
|
|
|
|
|
"uwire" { Token KW_uwire _ _ }
|
|
|
|
|
"wand" { Token KW_wand _ _ }
|
2019-03-05 03:32:30 +01:00
|
|
|
"while" { Token KW_while _ _ }
|
2019-03-05 00:25:14 +01:00
|
|
|
"wire" { Token KW_wire _ _ }
|
2019-03-22 21:57:13 +01:00
|
|
|
"wor" { Token KW_wor _ _ }
|
2019-03-22 06:31:43 +01:00
|
|
|
"xnor" { Token KW_xnor _ _ }
|
|
|
|
|
"xor" { Token KW_xor _ _ }
|
2019-03-05 00:25:14 +01:00
|
|
|
|
|
|
|
|
simpleIdentifier { Token Id_simple _ _ }
|
|
|
|
|
escapedIdentifier { Token Id_escaped _ _ }
|
|
|
|
|
systemIdentifier { Token Id_system _ _ }
|
|
|
|
|
number { Token Lit_number _ _ }
|
|
|
|
|
string { Token Lit_string _ _ }
|
2019-02-08 05:49:12 +01:00
|
|
|
|
|
|
|
|
"(" { Token Sym_paren_l _ _ }
|
|
|
|
|
")" { Token Sym_paren_r _ _ }
|
|
|
|
|
"[" { Token Sym_brack_l _ _ }
|
|
|
|
|
"]" { Token Sym_brack_r _ _ }
|
|
|
|
|
"{" { Token Sym_brace_l _ _ }
|
|
|
|
|
"}" { Token Sym_brace_r _ _ }
|
|
|
|
|
"~" { Token Sym_tildy _ _ }
|
|
|
|
|
"!" { Token Sym_bang _ _ }
|
|
|
|
|
"@" { Token Sym_at _ _ }
|
|
|
|
|
"#" { Token Sym_pound _ _ }
|
|
|
|
|
"%" { Token Sym_percent _ _ }
|
|
|
|
|
"^" { Token Sym_hat _ _ }
|
|
|
|
|
"&" { Token Sym_amp _ _ }
|
|
|
|
|
"|" { Token Sym_bar _ _ }
|
|
|
|
|
"*" { Token Sym_aster _ _ }
|
|
|
|
|
"." { Token Sym_dot _ _ }
|
|
|
|
|
"," { Token Sym_comma _ _ }
|
|
|
|
|
":" { Token Sym_colon _ _ }
|
|
|
|
|
";" { Token Sym_semi _ _ }
|
|
|
|
|
"=" { Token Sym_eq _ _ }
|
|
|
|
|
"<" { Token Sym_lt _ _ }
|
|
|
|
|
">" { Token Sym_gt _ _ }
|
|
|
|
|
"+" { Token Sym_plus _ _ }
|
|
|
|
|
"-" { Token Sym_dash _ _ }
|
|
|
|
|
"?" { Token Sym_question _ _ }
|
|
|
|
|
"/" { Token Sym_slash _ _ }
|
|
|
|
|
"$" { Token Sym_dollar _ _ }
|
|
|
|
|
"'" { Token Sym_s_quote _ _ }
|
|
|
|
|
"~&" { Token Sym_tildy_amp _ _ }
|
|
|
|
|
"~|" { Token Sym_tildy_bar _ _ }
|
|
|
|
|
"~^" { Token Sym_tildy_hat _ _ }
|
|
|
|
|
"^~" { Token Sym_hat_tildy _ _ }
|
|
|
|
|
"==" { Token Sym_eq_eq _ _ }
|
|
|
|
|
"!=" { Token Sym_bang_eq _ _ }
|
|
|
|
|
"&&" { Token Sym_amp_amp _ _ }
|
|
|
|
|
"||" { Token Sym_bar_bar _ _ }
|
|
|
|
|
"**" { Token Sym_aster_aster _ _ }
|
|
|
|
|
"<=" { Token Sym_lt_eq _ _ }
|
|
|
|
|
">=" { Token Sym_gt_eq _ _ }
|
|
|
|
|
">>" { Token Sym_gt_gt _ _ }
|
|
|
|
|
"<<" { Token Sym_lt_lt _ _ }
|
|
|
|
|
"++" { Token Sym_plus_plus _ _ }
|
|
|
|
|
"--" { Token Sym_dash_dash _ _ }
|
|
|
|
|
"+=" { Token Sym_plus_eq _ _ }
|
|
|
|
|
"-=" { Token Sym_dash_eq _ _ }
|
|
|
|
|
"*=" { Token Sym_aster_eq _ _ }
|
|
|
|
|
"/=" { Token Sym_slash_eq _ _ }
|
|
|
|
|
"%=" { Token Sym_percent_eq _ _ }
|
|
|
|
|
"&=" { Token Sym_amp_eq _ _ }
|
|
|
|
|
"|=" { Token Sym_bar_eq _ _ }
|
|
|
|
|
"^=" { Token Sym_hat_eq _ _ }
|
|
|
|
|
"+:" { Token Sym_plus_colon _ _ }
|
|
|
|
|
"-:" { Token Sym_dash_colon _ _ }
|
|
|
|
|
"::" { Token Sym_colon_colon _ _ }
|
|
|
|
|
".*" { Token Sym_dot_aster _ _ }
|
|
|
|
|
"->" { Token Sym_dash_gt _ _ }
|
|
|
|
|
":=" { Token Sym_colon_eq _ _ }
|
|
|
|
|
":/" { Token Sym_colon_slash _ _ }
|
|
|
|
|
"##" { Token Sym_pound_pound _ _ }
|
|
|
|
|
"[*" { Token Sym_brack_l_aster _ _ }
|
|
|
|
|
"[=" { Token Sym_brack_l_eq _ _ }
|
|
|
|
|
"=>" { Token Sym_eq_gt _ _ }
|
|
|
|
|
"@*" { Token Sym_at_aster _ _ }
|
|
|
|
|
"(*" { Token Sym_paren_l_aster _ _ }
|
|
|
|
|
"*)" { Token Sym_aster_paren_r _ _ }
|
|
|
|
|
"*>" { Token Sym_aster_gt _ _ }
|
|
|
|
|
"===" { Token Sym_eq_eq_eq _ _ }
|
|
|
|
|
"!==" { Token Sym_bang_eq_eq _ _ }
|
2019-03-05 00:25:14 +01:00
|
|
|
"==?" { Token Sym_eq_eq_question _ _ }
|
|
|
|
|
"!=?" { Token Sym_bang_eq_question _ _ }
|
2019-02-08 05:49:12 +01:00
|
|
|
">>>" { Token Sym_gt_gt_gt _ _ }
|
|
|
|
|
"<<<" { Token Sym_lt_lt_lt _ _ }
|
|
|
|
|
"<<=" { Token Sym_lt_lt_eq _ _ }
|
|
|
|
|
">>=" { Token Sym_gt_gt_eq _ _ }
|
|
|
|
|
"|->" { Token Sym_bar_dash_gt _ _ }
|
|
|
|
|
"|=>" { Token Sym_bar_eq_gt _ _ }
|
|
|
|
|
"[->" { Token Sym_brack_l_dash_gt _ _ }
|
|
|
|
|
"@@(" { Token Sym_at_at_paren_l _ _ }
|
|
|
|
|
"(*)" { Token Sym_paren_l_aster_paren_r _ _ }
|
|
|
|
|
"->>" { Token Sym_dash_gt_gt _ _ }
|
|
|
|
|
"&&&" { Token Sym_amp_amp_amp _ _ }
|
|
|
|
|
"<<<=" { Token Sym_lt_lt_lt_eq _ _ }
|
|
|
|
|
">>>=" { Token Sym_gt_gt_gt_eq _ _ }
|
|
|
|
|
|
2019-03-18 10:00:23 +01:00
|
|
|
directive { Token Spe_Directive _ _ }
|
|
|
|
|
|
2019-03-05 00:25:14 +01:00
|
|
|
-- operator precedences, from *lowest* to *highest*
|
2019-02-08 05:49:12 +01:00
|
|
|
%nonassoc NoElse
|
|
|
|
|
%nonassoc "else"
|
|
|
|
|
%right "?" ":"
|
|
|
|
|
%left "||"
|
|
|
|
|
%left "&&"
|
|
|
|
|
%left "|" "~|"
|
|
|
|
|
%left "^" "^~"
|
|
|
|
|
%left "&" "~&"
|
2019-03-05 00:25:14 +01:00
|
|
|
%left "==" "!=" "===" "!==" "==?" "!=?"
|
2019-02-08 05:49:12 +01:00
|
|
|
%left "<" "<=" ">" ">="
|
2019-02-18 02:52:01 +01:00
|
|
|
%left "<<" ">>" "<<<" ">>>"
|
2019-02-08 05:49:12 +01:00
|
|
|
%left "+" "-"
|
|
|
|
|
%left "*" "/" "%"
|
2019-03-05 00:25:14 +01:00
|
|
|
%left "**"
|
2019-03-23 00:24:45 +01:00
|
|
|
%right REDUCE_OP "!" "~" "++" "--"
|
2019-03-04 21:46:12 +01:00
|
|
|
%left "(" ")" "[" "]" "."
|
2019-02-08 05:49:12 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
%%
|
|
|
|
|
|
2019-02-10 00:35:15 +01:00
|
|
|
opt(p) :: { Maybe a }
|
|
|
|
|
: p { Just $1 }
|
|
|
|
|
| { Nothing }
|
|
|
|
|
|
2019-02-18 09:59:17 +01:00
|
|
|
Descriptions :: { [Description] }
|
2019-03-07 19:19:31 +01:00
|
|
|
: {- empty -} { [] }
|
|
|
|
|
| Descriptions ";" { $1 }
|
2019-02-18 09:59:17 +01:00
|
|
|
| Descriptions Description { $1 ++ [$2] }
|
2019-02-08 05:49:12 +01:00
|
|
|
|
2019-02-18 09:59:17 +01:00
|
|
|
Description :: { Description }
|
2019-03-07 19:19:31 +01:00
|
|
|
: Part { $1 }
|
|
|
|
|
| PackageItem { PackageItem $1 }
|
2019-03-18 10:00:23 +01:00
|
|
|
| Directive { Directive $1 }
|
|
|
|
|
|
|
|
|
|
Directive :: { String }
|
|
|
|
|
: directive { tokenString $1 }
|
2019-02-18 09:59:17 +01:00
|
|
|
|
|
|
|
|
Type :: { Type }
|
2019-03-22 21:57:13 +01:00
|
|
|
: PartialType Dimensions { $1 Unspecified $2 }
|
|
|
|
|
| PartialType Signing Dimensions { $1 $2 $3 }
|
|
|
|
|
| Identifier Dimensions { Alias $1 $2 }
|
|
|
|
|
PartialType :: { Signing -> [Range] -> Type }
|
|
|
|
|
: NetType { \Unspecified -> Net $1 }
|
|
|
|
|
| IntegerVectorType { IntegerVector $1 }
|
|
|
|
|
| IntegerAtomType { \sg -> \[] -> IntegerAtom $1 sg }
|
|
|
|
|
| NonIntegerType { \Unspecified -> \[] -> NonInteger $1 }
|
|
|
|
|
| "enum" opt(Type) "{" EnumItems "}" { \Unspecified -> Enum $2 $4 }
|
|
|
|
|
| "struct" Packing "{" StructItems "}" { \Unspecified -> Struct $2 $4 }
|
|
|
|
|
|
|
|
|
|
CastingType :: { Type }
|
|
|
|
|
: IntegerVectorType { IntegerVector $1 Unspecified [] }
|
|
|
|
|
| IntegerAtomType { IntegerAtom $1 Unspecified }
|
|
|
|
|
| NonIntegerType { NonInteger $1 }
|
|
|
|
|
| Signing { Implicit $1 [] }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Signing :: { Signing }
|
|
|
|
|
: "signed" { Signed }
|
|
|
|
|
| "unsigned" { Unsigned }
|
|
|
|
|
|
|
|
|
|
NetType :: { NetType }
|
|
|
|
|
: "supply0" { TSupply0 }
|
|
|
|
|
| "supply1" { TSupply1 }
|
|
|
|
|
| "tri" { TTri }
|
|
|
|
|
| "triand" { TTriand }
|
|
|
|
|
| "trior" { TTrior }
|
|
|
|
|
| "trireg" { TTrireg }
|
|
|
|
|
| "tri0" { TTri0 }
|
|
|
|
|
| "tri1" { TTri1 }
|
|
|
|
|
| "uwire" { TUwire }
|
|
|
|
|
| "wire" { TWire }
|
|
|
|
|
| "wand" { TWand }
|
|
|
|
|
| "wor" { TWor }
|
|
|
|
|
IntegerVectorType :: { IntegerVectorType }
|
|
|
|
|
: "bit" { TBit }
|
|
|
|
|
| "logic" { TLogic }
|
|
|
|
|
| "reg" { TReg }
|
|
|
|
|
IntegerAtomType :: { IntegerAtomType }
|
|
|
|
|
: "byte" { TByte }
|
|
|
|
|
| "shortint" { TShortint }
|
|
|
|
|
| "int" { TInt }
|
|
|
|
|
| "longint" { TLongint }
|
|
|
|
|
| "integer" { TInteger }
|
|
|
|
|
| "time" { TTime }
|
|
|
|
|
NonIntegerType :: { NonIntegerType }
|
|
|
|
|
: "shortreal" { TShortreal }
|
|
|
|
|
| "real" { TReal }
|
|
|
|
|
| "realtime" { TRealtime }
|
2019-02-18 09:59:17 +01:00
|
|
|
|
2019-03-02 02:26:44 +01:00
|
|
|
EnumItems :: { [(Identifier, Maybe Expr)] }
|
|
|
|
|
: VariablePortIdentifiers { $1 }
|
|
|
|
|
|
|
|
|
|
StructItems :: { [(Type, Identifier)] }
|
|
|
|
|
: StructItem { [$1] }
|
|
|
|
|
| StructItems StructItem { $1 ++ [$2] }
|
|
|
|
|
StructItem :: { (Type, Identifier) }
|
|
|
|
|
: Type Identifier ";" { ($1, $2) }
|
|
|
|
|
|
2019-03-22 21:57:13 +01:00
|
|
|
Packing :: { Packing }
|
|
|
|
|
: "packed" Signing { Packed $2 }
|
|
|
|
|
| "packed" { Packed Unspecified }
|
|
|
|
|
| {- empty -} { Unpacked }
|
2019-03-02 02:26:44 +01:00
|
|
|
|
2019-03-04 08:58:00 +01:00
|
|
|
Part :: { Description }
|
|
|
|
|
: "module" Identifier Params PortDecls ";" ModuleItems "endmodule" opt(Tag) { Part Module $2 (fst $4) ($3 ++ (snd $4) ++ $6) }
|
|
|
|
|
| "interface" Identifier Params PortDecls ";" ModuleItems "endinterface" opt(Tag) { Part Interface $2 (fst $4) ($3 ++ (snd $4) ++ $6) }
|
|
|
|
|
|
|
|
|
|
Tag :: { Identifier }
|
|
|
|
|
: ":" Identifier { $2 }
|
2019-02-11 20:07:46 +01:00
|
|
|
|
|
|
|
|
Params :: { [ModuleItem] }
|
|
|
|
|
: {- empty -} { [] }
|
|
|
|
|
| "#" "(" ParamDecls { $3 }
|
|
|
|
|
ParamDecls :: { [ModuleItem] }
|
|
|
|
|
: ParamDecl(")") { $1 }
|
|
|
|
|
| ParamDecl(",") ParamDecls { $1 ++ $2 }
|
|
|
|
|
ParamDecl(delim) :: { [ModuleItem] }
|
2019-02-24 09:06:40 +01:00
|
|
|
: "parameter" ParamType DeclAsgns delim { map (MIDecl . (uncurry $ Parameter $2)) $3 }
|
2019-02-08 05:49:12 +01:00
|
|
|
|
2019-03-04 08:58:00 +01:00
|
|
|
PortDecls :: { ([Identifier], [ModuleItem]) }
|
|
|
|
|
: "(" DeclTokens(")") { parseDTsAsPortDecls $2 }
|
2019-03-04 21:16:53 +01:00
|
|
|
| "(" ")" { ([], []) }
|
2019-03-04 08:58:00 +01:00
|
|
|
| {- empty -} { ([], []) }
|
|
|
|
|
|
|
|
|
|
ModportItems :: { [(Identifier, [ModportDecl])] }
|
|
|
|
|
: ModportItem { [$1] }
|
|
|
|
|
| ModportItems "," ModportItem { $1 ++ [$3] }
|
|
|
|
|
ModportItem :: { (Identifier, [ModportDecl]) }
|
|
|
|
|
: Identifier "(" ModportPortsDeclarations { ($1, $3) }
|
|
|
|
|
ModportPortsDeclarations :: { [ModportDecl] }
|
|
|
|
|
: ModportPortsDeclaration(")") { $1 }
|
|
|
|
|
| ModportPortsDeclaration(",") ModportPortsDeclarations { $1 ++ $2 }
|
|
|
|
|
ModportPortsDeclaration(delim) :: { [ModportDecl] }
|
|
|
|
|
: ModportSimplePortsDeclaration(delim) { $1 }
|
|
|
|
|
ModportSimplePortsDeclaration(delim) :: { [ModportDecl] }
|
|
|
|
|
: Direction ModportSimplePorts delim { map (\(a, b) -> ($1, a, b)) $2 }
|
|
|
|
|
ModportSimplePorts :: { [(Identifier, Maybe Expr)] }
|
|
|
|
|
: ModportSimplePort { [$1] }
|
|
|
|
|
| ModportSimplePorts "," ModportSimplePort { $1 ++ [$3] }
|
|
|
|
|
ModportSimplePort :: { (Identifier, Maybe Expr) }
|
|
|
|
|
: "." Identifier "(" opt(Expr) ")" { ($2, $4) }
|
|
|
|
|
| Identifier { ($1, Just $ Ident $1) }
|
|
|
|
|
|
2019-02-08 05:49:12 +01:00
|
|
|
Identifier :: { Identifier }
|
2019-02-10 00:35:15 +01:00
|
|
|
: simpleIdentifier { tokenString $1 }
|
|
|
|
|
| escapedIdentifier { tokenString $1 }
|
|
|
|
|
| systemIdentifier { tokenString $1 }
|
2019-02-08 05:49:12 +01:00
|
|
|
|
2019-02-10 00:35:15 +01:00
|
|
|
Identifiers :: { [Identifier] }
|
|
|
|
|
: Identifier { [$1] }
|
|
|
|
|
| Identifiers "," Identifier { $1 ++ [$3] }
|
|
|
|
|
|
2019-03-04 08:58:00 +01:00
|
|
|
-- uses delimiter propagation hack to avoid conflicts
|
|
|
|
|
DeclTokens(delim) :: { [DeclToken] }
|
2019-03-07 21:56:03 +01:00
|
|
|
: DeclToken delim { [$1] }
|
|
|
|
|
| DeclToken DeclTokens(delim) { [$1] ++ $2 }
|
|
|
|
|
| AsgnOp Expr "," DeclTokens(delim) { [DTAsgn $1 $2, DTComma] ++ $4 }
|
|
|
|
|
| AsgnOp Expr delim { [DTAsgn $1 $2] }
|
2019-03-04 08:58:00 +01:00
|
|
|
DeclToken :: { DeclToken }
|
2019-03-05 02:58:09 +01:00
|
|
|
: DeclOrStmtToken { $1 }
|
|
|
|
|
| ParameterBindings { DTParams $1 }
|
|
|
|
|
| ModuleInstantiation { DTInstance $1 }
|
|
|
|
|
|
|
|
|
|
DeclOrStmtTokens(delim) :: { [DeclToken] }
|
|
|
|
|
: DeclOrStmtToken delim { [$1] }
|
|
|
|
|
| DeclOrStmtToken DeclOrStmtTokens(delim) { [$1] ++ $2 }
|
2019-03-22 07:47:25 +01:00
|
|
|
| AsgnOp Expr "," DeclOrStmtTokens(delim) { [DTAsgn $1 $2, DTComma] ++ $4 }
|
|
|
|
|
| AsgnOp Expr delim { [DTAsgn $1 $2] }
|
|
|
|
|
| "<=" opt(DelayOrEventControl) Expr "," DeclOrStmtTokens(delim) { [DTAsgnNBlk $2 $3, DTComma] ++ $5 }
|
|
|
|
|
| "<=" opt(DelayOrEventControl) Expr delim { [DTAsgnNBlk $2 $3] }
|
2019-03-05 02:58:09 +01:00
|
|
|
DeclOrStmtToken :: { DeclToken }
|
2019-03-22 21:57:13 +01:00
|
|
|
: "," { DTComma }
|
|
|
|
|
| Range { DTRange $1 }
|
|
|
|
|
| Identifier { DTIdent $1 }
|
|
|
|
|
| Direction { DTDir $1 }
|
|
|
|
|
| "[" Expr "]" { DTBit $2 }
|
|
|
|
|
| "{" LHSs "}" { DTConcat $2 }
|
|
|
|
|
| PartialType { DTType $1 }
|
|
|
|
|
| "." Identifier { DTDot $2 }
|
|
|
|
|
| Signing { DTSigning $1 }
|
2019-03-02 02:26:44 +01:00
|
|
|
|
2019-02-10 00:35:15 +01:00
|
|
|
VariablePortIdentifiers :: { [(Identifier, Maybe Expr)] }
|
|
|
|
|
: VariablePortIdentifier { [$1] }
|
|
|
|
|
| VariablePortIdentifiers "," VariablePortIdentifier { $1 ++ [$3] }
|
|
|
|
|
VariablePortIdentifier :: { (Identifier, Maybe Expr) }
|
|
|
|
|
: Identifier { ($1, Nothing) }
|
|
|
|
|
| Identifier "=" Expr { ($1, Just $3) }
|
2019-02-08 05:49:12 +01:00
|
|
|
|
2019-03-02 02:26:44 +01:00
|
|
|
Direction :: { Direction }
|
|
|
|
|
: "inout" { Inout }
|
|
|
|
|
| "input" { Input }
|
|
|
|
|
| "output" { Output }
|
|
|
|
|
|
2019-02-08 05:49:12 +01:00
|
|
|
ModuleItems :: { [ModuleItem] }
|
2019-02-11 21:16:25 +01:00
|
|
|
: {- empty -} { [] }
|
|
|
|
|
| ModuleItems ModuleItem { $1 ++ $2 }
|
2019-02-09 23:35:31 +01:00
|
|
|
|
|
|
|
|
ModuleItem :: { [ModuleItem] }
|
2019-03-04 08:58:00 +01:00
|
|
|
-- This item covers module instantiations and all declarations
|
|
|
|
|
: DeclTokens(";") { parseDTsAsModuleItems $1 }
|
|
|
|
|
| "parameter" ParamType DeclAsgns ";" { map MIDecl $ map (uncurry $ Parameter $2) $3 }
|
|
|
|
|
| "localparam" ParamType DeclAsgns ";" { map MIDecl $ map (uncurry $ Localparam $2) $3 }
|
2019-03-18 17:37:46 +01:00
|
|
|
| "defparam" DefparamAsgns ";" { map (uncurry Defparam) $2 }
|
2019-03-26 00:31:06 +01:00
|
|
|
| "assign" opt(DelayControl) LHS "=" Expr ";" { [Assign $2 $3 $5] }
|
2019-03-04 20:25:38 +01:00
|
|
|
| AlwaysKW Stmt { [AlwaysC $1 $2] }
|
2019-03-05 02:58:09 +01:00
|
|
|
| "initial" Stmt { [Initial $2] }
|
2019-03-04 20:25:38 +01:00
|
|
|
| "genvar" Identifiers ";" { map Genvar $2 }
|
|
|
|
|
| "generate" GenItems "endgenerate" { [Generate $2] }
|
|
|
|
|
| "modport" ModportItems ";" { map (uncurry Modport) $2 }
|
2019-03-07 19:19:31 +01:00
|
|
|
| PackageItem { [MIPackageItem $1] }
|
2019-03-22 06:31:43 +01:00
|
|
|
| NInputGateKW NInputGates ";" { map (\(a, b, c) -> NInputGate $1 a b c) $2 }
|
|
|
|
|
| NOutputGateKW NOutputGates ";" { map (\(a, b, c) -> NOutputGate $1 a b c) $2 }
|
2019-03-26 06:54:16 +01:00
|
|
|
| AttributeInstance ModuleItem { map (MIAttr $1) $2 }
|
|
|
|
|
|
|
|
|
|
AttributeInstance :: { Attr }
|
|
|
|
|
: "(*" AttrSpecs "*)" { Attr $2 }
|
|
|
|
|
AttrSpecs :: { [AttrSpec] }
|
|
|
|
|
: AttrSpec { [$1] }
|
|
|
|
|
| AttrSpecs "," AttrSpec { $1 ++ [$3] }
|
|
|
|
|
AttrSpec :: { AttrSpec }
|
|
|
|
|
: Identifier "=" Expr { ($1, Just $3) }
|
|
|
|
|
| Identifier { ($1, Nothing) }
|
2019-03-22 06:31:43 +01:00
|
|
|
|
|
|
|
|
NInputGates :: { [(Maybe Identifier, LHS, [Expr])] }
|
|
|
|
|
: NInputGate { [$1] }
|
|
|
|
|
| NInputGates "," NInputGate { $1 ++ [$3]}
|
|
|
|
|
NOutputGates :: { [(Maybe Identifier, [LHS], Expr)] }
|
|
|
|
|
: NOutputGate { [$1] }
|
|
|
|
|
| NOutputGates "," NOutputGate { $1 ++ [$3]}
|
|
|
|
|
|
|
|
|
|
NInputGate :: { (Maybe Identifier, LHS, [Expr]) }
|
|
|
|
|
: opt(Identifier) "(" LHS "," Exprs ")" { ($1, $3, $5) }
|
|
|
|
|
NOutputGate :: { (Maybe Identifier, [LHS], Expr) }
|
|
|
|
|
: opt(Identifier) "(" NOutputGateItems { ($1, fst $3, snd $3) }
|
|
|
|
|
NOutputGateItems :: { ([LHS], Expr) }
|
|
|
|
|
: Expr ")" { ([], $1) }
|
|
|
|
|
| Expr "," NOutputGateItems { (fst $3 ++ [exprToLHS $1], snd $3) }
|
|
|
|
|
|
|
|
|
|
NInputGateKW :: { NInputGateKW }
|
|
|
|
|
: "and" { GateAnd }
|
|
|
|
|
| "nand" { GateNand }
|
|
|
|
|
| "or" { GateOr }
|
|
|
|
|
| "nor" { GateNor }
|
|
|
|
|
| "xor" { GateXor }
|
|
|
|
|
| "xnor" { GateXnor }
|
|
|
|
|
NOutputGateKW :: { NOutputGateKW }
|
|
|
|
|
: "buf" { GateBuf }
|
|
|
|
|
| "not" { GateNot }
|
2019-03-07 19:19:31 +01:00
|
|
|
|
2019-03-18 17:37:46 +01:00
|
|
|
DefparamAsgns :: { [(LHS, Expr)] }
|
|
|
|
|
: DefparamAsgn { [$1] }
|
|
|
|
|
| DefparamAsgns "," DefparamAsgn { $1 ++ [$3] }
|
|
|
|
|
DefparamAsgn :: { (LHS, Expr) }
|
|
|
|
|
: LHS "=" Expr { ($1, $3) }
|
|
|
|
|
|
2019-03-07 19:19:31 +01:00
|
|
|
PackageItem :: { PackageItem }
|
|
|
|
|
: "typedef" Type Identifier ";" { Typedef $2 $3 }
|
2019-03-07 19:58:20 +01:00
|
|
|
| "function" opt(Lifetime) FuncRetAndName TFItems DeclsAndStmts "endfunction" opt(Tag) { Function $2 (fst $3) (snd $3) (map defaultFuncInput $ (map makeInput $4) ++ fst $5) (snd $5) }
|
|
|
|
|
| "task" opt(Lifetime) Identifier TFItems DeclsAndStmts "endtask" opt(Tag) { Task $2 $3 (map defaultFuncInput $ $4 ++ fst $5) (snd $5) }
|
2019-03-04 20:25:38 +01:00
|
|
|
|
|
|
|
|
FuncRetAndName :: { (Type, Identifier) }
|
2019-03-22 21:57:13 +01:00
|
|
|
: Type Identifier { ($1 , $2) }
|
|
|
|
|
| Identifier { (Implicit Unspecified [], $1) }
|
|
|
|
|
| Signing Identifier { (Implicit $1 [], $2) }
|
|
|
|
|
| DimensionsNonEmpty Identifier { (Implicit Unspecified $1, $2) }
|
|
|
|
|
| Signing DimensionsNonEmpty Identifier { (Implicit $1 $2, $3) }
|
2019-02-15 05:29:42 +01:00
|
|
|
|
2019-02-18 06:26:43 +01:00
|
|
|
AlwaysKW :: { AlwaysKW }
|
|
|
|
|
: "always" { Always }
|
|
|
|
|
| "always_comb" { AlwaysComb }
|
|
|
|
|
| "always_ff" { AlwaysFF }
|
|
|
|
|
| "always_latch" { AlwaysLatch }
|
|
|
|
|
|
2019-03-04 20:25:38 +01:00
|
|
|
Lifetime :: { Lifetime }
|
|
|
|
|
: "static" { Static }
|
|
|
|
|
| "automatic" { Automatic }
|
|
|
|
|
|
2019-03-25 23:53:55 +01:00
|
|
|
ModuleInstantiation :: { [PortBinding] }
|
|
|
|
|
: "(" Bindings ")" { $2 }
|
2019-02-18 00:50:56 +01:00
|
|
|
|
2019-03-07 19:58:20 +01:00
|
|
|
TFItems :: { [Decl] }
|
|
|
|
|
: "(" DeclTokens(")") ";" { parseDTsAsDecls $2 }
|
2019-03-04 20:25:38 +01:00
|
|
|
| ";" { [] }
|
2019-02-24 09:06:40 +01:00
|
|
|
|
|
|
|
|
ParamType :: { Type }
|
2019-03-22 21:57:13 +01:00
|
|
|
: "integer" Signing { IntegerAtom TInteger $2 }
|
|
|
|
|
| "integer" { IntegerAtom TInteger Unspecified }
|
|
|
|
|
| Dimensions { Implicit Unspecified $1 }
|
|
|
|
|
| Signing Dimensions { Implicit $1 $2 }
|
2019-02-11 21:16:25 +01:00
|
|
|
|
2019-02-11 19:47:56 +01:00
|
|
|
Dimensions :: { [Range] }
|
2019-02-20 22:03:04 +01:00
|
|
|
: {- empty -} { [] }
|
|
|
|
|
| DimensionsNonEmpty { $1 }
|
|
|
|
|
DimensionsNonEmpty :: { [Range] }
|
2019-03-07 07:38:42 +01:00
|
|
|
: Dimension { [$1] }
|
|
|
|
|
| DimensionsNonEmpty Dimension { $1 ++ [$2] }
|
|
|
|
|
Dimension :: { Range }
|
|
|
|
|
: Range { $1 }
|
|
|
|
|
| "[" Expr "]" { (simplify $ BinOp Sub $2 (Number "1"), Number "0") }
|
2019-02-11 19:47:56 +01:00
|
|
|
|
2019-02-11 08:12:52 +01:00
|
|
|
DeclAsgns :: { [(Identifier, Expr)] }
|
|
|
|
|
: DeclAsgn { [$1] }
|
2019-02-11 20:07:46 +01:00
|
|
|
| DeclAsgns "," DeclAsgn { $1 ++ [$3] }
|
2019-02-11 08:12:52 +01:00
|
|
|
DeclAsgn :: { (Identifier, Expr) }
|
|
|
|
|
: Identifier "=" Expr { ($1, $3) }
|
|
|
|
|
|
2019-02-08 05:49:12 +01:00
|
|
|
Range :: { Range }
|
2019-02-11 21:16:25 +01:00
|
|
|
: "[" Expr ":" Expr "]" { ($2, $4) }
|
2019-02-08 05:49:12 +01:00
|
|
|
|
|
|
|
|
LHS :: { LHS }
|
2019-03-04 21:16:53 +01:00
|
|
|
: Identifier { LHSIdent $1 }
|
|
|
|
|
| LHS Range { LHSRange $1 $2 }
|
|
|
|
|
| LHS "[" Expr "]" { LHSBit $1 $3 }
|
|
|
|
|
| LHS "." Identifier { LHSDot $1 $3 }
|
|
|
|
|
| "{" LHSs "}" { LHSConcat $2 }
|
2019-02-08 05:49:12 +01:00
|
|
|
|
|
|
|
|
LHSs :: { [LHS] }
|
2019-03-04 21:16:53 +01:00
|
|
|
: LHS { [$1] }
|
|
|
|
|
| LHSs "," LHS { $1 ++ [$3] }
|
2019-02-08 05:49:12 +01:00
|
|
|
|
|
|
|
|
Bindings :: { [(Identifier, Maybe Expr)] }
|
2019-02-18 00:50:56 +01:00
|
|
|
: {- empty -} { [] }
|
|
|
|
|
| BindingsNonEmpty { $1 }
|
|
|
|
|
BindingsNonEmpty :: { [(Identifier, Maybe Expr)] }
|
|
|
|
|
: Binding { [$1] }
|
|
|
|
|
| Binding "," BindingsNonEmpty { $1 : $3}
|
2019-02-08 05:49:12 +01:00
|
|
|
Binding :: { (Identifier, Maybe Expr) }
|
2019-02-24 09:06:40 +01:00
|
|
|
: "." Identifier "(" opt(Expr) ")" { ($2, $4) }
|
2019-02-18 00:50:56 +01:00
|
|
|
| "." Identifier { ($2, Just $ Ident $2) }
|
|
|
|
|
| Expr { ("", Just $1) }
|
2019-03-08 00:08:10 +01:00
|
|
|
| ".*" { ("*", Nothing) }
|
2019-02-08 05:49:12 +01:00
|
|
|
|
|
|
|
|
ParameterBindings :: { [(Identifier, Maybe Expr)] }
|
2019-02-18 09:59:17 +01:00
|
|
|
: "#" "(" BindingsNonEmpty ")" { $3 }
|
2019-02-08 05:49:12 +01:00
|
|
|
|
|
|
|
|
Stmts :: { [Stmt] }
|
2019-02-11 21:16:25 +01:00
|
|
|
: {- empty -} { [] }
|
|
|
|
|
| Stmts Stmt { $1 ++ [$2] }
|
2019-02-08 05:49:12 +01:00
|
|
|
|
|
|
|
|
Stmt :: { Stmt }
|
2019-03-07 21:56:03 +01:00
|
|
|
: StmtNonAsgn { $1 }
|
|
|
|
|
| LHS AsgnOp Expr ";" { AsgnBlk $2 $1 $3 }
|
|
|
|
|
| Identifier ";" { Subroutine $1 [] }
|
2019-03-22 07:47:25 +01:00
|
|
|
| LHS "<=" opt(DelayOrEventControl) Expr ";" { Asgn $3 $1 $4 }
|
2019-03-04 20:25:38 +01:00
|
|
|
StmtNonAsgn :: { Stmt }
|
2019-02-11 20:46:09 +01:00
|
|
|
: ";" { Null }
|
2019-03-18 19:41:09 +01:00
|
|
|
| "begin" opt(Tag) DeclsAndStmts "end" opt(Tag) { Block (combineTags $2 $5) (fst $3) (snd $3) }
|
2019-03-04 20:25:38 +01:00
|
|
|
| "if" "(" Expr ")" Stmt "else" Stmt { If $3 $5 $7 }
|
|
|
|
|
| "if" "(" Expr ")" Stmt %prec NoElse { If $3 $5 Null }
|
2019-02-11 20:46:09 +01:00
|
|
|
| "for" "(" Identifier "=" Expr ";" Expr ";" Identifier "=" Expr ")" Stmt { For ($3, $5) $7 ($9, $11) $13 }
|
2019-03-05 00:25:14 +01:00
|
|
|
| Unique CaseKW "(" Expr ")" Cases opt(CaseDefault) "endcase" { Case $1 $2 $4 $6 $7 }
|
2019-03-05 02:58:09 +01:00
|
|
|
| TimingControl Stmt { Timing $1 $2 }
|
2019-03-04 20:25:38 +01:00
|
|
|
| "return" Expr ";" { Return $2 }
|
2019-03-05 02:58:09 +01:00
|
|
|
| Identifier "(" CallArgs ")" ";" { Subroutine $1 $3 }
|
2019-03-05 03:32:30 +01:00
|
|
|
| "while" "(" Expr ")" Stmt { While $3 $5 }
|
|
|
|
|
| "repeat" "(" Expr ")" Stmt { RepeatL $3 $5 }
|
|
|
|
|
| "do" Stmt "while" "(" Expr ")" ";" { DoWhile $5 $2 }
|
|
|
|
|
| "forever" Stmt { Forever $2 }
|
2019-03-26 00:01:32 +01:00
|
|
|
| "->" Identifier ";" { Trigger $2 }
|
2019-03-26 06:54:16 +01:00
|
|
|
| AttributeInstance Stmt { StmtAttr $1 $2 }
|
2019-03-04 20:25:38 +01:00
|
|
|
|
|
|
|
|
DeclsAndStmts :: { ([Decl], [Stmt]) }
|
|
|
|
|
: DeclOrStmt DeclsAndStmts { combineDeclsAndStmts $1 $2 }
|
|
|
|
|
| StmtNonAsgn Stmts { ([], $1 : $2) }
|
|
|
|
|
| {- empty -} { ([], []) }
|
|
|
|
|
DeclOrStmt :: { ([Decl], [Stmt]) }
|
2019-03-05 02:58:09 +01:00
|
|
|
: DeclOrStmtTokens(";") { parseDTsAsDeclOrAsgn $1 }
|
2019-03-04 20:25:38 +01:00
|
|
|
| "parameter" ParamType DeclAsgns ";" { (map (uncurry $ Parameter $2) $3, []) }
|
|
|
|
|
| "localparam" ParamType DeclAsgns ";" { (map (uncurry $ Localparam $2) $3, []) }
|
2019-02-08 05:49:12 +01:00
|
|
|
|
2019-03-05 02:58:09 +01:00
|
|
|
TimingControl :: { Timing }
|
2019-03-22 07:47:25 +01:00
|
|
|
: DelayOrEventControl { $1 }
|
2019-03-26 00:31:06 +01:00
|
|
|
| CycleDelay { Cycle $1 }
|
2019-03-22 07:47:25 +01:00
|
|
|
DelayOrEventControl :: { Timing }
|
2019-03-26 00:31:06 +01:00
|
|
|
: DelayControl { Delay $1 }
|
|
|
|
|
| EventControl { Event $1 }
|
|
|
|
|
DelayControl :: { Expr }
|
|
|
|
|
: "#" DelayValue { $2 }
|
|
|
|
|
| "#" "(" Expr ")" { $3 }
|
|
|
|
|
CycleDelay :: { Expr }
|
|
|
|
|
: "##" Expr { $2 }
|
|
|
|
|
EventControl :: { Sense }
|
|
|
|
|
: "@" "(" Senses ")" { $3 }
|
|
|
|
|
| "@" "(*)" { SenseStar }
|
|
|
|
|
| "@*" { SenseStar }
|
2019-03-05 02:58:09 +01:00
|
|
|
Senses :: { Sense }
|
|
|
|
|
: Sense { $1 }
|
|
|
|
|
| Senses "or" Sense { SenseOr $1 $3 }
|
2019-03-08 23:29:44 +01:00
|
|
|
| Senses "," Sense { SenseOr $1 $3 }
|
2019-03-05 02:58:09 +01:00
|
|
|
Sense :: { Sense }
|
|
|
|
|
: LHS { Sense $1 }
|
|
|
|
|
| "posedge" LHS { SensePosedge $2 }
|
|
|
|
|
| "negedge" LHS { SenseNegedge $2 }
|
|
|
|
|
|
2019-03-22 07:47:25 +01:00
|
|
|
DelayValue :: { Expr }
|
|
|
|
|
: Number { Number $1 }
|
|
|
|
|
-- TODO: Support these other DelayValues?
|
|
|
|
|
-- | real_number
|
|
|
|
|
-- | ps_identifier
|
|
|
|
|
-- | time_literal
|
|
|
|
|
-- | 1step
|
|
|
|
|
|
2019-03-05 00:25:14 +01:00
|
|
|
Unique :: { Bool }
|
|
|
|
|
: "unique" { True }
|
|
|
|
|
| {- empty -} { False }
|
|
|
|
|
|
2019-02-23 21:10:25 +01:00
|
|
|
CaseKW :: { CaseKW }
|
2019-03-05 00:25:14 +01:00
|
|
|
: "case" { CaseN }
|
|
|
|
|
| "casex" { CaseX }
|
|
|
|
|
| "casez" { CaseZ }
|
2019-02-23 21:10:25 +01:00
|
|
|
|
2019-02-08 05:49:12 +01:00
|
|
|
Cases :: { [Case] }
|
2019-02-18 00:33:20 +01:00
|
|
|
: {- empty -} { [] }
|
|
|
|
|
| Cases Case { $1 ++ [$2] }
|
2019-02-08 05:49:12 +01:00
|
|
|
|
|
|
|
|
Case :: { Case }
|
2019-02-18 00:33:20 +01:00
|
|
|
: Exprs ":" Stmt { ($1, $3) }
|
2019-02-08 05:49:12 +01:00
|
|
|
|
2019-02-18 00:33:20 +01:00
|
|
|
CaseDefault :: { Stmt }
|
|
|
|
|
: "default" opt(":") Stmt { $3 }
|
2019-02-08 05:49:12 +01:00
|
|
|
|
2019-02-17 20:54:12 +01:00
|
|
|
Number :: { String }
|
|
|
|
|
: number { tokenString $1 }
|
2019-02-08 05:49:12 +01:00
|
|
|
|
|
|
|
|
String :: { String }
|
2019-02-24 09:06:40 +01:00
|
|
|
: string { tail $ init $ tokenString $1 }
|
2019-02-08 05:49:12 +01:00
|
|
|
|
2019-03-08 22:55:03 +01:00
|
|
|
CallArgs :: { [Maybe Expr] }
|
|
|
|
|
: {- empty -} { [] }
|
|
|
|
|
| Expr { [Just $1] }
|
|
|
|
|
| CallArgsFollow { (Nothing) : $1 }
|
|
|
|
|
| Expr CallArgsFollow { (Just $1) : $2 }
|
|
|
|
|
CallArgsFollow :: { [Maybe Expr] }
|
|
|
|
|
: "," opt(Expr) { [$2] }
|
|
|
|
|
| "," opt(Expr) CallArgsFollow { $2 : $3 }
|
2019-02-08 05:49:12 +01:00
|
|
|
|
|
|
|
|
Exprs :: { [Expr] }
|
2019-03-23 00:24:45 +01:00
|
|
|
: Expr { [$1] }
|
|
|
|
|
| Exprs "," Expr { $1 ++ [$3] }
|
2019-02-08 05:49:12 +01:00
|
|
|
|
|
|
|
|
Expr :: { Expr }
|
2019-03-23 00:24:45 +01:00
|
|
|
: "(" Expr ")" { $2 }
|
|
|
|
|
| String { String $1 }
|
|
|
|
|
| Number { Number $1 }
|
|
|
|
|
| Identifier "(" CallArgs ")" { Call $1 $3 }
|
|
|
|
|
| Identifier { Ident $1 }
|
|
|
|
|
| Expr Range { Range $1 $2 }
|
|
|
|
|
| Expr "[" Expr "]" { Bit $1 $3 }
|
|
|
|
|
| "{" Expr "{" Exprs "}" "}" { Repeat $2 $4 }
|
|
|
|
|
| "{" Exprs "}" { Concat $2 }
|
|
|
|
|
| Expr "?" Expr ":" Expr { Mux $1 $3 $5 }
|
|
|
|
|
| CastingType "'" "(" Expr ")" { Cast ($1 ) $4 }
|
|
|
|
|
| Identifier "'" "(" Expr ")" { Cast (Alias $1 []) $4 }
|
|
|
|
|
| Expr "." Identifier { Dot $1 $3 }
|
|
|
|
|
| "'" "{" PatternItems "}" { Pattern $3 }
|
|
|
|
|
-- binary expressions
|
|
|
|
|
| Expr "||" Expr { BinOp LogOr $1 $3 }
|
|
|
|
|
| Expr "&&" Expr { BinOp LogAnd $1 $3 }
|
|
|
|
|
| Expr "|" Expr { BinOp BitOr $1 $3 }
|
|
|
|
|
| Expr "^" Expr { BinOp BitXor $1 $3 }
|
|
|
|
|
| Expr "&" Expr { BinOp BitAnd $1 $3 }
|
|
|
|
|
| Expr "+" Expr { BinOp Add $1 $3 }
|
|
|
|
|
| Expr "-" Expr { BinOp Sub $1 $3 }
|
|
|
|
|
| Expr "*" Expr { BinOp Mul $1 $3 }
|
|
|
|
|
| Expr "/" Expr { BinOp Div $1 $3 }
|
|
|
|
|
| Expr "%" Expr { BinOp Mod $1 $3 }
|
|
|
|
|
| Expr "**" Expr { BinOp Pow $1 $3 }
|
|
|
|
|
| Expr "==" Expr { BinOp Eq $1 $3 }
|
|
|
|
|
| Expr "!=" Expr { BinOp Ne $1 $3 }
|
|
|
|
|
| Expr "<" Expr { BinOp Lt $1 $3 }
|
|
|
|
|
| Expr "<=" Expr { BinOp Le $1 $3 }
|
|
|
|
|
| Expr ">" Expr { BinOp Gt $1 $3 }
|
|
|
|
|
| Expr ">=" Expr { BinOp Ge $1 $3 }
|
|
|
|
|
| Expr "===" Expr { BinOp TEq $1 $3 }
|
|
|
|
|
| Expr "!==" Expr { BinOp TNe $1 $3 }
|
|
|
|
|
| Expr "==?" Expr { BinOp WEq $1 $3 }
|
|
|
|
|
| Expr "!=?" Expr { BinOp WNe $1 $3 }
|
|
|
|
|
| Expr "<<" Expr { BinOp ShiftL $1 $3 }
|
|
|
|
|
| Expr ">>" Expr { BinOp ShiftR $1 $3 }
|
|
|
|
|
| Expr "<<<" Expr { BinOp ShiftAL $1 $3 }
|
|
|
|
|
| Expr ">>>" Expr { BinOp ShiftAR $1 $3 }
|
|
|
|
|
-- unary expressions
|
|
|
|
|
| "!" Expr { UniOp LogNot $2 }
|
|
|
|
|
| "~" Expr { UniOp BitNot $2 }
|
|
|
|
|
| "+" Expr %prec REDUCE_OP { UniOp UniAdd $2 }
|
|
|
|
|
| "-" Expr %prec REDUCE_OP { UniOp UniSub $2 }
|
|
|
|
|
| "&" Expr %prec REDUCE_OP { UniOp RedAnd $2 }
|
|
|
|
|
| "~&" Expr %prec REDUCE_OP { UniOp RedNand $2 }
|
|
|
|
|
| "|" Expr %prec REDUCE_OP { UniOp RedOr $2 }
|
|
|
|
|
| "~|" Expr %prec REDUCE_OP { UniOp RedNor $2 }
|
|
|
|
|
| "^" Expr %prec REDUCE_OP { UniOp RedXor $2 }
|
|
|
|
|
| "~^" Expr %prec REDUCE_OP { UniOp RedXnor $2 }
|
|
|
|
|
| "^~" Expr %prec REDUCE_OP { UniOp RedXnor $2 }
|
2019-03-02 02:26:44 +01:00
|
|
|
|
|
|
|
|
PatternItems :: { [(Maybe Identifier, Expr)] }
|
|
|
|
|
: PatternNamedItems { map (\(x,e) -> (Just x, e)) $1 }
|
|
|
|
|
| PatternUnnamedItems { zip (repeat Nothing) $1 }
|
|
|
|
|
PatternNamedItems :: { [(Identifier, Expr)] }
|
|
|
|
|
: PatternNamedItem { [$1] }
|
|
|
|
|
| PatternNamedItems "," PatternNamedItem { $1 ++ [$3] }
|
|
|
|
|
PatternNamedItem :: { (Identifier, Expr) }
|
|
|
|
|
: Identifier ":" Expr { ($1, $3) }
|
|
|
|
|
PatternUnnamedItems :: { [Expr] }
|
|
|
|
|
: Exprs { $1 }
|
2019-02-08 05:49:12 +01:00
|
|
|
|
2019-02-18 00:33:20 +01:00
|
|
|
GenItemOrNull :: { GenItem }
|
|
|
|
|
: GenItem { $1 }
|
|
|
|
|
| ";" { GenNull }
|
|
|
|
|
|
|
|
|
|
GenItems :: { [GenItem] }
|
|
|
|
|
: {- empty -} { [] }
|
|
|
|
|
| GenItems GenItem { $1 ++ [$2] }
|
|
|
|
|
|
|
|
|
|
GenItem :: { GenItem }
|
|
|
|
|
: "if" "(" Expr ")" GenItemOrNull "else" GenItemOrNull { GenIf $3 $5 $7 }
|
|
|
|
|
| "if" "(" Expr ")" GenItemOrNull %prec NoElse { GenIf $3 $5 GenNull }
|
2019-03-08 22:03:29 +01:00
|
|
|
| GenBlock { uncurry GenBlock $1 }
|
2019-02-18 00:33:20 +01:00
|
|
|
| "case" "(" Expr ")" GenCases opt(GenCaseDefault) "endcase" { GenCase $3 $5 $6 }
|
2019-03-08 22:03:29 +01:00
|
|
|
| "for" "(" Identifier "=" Expr ";" Expr ";" GenvarIteration ")" GenBlock { (uncurry $ GenFor ($3, $5) $7 $9) $11 }
|
2019-02-18 00:33:20 +01:00
|
|
|
-- TODO: We should restrict it to the module items that are actually allowed.
|
|
|
|
|
| ModuleItem { genItemsToGenItem $ map GenModuleItem $1 }
|
|
|
|
|
|
2019-03-08 22:03:29 +01:00
|
|
|
GenBlock :: { (Maybe Identifier, [GenItem]) }
|
2019-03-18 19:41:09 +01:00
|
|
|
: "begin" opt(Tag) GenItems "end" opt(Tag) { (combineTags $2 $5, $3) }
|
2019-03-08 22:03:29 +01:00
|
|
|
|
2019-02-18 00:33:20 +01:00
|
|
|
GenCases :: { [GenCase] }
|
|
|
|
|
: {- empty -} { [] }
|
|
|
|
|
| GenCases GenCase { $1 ++ [$2] }
|
|
|
|
|
|
|
|
|
|
GenCase :: { GenCase }
|
|
|
|
|
: Exprs ":" GenItemOrNull { ($1, $3) }
|
|
|
|
|
|
|
|
|
|
GenCaseDefault :: { GenItem }
|
|
|
|
|
: "default" opt(":") GenItemOrNull { $3 }
|
|
|
|
|
|
2019-03-05 00:25:14 +01:00
|
|
|
GenvarIteration :: { (Identifier, AsgnOp, Expr) }
|
2019-03-07 21:56:03 +01:00
|
|
|
: Identifier AsgnOp Expr { ($1, $2, $3) }
|
2019-03-05 00:25:14 +01:00
|
|
|
| IncOrDecOperator Identifier { ($2, AsgnOp $1, Number "1") }
|
|
|
|
|
| Identifier IncOrDecOperator { ($1, AsgnOp $2, Number "1") }
|
|
|
|
|
|
2019-03-07 21:56:03 +01:00
|
|
|
AsgnOp :: { AsgnOp }
|
2019-03-05 00:25:14 +01:00
|
|
|
: "=" { AsgnOpEq }
|
|
|
|
|
| "+=" { AsgnOp Add }
|
|
|
|
|
| "-=" { AsgnOp Sub }
|
|
|
|
|
| "*=" { AsgnOp Mul }
|
|
|
|
|
| "/=" { AsgnOp Div }
|
|
|
|
|
| "%=" { AsgnOp Mod }
|
2019-03-23 00:24:45 +01:00
|
|
|
| "&=" { AsgnOp BitAnd }
|
|
|
|
|
| "|=" { AsgnOp BitOr }
|
|
|
|
|
| "^=" { AsgnOp BitXor }
|
2019-03-05 00:25:14 +01:00
|
|
|
| "<<=" { AsgnOp ShiftL }
|
|
|
|
|
| ">>=" { AsgnOp ShiftR }
|
|
|
|
|
| "<<<=" { AsgnOp ShiftAL }
|
|
|
|
|
| ">>>=" { AsgnOp ShiftAR }
|
|
|
|
|
|
|
|
|
|
IncOrDecOperator :: { BinOp }
|
|
|
|
|
: "++" { Add }
|
|
|
|
|
| "--" { Sub }
|
2019-02-08 05:49:12 +01:00
|
|
|
|
|
|
|
|
{
|
2019-03-04 08:58:00 +01:00
|
|
|
|
2019-02-08 05:49:12 +01:00
|
|
|
parseError :: [Token] -> a
|
|
|
|
|
parseError a = case a of
|
|
|
|
|
[] -> error "Parse error: no tokens left to parse."
|
|
|
|
|
Token t s p : _ -> error $ "Parse error: unexpected token '" ++ s ++ "' (" ++ show t ++ ") at " ++ show p ++ "."
|
|
|
|
|
|
2019-02-18 00:33:20 +01:00
|
|
|
genItemsToGenItem :: [GenItem] -> GenItem
|
|
|
|
|
genItemsToGenItem [] = error "genItemsToGenItem given empty list!"
|
|
|
|
|
genItemsToGenItem [x] = x
|
|
|
|
|
genItemsToGenItem xs = GenBlock Nothing xs
|
|
|
|
|
|
2019-03-04 20:25:38 +01:00
|
|
|
combineDeclsAndStmts :: ([Decl], [Stmt]) -> ([Decl], [Stmt]) -> ([Decl], [Stmt])
|
|
|
|
|
combineDeclsAndStmts (a1, b1) (a2, b2) = (a1 ++ a2, b1 ++ b2)
|
|
|
|
|
|
|
|
|
|
makeInput :: Decl -> Decl
|
|
|
|
|
makeInput (Variable _ t x a me) = Variable Input t x a me
|
|
|
|
|
makeInput other = error $ "unexpected non-var decl: " ++ (show other)
|
|
|
|
|
|
2019-03-06 21:07:22 +01:00
|
|
|
defaultFuncInput :: Decl -> Decl
|
2019-03-22 21:57:13 +01:00
|
|
|
defaultFuncInput (Variable Input (Implicit sg rs) x a me) =
|
|
|
|
|
Variable Input (IntegerVector TLogic sg rs) x a me
|
2019-03-06 21:07:22 +01:00
|
|
|
defaultFuncInput other = other
|
|
|
|
|
|
2019-03-18 19:41:09 +01:00
|
|
|
combineTags :: Maybe Identifier -> Maybe Identifier -> Maybe Identifier
|
|
|
|
|
combineTags (Just a) (Just b) =
|
|
|
|
|
if a == b
|
|
|
|
|
then Just a
|
|
|
|
|
else error $ "tag mismatch: " ++ show (a, b)
|
|
|
|
|
combineTags Nothing other = other
|
|
|
|
|
combineTags other _ = other
|
|
|
|
|
|
2019-03-22 06:31:43 +01:00
|
|
|
exprToLHS :: Expr -> LHS
|
2019-03-23 00:24:45 +01:00
|
|
|
exprToLHS (Ident x) = LHSIdent x
|
|
|
|
|
exprToLHS (Bit e b) = LHSBit (exprToLHS e) b
|
|
|
|
|
exprToLHS (Range e r) = LHSRange (exprToLHS e) r
|
|
|
|
|
exprToLHS (Dot e x) = LHSDot (exprToLHS e) x
|
|
|
|
|
exprToLHS (Concat es) = LHSConcat (map exprToLHS es)
|
2019-03-22 06:31:43 +01:00
|
|
|
exprToLHS other =
|
|
|
|
|
error $ "Parse error: cannot convert expression to LHS: " ++ show other
|
|
|
|
|
|
2019-02-08 05:49:12 +01:00
|
|
|
}
|