ruby: patch checkpoint restore with garnet
[gem5.git] / src / mem / ruby / common / Address.cc
index b4ad39294cd0f08c0c813af18338ec4cc43c98ab..b075ef3c5aabed2373f292daff8b07c29cc757c6 100644 (file)
@@ -1,4 +1,3 @@
-
 /*
  * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
  * All rights reserved.
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-/*
- * $Id$
- */
-
+#include "arch/isa_traits.hh"
+#include "config/the_isa.hh"
 #include "mem/ruby/common/Address.hh"
+#include "mem/ruby/system/System.hh"
 
-void Address::output(ostream& out) const
+physical_address_t
+Address::getLineAddress() const
 {
-  // Note: this outputs addresses in the form "ffff", not "0xffff".
-  // This code should always be able to write out addresses in a
-  // format that can be read in by the below input() method.  Please
-  // don't change this without talking to Milo first.
-  out << hex << m_address << dec;
+    return bitSelect(RubySystem::getBlockSizeBits(), ADDRESS_WIDTH);
 }
 
-void Address::input(istream& in)
+physical_address_t
+Address::getOffset() const
 {
-  // Note: this only works with addresses in the form "ffff", not
-  // "0xffff".  This code should always be able to read in addresses
-  // written out by the above output() method.  Please don't change
-  // this without talking to Milo first.
-  in >> hex >> m_address >> dec;
+    return bitSelect(0, RubySystem::getBlockSizeBits() - 1);
 }
 
-Address::Address(const Address& obj)
+void
+Address::makeLineAddress()
+{
+    m_address = maskLowOrderBits(RubySystem::getBlockSizeBits());
+}
+
+// returns the next stride address based on line address
+void
+Address::makeNextStrideAddress(int stride)
+{
+    m_address = maskLowOrderBits(RubySystem::getBlockSizeBits())
+        + RubySystem::getBlockSizeBytes()*stride;
+}
+
+Index
+Address::memoryModuleIndex() const
 {
-  m_address = obj.m_address;
+    Index index =
+        bitSelect(RubySystem::getBlockSizeBits() +
+                  RubySystem::getMemorySizeBits(), ADDRESS_WIDTH);
+    assert (index >= 0);
+    return index;
+
+    // Index indexHighPortion =
+    //     address.bitSelect(MEMORY_SIZE_BITS - 1,
+    //                       PAGE_SIZE_BITS + NUMBER_OF_MEMORY_MODULE_BITS);
+    // Index indexLowPortion =
+    //     address.bitSelect(DATA_BLOCK_BITS, PAGE_SIZE_BITS - 1);
+    //
+    // Index index = indexLowPortion |
+    //     (indexHighPortion << (PAGE_SIZE_BITS - DATA_BLOCK_BITS));
+
+    /*
+      Round-robin mapping of addresses, at page size granularity
+
+ADDRESS_WIDTH    MEMORY_SIZE_BITS        PAGE_SIZE_BITS  DATA_BLOCK_BITS
+  |                    |                       |               |
+ \ /                  \ /                     \ /             \ /       0
+  -----------------------------------------------------------------------
+  |       unused        |xxxxxxxxxxxxxxx|       |xxxxxxxxxxxxxxx|       |
+  |                     |xxxxxxxxxxxxxxx|       |xxxxxxxxxxxxxxx|       |
+  -----------------------------------------------------------------------
+                        indexHighPortion         indexLowPortion
+                                        <------->
+                               NUMBER_OF_MEMORY_MODULE_BITS
+    */
 }
 
-Address& Address::operator=(const Address& obj)
+void
+Address::print(std::ostream& out) const
+{
+    using namespace std;
+    out << "[" << hex << "0x" << m_address << "," << " line 0x"
+        << maskLowOrderBits(RubySystem::getBlockSizeBits()) << dec << "]"
+        << flush;
+}
+
+void
+Address::output(std::ostream& out) const
+{
+    // Note: this outputs addresses in the form "ffff", not "0xffff".
+    // This code should always be able to write out addresses in a
+    // format that can be read in by the below input() method.  Please
+    // don't change this without talking to Milo first.
+    out << std::hex << m_address << std::dec;
+}
+
+void
+Address::input(std::istream& in)
+{
+    // Note: this only works with addresses in the form "ffff", not
+    // "0xffff".  This code should always be able to read in addresses
+    // written out by the above output() method.  Please don't change
+    // this without talking to Milo first.
+    in >> std::hex >> m_address >> std::dec;
+}
+
+Address::Address(const Address& obj)
 {
-  if (this == &obj) {
-    //    assert(false);
-  } else {
     m_address = obj.m_address;
-  }
-  return *this;
 }
 
+Address&
+Address::operator=(const Address& obj)
+{
+    if (this == &obj) {
+        // assert(false);
+    } else {
+        m_address = obj.m_address;
+    }
+    return *this;
+}
+
+void
+Address::makePageAddress()
+{
+    m_address = maskLowOrderBits(TheISA::LogVMPageSize);
+}
+
+Address
+page_address(const Address& addr)
+{
+    Address temp = addr;
+    temp.makePageAddress();
+    return temp;
+}
+
+Address
+next_stride_address(const Address& addr, int stride)
+{
+    Address temp = addr;
+    temp.makeNextStrideAddress(stride);
+    return temp;
+}