gem5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
port.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2012,2015 ARM Limited
3  * All rights reserved
4  *
5  * The license below extends only to copyright in the software and shall
6  * not be construed as granting a license to any other intellectual
7  * property including but not limited to intellectual property relating
8  * to a hardware implementation of the functionality of the software
9  * licensed hereunder. You may use the software subject to the license
10  * terms below provided that you ensure that this notice is replicated
11  * unmodified and in its entirety in all distributions of the software,
12  * modified or unmodified, in source code or in binary form.
13  *
14  * Copyright (c) 2002-2005 The Regents of The University of Michigan
15  * All rights reserved.
16  *
17  * Redistribution and use in source and binary forms, with or without
18  * modification, are permitted provided that the following conditions are
19  * met: redistributions of source code must retain the above copyright
20  * notice, this list of conditions and the following disclaimer;
21  * redistributions in binary form must reproduce the above copyright
22  * notice, this list of conditions and the following disclaimer in the
23  * documentation and/or other materials provided with the distribution;
24  * neither the name of the copyright holders nor the names of its
25  * contributors may be used to endorse or promote products derived from
26  * this software without specific prior written permission.
27  *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
31  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
32  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
33  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
34  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
36  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
37  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
38  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39  *
40  * Authors: Steve Reinhardt
41  * Andreas Hansson
42  * William Wang
43  */
44 
49 #include "mem/port.hh"
50 
51 #include "base/trace.hh"
52 #include "mem/mem_object.hh"
53 
54 Port::Port(const std::string &_name, MemObject& _owner, PortID _id)
55  : portName(_name), id(_id), owner(_owner)
56 {
57 }
58 
60 {
61 }
62 
63 BaseMasterPort::BaseMasterPort(const std::string& name, MemObject* owner,
64  PortID _id)
65  : Port(name, *owner, _id), _baseSlavePort(NULL)
66 {
67 }
68 
70 {
71 }
72 
75 {
76  if (_baseSlavePort == NULL)
77  panic("Cannot getSlavePort on master port %s that is not connected\n",
78  name());
79 
80  return *_baseSlavePort;
81 }
82 
83 bool
85 {
86  return _baseSlavePort != NULL;
87 }
88 
89 BaseSlavePort::BaseSlavePort(const std::string& name, MemObject* owner,
90  PortID _id)
91  : Port(name, *owner, _id), _baseMasterPort(NULL)
92 {
93 }
94 
96 {
97 }
98 
101 {
102  if (_baseMasterPort == NULL)
103  panic("Cannot getMasterPort on slave port %s that is not connected\n",
104  name());
105 
106  return *_baseMasterPort;
107 }
108 
109 bool
111 {
112  return _baseMasterPort != NULL;
113 }
114 
118 MasterPort::MasterPort(const std::string& name, MemObject* owner, PortID _id)
119  : BaseMasterPort(name, owner, _id), _slavePort(NULL)
120 {
121 }
122 
124 {
125 }
126 
127 void
129 {
130  // bind on the level of the base ports
131  _baseSlavePort = &slave_port;
132 
133  // also attempt to base the slave to the appropriate type
134  SlavePort* cast_slave_port = dynamic_cast<SlavePort*>(&slave_port);
135 
136  // if this port is compatible, then proceed with the binding
137  if (cast_slave_port != NULL) {
138  // master port keeps track of the slave port
139  _slavePort = cast_slave_port;
140  // slave port also keeps track of master port
141  _slavePort->bind(*this);
142  } else {
143  fatal("Master port %s cannot bind to %s\n", name(),
144  slave_port.name());
145  }
146 }
147 
148 void
150 {
151  if (_slavePort == NULL)
152  panic("Attempting to unbind master port %s that is not connected\n",
153  name());
154  _slavePort->unbind();
155  _slavePort = NULL;
156  _baseSlavePort = NULL;
157 }
158 
161 {
162  return _slavePort->getAddrRanges();
163 }
164 
165 Tick
167 {
168  assert(pkt->isRequest());
169  return _slavePort->recvAtomic(pkt);
170 }
171 
172 void
174 {
175  assert(pkt->isRequest());
176  return _slavePort->recvFunctional(pkt);
177 }
178 
179 bool
181 {
182  assert(pkt->isRequest());
183  return _slavePort->recvTimingReq(pkt);
184 }
185 
186 bool
188 {
189  assert(pkt->isResponse());
190  return _slavePort->recvTimingSnoopResp(pkt);
191 }
192 
193 void
195 {
197 }
198 
199 void
201 {
202  Request req(a, 1, 0, Request::funcMasterId);
203  Packet pkt(&req, MemCmd::PrintReq);
204  Packet::PrintReqState prs(std::cerr);
205  pkt.senderState = &prs;
206 
207  sendFunctional(&pkt);
208 }
209 
213 SlavePort::SlavePort(const std::string& name, MemObject* owner, PortID id)
214  : BaseSlavePort(name, owner, id), _masterPort(NULL)
215 {
216 }
217 
219 {
220 }
221 
222 void
224 {
225  _baseMasterPort = NULL;
226  _masterPort = NULL;
227 }
228 
229 void
231 {
232  _baseMasterPort = &master_port;
233  _masterPort = &master_port;
234 }
235 
236 Tick
238 {
239  assert(pkt->isRequest());
240  return _masterPort->recvAtomicSnoop(pkt);
241 }
242 
243 void
245 {
246  assert(pkt->isRequest());
247  return _masterPort->recvFunctionalSnoop(pkt);
248 }
249 
250 bool
252 {
253  assert(pkt->isResponse());
254  return _masterPort->recvTimingResp(pkt);
255 }
256 
257 void
259 {
260  assert(pkt->isRequest());
262 }
263 
264 void
266 {
268 }
269 
270 void
272 {
274 }
A MasterPort is a specialisation of a BaseMasterPort, which implements the default protocol for the t...
Definition: port.hh:167
This master id is used for functional requests that don't come from a particular device.
Definition: request.hh:201
Ports are used to interface memory objects to each other.
Definition: port.hh:63
virtual void recvTimingSnoopReq(PacketPtr pkt)
Receive a timing snoop request from the slave port.
Definition: port.hh:293
const std::string & name()
Definition: trace.cc:49
Port(const std::string &_name, MemObject &_owner, PortID _id)
Abstract base class for ports.
Definition: port.cc:54
virtual void recvRespRetry()=0
Called by the master port if sendTimingResp was called on this slave port (causing recvTimingResp to ...
#define panic(...)
Definition: misc.hh:153
Object used to maintain state of a PrintReq.
Definition: packet.hh:388
const std::string name() const
Return port name (for DPRINTF).
Definition: port.hh:99
bool sendTimingSnoopResp(PacketPtr pkt)
Attempt to send a timing snoop response packet to the slave port by calling its corresponding receive...
Definition: port.cc:187
void bind(MasterPort &master_port)
Called by the master port to bind.
Definition: port.cc:230
Bitfield< 8 > a
Definition: miscregs.hh:1377
Tick sendAtomicSnoop(PacketPtr pkt)
Send an atomic snoop request packet, where the data is moved and the state is updated in zero time...
Definition: port.cc:237
MemObject declaration.
virtual void recvFunctional(PacketPtr pkt)=0
Receive a functional request packet from the master port.
void sendFunctionalSnoop(PacketPtr pkt)
Send a functional snoop request packet, where the data is instantly updated everywhere in the memory ...
Definition: port.cc:244
Port Object Declaration.
BaseSlavePort * _baseSlavePort
Definition: port.hh:120
bool sendTimingReq(PacketPtr pkt)
Attempt to send a timing request to the slave port by calling its corresponding receive function...
Definition: port.cc:180
A SlavePort is a specialisation of a port.
Definition: port.hh:331
virtual void sendRetryResp()
Send a retry to the slave port that previously attempted a sendTimingResp to this master port and fai...
Definition: port.cc:194
MasterPort * _masterPort
Definition: port.hh:338
virtual Tick recvAtomic(PacketPtr pkt)=0
Receive an atomic request packet from the master port.
bool isRequest() const
Definition: packet.hh:505
void sendRetrySnoopResp()
Send a retry to the master port that previously attempted a sendTimingSnoopResp to this slave port an...
Definition: port.cc:271
A BaseSlavePort is a protocol-agnostic slave port, responsible only for the structural connection to ...
Definition: port.hh:139
virtual bool recvTimingResp(PacketPtr pkt)=0
Receive a timing response from the slave port.
virtual ~Port()
Virtual destructor due to inheritance.
Definition: port.cc:59
BaseMasterPort * _baseMasterPort
Definition: port.hh:144
SlavePort * _slavePort
Definition: port.hh:174
virtual ~SlavePort()
Definition: port.cc:218
bool sendTimingResp(PacketPtr pkt)
Attempt to send a timing response to the master port by calling its corresponding receive function...
Definition: port.cc:251
void unbind()
Unbind this master port and the associated slave port.
Definition: port.cc:149
virtual void recvReqRetry()=0
Called by the slave port if sendTimingReq was called on this master port (causing recvTimingReq to be...
virtual void recvFunctionalSnoop(PacketPtr pkt)
Receive a functional snoop request packet from the slave port.
Definition: port.hh:280
uint64_t Tick
Tick count type.
Definition: types.hh:63
#define fatal(...)
Definition: misc.hh:163
virtual void recvRetrySnoopResp()
Called by the slave port if sendTimingSnoopResp was called on this master port (causing recvTimingSno...
Definition: port.hh:310
virtual ~BaseMasterPort()
Definition: port.cc:69
void unbind()
Called by the master port to unbind.
Definition: port.cc:223
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:142
void printAddr(Addr a)
Inject a PrintReq for the given address to print the state of that address throughout the memory syst...
Definition: port.cc:200
A Packet is used to encapsulate a transfer between two objects in the memory system (e...
Definition: packet.hh:245
BaseSlavePort(const std::string &name, MemObject *owner, PortID id=InvalidPortID)
Definition: port.cc:89
BaseMasterPort & getMasterPort() const
Definition: port.cc:100
virtual ~MasterPort()
Definition: port.cc:123
bool isConnected() const
Definition: port.cc:84
virtual bool recvTimingReq(PacketPtr pkt)=0
Receive a timing request from the master port.
AddrRangeList getAddrRanges() const
Get the address ranges of the connected slave port.
Definition: port.cc:160
virtual AddrRangeList getAddrRanges() const =0
Get a list of the non-overlapping address ranges the owner is responsible for.
void sendRetryReq()
Send a retry to the master port that previously attempted a sendTimingReq to this slave port and fail...
Definition: port.cc:265
SenderState * senderState
This packet's sender state.
Definition: packet.hh:454
The MemObject class extends the ClockedObject with accessor functions to get its master and slave por...
Definition: mem_object.hh:60
A BaseMasterPort is a protocol-agnostic master port, responsible only for the structural connection t...
Definition: port.hh:115
SlavePort(const std::string &name, MemObject *owner, PortID id=InvalidPortID)
Slave port.
Definition: port.cc:213
bool isConnected() const
Definition: port.cc:110
void sendTimingSnoopReq(PacketPtr pkt)
Attempt to send a timing snoop request packet to the master port by calling its corresponding receive...
Definition: port.cc:258
void bind(BaseSlavePort &slave_port)
Bind this master port to a slave port.
Definition: port.cc:128
BaseSlavePort & getSlavePort() const
Definition: port.cc:74
virtual Tick recvAtomicSnoop(PacketPtr pkt)
Receive an atomic snoop request packet from the slave port.
Definition: port.hh:271
int16_t PortID
Port index/ID type, and a symbolic name for an invalid port id.
Definition: types.hh:181
Bitfield< 11 > id
Definition: miscregs.hh:124
Tick sendAtomic(PacketPtr pkt)
Send an atomic request packet, where the data is moved and the state is updated in zero time...
Definition: port.cc:166
MasterPort(const std::string &name, MemObject *owner, PortID id=InvalidPortID)
Master port.
Definition: port.cc:118
BaseMasterPort(const std::string &name, MemObject *owner, PortID id=InvalidPortID)
Definition: port.cc:63
virtual bool recvTimingSnoopResp(PacketPtr pkt)
Receive a timing snoop response from the master port.
Definition: port.hh:457
void sendFunctional(PacketPtr pkt)
Send a functional request packet, where the data is instantly updated everywhere in the memory system...
Definition: port.cc:173
bool isResponse() const
Definition: packet.hh:506
virtual ~BaseSlavePort()
Definition: port.cc:95

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