diff options
author | Clifford Wolf <clifford@clifford.at> | 2014-06-06 17:40:04 +0200 |
---|---|---|
committer | Clifford Wolf <clifford@clifford.at> | 2014-06-06 17:40:04 +0200 |
commit | b5cd7a01793294a53d91a2cd3ee9bbca5b9a8c54 (patch) | |
tree | 54118df8df6d0e9919c22cafb5a1cda924158633 /frontends/verilog | |
parent | f9c1cd5edba5acb4d9b9dd287c7265111cf22087 (diff) | |
download | yosys-b5cd7a01793294a53d91a2cd3ee9bbca5b9a8c54.tar.gz yosys-b5cd7a01793294a53d91a2cd3ee9bbca5b9a8c54.tar.bz2 yosys-b5cd7a01793294a53d91a2cd3ee9bbca5b9a8c54.zip |
added while and repeat support to verilog parser
Diffstat (limited to 'frontends/verilog')
-rw-r--r-- | frontends/verilog/lexer.l | 2 | ||||
-rw-r--r-- | frontends/verilog/parser.y | 28 |
2 files changed, 29 insertions, 1 deletions
diff --git a/frontends/verilog/lexer.l b/frontends/verilog/lexer.l index 226a26709..5300d1b26 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 ed9be692b..a12dcf142 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); |