gem5  v21.0.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
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 
44 // TriggerQueue helper class is used keep a list of events that trigger the
45 // actions that need to be executed before an ouststanding transaction
46 // completes in the CHI protocol. When a transaction no longer has pending
47 // respose or data messages, this queue is checked and the event at the head
48 // of the queue is triggered. If the queue is empty, the transactions is
49 // finalized. Events can be marked as NB (non-blocking). NB are triggered by
50 // the protocol even if the transactions has pending data/responses.
51 
52 template<typename T>
54 {
55  private:
56  struct ValType {
57  T val;
59  };
61 
62  public:
63  // Returns the head of the queue
64  const T& front() const { return queue.front().val; }
65 
66  // Returns the head of the queue
67  // NOTE: SLICC won't allow to reuse front() or different
68  // values of the template parameter, thus we use an additional
69  // def. to workaround that
70  const T& next() const { return queue.front().val; }
71 
72  // Returns the end of the queue
73  const T& back() const { return queue.back().val; }
74 
75  // Is the head event non-blocking ?
76  bool frontNB() const { return queue.front().non_blocking; }
77 
78  // Is the last event non-blocking ?
79  bool backNB() const { return queue.back().non_blocking; }
80 
81  // Is the queue empty ?
82  bool empty() const { return queue.empty(); }
83 
84  // put an event at the end of the queue
85  void push(const T &elem) { queue.push_back({elem,false}); }
86 
87  // emplace an event at the end of the queue
88  template<typename... Ts>
89  void
90  emplace(Ts&&... args)
91  {
92  queue.push_back({T(std::forward<Ts>(args)...),false});
93  }
94 
95  // put an event at the head of the queue
96  void pushFront(const T &elem) { queue.push_front({elem,false}); }
97 
98  // put a non-blocking event at the end of the queue
99  void pushNB(const T &elem) { queue.push_back({elem,true}); }
100 
101  // put a non-blocking event at the head of the queue
102  void pushFrontNB(const T &elem) { queue.push_front({elem,true}); }
103 
104  // pop the head of the queue
105  void pop() { queue.pop_front(); }
106 
107  void print(std::ostream& out) const;
108 };
109 
110 template<class T>
111 inline std::ostream&
112 operator<<(std::ostream& out, const TriggerQueue<T>& obj)
113 {
114  obj.print(out);
115  out << std::flush;
116  return out;
117 }
118 
119 template<class T>
120 inline void
121 TriggerQueue<T>::print(std::ostream& out) const
122 {
123 }
124 
125 #endif // __MEM_RUBY_COMMON_QUEUE_HH__
TriggerQueue::pushFront
void pushFront(const T &elem)
Definition: TriggerQueue.hh:96
TriggerQueue::print
void print(std::ostream &out) const
Definition: TriggerQueue.hh:121
TriggerQueue::ValType::non_blocking
bool non_blocking
Definition: TriggerQueue.hh:58
TriggerQueue::push
void push(const T &elem)
Definition: TriggerQueue.hh:85
TriggerQueue::pushNB
void pushNB(const T &elem)
Definition: TriggerQueue.hh:99
operator<<
std::ostream & operator<<(std::ostream &out, const TriggerQueue< T > &obj)
Definition: TriggerQueue.hh:112
TriggerQueue::next
const T & next() const
Definition: TriggerQueue.hh:70
TriggerQueue::empty
bool empty() const
Definition: TriggerQueue.hh:82
TriggerQueue::front
const T & front() const
Definition: TriggerQueue.hh:64
TriggerQueue::pop
void pop()
Definition: TriggerQueue.hh:105
TriggerQueue::ValType::val
T val
Definition: TriggerQueue.hh:57
TriggerQueue::frontNB
bool frontNB() const
Definition: TriggerQueue.hh:76
TriggerQueue::back
const T & back() const
Definition: TriggerQueue.hh:73
TriggerQueue::emplace
void emplace(Ts &&... args)
Definition: TriggerQueue.hh:90
TriggerQueue::backNB
bool backNB() const
Definition: TriggerQueue.hh:79
TriggerQueue::ValType
Definition: TriggerQueue.hh:56
TriggerQueue
Definition: TriggerQueue.hh:53
std::deque
STL deque class.
Definition: stl.hh:44
TriggerQueue::queue
std::deque< ValType > queue
Definition: TriggerQueue.hh:60
TriggerQueue::pushFrontNB
void pushFrontNB(const T &elem)
Definition: TriggerQueue.hh:102

Generated on Tue Mar 23 2021 19:41:28 for gem5 by doxygen 1.8.17