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