break;
if (type == AST_GENBLOCK)
break;
+ if (type == AST_BLOCK && !str.empty())
+ break;
if (type == AST_PREFIX && i >= 1)
break;
while (did_something_here && i < children.size()) {
did_something = true;
}
+ // transform block with name
+ if (type == AST_BLOCK && !str.empty())
+ {
+ std::map<std::string, std::string> name_map;
+ expand_genblock(std::string(), str + ".", name_map);
+
+ std::vector<AstNode*> new_children;
+ for (size_t i = 0; i < children.size(); i++)
+ if (children[i]->type == AST_WIRE) {
+ children[i]->simplify(false, false, false, stage, -1, false);
+ current_ast_mod->children.push_back(children[i]);
+ } else
+ new_children.push_back(children[i]);
+
+ children.swap(new_children);
+ did_something = true;
+ str.clear();
+ }
+
// simplify unconditional generate block
if (type == AST_GENBLOCK && children.size() != 0)
{
};
task_func_body:
- task_func_body wire_decl |
task_func_body behavioral_stmt |
/* empty */;
// this production creates the obligatory if-else shift/reduce conflict
behavioral_stmt:
- defattr |
+ defattr | wire_decl |
simple_behavioral_stmt ';' |
hierarchical_id attr {
AstNode *node = new AstNode(AST_TCALL);
ast_stack.back()->children.push_back(node);
ast_stack.push_back(node);
append_attr(node, $1);
+ if ($3 != NULL)
+ node->str = *$3;
} behavioral_stmt_list TOK_END opt_label {
+ if ($3 != NULL && $7 != NULL && *$3 != *$7)
+ frontend_verilog_yyerror("Syntax error.");
if ($3 != NULL)
delete $3;
if ($7 != NULL)