gem5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
AbstractController.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2009-2014 Mark D. Hill and David A. Wood
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are
7  * met: redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer;
9  * redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution;
12  * neither the name of the copyright holders nor the names of its
13  * contributors may be used to endorse or promote products derived from
14  * this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 #ifndef __MEM_RUBY_SLICC_INTERFACE_ABSTRACTCONTROLLER_HH__
30 #define __MEM_RUBY_SLICC_INTERFACE_ABSTRACTCONTROLLER_HH__
31 
32 #include <exception>
33 #include <iostream>
34 #include <string>
35 
36 #include "base/callback.hh"
37 #include "mem/protocol/AccessPermission.hh"
45 #include "mem/packet.hh"
46 #include "mem/qport.hh"
47 #include "params/RubyController.hh"
48 #include "mem/mem_object.hh"
49 
50 class Network;
51 class GPUCoalescer;
52 
53 // used to communicate that an in_port peeked the wrong message type
54 class RejectException: public std::exception
55 {
56  virtual const char* what() const throw()
57  { return "Port rejected message based on type"; }
58 };
59 
60 class AbstractController : public MemObject, public Consumer
61 {
62  public:
63  typedef RubyControllerParams Params;
64  AbstractController(const Params *p);
65  void init();
66  const Params *params() const { return (const Params *)_params; }
67 
68  NodeID getVersion() const { return m_machineID.getNum(); }
69  MachineType getType() const { return m_machineID.getType(); }
70 
71  void initNetworkPtr(Network* net_ptr) { m_net_ptr = net_ptr; }
72 
73  // return instance name
75  bool isBlocked(Addr) const;
76  void unblock(Addr);
77  bool isBlocked(Addr);
78 
79  virtual MessageBuffer* getMandatoryQueue() const = 0;
80  virtual MessageBuffer* getMemoryQueue() const = 0;
81  virtual AccessPermission getAccessPermission(const Addr &addr) = 0;
82 
83  virtual void print(std::ostream & out) const = 0;
84  virtual void wakeup() = 0;
85  virtual void resetStats() = 0;
86  virtual void regStats();
87 
88  virtual void recordCacheTrace(int cntrl, CacheRecorder* tr) = 0;
89  virtual Sequencer* getCPUSequencer() const = 0;
90  virtual GPUCoalescer* getGPUCoalescer() const = 0;
91 
94  virtual void functionalRead(const Addr &addr, PacketPtr) = 0;
98  virtual int functionalWriteBuffers(PacketPtr&) = 0;
99  virtual int functionalWrite(const Addr &addr, PacketPtr) = 0;
101 
103  virtual void enqueuePrefetch(const Addr &, const RubyRequestType&)
104  { fatal("Prefetches not implemented!");}
105 
109  virtual void collateStats()
110  {fatal("collateStats() should be overridden!");}
111 
113  virtual void initNetQueues() = 0;
114 
116  BaseMasterPort& getMasterPort(const std::string& if_name,
117  PortID idx = InvalidPortID);
118 
119  void queueMemoryRead(const MachineID &id, Addr addr, Cycles latency);
120  void queueMemoryWrite(const MachineID &id, Addr addr, Cycles latency,
121  const DataBlock &block);
122  void queueMemoryWritePartial(const MachineID &id, Addr addr, Cycles latency,
123  const DataBlock &block, int size);
124  void recvTimingResp(PacketPtr pkt);
125 
126  public:
127  MachineID getMachineID() const { return m_machineID; }
128 
131  { return *(m_delayVCHistogram[index]); }
132 
133  protected:
135  void profileRequest(const std::string &request);
137  void profileMsgDelay(uint32_t virtualNetwork, Cycles delay);
138 
139  void stallBuffer(MessageBuffer* buf, Addr addr);
140  void wakeUpBuffers(Addr addr);
141  void wakeUpAllBuffers(Addr addr);
142  void wakeUpAllBuffers();
143 
144  protected:
148 
149  // MasterID used by some components of gem5.
151 
154  std::map<Addr, MessageBuffer*> m_block_map;
155 
157  typedef std::set<MessageBuffer*> MsgBufType;
158  typedef std::map<Addr, MsgVecType* > WaitingBufType;
160 
161  unsigned int m_in_ports;
162  unsigned int m_cur_in_port;
163  const int m_number_of_TBEs;
165  const unsigned int m_buffer_size;
167 
171 
176 
179  class StatsCallback : public Callback
180  {
181  private:
183 
184  public:
185  virtual ~StatsCallback() {}
187  void process() {ctr->collateStats();}
188  };
189 
195  {
196  private:
197  // Packet queues used to store outgoing requests and snoop responses.
200 
201  // Controller that operates this port.
203 
204  public:
205  MemoryPort(const std::string &_name, AbstractController *_controller,
206  const std::string &_label);
207 
208  // Function for receiving a timing response from the peer port.
209  // Currently the pkt is handed to the coherence controller
210  // associated with this port.
211  bool recvTimingResp(PacketPtr pkt);
212  };
213 
214  /* Master port to the memory controller. */
216 
217  // State that is stored in packets sent to the memory controller.
219  {
220  // Id of the machine from which the request originated.
222 
224  {}
225  };
226 };
227 
228 #endif // __MEM_RUBY_SLICC_INTERFACE_ABSTRACTCONTROLLER_HH__
std::map< Addr, MsgVecType * > WaitingBufType
bool recvTimingResp(PacketPtr pkt)
Receive a timing response from the slave port.
virtual MessageBuffer * getMemoryQueue() const =0
Bitfield< 30, 0 > index
WaitingBufType m_waiting_buffers
Cycles is a wrapper class for representing cycle counts, i.e.
Definition: types.hh:83
Generic callback class.
Definition: callback.hh:41
const unsigned int m_buffer_size
const PortID InvalidPortID
Definition: types.hh:182
MachineType getType() const
Definition: MachineID.hh:48
void recvTimingResp(PacketPtr pkt)
virtual void regStats()
Register statistics for this object.
AbstractController(const Params *p)
The QueuedMasterPort combines two queues, a request queue and a snoop response queue, that both share the same port.
Definition: qport.hh:107
ip6_addr_t addr
Definition: inet.hh:335
MemObject declaration.
std::map< Addr, MessageBuffer * > m_block_map
virtual void enqueuePrefetch(const Addr &, const RubyRequestType &)
Function for enqueuing a prefetch request.
virtual void functionalRead(const Addr &addr, PacketPtr)=0
These functions are used by ruby system to read/write the data blocks that exist with in the controll...
std::set< MessageBuffer * > MsgBufType
void queueMemoryRead(const MachineID &id, Addr addr, Cycles latency)
std::vector< MessageBuffer * > MsgVecType
void init()
init() is called after all C++ SimObjects have been created and all ports are connected.
virtual void recordCacheTrace(int cntrl, CacheRecorder *tr)=0
virtual void print(std::ostream &out) const =0
virtual void initNetQueues()=0
Initialize the message buffers.
This is a simple scalar statistic, like a counter.
Definition: statistics.hh:2475
Port that forwards requests and receives responses from the memory controller.
void process()
virtual process function that is invoked when the callback queue is executed.
MachineID getMachineID() const
bool isBlocked(Addr) const
RubyControllerParams Params
unsigned int NodeID
Definition: TypeDefines.hh:34
void queueMemoryWrite(const MachineID &id, Addr addr, Cycles latency, const DataBlock &block)
Declaration of the queued port.
virtual void wakeup()=0
Callback class used for collating statistics from all the controller of this type.
virtual MessageBuffer * getMandatoryQueue() const =0
virtual void resetStats()=0
Reset statistics associated with this object.
MachineType getType() const
std::vector< Stats::Histogram * > m_delayVCHistogram
virtual int functionalWriteBuffers(PacketPtr &)=0
The return value indicates the number of messages written with the data from the packet.
void profileRequest(const std::string &request)
Profiles original cache requests including PUTs.
Stats::Histogram & getDelayVCHist(uint32_t index)
#define fatal(...)
Definition: misc.hh:163
A simple histogram stat.
Definition: statistics.hh:2551
int functionalMemoryWrite(PacketPtr)
virtual void collateStats()
Function for collating statistics from all the controllers of this particular type.
MemObjectParams Params
Definition: mem_object.hh:63
void profileMsgDelay(uint32_t virtualNetwork, Cycles delay)
Profiles the delay associated with messages.
Stats::Scalar m_fully_busy_cycles
Counter for the number of cycles when the transitions carried out were equal to the maximum allowed...
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:142
uint16_t MasterID
Definition: request.hh:85
A Packet is used to encapsulate a transfer between two objects in the memory system (e...
Definition: packet.hh:245
A virtual base opaque structure used to hold state associated with the packet (e.g., an MSHR), specific to a MemObject that sees the packet.
Definition: packet.hh:377
void blockOnQueue(Addr, MessageBuffer *)
virtual Sequencer * getCPUSequencer() const =0
int size()
Definition: pagetable.hh:146
Declaration of the Packet class.
MemoryPort(const std::string &_name, AbstractController *_controller, const std::string &_label)
void wakeUpBuffers(Addr addr)
const Params * params() const
The MemObject class extends the ClockedObject with accessor functions to get its master and slave por...
Definition: mem_object.hh:60
virtual AccessPermission getAccessPermission(const Addr &addr)=0
A BaseMasterPort is a protocol-agnostic master port, responsible only for the structural connection t...
Definition: port.hh:115
void queueMemoryWritePartial(const MachineID &id, Addr addr, Cycles latency, const DataBlock &block, int size)
Stats::Histogram & getDelayHist()
const SimObjectParams * _params
Cached copy of the object parameters.
Definition: sim_object.hh:107
void stallBuffer(MessageBuffer *buf, Addr addr)
virtual GPUCoalescer * getGPUCoalescer() const =0
StatsCallback(AbstractController *_ctr)
const MasterID m_masterId
virtual int functionalWrite(const Addr &addr, PacketPtr)=0
int16_t PortID
Port index/ID type, and a symbolic name for an invalid port id.
Definition: types.hh:181
NodeID getNum() const
Definition: MachineID.hh:49
void initNetworkPtr(Network *net_ptr)
void functionalMemoryRead(PacketPtr)
Bitfield< 0 > p
virtual const char * what() const
NodeID getVersion() const
Stats::Histogram m_delayHistogram
Histogram for profiling delay for the messages this controller cares for.
BaseMasterPort & getMasterPort(const std::string &if_name, PortID idx=InvalidPortID)
A function used to return the port associated with this bus object.

Generated on Fri Jun 9 2017 13:03:50 for gem5 by doxygen 1.8.6