Clearer for loop error messages
authorZachary Snow <zach@zachjs.com>
Sat, 25 Jul 2020 16:35:03 +0000 (10:35 -0600)
committerZachary Snow <zach@zachjs.com>
Sat, 25 Jul 2020 16:37:16 +0000 (10:37 -0600)
frontends/ast/simplify.cc

index 00f8c8df67cd336814993436369df50110aea2de..de24a0055397463a81662fc1b4b97aabd6817454 100644 (file)
@@ -1687,25 +1687,27 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
                                body_ast->children.size() == 1 && body_ast->children.at(0)->type == AST_GENBLOCK)
                        body_ast = body_ast->children.at(0);
 
+               const char* loop_type_str = "procedural";
+               const char* var_type_str = "register";
+               AstNodeType var_type = AST_WIRE;
+               if (type == AST_GENFOR) {
+                       loop_type_str = "generate";
+                       var_type_str = "genvar";
+                       var_type = AST_GENVAR;
+               }
+
                if (init_ast->type != AST_ASSIGN_EQ)
-                       log_file_error(filename, location.first_line, "Unsupported 1st expression of generate for-loop!\n");
+                       log_file_error(filename, location.first_line, "Unsupported 1st expression of %s for-loop!\n", loop_type_str);
                if (next_ast->type != AST_ASSIGN_EQ)
-                       log_file_error(filename, location.first_line, "Unsupported 3rd expression of generate for-loop!\n");
+                       log_file_error(filename, location.first_line, "Unsupported 3rd expression of %s for-loop!\n", loop_type_str);
 
-               if (type == AST_GENFOR) {
-                       if (init_ast->children[0]->id2ast == NULL || init_ast->children[0]->id2ast->type != AST_GENVAR)
-                               log_file_error(filename, location.first_line, "Left hand side of 1st expression of generate for-loop is not a gen var!\n");
-                       if (next_ast->children[0]->id2ast == NULL || next_ast->children[0]->id2ast->type != AST_GENVAR)
-                               log_file_error(filename, location.first_line, "Left hand side of 3rd expression of generate for-loop is not a gen var!\n");
-               } else {
-                       if (init_ast->children[0]->id2ast == NULL || init_ast->children[0]->id2ast->type != AST_WIRE)
-                               log_file_error(filename, location.first_line, "Left hand side of 1st expression of generate for-loop is not a register!\n");
-                       if (next_ast->children[0]->id2ast == NULL || next_ast->children[0]->id2ast->type != AST_WIRE)
-                               log_file_error(filename, location.first_line, "Left hand side of 3rd expression of generate for-loop is not a register!\n");
-               }
+               if (init_ast->children[0]->id2ast == NULL || init_ast->children[0]->id2ast->type != var_type)
+                       log_file_error(filename, location.first_line, "Left hand side of 1st expression of %s for-loop is not a %s!\n", loop_type_str, var_type_str);
+               if (next_ast->children[0]->id2ast == NULL || next_ast->children[0]->id2ast->type != var_type)
+                       log_file_error(filename, location.first_line, "Left hand side of 3rd expression of %s for-loop is not a %s!\n", loop_type_str, var_type_str);
 
                if (init_ast->children[0]->id2ast != next_ast->children[0]->id2ast)
-                       log_file_error(filename, location.first_line, "Incompatible left-hand sides in 1st and 3rd expression of generate for-loop!\n");
+                       log_file_error(filename, location.first_line, "Incompatible left-hand sides in 1st and 3rd expression of %s for-loop!\n", loop_type_str);
 
                // eval 1st expression
                AstNode *varbuf = init_ast->children[1]->clone();
@@ -1717,7 +1719,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
                }
 
                if (varbuf->type != AST_CONSTANT)
-                       log_file_error(filename, location.first_line, "Right hand side of 1st expression of generate for-loop is not constant!\n");
+                       log_file_error(filename, location.first_line, "Right hand side of 1st expression of %s for-loop is not constant!\n", loop_type_str);
 
                auto resolved = current_scope.at(init_ast->children[0]->str);
                if (resolved->range_valid) {
@@ -1758,7 +1760,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
                        }
 
                        if (buf->type != AST_CONSTANT)
-                               log_file_error(filename, location.first_line, "2nd expression of generate for-loop is not constant!\n");
+                               log_file_error(filename, location.first_line, "2nd expression of %s for-loop is not constant!\n", loop_type_str);
 
                        if (buf->integer == 0) {
                                delete buf;
@@ -1804,7 +1806,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
                        }
 
                        if (buf->type != AST_CONSTANT)
-                               log_file_error(filename, location.first_line, "Right hand side of 3rd expression of generate for-loop is not constant (%s)!\n", type2str(buf->type).c_str());
+                               log_file_error(filename, location.first_line, "Right hand side of 3rd expression of %s for-loop is not constant (%s)!\n", loop_type_str, type2str(buf->type).c_str());
 
                        delete varbuf->children[0];
                        varbuf->children[0] = buf;