fix bug introduced by not taking all of PeterCrozier's changes in 16ea4ea6
authorJeff Wang <jjj11x@gmail.com>
Fri, 17 Jan 2020 06:21:09 +0000 (01:21 -0500)
committerJeff Wang <jeff.wang@utexas.edu>
Fri, 17 Jan 2020 07:07:42 +0000 (02:07 -0500)
The if(str == node->str) is in fact necessary (otherwise causes generate
for in Multiplier_2D in tests/simple/multiplier.v to fail with error
message "Right hand side of 3rd expression of generate for-loop is not
constant!"). Note: in PeterCrozier's implementation, the break only
breaks out of the switch-case, not the outer for loop.

frontends/ast/simplify.cc

index c96f5d549e474d377b4e57a9ac98cbd65f8a3e6a..0c9e32d2486a89550e3aaedf91a227c3002cf909 100644 (file)
@@ -324,7 +324,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
                const_fold = true;
 
        // in certain cases a function must be evaluated constant. this is what in_param controls.
-       if (type == AST_PARAMETER || type == AST_LOCALPARAM || type == AST_LOCALPARAM || type == AST_ENUM_ITEM || type == AST_DEFPARAM || type == AST_PARASET || type == AST_PREFIX)
+       if (type == AST_PARAMETER || type == AST_LOCALPARAM || type == AST_ENUM_ITEM || type == AST_DEFPARAM || type == AST_PARASET || type == AST_PREFIX)
                in_param = true;
 
        std::map<std::string, AstNode*> backup_scope;
@@ -1089,8 +1089,10 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
                                case AST_TASK:
                                case AST_DPI_FUNCTION:
                                        //log("found child %s, %s\n", type2str(node->type).c_str(), node->str.c_str());
-                                       log("add %s, type %s to scope\n", str.c_str(), type2str(node->type).c_str());
-                                       current_scope[node->str] = node;
+                                       if (str == node->str) {
+                                               log("add %s, type %s to scope\n", str.c_str(), type2str(node->type).c_str());
+                                               current_scope[node->str] = node;
+                                       }
                                        break;
                                case AST_ENUM:
                                        for (auto enum_node : node->children) {
@@ -1327,7 +1329,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
                        }
 
                        if (buf->type != AST_CONSTANT)
-                               log_file_error(filename, linenum, "Right hand side of 3rd expression of generate for-loop is not constant!\n");
+                               log_file_error(filename, linenum, "Right hand side of 3rd expression of generate for-loop is not constant (%s)!\n", type2str(buf->type).c_str());
 
                        delete varbuf->children[0];
                        varbuf->children[0] = buf;