summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2014-06-06 17:40:04 +0200
committerClifford Wolf <clifford@clifford.at>2014-06-06 17:40:04 +0200
commitb5cd7a01793294a53d91a2cd3ee9bbca5b9a8c54 (patch)
tree54118df8df6d0e9919c22cafb5a1cda924158633
parentf9c1cd5edba5acb4d9b9dd287c7265111cf22087 (diff)
added while and repeat support to verilog parser
-rw-r--r--frontends/ast/ast.cc1
-rw-r--r--frontends/ast/ast.h1
-rw-r--r--frontends/verilog/lexer.l2
-rw-r--r--frontends/verilog/parser.y28
4 files changed, 31 insertions, 1 deletions
diff --git a/frontends/ast/ast.cc b/frontends/ast/ast.cc
index f2f2d0e6..105645f9 100644
--- a/frontends/ast/ast.cc
+++ b/frontends/ast/ast.cc
@@ -137,6 +137,7 @@ std::string AST::type2str(AstNodeType type)
X(AST_DEFAULT)
X(AST_FOR)
X(AST_WHILE)
+ X(AST_REPEAT)
X(AST_GENVAR)
X(AST_GENFOR)
X(AST_GENIF)
diff --git a/frontends/ast/ast.h b/frontends/ast/ast.h
index 72a2a460..8f9c3534 100644
--- a/frontends/ast/ast.h
+++ b/frontends/ast/ast.h
@@ -117,6 +117,7 @@ namespace AST
AST_DEFAULT,
AST_FOR,
AST_WHILE,
+ AST_REPEAT,
AST_GENVAR,
AST_GENFOR,
diff --git a/frontends/verilog/lexer.l b/frontends/verilog/lexer.l
index 226a2670..5300d1b2 100644
--- a/frontends/verilog/lexer.l
+++ b/frontends/verilog/lexer.l
@@ -140,6 +140,8 @@ namespace VERILOG_FRONTEND {
"default" { return TOK_DEFAULT; }
"generate" { return TOK_GENERATE; }
"endgenerate" { return TOK_ENDGENERATE; }
+"while" { return TOK_WHILE; }
+"repeat" { return TOK_REPEAT; }
"assert"([ \t\r\n]+"property")? { return TOK_ASSERT; }
diff --git a/frontends/verilog/parser.y b/frontends/verilog/parser.y
index ed9be692..a12dcf14 100644
--- a/frontends/verilog/parser.y
+++ b/frontends/verilog/parser.y
@@ -98,7 +98,7 @@ static void free_attr(std::map<std::string, AstNode*> *al)
%token TOK_MODULE TOK_ENDMODULE TOK_PARAMETER TOK_LOCALPARAM TOK_DEFPARAM
%token TOK_INPUT TOK_OUTPUT TOK_INOUT TOK_WIRE TOK_REG
%token TOK_INTEGER TOK_SIGNED TOK_ASSIGN TOK_ALWAYS TOK_INITIAL
-%token TOK_BEGIN TOK_END TOK_IF TOK_ELSE TOK_FOR
+%token TOK_BEGIN TOK_END TOK_IF TOK_ELSE TOK_FOR TOK_WHILE TOK_REPEAT
%token TOK_POSEDGE TOK_NEGEDGE TOK_OR
%token TOK_CASE TOK_CASEX TOK_CASEZ TOK_ENDCASE TOK_DEFAULT
%token TOK_FUNCTION TOK_ENDFUNCTION TOK_TASK TOK_ENDTASK
@@ -819,6 +819,32 @@ behavioral_stmt:
ast_stack.pop_back();
ast_stack.pop_back();
} |
+ attr TOK_WHILE '(' expr ')' {
+ AstNode *node = new AstNode(AST_WHILE);
+ ast_stack.back()->children.push_back(node);
+ ast_stack.push_back(node);
+ append_attr(node, $1);
+ AstNode *block = new AstNode(AST_BLOCK);
+ ast_stack.back()->children.push_back($4);
+ ast_stack.back()->children.push_back(block);
+ ast_stack.push_back(block);
+ } behavioral_stmt {
+ ast_stack.pop_back();
+ ast_stack.pop_back();
+ } |
+ attr TOK_REPEAT '(' expr ')' {
+ AstNode *node = new AstNode(AST_REPEAT);
+ ast_stack.back()->children.push_back(node);
+ ast_stack.push_back(node);
+ append_attr(node, $1);
+ AstNode *block = new AstNode(AST_BLOCK);
+ ast_stack.back()->children.push_back($4);
+ ast_stack.back()->children.push_back(block);
+ ast_stack.push_back(block);
+ } behavioral_stmt {
+ ast_stack.pop_back();
+ ast_stack.pop_back();
+ } |
attr TOK_IF '(' expr ')' {
AstNode *node = new AstNode(AST_CASE);
AstNode *block = new AstNode(AST_BLOCK);