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