TBETable.hh revision 7455
12SN/A/* 210905Sandreas.sandberg@arm.com * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 310905Sandreas.sandberg@arm.com * All rights reserved. 410905Sandreas.sandberg@arm.com * 510905Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without 610905Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are 710905Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright 810905Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer; 910905Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright 1010905Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the 1110905Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution; 1210905Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its 1310905Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from 141762SN/A * this software without specific prior written permission. 152SN/A * 162SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272SN/A */ 282SN/A 292SN/A#ifndef __MEM_RUBY_SYSTEM_TBETABLE_HH__ 302SN/A#define __MEM_RUBY_SYSTEM_TBETABLE_HH__ 312SN/A 322SN/A#include <iostream> 332SN/A 342SN/A#include "base/hashmap.hh" 352SN/A#include "mem/ruby/common/Address.hh" 362SN/A#include "mem/ruby/common/Global.hh" 372SN/A#include "mem/ruby/profiler/Profiler.hh" 382SN/A#include "mem/ruby/system/System.hh" 392665Ssaidi@eecs.umich.edu 402760Sbinkertn@umich.edutemplate<class ENTRY> 412760Sbinkertn@umich.educlass TBETable 422665Ssaidi@eecs.umich.edu{ 4310905Sandreas.sandberg@arm.com public: 442SN/A TBETable(int number_of_TBEs) 452SN/A : m_number_of_TBEs(number_of_TBEs) 462SN/A { 472SN/A } 482SN/A 492SN/A void 502SN/A printConfig(std::ostream& out) 512SN/A { 522SN/A out << "TBEs_per_TBETable: " << m_number_of_TBEs << std::endl; 532SN/A } 548229Snate@binkert.org 552SN/A bool isPresent(const Address& address) const; 568229Snate@binkert.org void allocate(const Address& address); 5710905Sandreas.sandberg@arm.com void deallocate(const Address& address); 584841Ssaidi@eecs.umich.edu bool 592SN/A areNSlotsAvailable(int n) const 6010459SAndreas.Sandberg@ARM.com { 616214Snate@binkert.org return (m_number_of_TBEs - m_map.size()) >= n; 622SN/A } 632738Sstever@eecs.umich.edu 64395SN/A ENTRY& lookup(const Address& address); 6510905Sandreas.sandberg@arm.com const ENTRY& lookup(const Address& address) const; 664000Ssaidi@eecs.umich.edu 6711067Sandreas.sandberg@arm.com // Print cache contents 689983Sstever@gmail.com void print(std::ostream& out) const; 692SN/A 7010905Sandreas.sandberg@arm.com private: 7110905Sandreas.sandberg@arm.com // Private copy constructor and assignment operator 7210905Sandreas.sandberg@arm.com TBETable(const TBETable& obj); 739048SAli.Saidi@ARM.com TBETable& operator=(const TBETable& obj); 749048SAli.Saidi@ARM.com 759056SAli.Saidi@ARM.com // Data Members (m_prefix) 769048SAli.Saidi@ARM.com m5::hash_map<Address, ENTRY> m_map; 779048SAli.Saidi@ARM.com 789056SAli.Saidi@ARM.com private: 799048SAli.Saidi@ARM.com int m_number_of_TBEs; 8010930Sbrandon.potter@amd.com}; 819048SAli.Saidi@ARM.com 82217SN/Atemplate<class ENTRY> 8310905Sandreas.sandberg@arm.cominline std::ostream& 84217SN/Aoperator<<(std::ostream& out, const TBETable<ENTRY>& obj) 8510459SAndreas.Sandberg@ARM.com{ 8610905Sandreas.sandberg@arm.com obj.print(out); 8710459SAndreas.Sandberg@ARM.com out << std::flush; 8810459SAndreas.Sandberg@ARM.com return out; 8910905Sandreas.sandberg@arm.com} 9010459SAndreas.Sandberg@ARM.com 9110459SAndreas.Sandberg@ARM.comtemplate<class ENTRY> 92217SN/Ainline bool 9310905Sandreas.sandberg@arm.comTBETable<ENTRY>::isPresent(const Address& address) const 94217SN/A{ 9510459SAndreas.Sandberg@ARM.com assert(address == line_address(address)); 9610905Sandreas.sandberg@arm.com assert(m_map.size() <= m_number_of_TBEs); 9710459SAndreas.Sandberg@ARM.com return !!m_map.count(address); 9810459SAndreas.Sandberg@ARM.com} 9910905Sandreas.sandberg@arm.com 10010459SAndreas.Sandberg@ARM.comtemplate<class ENTRY> 10110459SAndreas.Sandberg@ARM.cominline void 102217SN/ATBETable<ENTRY>::allocate(const Address& address) 10310905Sandreas.sandberg@arm.com{ 1046820SLisa.Hsu@amd.com assert(!isPresent(address)); 10510459SAndreas.Sandberg@ARM.com assert(m_map.size() < m_number_of_TBEs); 10610905Sandreas.sandberg@arm.com m_map[address] = ENTRY(); 10710459SAndreas.Sandberg@ARM.com} 10810459SAndreas.Sandberg@ARM.com 10910905Sandreas.sandberg@arm.comtemplate<class ENTRY> 11010459SAndreas.Sandberg@ARM.cominline void 11110459SAndreas.Sandberg@ARM.comTBETable<ENTRY>::deallocate(const Address& address) 1126820SLisa.Hsu@amd.com{ 11310905Sandreas.sandberg@arm.com assert(isPresent(address)); 1146227Snate@binkert.org assert(m_map.size() > 0); 115217SN/A m_map.erase(address); 116217SN/A} 11710905Sandreas.sandberg@arm.com 1184841Ssaidi@eecs.umich.edu// looks an address up in the cache 1194841Ssaidi@eecs.umich.edutemplate<class ENTRY> 1204841Ssaidi@eecs.umich.eduinline ENTRY& 12110905Sandreas.sandberg@arm.comTBETable<ENTRY>::lookup(const Address& address) 1227948SAli.Saidi@ARM.com{ 1237948SAli.Saidi@ARM.com assert(isPresent(address)); 1247948SAli.Saidi@ARM.com return m_map.find(address)->second; 12510905Sandreas.sandberg@arm.com} 12610905Sandreas.sandberg@arm.com 127217SN/A// looks an address up in the cache 1284841Ssaidi@eecs.umich.edutemplate<class ENTRY> 12910905Sandreas.sandberg@arm.cominline const ENTRY& 13010905Sandreas.sandberg@arm.comTBETable<ENTRY>::lookup(const Address& address) const 1314841Ssaidi@eecs.umich.edu{ 1327948SAli.Saidi@ARM.com assert(isPresent(address)); 13310905Sandreas.sandberg@arm.com return m_map.find(address)->second; 13410905Sandreas.sandberg@arm.com} 1357948SAli.Saidi@ARM.com 136237SN/Atemplate<class ENTRY> 13710905Sandreas.sandberg@arm.cominline void 138237SN/ATBETable<ENTRY>::print(std::ostream& out) const 139217SN/A{ 140217SN/A} 141217SN/A 142237SN/A#endif // __MEM_RUBY_SYSTEM_TBETABLE_HH__ 14310905Sandreas.sandberg@arm.com