Fixed memory->start_offset handling
authorClifford Wolf <clifford@clifford.at>
Thu, 1 Jan 2015 11:56:01 +0000 (12:56 +0100)
committerClifford Wolf <clifford@clifford.at>
Thu, 1 Jan 2015 11:56:01 +0000 (12:56 +0100)
backends/ilang/ilang_backend.cc
frontends/ast/genrtlil.cc
frontends/ilang/ilang_parser.y

index dd5b6f3cec0d6aaa385600a87dd15e9bccc368b4..60fb099018b1cae744748d2e3a3531f6c559c6a5 100644 (file)
@@ -150,6 +150,8 @@ void ILANG_BACKEND::dump_memory(std::ostream &f, std::string indent, const RTLIL
                f << stringf("width %d ", memory->width);
        if (memory->size != 0)
                f << stringf("size %d ", memory->size);
+       if (memory->start_offset != 0)
+               f << stringf("offset %d ", memory->start_offset);
        f << stringf("%s\n", memory->name.c_str());
 }
 
index a86d08d564e3b2d810b4cbdf89b4b0bfaec14a97..17d62d4dd38184fa0ad3b076c3571ab202e0b179 100644 (file)
@@ -839,14 +839,15 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint, bool sign_hint)
                        memory->attributes["\\src"] = stringf("%s:%d", filename.c_str(), linenum);
                        memory->name = str;
                        memory->width = children[0]->range_left - children[0]->range_right + 1;
-                       memory->start_offset = children[0]->range_right;
-                       memory->size = children[1]->range_left - children[1]->range_right;
+                       if (children[1]->range_right < children[1]->range_left) {
+                               memory->start_offset = children[1]->range_right;
+                               memory->size = children[1]->range_left - children[1]->range_right + 1;
+                       } else {
+                               memory->start_offset = children[1]->range_left;
+                               memory->size = children[1]->range_right - children[1]->range_left + 1;
+                       }
                        current_module->memories[memory->name] = memory;
 
-                       if (memory->size < 0)
-                               memory->size *= -1;
-                       memory->size += std::min(children[1]->range_left, children[1]->range_right) + 1;
-
                        for (auto &attr : attributes) {
                                if (attr.second->type != AST_CONSTANT)
                                        log_error("Attribute `%s' with non-constant value at %s:%d!\n",
index 4e0981b51ba2f57a0d77af5380668f9a92a4cccc..4661d57722cc0dddf2ac715c0d0300013152d606 100644 (file)
@@ -183,6 +183,9 @@ memory_options:
        memory_options TOK_SIZE TOK_INT {
                current_memory->size = $3;
        } |
+       memory_options TOK_OFFSET TOK_INT {
+               current_memory->start_offset = $3;
+       } |
        /* empty */;
 
 cell_stmt: