diff options
-rw-r--r-- | src/mem/physical.cc | 29 | ||||
-rw-r--r-- | src/mem/physical.hh | 4 |
2 files changed, 28 insertions, 5 deletions
diff --git a/src/mem/physical.cc b/src/mem/physical.cc index 140e2b1c0..df106d8cc 100644 --- a/src/mem/physical.cc +++ b/src/mem/physical.cc @@ -203,13 +203,34 @@ PhysicalMemory::getConfAddrRanges() const // this could be done once in the constructor, but since it is unlikely to // be called more than once the iteration should not be a problem AddrRangeList ranges; - for (vector<AbstractMemory*>::const_iterator m = memories.begin(); - m != memories.end(); ++m) { - if ((*m)->isConfReported()) { - ranges.push_back((*m)->getAddrRange()); + vector<AddrRange> intlv_ranges; + for (AddrRangeMap<AbstractMemory*>::const_iterator r = addrMap.begin(); + r != addrMap.end(); ++r) { + if (r->second->isConfReported()) { + // if the range is interleaved then save it for now + if (r->first.interleaved()) { + // if we already got interleaved ranges that are not + // part of the same range, then first do a merge + // before we add the new one + if (!intlv_ranges.empty() && + !intlv_ranges.back().mergesWith(r->first)) { + ranges.push_back(AddrRange(intlv_ranges)); + intlv_ranges.clear(); + } + intlv_ranges.push_back(r->first); + } else { + // keep the current range + ranges.push_back(r->first); + } } } + // if there is still interleaved ranges waiting to be merged, + // go ahead and do it + if (!intlv_ranges.empty()) { + ranges.push_back(AddrRange(intlv_ranges)); + } + return ranges; } diff --git a/src/mem/physical.hh b/src/mem/physical.hh index 10edeb18f..02fefb478 100644 --- a/src/mem/physical.hh +++ b/src/mem/physical.hh @@ -135,7 +135,9 @@ class PhysicalMemory : public Serializable /** * Get the memory ranges for all memories that are to be reported - * to the configuration table. + * to the configuration table. The ranges are merged before they + * are returned such that any interleaved ranges appear as a + * single range. * * @return All configuration table memory ranges */ |