DirectoryMemory.hh revision 6876
1 2/* 3 * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are 8 * met: redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer; 10 * redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution; 13 * neither the name of the copyright holders nor the names of its 14 * contributors may be used to endorse or promote products derived from 15 * this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30/* 31 * DirectoryMemory.hh 32 * 33 * Description: 34 * 35 * $Id$ 36 * 37 */ 38 39#ifndef DIRECTORYMEMORY_H 40#define DIRECTORYMEMORY_H 41 42#include "mem/ruby/common/Global.hh" 43#include "mem/ruby/common/Address.hh" 44#include "mem/ruby/system/MemoryVector.hh" 45#include "mem/protocol/Directory_Entry.hh" 46#include "sim/sim_object.hh" 47#include "params/RubyDirectoryMemory.hh" 48 49class AbstractController; 50 51class DirectoryMemory : public SimObject { 52public: 53 // Constructors 54 typedef RubyDirectoryMemoryParams Params; 55 DirectoryMemory(const Params *p); 56 void init(); 57 // DirectoryMemory(int version); 58 59 // Destructor 60 ~DirectoryMemory(); 61 62 int mapAddressToLocalIdx(PhysAddress address); 63 static int mapAddressToDirectoryVersion(PhysAddress address); 64 65 uint64 getSize() { return m_size_bytes; } 66 67 // Public Methods 68 void printConfig(ostream& out) const; 69 static void printGlobalConfig(ostream & out); 70 bool isPresent(PhysAddress address); 71 Directory_Entry& lookup(PhysAddress address); 72 73 void invalidateBlock(PhysAddress address); 74 75 void print(ostream& out) const; 76 77private: 78 // Private Methods 79 80 // Private copy constructor and assignment operator 81 DirectoryMemory(const DirectoryMemory& obj); 82 DirectoryMemory& operator=(const DirectoryMemory& obj); 83 84private: 85 const string m_name; 86 AbstractController* m_controller; 87 // Data Members (m_ prefix) 88 Directory_Entry **m_entries; 89 // int m_size; // # of memory module blocks this directory is responsible for 90 uint64 m_size_bytes; 91 uint64 m_size_bits; 92 int m_num_entries; 93 int m_version; 94 95 static int m_num_directories; 96 static int m_num_directories_bits; 97 static uint64_t m_total_size_bytes; 98 99 MemoryVector* m_ram; 100}; 101 102// Output operator declaration 103ostream& operator<<(ostream& out, const DirectoryMemory& obj); 104 105// ******************* Definitions ******************* 106 107// Output operator definition 108extern inline 109ostream& operator<<(ostream& out, const DirectoryMemory& obj) 110{ 111 obj.print(out); 112 out << flush; 113 return out; 114} 115 116#endif //DIRECTORYMEMORY_H 117