TBETable.hh revision 7455
112655Sandreas.sandberg@arm.com/* 212655Sandreas.sandberg@arm.com * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 312655Sandreas.sandberg@arm.com * All rights reserved. 412655Sandreas.sandberg@arm.com * 512655Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without 612655Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are 712655Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright 812655Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer; 912655Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright 1012655Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the 1112655Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution; 1212655Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its 1312655Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from 1412655Sandreas.sandberg@arm.com * this software without specific prior written permission. 1512655Sandreas.sandberg@arm.com * 1612655Sandreas.sandberg@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1712655Sandreas.sandberg@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1812655Sandreas.sandberg@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1912655Sandreas.sandberg@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2012655Sandreas.sandberg@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2112655Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2212655Sandreas.sandberg@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2312655Sandreas.sandberg@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2412655Sandreas.sandberg@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2512655Sandreas.sandberg@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2612655Sandreas.sandberg@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2712655Sandreas.sandberg@arm.com */ 2812655Sandreas.sandberg@arm.com 2912655Sandreas.sandberg@arm.com#ifndef __MEM_RUBY_SYSTEM_TBETABLE_HH__ 3012655Sandreas.sandberg@arm.com#define __MEM_RUBY_SYSTEM_TBETABLE_HH__ 3112655Sandreas.sandberg@arm.com 3212655Sandreas.sandberg@arm.com#include <iostream> 3312655Sandreas.sandberg@arm.com 3412655Sandreas.sandberg@arm.com#include "base/hashmap.hh" 3512655Sandreas.sandberg@arm.com#include "mem/ruby/common/Address.hh" 3612655Sandreas.sandberg@arm.com#include "mem/ruby/common/Global.hh" 3712655Sandreas.sandberg@arm.com#include "mem/ruby/profiler/Profiler.hh" 3812655Sandreas.sandberg@arm.com#include "mem/ruby/system/System.hh" 3912655Sandreas.sandberg@arm.com 4012655Sandreas.sandberg@arm.comtemplate<class ENTRY> 4112655Sandreas.sandberg@arm.comclass TBETable 4212655Sandreas.sandberg@arm.com{ 4312655Sandreas.sandberg@arm.com public: 4412655Sandreas.sandberg@arm.com TBETable(int number_of_TBEs) 4512655Sandreas.sandberg@arm.com : m_number_of_TBEs(number_of_TBEs) 4612655Sandreas.sandberg@arm.com { 4712655Sandreas.sandberg@arm.com } 4812655Sandreas.sandberg@arm.com 4912660Sandreas.sandberg@arm.com void 5012655Sandreas.sandberg@arm.com printConfig(std::ostream& out) 5112655Sandreas.sandberg@arm.com { 5212655Sandreas.sandberg@arm.com out << "TBEs_per_TBETable: " << m_number_of_TBEs << std::endl; 5312655Sandreas.sandberg@arm.com } 5412655Sandreas.sandberg@arm.com 5512658Sandreas.sandberg@arm.com bool isPresent(const Address& address) const; 5612655Sandreas.sandberg@arm.com void allocate(const Address& address); 5712655Sandreas.sandberg@arm.com void deallocate(const Address& address); 5812655Sandreas.sandberg@arm.com bool 5912655Sandreas.sandberg@arm.com areNSlotsAvailable(int n) const 6012655Sandreas.sandberg@arm.com { 6112655Sandreas.sandberg@arm.com return (m_number_of_TBEs - m_map.size()) >= n; 6212655Sandreas.sandberg@arm.com } 6312655Sandreas.sandberg@arm.com 6412655Sandreas.sandberg@arm.com ENTRY& lookup(const Address& address); 6512655Sandreas.sandberg@arm.com const ENTRY& lookup(const Address& address) const; 6612658Sandreas.sandberg@arm.com 6712658Sandreas.sandberg@arm.com // Print cache contents 6812655Sandreas.sandberg@arm.com void print(std::ostream& out) const; 6912655Sandreas.sandberg@arm.com 7012655Sandreas.sandberg@arm.com private: 7112655Sandreas.sandberg@arm.com // Private copy constructor and assignment operator 7212655Sandreas.sandberg@arm.com TBETable(const TBETable& obj); 7312655Sandreas.sandberg@arm.com TBETable& operator=(const TBETable& obj); 7412655Sandreas.sandberg@arm.com 7512658Sandreas.sandberg@arm.com // Data Members (m_prefix) 7612658Sandreas.sandberg@arm.com m5::hash_map<Address, ENTRY> m_map; 7712655Sandreas.sandberg@arm.com 7812655Sandreas.sandberg@arm.com private: 7912656Sandreas.sandberg@arm.com int m_number_of_TBEs; 8012656Sandreas.sandberg@arm.com}; 8112655Sandreas.sandberg@arm.com 8212656Sandreas.sandberg@arm.comtemplate<class ENTRY> 8312660Sandreas.sandberg@arm.cominline std::ostream& 8412658Sandreas.sandberg@arm.comoperator<<(std::ostream& out, const TBETable<ENTRY>& obj) 8512658Sandreas.sandberg@arm.com{ 8612658Sandreas.sandberg@arm.com obj.print(out); 8712655Sandreas.sandberg@arm.com out << std::flush; 8812655Sandreas.sandberg@arm.com return out; 8912656Sandreas.sandberg@arm.com} 9012655Sandreas.sandberg@arm.com 9112660Sandreas.sandberg@arm.comtemplate<class ENTRY> 9212655Sandreas.sandberg@arm.cominline bool 9312660Sandreas.sandberg@arm.comTBETable<ENTRY>::isPresent(const Address& address) const 9412658Sandreas.sandberg@arm.com{ 9512658Sandreas.sandberg@arm.com assert(address == line_address(address)); 9612655Sandreas.sandberg@arm.com assert(m_map.size() <= m_number_of_TBEs); 9712658Sandreas.sandberg@arm.com return !!m_map.count(address); 9812658Sandreas.sandberg@arm.com} 9912658Sandreas.sandberg@arm.com 10012658Sandreas.sandberg@arm.comtemplate<class ENTRY> 10112658Sandreas.sandberg@arm.cominline void 10212655Sandreas.sandberg@arm.comTBETable<ENTRY>::allocate(const Address& address) 10312658Sandreas.sandberg@arm.com{ 10412658Sandreas.sandberg@arm.com assert(!isPresent(address)); 10512658Sandreas.sandberg@arm.com assert(m_map.size() < m_number_of_TBEs); 10612658Sandreas.sandberg@arm.com m_map[address] = ENTRY(); 10712658Sandreas.sandberg@arm.com} 10812660Sandreas.sandberg@arm.com 10912658Sandreas.sandberg@arm.comtemplate<class ENTRY> 11012658Sandreas.sandberg@arm.cominline void 11112655Sandreas.sandberg@arm.comTBETable<ENTRY>::deallocate(const Address& address) 11212656Sandreas.sandberg@arm.com{ 11312655Sandreas.sandberg@arm.com assert(isPresent(address)); 11412660Sandreas.sandberg@arm.com assert(m_map.size() > 0); 11512660Sandreas.sandberg@arm.com m_map.erase(address); 11612660Sandreas.sandberg@arm.com} 11712660Sandreas.sandberg@arm.com 11812660Sandreas.sandberg@arm.com// looks an address up in the cache 11912660Sandreas.sandberg@arm.comtemplate<class ENTRY> 12012660Sandreas.sandberg@arm.cominline ENTRY& 12112660Sandreas.sandberg@arm.comTBETable<ENTRY>::lookup(const Address& address) 12212660Sandreas.sandberg@arm.com{ 12312660Sandreas.sandberg@arm.com assert(isPresent(address)); 12412660Sandreas.sandberg@arm.com return m_map.find(address)->second; 12512655Sandreas.sandberg@arm.com} 12612655Sandreas.sandberg@arm.com 12712655Sandreas.sandberg@arm.com// looks an address up in the cache 12812655Sandreas.sandberg@arm.comtemplate<class ENTRY> 12912656Sandreas.sandberg@arm.cominline const ENTRY& 13012655Sandreas.sandberg@arm.comTBETable<ENTRY>::lookup(const Address& address) const 13112660Sandreas.sandberg@arm.com{ 13212660Sandreas.sandberg@arm.com assert(isPresent(address)); 13312660Sandreas.sandberg@arm.com return m_map.find(address)->second; 13412660Sandreas.sandberg@arm.com} 13512660Sandreas.sandberg@arm.com 13612660Sandreas.sandberg@arm.comtemplate<class ENTRY> 13712660Sandreas.sandberg@arm.cominline void 13812660Sandreas.sandberg@arm.comTBETable<ENTRY>::print(std::ostream& out) const 13912660Sandreas.sandberg@arm.com{ 14012660Sandreas.sandberg@arm.com} 14112658Sandreas.sandberg@arm.com 14212655Sandreas.sandberg@arm.com#endif // __MEM_RUBY_SYSTEM_TBETABLE_HH__ 14312655Sandreas.sandberg@arm.com