aboutsummaryrefslogtreecommitdiffstats
path: root/frontends
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2016-07-25 12:48:03 +0200
committerClifford Wolf <clifford@clifford.at>2016-07-25 12:48:03 +0200
commit7a67add95d3d2f3293f84e38b891024d6444d2a4 (patch)
treef5d4107d03135858f5ca76d1fcd4efd8501c1184 /frontends
parentb1c432af5613b0e5817ccc35bb081737dfcb6867 (diff)
downloadyosys-7a67add95d3d2f3293f84e38b891024d6444d2a4.tar.gz
yosys-7a67add95d3d2f3293f84e38b891024d6444d2a4.tar.bz2
yosys-7a67add95d3d2f3293f84e38b891024d6444d2a4.zip
Fixed parsing of empty positional cell ports
Diffstat (limited to 'frontends')
-rw-r--r--frontends/verilog/verilog_parser.y33
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);