Convert AST_DOT with AST_RANGE to AST_PREFIX Signed-off-by: Ryszard Różak <rrozak@antmicro.com>
diff --git a/uhdm-plugin/UhdmAst.cc b/uhdm-plugin/UhdmAst.cc index 4e3cd7d..ce84d45 100644 --- a/uhdm-plugin/UhdmAst.cc +++ b/uhdm-plugin/UhdmAst.cc
@@ -841,30 +841,43 @@ static void simplify(AST::AstNode *current_node, AST::AstNode *parent_node) { + if (current_node->type == static_cast<int>(AST::AST_DOT)) + current_node->type = AST::AST_IDENTIFIER; + + auto dot_it = + std::find_if(current_node->children.begin(), current_node->children.end(), [](auto c) { return c->type == static_cast<int>(AST::AST_DOT); }); + AST::AstNode *dot = (dot_it != current_node->children.end()) ? *dot_it : nullptr; + AST::AstNode *expanded = nullptr; - AST::AstNode *dot = nullptr; - for (auto c : current_node->children) { - if (c->type == static_cast<int>(AST::AST_DOT) && expanded == nullptr) { - dot = c; - break; - } - } if (dot) { if (!AST_INTERNAL::current_scope.count(current_node->str)) { // for accessing elements currently unsupported with AST_DOT // fallback to "." notation + AST::AstNode *prefix_node = nullptr; + AST::AstNode *parent_node = current_node; while (dot && !dot->str.empty()) { - current_node->str += "." + dot->str.substr(1); - if (!dot->children.empty()) { - dot = dot->children[0]; + // it is not possible for AST_RANGE to be after AST::DOT (see process_hier_path function) + if (parent_node->children[0]->type == AST::AST_RANGE) { + if (parent_node->children[1]->type == AST::AST_RANGE) + log_error("Multirange in AST_DOT is currently unsupported\n"); + + simplify(dot, nullptr); + AST::AstNode *range_const = parent_node->children[0]->children[0]; + prefix_node = new AST::AstNode(AST::AST_PREFIX, range_const->clone(), dot->clone()); + break; } else { - dot = nullptr; + current_node->str += "." + dot->str.substr(1); + dot_it = + std::find_if(dot->children.begin(), dot->children.end(), [](auto c) { return c->type == static_cast<int>(AST::AST_DOT); }); + parent_node = dot; + dot = (dot_it != dot->children.end()) ? *dot_it : nullptr; } } - for (auto cc : current_node->children) { - delete cc; + current_node->delete_children(); + if (prefix_node != nullptr) { + current_node->type = AST::AST_PREFIX; + current_node->children = prefix_node->children; } - current_node->children.clear(); } else { auto wire_node = AST_INTERNAL::current_scope[current_node->str]; // make sure wire_node is already simplified