gem5  v22.1.0.0
thread_bridge.cc
Go to the documentation of this file.
1 /*
2  * Copyright 2022 Google, LLC
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met: redistributions of source code must retain the above copyright
7  * notice, this list of conditions and the following disclaimer;
8  * redistributions in binary form must reproduce the above copyright
9  * notice, this list of conditions and the following disclaimer in the
10  * documentation and/or other materials provided with the distribution;
11  * neither the name of the copyright holders nor the names of its
12  * contributors may be used to endorse or promote products derived from
13  * this software without specific prior written permission.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 #include "mem/thread_bridge.hh"
29 
30 #include "base/trace.hh"
31 #include "sim/eventq.hh"
32 
33 namespace gem5
34 {
35 
36 ThreadBridge::ThreadBridge(const ThreadBridgeParams &p)
37  : SimObject(p), in_port_("in_port", *this), out_port_("out_port", *this)
38 {
39 }
40 
42  ThreadBridge &device)
43  : ResponsePort(name, &device), device_(device)
44 {
45 }
46 
49 {
50  return device_.out_port_.getAddrRanges();
51 }
52 
53 // TimingResponseProtocol
54 bool
56 {
57  panic("ThreadBridge only supports atomic/functional access.");
58 }
59 void
61 {
62  panic("ThreadBridge only supports atomic/functional access.");
63 }
64 
65 // AtomicResponseProtocol
66 Tick
68  MemBackdoorPtr &backdoor)
69 {
70  panic("ThreadBridge only supports atomic/functional access.");
71 }
72 Tick
74 {
75  EventQueue::ScopedMigration migrate(device_.eventQueue());
76  return device_.out_port_.sendAtomic(pkt);
77 }
78 
79 // FunctionalResponseProtocol
80 void
82 {
83  EventQueue::ScopedMigration migrate(device_.eventQueue());
84  device_.out_port_.sendFunctional(pkt);
85 }
86 
88  ThreadBridge &device)
89  : RequestPort(name, &device), device_(device)
90 {
91 }
92 
93 void
95 {
96  device_.in_port_.sendRangeChange();
97 }
98 
99 // TimingRequestProtocol
100 bool
102 {
103  panic("ThreadBridge only supports atomic/functional access.");
104 }
105 void
107 {
108  panic("ThreadBridge only supports atomic/functional access.");
109 }
110 
111 Port &
112 ThreadBridge::getPort(const std::string &if_name, PortID idx)
113 {
114  if (if_name == "in_port")
115  return in_port_;
116  if (if_name == "out_port")
117  return out_port_;
118  return SimObject::getPort(if_name, idx);
119 }
120 
121 } // namespace gem5
virtual std::string name() const
Definition: named.hh:47
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
Definition: packet.hh:294
Ports are used to interface objects to each other.
Definition: port.hh:62
A RequestPort is a specialisation of a Port, which implements the default protocol for the three diff...
Definition: port.hh:79
A ResponsePort is a specialization of a port.
Definition: port.hh:270
Abstract superclass for simulation objects.
Definition: sim_object.hh:148
bool recvTimingReq(PacketPtr pkt) override
Receive a timing request from the peer.
IncomingPort(const std::string &name, ThreadBridge &device)
Tick recvAtomic(PacketPtr pkt) override
Receive an atomic request packet from the peer.
void recvRespRetry() override
Called by the peer if sendTimingResp was called on this protocol (causing recvTimingResp to be called...
Tick recvAtomicBackdoor(PacketPtr pkt, MemBackdoorPtr &backdoor) override
Default implementations.
AddrRangeList getAddrRanges() const override
Get a list of the non-overlapping address ranges the owner is responsible for.
void recvFunctional(PacketPtr pkt) override
Receive a functional request packet from the peer.
OutgoingPort(const std::string &name, ThreadBridge &device)
bool recvTimingResp(PacketPtr pkt) override
Receive a timing response from the peer.
void recvRangeChange() override
Called to receive an address range change from the peer response port.
void recvReqRetry() override
Called by the peer if sendTimingReq was called on this peer (causing recvTimingReq to be called on th...
ThreadBridge(const ThreadBridgeParams &p)
IncomingPort in_port_
Port & getPort(const std::string &if_name, PortID idx=InvalidPortID) override
Get a port with a given name and index.
OutgoingPort out_port_
#define panic(...)
This implements a cprintf based panic() function.
Definition: logging.hh:178
virtual Port & getPort(const std::string &if_name, PortID idx=InvalidPortID)
Get a port with a given name and index.
Definition: sim_object.cc:126
Bitfield< 54 > p
Definition: pagetable.hh:70
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
int16_t PortID
Port index/ID type, and a symbolic name for an invalid port id.
Definition: types.hh:245
uint64_t Tick
Tick count type.
Definition: types.hh:58
const std::string & name()
Definition: trace.cc:49

Generated on Wed Dec 21 2022 10:22:39 for gem5 by doxygen 1.9.1