TBETable.hh revision 6145
110779SCurtis.Dunham@arm.com 210779SCurtis.Dunham@arm.com/* 310779SCurtis.Dunham@arm.com * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 410779SCurtis.Dunham@arm.com * All rights reserved. 510779SCurtis.Dunham@arm.com * 610779SCurtis.Dunham@arm.com * Redistribution and use in source and binary forms, with or without 710779SCurtis.Dunham@arm.com * modification, are permitted provided that the following conditions are 810779SCurtis.Dunham@arm.com * met: redistributions of source code must retain the above copyright 910779SCurtis.Dunham@arm.com * notice, this list of conditions and the following disclaimer; 1010779SCurtis.Dunham@arm.com * redistributions in binary form must reproduce the above copyright 1110779SCurtis.Dunham@arm.com * notice, this list of conditions and the following disclaimer in the 1210779SCurtis.Dunham@arm.com * documentation and/or other materials provided with the distribution; 1310779SCurtis.Dunham@arm.com * neither the name of the copyright holders nor the names of its 1410779SCurtis.Dunham@arm.com * contributors may be used to endorse or promote products derived from 1510779SCurtis.Dunham@arm.com * this software without specific prior written permission. 1610779SCurtis.Dunham@arm.com * 1710779SCurtis.Dunham@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1810779SCurtis.Dunham@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1910779SCurtis.Dunham@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2010779SCurtis.Dunham@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2110779SCurtis.Dunham@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2210779SCurtis.Dunham@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2310779SCurtis.Dunham@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2410779SCurtis.Dunham@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2510779SCurtis.Dunham@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2610779SCurtis.Dunham@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2710779SCurtis.Dunham@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2810779SCurtis.Dunham@arm.com */ 2910779SCurtis.Dunham@arm.com 3010779SCurtis.Dunham@arm.com/* 3110779SCurtis.Dunham@arm.com * TBETable.h 3210779SCurtis.Dunham@arm.com * 3310779SCurtis.Dunham@arm.com * Description: 3410779SCurtis.Dunham@arm.com * 3510779SCurtis.Dunham@arm.com * $Id$ 3610779SCurtis.Dunham@arm.com * 3710779SCurtis.Dunham@arm.com */ 3810779SCurtis.Dunham@arm.com 3910779SCurtis.Dunham@arm.com#ifndef TBETABLE_H 4010779SCurtis.Dunham@arm.com#define TBETABLE_H 4110779SCurtis.Dunham@arm.com 4210779SCurtis.Dunham@arm.com#include "Global.hh" 4310779SCurtis.Dunham@arm.com#include "Map.hh" 4410779SCurtis.Dunham@arm.com#include "Address.hh" 4510779SCurtis.Dunham@arm.com#include "Profiler.hh" 4610779SCurtis.Dunham@arm.com#include "AbstractChip.hh" 4710779SCurtis.Dunham@arm.com#include "System.hh" 4810779SCurtis.Dunham@arm.com 4910779SCurtis.Dunham@arm.comtemplate<class ENTRY> 5010779SCurtis.Dunham@arm.comclass TBETable { 5110779SCurtis.Dunham@arm.compublic: 5210779SCurtis.Dunham@arm.com 5310779SCurtis.Dunham@arm.com // Constructors 5410779SCurtis.Dunham@arm.com TBETable(AbstractChip* chip_ptr); 5510779SCurtis.Dunham@arm.com 5610779SCurtis.Dunham@arm.com // Destructor 5710779SCurtis.Dunham@arm.com //~TBETable(); 5810779SCurtis.Dunham@arm.com 5910779SCurtis.Dunham@arm.com // Public Methods 6010779SCurtis.Dunham@arm.com 6110779SCurtis.Dunham@arm.com static void printConfig(ostream& out) { out << "TBEs_per_TBETable: " << NUMBER_OF_TBES << endl; } 6210779SCurtis.Dunham@arm.com 6310779SCurtis.Dunham@arm.com bool isPresent(const Address& address) const; 6410779SCurtis.Dunham@arm.com void allocate(const Address& address); 6510779SCurtis.Dunham@arm.com void deallocate(const Address& address); 6610779SCurtis.Dunham@arm.com bool areNSlotsAvailable(int n) const { return (NUMBER_OF_TBES - m_map.size()) >= n; } 6710779SCurtis.Dunham@arm.com 6810779SCurtis.Dunham@arm.com ENTRY& lookup(const Address& address); 6910779SCurtis.Dunham@arm.com const ENTRY& lookup(const Address& address) const; 7010779SCurtis.Dunham@arm.com 7110779SCurtis.Dunham@arm.com // Print cache contents 7210779SCurtis.Dunham@arm.com void print(ostream& out) const; 7310779SCurtis.Dunham@arm.comprivate: 7410779SCurtis.Dunham@arm.com // Private Methods 7510779SCurtis.Dunham@arm.com 7610779SCurtis.Dunham@arm.com // Private copy constructor and assignment operator 7710779SCurtis.Dunham@arm.com TBETable(const TBETable& obj); 7810779SCurtis.Dunham@arm.com TBETable& operator=(const TBETable& obj); 7910779SCurtis.Dunham@arm.com 8010779SCurtis.Dunham@arm.com // Data Members (m_prefix) 8110779SCurtis.Dunham@arm.com Map<Address, ENTRY> m_map; 8210779SCurtis.Dunham@arm.com AbstractChip* m_chip_ptr; 8310779SCurtis.Dunham@arm.com}; 8410779SCurtis.Dunham@arm.com 8510779SCurtis.Dunham@arm.com// Output operator declaration 8610779SCurtis.Dunham@arm.com//ostream& operator<<(ostream& out, const TBETable<ENTRY>& obj); 8710779SCurtis.Dunham@arm.com 8811254SCurtis.Dunham@arm.com// ******************* Definitions ******************* 8910779SCurtis.Dunham@arm.com 9010779SCurtis.Dunham@arm.com// Output operator definition 9110779SCurtis.Dunham@arm.comtemplate<class ENTRY> 9210779SCurtis.Dunham@arm.comextern inline 9310779SCurtis.Dunham@arm.comostream& operator<<(ostream& out, const TBETable<ENTRY>& obj) 9410779SCurtis.Dunham@arm.com{ 9510779SCurtis.Dunham@arm.com obj.print(out); 9610779SCurtis.Dunham@arm.com out << flush; 9710779SCurtis.Dunham@arm.com return out; 9810779SCurtis.Dunham@arm.com} 9910779SCurtis.Dunham@arm.com 10010779SCurtis.Dunham@arm.com 10110779SCurtis.Dunham@arm.com// **************************************************************** 10210779SCurtis.Dunham@arm.com 10310779SCurtis.Dunham@arm.comtemplate<class ENTRY> 10410779SCurtis.Dunham@arm.comextern inline 10510779SCurtis.Dunham@arm.comTBETable<ENTRY>::TBETable(AbstractChip* chip_ptr) 10610779SCurtis.Dunham@arm.com{ 10710779SCurtis.Dunham@arm.com m_chip_ptr = chip_ptr; 10810779SCurtis.Dunham@arm.com} 10910779SCurtis.Dunham@arm.com 11010779SCurtis.Dunham@arm.com// PUBLIC METHODS 11110779SCurtis.Dunham@arm.com 11210779SCurtis.Dunham@arm.com// tests to see if an address is present in the cache 11310779SCurtis.Dunham@arm.comtemplate<class ENTRY> 11410779SCurtis.Dunham@arm.comextern inline 11510779SCurtis.Dunham@arm.combool TBETable<ENTRY>::isPresent(const Address& address) const 11610779SCurtis.Dunham@arm.com{ 11710779SCurtis.Dunham@arm.com assert(address == line_address(address)); 11810779SCurtis.Dunham@arm.com assert(m_map.size() <= NUMBER_OF_TBES); 11910779SCurtis.Dunham@arm.com return m_map.exist(address); 12010779SCurtis.Dunham@arm.com} 12110779SCurtis.Dunham@arm.com 12211254SCurtis.Dunham@arm.comtemplate<class ENTRY> 12310779SCurtis.Dunham@arm.comextern inline 12410779SCurtis.Dunham@arm.comvoid TBETable<ENTRY>::allocate(const Address& address) 12510779SCurtis.Dunham@arm.com{ 12610779SCurtis.Dunham@arm.com assert(isPresent(address) == false); 12710779SCurtis.Dunham@arm.com assert(m_map.size() < NUMBER_OF_TBES); 12810779SCurtis.Dunham@arm.com g_system_ptr->getProfiler()->L2tbeUsageSample(m_map.size()); 12910779SCurtis.Dunham@arm.com m_map.add(address, ENTRY()); 13010779SCurtis.Dunham@arm.com} 13110779SCurtis.Dunham@arm.com 13210779SCurtis.Dunham@arm.comtemplate<class ENTRY> 13310779SCurtis.Dunham@arm.comextern inline 13410779SCurtis.Dunham@arm.comvoid TBETable<ENTRY>::deallocate(const Address& address) 13510779SCurtis.Dunham@arm.com{ 13610779SCurtis.Dunham@arm.com assert(isPresent(address) == true); 13710779SCurtis.Dunham@arm.com assert(m_map.size() > 0); 13810779SCurtis.Dunham@arm.com m_map.erase(address); 13910779SCurtis.Dunham@arm.com} 14010779SCurtis.Dunham@arm.com 14110779SCurtis.Dunham@arm.com// looks an address up in the cache 14210779SCurtis.Dunham@arm.comtemplate<class ENTRY> 14310779SCurtis.Dunham@arm.comextern inline 14410779SCurtis.Dunham@arm.comENTRY& TBETable<ENTRY>::lookup(const Address& address) 14510779SCurtis.Dunham@arm.com{ 14610779SCurtis.Dunham@arm.com assert(isPresent(address) == true); 14710779SCurtis.Dunham@arm.com return m_map.lookup(address); 14810779SCurtis.Dunham@arm.com} 14910779SCurtis.Dunham@arm.com 15010779SCurtis.Dunham@arm.com// looks an address up in the cache 15110779SCurtis.Dunham@arm.comtemplate<class ENTRY> 15210779SCurtis.Dunham@arm.comextern inline 15310779SCurtis.Dunham@arm.comconst ENTRY& TBETable<ENTRY>::lookup(const Address& address) const 15410779SCurtis.Dunham@arm.com{ 15510779SCurtis.Dunham@arm.com assert(isPresent(address) == true); 15610779SCurtis.Dunham@arm.com return m_map.lookup(address); 15710779SCurtis.Dunham@arm.com} 15810779SCurtis.Dunham@arm.com 15910779SCurtis.Dunham@arm.comtemplate<class ENTRY> 16010779SCurtis.Dunham@arm.comextern inline 16110779SCurtis.Dunham@arm.comvoid TBETable<ENTRY>::print(ostream& out) const 16210779SCurtis.Dunham@arm.com{ 16310779SCurtis.Dunham@arm.com} 16410779SCurtis.Dunham@arm.com 16510779SCurtis.Dunham@arm.com#endif //TBETABLE_H 16610779SCurtis.Dunham@arm.com