-
/*
* 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;
+}