changeset 190fd0e285f6 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=190fd0e285f6
description:
        base: Add support for merging of interleaved address ranges

        This patch adds support for merging a vector of interleaved address
        ranges into a contigous range. The functionality will be used in the
        interconnect and the PhysicalMemory to transform interleaved memory
        ranges to contigous ranges before passing them on.

        The actual use of the merging is appearing in future patches.

diffstat:

 src/base/addr_range.hh |  42 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 42 insertions(+), 0 deletions(-)

diffs (59 lines):

diff -r 22e15f9c3fda -r 190fd0e285f6 src/base/addr_range.hh
--- a/src/base/addr_range.hh    Mon Jan 07 13:05:38 2013 -0500
+++ b/src/base/addr_range.hh    Mon Jan 07 13:05:38 2013 -0500
@@ -45,6 +45,8 @@
 #ifndef __BASE_ADDR_RANGE_HH__
 #define __BASE_ADDR_RANGE_HH__
 
+#include <vector>
+
 #include "base/bitfield.hh"
 #include "base/cprintf.hh"
 #include "base/misc.hh"
@@ -87,6 +89,46 @@
     {}
 
     /**
+     * Create an address range by merging a collection of interleaved
+     * ranges.
+     *
+     * @param ranges Interleaved ranges to be merged
+     */
+    AddrRange(const std::vector<AddrRange>& ranges)
+        : _start(1), _end(0), intlvHighBit(0), intlvBits(0), intlvMatch(0)
+    {
+        if (!ranges.empty()) {
+            // get the values from the first one and check the others
+            _start = ranges.front()._start;
+            _end = ranges.front()._end;
+            intlvHighBit = ranges.front().intlvHighBit;
+            intlvBits = ranges.front().intlvBits;
+
+            if (ranges.size() != (ULL(1) << intlvBits))
+                fatal("Got %d ranges spanning %d interleaving bits\n",
+                      ranges.size(), intlvBits);
+
+            uint8_t match = 0;
+            for (std::vector<AddrRange>::const_iterator r = ranges.begin();
+                 r != ranges.end(); ++r) {
+                if (!mergesWith(*r))
+                    fatal("Can only merge ranges with the same start, end "
+                          "and interleaving bits\n");
+
+                if (r->intlvMatch != match)
+                    fatal("Expected interleave match %d but got %d when "
+                          "merging\n", match, r->intlvMatch);
+                ++match;
+            }
+
+            // our range is complete and we can turn this into a
+            // non-interleaved range
+            intlvHighBit = 0;
+            intlvBits = 0;
+        }
+    }
+
+    /**
      * Determine if the range is interleaved or not.
      *
      * @return true if interleaved
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to