Fix mem2reg handling of memories with upto data ports, fixes #888
authorClifford Wolf <clifford@clifford.at>
Thu, 21 Mar 2019 21:19:17 +0000 (22:19 +0100)
committerClifford Wolf <clifford@clifford.at>
Thu, 21 Mar 2019 21:21:17 +0000 (22:21 +0100)
Signed-off-by: Clifford Wolf <clifford@clifford.at>
frontends/ast/simplify.cc

index d525c6b8a8fc864d781290ebcb7343bc2a0d106f..63b71b80010cd8a13907724c2355c4ed6ccc5607 100644 (file)
@@ -138,9 +138,15 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
                                int mem_width, mem_size, addr_bits;
                                node->meminfo(mem_width, mem_size, addr_bits);
 
+                               int data_range_left = node->children[0]->range_left;
+                               int data_range_right = node->children[0]->range_right;
+
+                               if (node->children[0]->range_swapped)
+                                       std::swap(data_range_left, data_range_right);
+
                                for (int i = 0; i < mem_size; i++) {
                                        AstNode *reg = new AstNode(AST_WIRE, new AstNode(AST_RANGE,
-                                                       mkconst_int(mem_width-1, true), mkconst_int(0, true)));
+                                                       mkconst_int(data_range_left, true), mkconst_int(data_range_right, true)));
                                        reg->str = stringf("%s[%d]", node->str.c_str(), i);
                                        reg->is_reg = true;
                                        reg->is_signed = node->is_signed;
@@ -976,6 +982,9 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
                int data_range_left = id2ast->children[0]->range_left;
                int data_range_right = id2ast->children[0]->range_right;
 
+               if (id2ast->children[0]->range_swapped)
+                       std::swap(data_range_left, data_range_right);
+
                std::stringstream sstr;
                sstr << "$mem2bits$" << str << "$" << filename << ":" << linenum << "$" << (autoidx++);
                std::string wire_id = sstr.str();