Module name scope support
authorZachary Snow <zach@zachjs.com>
Fri, 21 Aug 2020 00:15:08 +0000 (20:15 -0400)
committerZachary Snow <zach@zachjs.com>
Fri, 21 Aug 2020 00:15:08 +0000 (20:15 -0400)
frontends/ast/simplify.cc
tests/simple/generate.v

index 7f9795d297ff371f3baa9e80f97f459453d9c2f3..19dd5af106a33f4539cc9101281264c487632663 100644 (file)
@@ -1597,6 +1597,13 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
        if (type == AST_IDENTIFIER) {
                if (current_scope.count(str) == 0) {
                        AstNode *current_scope_ast = (current_ast_mod == nullptr) ? current_ast : current_ast_mod;
+                       const std::string& mod_scope = current_scope_ast->str;
+                       if (str[0] == '\\' && str.substr(0, mod_scope.size()) == mod_scope) {
+                               std::string new_str = "\\" + str.substr(mod_scope.size() + 1);
+                               if (current_scope.count(new_str)) {
+                                       str = new_str;
+                               }
+                       }
                        for (auto node : current_scope_ast->children) {
                                //log("looking at mod scope child %s\n", type2str(node->type).c_str());
                                switch (node->type) {
index dcd450e472ad42004dc4fb45909ced5e9eb11134..12327b36eb8426e2ef0d1f18cd26f370eb7efacc 100644 (file)
@@ -223,6 +223,10 @@ module gen_test8;
                                `ASSERT(A.x == 2)
                                `ASSERT(A.C.x == 1)
                                `ASSERT(A.B.x == 0)
+                               `ASSERT(gen_test8.x == 3)
+                               `ASSERT(gen_test8.A.x == 2)
+                               `ASSERT(gen_test8.A.C.x == 1)
+                               `ASSERT(gen_test8.A.B.x == 0)
                        end
                        begin : C
                                wire [1:0] x = 2'b01;
@@ -230,12 +234,20 @@ module gen_test8;
                                `ASSERT(A.x == 2)
                                `ASSERT(A.C.x == 1)
                                `ASSERT(A.B.x == 0)
+                               `ASSERT(gen_test8.x == 3)
+                               `ASSERT(gen_test8.A.x == 2)
+                               `ASSERT(gen_test8.A.C.x == 1)
+                               `ASSERT(gen_test8.A.B.x == 0)
                        end
                        assign x = B.x ^ 2'b11 ^ C.x;
                        `ASSERT(x == 2)
                        `ASSERT(A.x == 2)
                        `ASSERT(A.C.x == 1)
                        `ASSERT(A.B.x == 0)
+                       `ASSERT(gen_test8.x == 3)
+                       `ASSERT(gen_test8.A.x == 2)
+                       `ASSERT(gen_test8.A.C.x == 1)
+                       `ASSERT(gen_test8.A.B.x == 0)
                end
        endgenerate
 
@@ -243,4 +255,8 @@ module gen_test8;
        `ASSERT(A.x == 2)
        `ASSERT(A.C.x == 1)
        `ASSERT(A.B.x == 0)
+       `ASSERT(gen_test8.x == 3)
+       `ASSERT(gen_test8.A.x == 2)
+       `ASSERT(gen_test8.A.C.x == 1)
+       `ASSERT(gen_test8.A.B.x == 0)
 endmodule