AbstractController.hh revision 9595:470016acf37d
13569Sgblack@eecs.umich.edu/* 23569Sgblack@eecs.umich.edu * Copyright (c) 2009 Mark D. Hill and David A. Wood 33569Sgblack@eecs.umich.edu * All rights reserved. 43569Sgblack@eecs.umich.edu * 53569Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 63569Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 73569Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 83569Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 93569Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 103569Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 113569Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 123569Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 133569Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 143569Sgblack@eecs.umich.edu * this software without specific prior written permission. 153569Sgblack@eecs.umich.edu * 163569Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 173569Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 183569Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 193569Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 203569Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 213569Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 223569Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 233569Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 243569Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 253569Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 263569Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 273569Sgblack@eecs.umich.edu */ 283804Ssaidi@eecs.umich.edu 293569Sgblack@eecs.umich.edu#ifndef __MEM_RUBY_SLICC_INTERFACE_ABSTRACTCONTROLLER_HH__ 303569Sgblack@eecs.umich.edu#define __MEM_RUBY_SLICC_INTERFACE_ABSTRACTCONTROLLER_HH__ 313804Ssaidi@eecs.umich.edu 323811Ssaidi@eecs.umich.edu#include <iostream> 333569Sgblack@eecs.umich.edu#include <string> 343824Ssaidi@eecs.umich.edu 353811Ssaidi@eecs.umich.edu#include "mem/protocol/AccessPermission.hh" 363811Ssaidi@eecs.umich.edu#include "mem/ruby/common/Address.hh" 373823Ssaidi@eecs.umich.edu#include "mem/ruby/common/Consumer.hh" 383823Ssaidi@eecs.umich.edu#include "mem/ruby/common/DataBlock.hh" 393823Ssaidi@eecs.umich.edu#include "mem/ruby/common/Histogram.hh" 403569Sgblack@eecs.umich.edu#include "mem/ruby/network/Network.hh" 413569Sgblack@eecs.umich.edu#include "mem/ruby/recorder/CacheRecorder.hh" 423804Ssaidi@eecs.umich.edu#include "mem/ruby/system/MachineID.hh" 433804Ssaidi@eecs.umich.edu#include "mem/packet.hh" 443569Sgblack@eecs.umich.edu#include "params/RubyController.hh" 453569Sgblack@eecs.umich.edu#include "sim/clocked_object.hh" 463569Sgblack@eecs.umich.edu 473804Ssaidi@eecs.umich.educlass MessageBuffer; 483881Ssaidi@eecs.umich.educlass Network; 493881Ssaidi@eecs.umich.edu 503804Ssaidi@eecs.umich.educlass AbstractController : public ClockedObject, public Consumer 513804Ssaidi@eecs.umich.edu{ 523804Ssaidi@eecs.umich.edu public: 533804Ssaidi@eecs.umich.edu typedef RubyControllerParams Params; 543569Sgblack@eecs.umich.edu AbstractController(const Params *p); 553804Ssaidi@eecs.umich.edu void init(); 563804Ssaidi@eecs.umich.edu const Params *params() const { return (const Params *)_params; } 573881Ssaidi@eecs.umich.edu virtual MessageBuffer* getMandatoryQueue() const = 0; 583881Ssaidi@eecs.umich.edu virtual const int & getVersion() const = 0; 593881Ssaidi@eecs.umich.edu virtual const std::string toString() const = 0; // returns text version of 603804Ssaidi@eecs.umich.edu // controller type 613569Sgblack@eecs.umich.edu virtual const std::string getName() const = 0; // return instance name 623804Ssaidi@eecs.umich.edu virtual void blockOnQueue(Address, MessageBuffer*) = 0; 633804Ssaidi@eecs.umich.edu virtual void unblock(Address) = 0; 643804Ssaidi@eecs.umich.edu virtual void initNetworkPtr(Network* net_ptr) = 0; 653804Ssaidi@eecs.umich.edu virtual AccessPermission getAccessPermission(const Address& addr) = 0; 663881Ssaidi@eecs.umich.edu virtual DataBlock& getDataBlock(const Address& addr) = 0; 673804Ssaidi@eecs.umich.edu 683804Ssaidi@eecs.umich.edu virtual void print(std::ostream & out) const = 0; 693804Ssaidi@eecs.umich.edu virtual void printStats(std::ostream & out) const = 0; 703804Ssaidi@eecs.umich.edu virtual void wakeup() = 0; 713804Ssaidi@eecs.umich.edu // virtual void dumpStats(std::ostream & out) = 0; 723804Ssaidi@eecs.umich.edu virtual void clearStats() = 0; 733804Ssaidi@eecs.umich.edu virtual void recordCacheTrace(int cntrl, CacheRecorder* tr) = 0; 743569Sgblack@eecs.umich.edu virtual Sequencer* getSequencer() const = 0; 753569Sgblack@eecs.umich.edu 763804Ssaidi@eecs.umich.edu //! These functions are used by ruby system to read/write the message 773804Ssaidi@eecs.umich.edu //! queues that exist with in the controller. 783826Ssaidi@eecs.umich.edu //! The boolean return value indicates if the read was performed 793804Ssaidi@eecs.umich.edu //! successfully. 803569Sgblack@eecs.umich.edu virtual bool functionalReadBuffers(PacketPtr&) = 0; 813569Sgblack@eecs.umich.edu //! The return value indicates the number of messages written with the 823804Ssaidi@eecs.umich.edu //! data from the packet. 833826Ssaidi@eecs.umich.edu virtual uint32_t functionalWriteBuffers(PacketPtr&) = 0; 843907Ssaidi@eecs.umich.edu 853826Ssaidi@eecs.umich.edu //! Function for enqueuing a prefetch request 863811Ssaidi@eecs.umich.edu virtual void enqueuePrefetch(const Address&, const RubyRequestType&) 873836Ssaidi@eecs.umich.edu { fatal("Prefetches not implemented!");} 883915Ssaidi@eecs.umich.edu 893907Ssaidi@eecs.umich.edu public: 903881Ssaidi@eecs.umich.edu MachineID getMachineID() const { return m_machineID; } 913881Ssaidi@eecs.umich.edu uint64_t getFullyBusyCycles() const { return m_fully_busy_cycles; } 923881Ssaidi@eecs.umich.edu uint64_t getRequestCount() const { return m_request_count; } 933881Ssaidi@eecs.umich.edu const std::map<std::string, uint64_t>& getRequestProfileMap() const 943907Ssaidi@eecs.umich.edu { return m_requestProfileMap; } 953881Ssaidi@eecs.umich.edu 963881Ssaidi@eecs.umich.edu Histogram& getDelayHist() { return m_delayHistogram; } 973881Ssaidi@eecs.umich.edu Histogram& getDelayVCHist(uint32_t index) 983881Ssaidi@eecs.umich.edu { return m_delayVCHistogram[index]; } 993881Ssaidi@eecs.umich.edu 1003907Ssaidi@eecs.umich.edu MessageBuffer *getPeerQueue(uint32_t pid) 1013907Ssaidi@eecs.umich.edu { 1023907Ssaidi@eecs.umich.edu std::map<uint32_t, MessageBuffer *>::iterator it = 1033907Ssaidi@eecs.umich.edu peerQueueMap.find(pid); 1043907Ssaidi@eecs.umich.edu assert(it != peerQueueMap.end()); 1053907Ssaidi@eecs.umich.edu return (*it).second; 1063907Ssaidi@eecs.umich.edu } 1073907Ssaidi@eecs.umich.edu 1083907Ssaidi@eecs.umich.edu protected: 1093907Ssaidi@eecs.umich.edu //! Profiles original cache requests including PUTs 1103907Ssaidi@eecs.umich.edu void profileRequest(const std::string &request); 1113907Ssaidi@eecs.umich.edu //! Profiles the delay associated with messages. 1123907Ssaidi@eecs.umich.edu void profileMsgDelay(uint32_t virtualNetwork, Cycles delay); 1133907Ssaidi@eecs.umich.edu 1143907Ssaidi@eecs.umich.edu //! Function for connecting peer controllers 1153907Ssaidi@eecs.umich.edu void connectWithPeer(AbstractController *); 1163907Ssaidi@eecs.umich.edu virtual void getQueuesFromPeer(AbstractController *) 1173907Ssaidi@eecs.umich.edu { fatal("getQueuesFromPeer() should be called only if implemented!"); } 1183907Ssaidi@eecs.umich.edu 1193907Ssaidi@eecs.umich.edu protected: 1203907Ssaidi@eecs.umich.edu int m_transitions_per_cycle; 1213907Ssaidi@eecs.umich.edu int m_buffer_size; 1223907Ssaidi@eecs.umich.edu Cycles m_recycle_latency; 1233881Ssaidi@eecs.umich.edu std::string m_name; 1243881Ssaidi@eecs.umich.edu NodeID m_version; 1253881Ssaidi@eecs.umich.edu Network* m_net_ptr; 1263881Ssaidi@eecs.umich.edu MachineID m_machineID; 1273881Ssaidi@eecs.umich.edu bool m_is_blocking; 1283881Ssaidi@eecs.umich.edu std::map<Address, MessageBuffer*> m_block_map; 1293881Ssaidi@eecs.umich.edu typedef std::vector<MessageBuffer*> MsgVecType; 1303881Ssaidi@eecs.umich.edu typedef std::map< Address, MsgVecType* > WaitingBufType; 1313881Ssaidi@eecs.umich.edu WaitingBufType m_waiting_buffers; 1323881Ssaidi@eecs.umich.edu int m_max_in_port_rank; 1333881Ssaidi@eecs.umich.edu int m_cur_in_port_rank; 1343881Ssaidi@eecs.umich.edu int m_number_of_TBEs; 1353907Ssaidi@eecs.umich.edu 1363811Ssaidi@eecs.umich.edu //! Map from physical network number to the Message Buffer. 1373826Ssaidi@eecs.umich.edu std::map<uint32_t, MessageBuffer*> peerQueueMap; 1383826Ssaidi@eecs.umich.edu 1393826Ssaidi@eecs.umich.edu //! Counter for the number of cycles when the transitions carried out 1403826Ssaidi@eecs.umich.edu //! were equal to the maximum allowed 1413881Ssaidi@eecs.umich.edu uint64_t m_fully_busy_cycles; 1423881Ssaidi@eecs.umich.edu 1433881Ssaidi@eecs.umich.edu //! Map for couting requests of different types. The controller should 1443881Ssaidi@eecs.umich.edu //! call requisite function for updating the count. 1453881Ssaidi@eecs.umich.edu std::map<std::string, uint64_t> m_requestProfileMap; 1463881Ssaidi@eecs.umich.edu uint64_t m_request_count; 1473881Ssaidi@eecs.umich.edu 1483881Ssaidi@eecs.umich.edu //! Histogram for profiling delay for the messages this controller 1493881Ssaidi@eecs.umich.edu //! cares for 1503881Ssaidi@eecs.umich.edu Histogram m_delayHistogram; 1513881Ssaidi@eecs.umich.edu std::vector<Histogram> m_delayVCHistogram; 1523881Ssaidi@eecs.umich.edu}; 1533881Ssaidi@eecs.umich.edu 1543881Ssaidi@eecs.umich.edu#endif // __MEM_RUBY_SLICC_INTERFACE_ABSTRACTCONTROLLER_HH__ 1553881Ssaidi@eecs.umich.edu