diff options
author | Clifford Wolf <clifford@clifford.at> | 2016-07-25 12:48:03 +0200 |
---|---|---|
committer | Clifford Wolf <clifford@clifford.at> | 2016-07-25 12:48:03 +0200 |
commit | 7a67add95d3d2f3293f84e38b891024d6444d2a4 (patch) | |
tree | f5d4107d03135858f5ca76d1fcd4efd8501c1184 /frontends/verilog | |
parent | b1c432af5613b0e5817ccc35bb081737dfcb6867 (diff) | |
download | yosys-7a67add95d3d2f3293f84e38b891024d6444d2a4.tar.gz yosys-7a67add95d3d2f3293f84e38b891024d6444d2a4.tar.bz2 yosys-7a67add95d3d2f3293f84e38b891024d6444d2a4.zip |
Fixed parsing of empty positional cell ports
Diffstat (limited to 'frontends/verilog')
-rw-r--r-- | frontends/verilog/verilog_parser.y | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/frontends/verilog/verilog_parser.y b/frontends/verilog/verilog_parser.y index f39c60116..d1da630d5 100644 --- a/frontends/verilog/verilog_parser.y +++ b/frontends/verilog/verilog_parser.y @@ -872,10 +872,39 @@ cell_parameter: }; cell_port_list: - cell_port | cell_port_list ',' cell_port; + cell_port_list_rules { + // remove empty args from end of list + while (!astbuf2->children.empty()) { + AstNode *node = astbuf2->children.back(); + if (node->type != AST_ARGUMENT) break; + if (!node->children.empty()) break; + if (!node->str.empty()) break; + astbuf2->children.pop_back(); + } + + // check port types + bool has_positional_args = false; + bool has_named_args = false; + for (auto node : astbuf2->children) { + if (node->type != AST_ARGUMENT) continue; + if (node->str.empty()) + has_positional_args = true; + else + has_named_args = true; + } + + if (has_positional_args && has_named_args) + frontend_verilog_yyerror("Mix of positional and named cell ports."); + }; + +cell_port_list_rules: + cell_port | cell_port_list_rules ',' cell_port; cell_port: - /* empty */ | + /* empty */ { + AstNode *node = new AstNode(AST_ARGUMENT); + astbuf2->children.push_back(node); + } | expr { AstNode *node = new AstNode(AST_ARGUMENT); astbuf2->children.push_back(node); |