gem5 v24.0.0.0
Loading...
Searching...
No Matches
TriggerQueue.hh
Go to the documentation of this file.
1/*
2 * Copyright (c) 2021 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 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions are
16 * met: redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer;
18 * redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution;
21 * neither the name of the copyright holders nor the names of its
22 * contributors may be used to endorse or promote products derived from
23 * this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 */
37
38#ifndef __MEM_RUBY_COMMON_QUEUE_HH__
39#define __MEM_RUBY_COMMON_QUEUE_HH__
40
41#include <deque>
42#include <iostream>
43
44namespace gem5
45{
46
47namespace ruby
48{
49
50// TriggerQueue helper class is used keep a list of events that trigger the
51// actions that need to be executed before an ouststanding transaction
52// completes in the CHI protocol. When a transaction no longer has pending
53// respose or data messages, this queue is checked and the event at the head
54// of the queue is triggered. If the queue is empty, the transactions is
55// finalized. Events can be marked as NB (non-blocking). NB are triggered by
56// the protocol even if the transactions has pending data/responses.
57
58template<typename T>
60{
61 private:
62 struct ValType
63 {
64 T val;
66 };
68
69 public:
70 // Returns the head of the queue
71 const T& front() const { return queue.front().val; }
72
73 // Returns the head of the queue
74 // NOTE: SLICC won't allow to reuse front() or different
75 // values of the template parameter, thus we use an additional
76 // def. to workaround that
77 const T& next() const { return queue.front().val; }
78
79 // Returns the end of the queue
80 const T& back() const { return queue.back().val; }
81
82 // Is the head event non-blocking ?
83 bool frontNB() const { return queue.front().non_blocking; }
84
85 // Is the last event non-blocking ?
86 bool backNB() const { return queue.back().non_blocking; }
87
88 // Is the queue empty ?
89 bool empty() const { return queue.empty(); }
90
91 // put an event at the end of the queue
92 void push(const T &elem) { queue.push_back({elem,false}); }
93
94 // emplace an event at the end of the queue
95 template<typename... Ts>
96 void
97 emplace(Ts&&... args)
98 {
99 queue.push_back({T(std::forward<Ts>(args)...),false});
100 }
101
102 // put an event at the head of the queue
103 void pushFront(const T &elem) { queue.push_front({elem,false}); }
104
105 // put a non-blocking event at the end of the queue
106 void pushNB(const T &elem) { queue.push_back({elem,true}); }
107
108 // put a non-blocking event at the head of the queue
109 void pushFrontNB(const T &elem) { queue.push_front({elem,true}); }
110
111 // pop the head of the queue
112 void pop() { queue.pop_front(); }
113
114 void print(std::ostream& out) const;
115};
116
117template<class T>
118inline std::ostream&
119operator<<(std::ostream& out, const TriggerQueue<T>& obj)
120{
121 obj.print(out);
122 out << std::flush;
123 return out;
124}
125
126template<class T>
127inline void
128TriggerQueue<T>::print(std::ostream& out) const
129{
130}
131
132} // namespace ruby
133} // namespace gem5
134
135#endif // __MEM_RUBY_COMMON_QUEUE_HH__
const T & front() const
const T & next() const
std::deque< ValType > queue
void pushNB(const T &elem)
const T & back() const
void pushFrontNB(const T &elem)
void print(std::ostream &out) const
void pushFront(const T &elem)
void emplace(Ts &&... args)
void push(const T &elem)
STL deque class.
Definition stl.hh:44
std::ostream & operator<<(std::ostream &os, const BoolVec &myvector)
Definition BoolVec.cc:49
Copyright (c) 2024 - Pranith Kumar Copyright (c) 2020 Inria All rights reserved.
Definition binary32.hh:36

Generated on Tue Jun 18 2024 16:24:05 for gem5 by doxygen 1.11.0