PersistentTable.hh revision 7039
110298Salexandru.dutu@amd.com/*
210298Salexandru.dutu@amd.com * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
310298Salexandru.dutu@amd.com * All rights reserved.
410298Salexandru.dutu@amd.com *
510298Salexandru.dutu@amd.com * Redistribution and use in source and binary forms, with or without
610298Salexandru.dutu@amd.com * modification, are permitted provided that the following conditions are
710298Salexandru.dutu@amd.com * met: redistributions of source code must retain the above copyright
810298Salexandru.dutu@amd.com * notice, this list of conditions and the following disclaimer;
910298Salexandru.dutu@amd.com * redistributions in binary form must reproduce the above copyright
1010298Salexandru.dutu@amd.com * notice, this list of conditions and the following disclaimer in the
1110298Salexandru.dutu@amd.com * documentation and/or other materials provided with the distribution;
1210298Salexandru.dutu@amd.com * neither the name of the copyright holders nor the names of its
1310298Salexandru.dutu@amd.com * contributors may be used to endorse or promote products derived from
1410298Salexandru.dutu@amd.com * this software without specific prior written permission.
1510298Salexandru.dutu@amd.com *
1610298Salexandru.dutu@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1710298Salexandru.dutu@amd.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1810298Salexandru.dutu@amd.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1910298Salexandru.dutu@amd.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2010298Salexandru.dutu@amd.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2110298Salexandru.dutu@amd.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2210298Salexandru.dutu@amd.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2310298Salexandru.dutu@amd.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2410298Salexandru.dutu@amd.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2510298Salexandru.dutu@amd.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2610298Salexandru.dutu@amd.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2710298Salexandru.dutu@amd.com */
2810298Salexandru.dutu@amd.com
2910298Salexandru.dutu@amd.com#ifndef __MEM_RUBY_SYSTEM_PERSISTENTTABLE_HH__
3010298Salexandru.dutu@amd.com#define __MEM_RUBY_SYSTEM_PERSISTENTTABLE_HH__
3110298Salexandru.dutu@amd.com
3210298Salexandru.dutu@amd.com#include "mem/gems_common/Map.hh"
3310298Salexandru.dutu@amd.com#include "mem/protocol/AccessType.hh"
3410298Salexandru.dutu@amd.com#include "mem/ruby/common/Address.hh"
3510298Salexandru.dutu@amd.com#include "mem/ruby/common/Global.hh"
3610298Salexandru.dutu@amd.com#include "mem/ruby/common/NetDest.hh"
3710298Salexandru.dutu@amd.com#include "mem/ruby/system/MachineID.hh"
3810298Salexandru.dutu@amd.com
3910298Salexandru.dutu@amd.comclass PersistentTableEntry
4010298Salexandru.dutu@amd.com{
4110298Salexandru.dutu@amd.com  public:
4210298Salexandru.dutu@amd.com    void print(ostream& out) const {}
4310298Salexandru.dutu@amd.com
4411800Sbrandon.potter@amd.com    NetDest m_starving;
4511800Sbrandon.potter@amd.com    NetDest m_marked;
4610298Salexandru.dutu@amd.com    NetDest m_request_to_write;
4710298Salexandru.dutu@amd.com};
4810298Salexandru.dutu@amd.com
4910298Salexandru.dutu@amd.comclass PersistentTable
5010298Salexandru.dutu@amd.com{
5110298Salexandru.dutu@amd.com  public:
5210298Salexandru.dutu@amd.com    // Constructors
5310298Salexandru.dutu@amd.com    PersistentTable();
5410298Salexandru.dutu@amd.com
5510298Salexandru.dutu@amd.com    // Destructor
5610298Salexandru.dutu@amd.com    ~PersistentTable();
5710298Salexandru.dutu@amd.com
5810298Salexandru.dutu@amd.com    // Public Methods
5910298Salexandru.dutu@amd.com    void persistentRequestLock(const Address& address, MachineID locker,
6010298Salexandru.dutu@amd.com                               AccessType type);
6110298Salexandru.dutu@amd.com    void persistentRequestUnlock(const Address& address, MachineID unlocker);
6210298Salexandru.dutu@amd.com    bool okToIssueStarving(const Address& address, MachineID machID) const;
6310298Salexandru.dutu@amd.com    MachineID findSmallest(const Address& address) const;
6410298Salexandru.dutu@amd.com    AccessType typeOfSmallest(const Address& address) const;
6510298Salexandru.dutu@amd.com    void markEntries(const Address& address);
6610298Salexandru.dutu@amd.com    bool isLocked(const Address& addr) const;
6710298Salexandru.dutu@amd.com    int countStarvingForAddress(const Address& addr) const;
6810298Salexandru.dutu@amd.com    int countReadStarvingForAddress(const Address& addr) const;
6910298Salexandru.dutu@amd.com
7010298Salexandru.dutu@amd.com    static void printConfig(ostream& out) {}
7110298Salexandru.dutu@amd.com
7210298Salexandru.dutu@amd.com    void print(ostream& out) const;
7310298Salexandru.dutu@amd.com
7410298Salexandru.dutu@amd.com  private:
7510298Salexandru.dutu@amd.com    // Private copy constructor and assignment operator
7610298Salexandru.dutu@amd.com    PersistentTable(const PersistentTable& obj);
7710298Salexandru.dutu@amd.com    PersistentTable& operator=(const PersistentTable& obj);
7810298Salexandru.dutu@amd.com
7910298Salexandru.dutu@amd.com    // Data Members (m_prefix)
8010298Salexandru.dutu@amd.com    Map<Address, PersistentTableEntry>* m_map_ptr;
8110298Salexandru.dutu@amd.com};
8210298Salexandru.dutu@amd.com
8310298Salexandru.dutu@amd.cominline ostream&
8410298Salexandru.dutu@amd.comoperator<<(ostream& out, const PersistentTable& obj)
8510298Salexandru.dutu@amd.com{
8610298Salexandru.dutu@amd.com    obj.print(out);
8710298Salexandru.dutu@amd.com    out << flush;
8810298Salexandru.dutu@amd.com    return out;
8910298Salexandru.dutu@amd.com}
9010298Salexandru.dutu@amd.com
9110298Salexandru.dutu@amd.cominline ostream&
9210298Salexandru.dutu@amd.comoperator<<(ostream& out, const PersistentTableEntry& obj)
9310298Salexandru.dutu@amd.com{
9410298Salexandru.dutu@amd.com    obj.print(out);
9510298Salexandru.dutu@amd.com    out << flush;
9610298Salexandru.dutu@amd.com    return out;
9710298Salexandru.dutu@amd.com}
9810298Salexandru.dutu@amd.com
9910298Salexandru.dutu@amd.com#endif // __MEM_RUBY_SYSTEM_PERSISTENTTABLE_HH__
10010298Salexandru.dutu@amd.com