Sequencer.hh revision 7546:84e8f914b3b8
111784Sarthur.perais@inria.fr/* 211784Sarthur.perais@inria.fr * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 311784Sarthur.perais@inria.fr * All rights reserved. 411784Sarthur.perais@inria.fr * 511784Sarthur.perais@inria.fr * Redistribution and use in source and binary forms, with or without 611784Sarthur.perais@inria.fr * modification, are permitted provided that the following conditions are 711784Sarthur.perais@inria.fr * met: redistributions of source code must retain the above copyright 811784Sarthur.perais@inria.fr * notice, this list of conditions and the following disclaimer; 911784Sarthur.perais@inria.fr * redistributions in binary form must reproduce the above copyright 1011784Sarthur.perais@inria.fr * notice, this list of conditions and the following disclaimer in the 1111784Sarthur.perais@inria.fr * documentation and/or other materials provided with the distribution; 1211784Sarthur.perais@inria.fr * neither the name of the copyright holders nor the names of its 1311784Sarthur.perais@inria.fr * contributors may be used to endorse or promote products derived from 1411784Sarthur.perais@inria.fr * this software without specific prior written permission. 1511784Sarthur.perais@inria.fr * 1611784Sarthur.perais@inria.fr * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1711784Sarthur.perais@inria.fr * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1811784Sarthur.perais@inria.fr * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1911784Sarthur.perais@inria.fr * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2011784Sarthur.perais@inria.fr * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2111784Sarthur.perais@inria.fr * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2211784Sarthur.perais@inria.fr * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2311784Sarthur.perais@inria.fr * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2411784Sarthur.perais@inria.fr * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2511784Sarthur.perais@inria.fr * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2611784Sarthur.perais@inria.fr * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711784Sarthur.perais@inria.fr */ 2811784Sarthur.perais@inria.fr 2911784Sarthur.perais@inria.fr#ifndef __MEM_RUBY_SYSTEM_SEQUENCER_HH__ 3011784Sarthur.perais@inria.fr#define __MEM_RUBY_SYSTEM_SEQUENCER_HH__ 3111784Sarthur.perais@inria.fr 3211784Sarthur.perais@inria.fr#include <iostream> 3311784Sarthur.perais@inria.fr 3411784Sarthur.perais@inria.fr#include "base/hashmap.hh" 3511784Sarthur.perais@inria.fr#include "mem/protocol/AccessModeType.hh" 3611784Sarthur.perais@inria.fr#include "mem/protocol/CacheRequestType.hh" 3711784Sarthur.perais@inria.fr#include "mem/protocol/GenericMachineType.hh" 3811784Sarthur.perais@inria.fr#include "mem/protocol/PrefetchBit.hh" 3911784Sarthur.perais@inria.fr#include "mem/ruby/common/Address.hh" 4011784Sarthur.perais@inria.fr#include "mem/ruby/common/Consumer.hh" 4111784Sarthur.perais@inria.fr#include "mem/ruby/common/Global.hh" 4211784Sarthur.perais@inria.fr#include "mem/ruby/system/RubyPort.hh" 4311784Sarthur.perais@inria.fr 4411784Sarthur.perais@inria.frclass DataBlock; 4511784Sarthur.perais@inria.frclass CacheMsg; 4611784Sarthur.perais@inria.frclass MachineID; 4711784Sarthur.perais@inria.frclass CacheMemory; 4811784Sarthur.perais@inria.fr 4911784Sarthur.perais@inria.frclass RubySequencerParams; 5011784Sarthur.perais@inria.fr 5111784Sarthur.perais@inria.frstruct SequencerRequest 5211784Sarthur.perais@inria.fr{ 5311784Sarthur.perais@inria.fr RubyRequest ruby_request; 5411784Sarthur.perais@inria.fr Time issue_time; 5511784Sarthur.perais@inria.fr 5611784Sarthur.perais@inria.fr SequencerRequest(const RubyRequest & _ruby_request, Time _issue_time) 5711784Sarthur.perais@inria.fr : ruby_request(_ruby_request), issue_time(_issue_time) 5811784Sarthur.perais@inria.fr {} 5911784Sarthur.perais@inria.fr}; 6011784Sarthur.perais@inria.fr 6111784Sarthur.perais@inria.frstd::ostream& operator<<(std::ostream& out, const SequencerRequest& obj); 6211784Sarthur.perais@inria.fr 6311784Sarthur.perais@inria.frclass Sequencer : public RubyPort, public Consumer 6411784Sarthur.perais@inria.fr{ 6511784Sarthur.perais@inria.fr public: 6611784Sarthur.perais@inria.fr typedef RubySequencerParams Params; 6711784Sarthur.perais@inria.fr Sequencer(const Params *); 6811784Sarthur.perais@inria.fr ~Sequencer(); 6911784Sarthur.perais@inria.fr 7011784Sarthur.perais@inria.fr // Public Methods 7111784Sarthur.perais@inria.fr void wakeup(); // Used only for deadlock detection 7211784Sarthur.perais@inria.fr 7311784Sarthur.perais@inria.fr void printConfig(std::ostream& out) const; 7411784Sarthur.perais@inria.fr 7511784Sarthur.perais@inria.fr void printProgress(std::ostream& out) const; 7611784Sarthur.perais@inria.fr 7711784Sarthur.perais@inria.fr void writeCallback(const Address& address, DataBlock& data); 7811784Sarthur.perais@inria.fr 7911784Sarthur.perais@inria.fr void writeCallback(const Address& address, 8011784Sarthur.perais@inria.fr GenericMachineType mach, 8111784Sarthur.perais@inria.fr DataBlock& data); 8211784Sarthur.perais@inria.fr 8311784Sarthur.perais@inria.fr void readCallback(const Address& address, DataBlock& data); 8411784Sarthur.perais@inria.fr 8511784Sarthur.perais@inria.fr void readCallback(const Address& address, 8611784Sarthur.perais@inria.fr GenericMachineType mach, 8711784Sarthur.perais@inria.fr DataBlock& data); 8811784Sarthur.perais@inria.fr 8911784Sarthur.perais@inria.fr RequestStatus makeRequest(const RubyRequest & request); 9011784Sarthur.perais@inria.fr RequestStatus getRequestStatus(const RubyRequest& request); 9111784Sarthur.perais@inria.fr bool empty() const; 9211784Sarthur.perais@inria.fr 9311784Sarthur.perais@inria.fr void print(std::ostream& out) const; 9411784Sarthur.perais@inria.fr void printStats(std::ostream& out) const; 9511784Sarthur.perais@inria.fr void checkCoherence(const Address& address); 9611784Sarthur.perais@inria.fr 9713443Spau.cabre@metempsy.com void markRemoved(); 9811784Sarthur.perais@inria.fr void removeRequest(SequencerRequest* request); 9911784Sarthur.perais@inria.fr 10011784Sarthur.perais@inria.fr private: 10111784Sarthur.perais@inria.fr bool tryCacheAccess(const Address& addr, CacheRequestType type, 10211784Sarthur.perais@inria.fr const Address& pc, AccessModeType access_mode, 10311784Sarthur.perais@inria.fr int size, DataBlock*& data_ptr); 10411784Sarthur.perais@inria.fr void issueRequest(const RubyRequest& request); 10511784Sarthur.perais@inria.fr 10611784Sarthur.perais@inria.fr void hitCallback(SequencerRequest* request, 10711784Sarthur.perais@inria.fr GenericMachineType mach, 10811784Sarthur.perais@inria.fr DataBlock& data); 10911784Sarthur.perais@inria.fr 11011784Sarthur.perais@inria.fr bool insertRequest(SequencerRequest* request); 11111784Sarthur.perais@inria.fr 11211784Sarthur.perais@inria.fr 11311784Sarthur.perais@inria.fr // Private copy constructor and assignment operator 11411784Sarthur.perais@inria.fr Sequencer(const Sequencer& obj); 11511784Sarthur.perais@inria.fr Sequencer& operator=(const Sequencer& obj); 11611784Sarthur.perais@inria.fr 11711784Sarthur.perais@inria.fr private: 11811784Sarthur.perais@inria.fr int m_max_outstanding_requests; 11911784Sarthur.perais@inria.fr int m_deadlock_threshold; 12011784Sarthur.perais@inria.fr 12111784Sarthur.perais@inria.fr CacheMemory* m_dataCache_ptr; 12211784Sarthur.perais@inria.fr CacheMemory* m_instCache_ptr; 12311784Sarthur.perais@inria.fr 12411784Sarthur.perais@inria.fr typedef m5::hash_map<Address, SequencerRequest*> RequestTable; 12511784Sarthur.perais@inria.fr RequestTable m_writeRequestTable; 12611784Sarthur.perais@inria.fr RequestTable m_readRequestTable; 12711784Sarthur.perais@inria.fr // Global outstanding request count, across all request tables 12811784Sarthur.perais@inria.fr int m_outstanding_count; 12911784Sarthur.perais@inria.fr bool m_deadlock_check_scheduled; 13011784Sarthur.perais@inria.fr 13111784Sarthur.perais@inria.fr int m_store_waiting_on_load_cycles; 13211784Sarthur.perais@inria.fr int m_store_waiting_on_store_cycles; 13311784Sarthur.perais@inria.fr int m_load_waiting_on_store_cycles; 13411784Sarthur.perais@inria.fr int m_load_waiting_on_load_cycles; 13511784Sarthur.perais@inria.fr 13611784Sarthur.perais@inria.fr bool m_usingRubyTester; 13711784Sarthur.perais@inria.fr 13813442Spau.cabre@metempsy.com class SequencerWakeupEvent : public Event 13911784Sarthur.perais@inria.fr { 14011784Sarthur.perais@inria.fr private: 14111784Sarthur.perais@inria.fr Sequencer *m_sequencer_ptr; 14211784Sarthur.perais@inria.fr 14311784Sarthur.perais@inria.fr public: 14411784Sarthur.perais@inria.fr SequencerWakeupEvent(Sequencer *_seq) : m_sequencer_ptr(_seq) {} 14511784Sarthur.perais@inria.fr void process() { m_sequencer_ptr->wakeup(); } 14611784Sarthur.perais@inria.fr const char *description() const { return "Sequencer deadlock check"; } 14711784Sarthur.perais@inria.fr }; 14811784Sarthur.perais@inria.fr 14911784Sarthur.perais@inria.fr SequencerWakeupEvent deadlockCheckEvent; 15011784Sarthur.perais@inria.fr}; 15111784Sarthur.perais@inria.fr 15211784Sarthur.perais@inria.frinline std::ostream& 15311784Sarthur.perais@inria.froperator<<(std::ostream& out, const Sequencer& obj) 15411784Sarthur.perais@inria.fr{ 15511784Sarthur.perais@inria.fr obj.print(out); 15611784Sarthur.perais@inria.fr out << std::flush; 15711784Sarthur.perais@inria.fr return out; 15811784Sarthur.perais@inria.fr} 15911784Sarthur.perais@inria.fr 16011784Sarthur.perais@inria.fr#endif // __MEM_RUBY_SYSTEM_SEQUENCER_HH__ 16111784Sarthur.perais@inria.fr 16211784Sarthur.perais@inria.fr