gem5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
dep_graph.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2012 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) 2006 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: Kevin Lim
41  */
42 
43 #ifndef __CPU_O3_DEP_GRAPH_HH__
44 #define __CPU_O3_DEP_GRAPH_HH__
45 
46 #include "cpu/o3/comm.hh"
47 
49 template <class DynInstPtr>
51 {
52  public:
54  : inst(NULL), next(NULL)
55  { }
56 
57  DynInstPtr inst;
58  //Might want to include data about what arch. register the
59  //dependence is waiting on.
61 };
62 
72 template <class DynInstPtr>
74 {
75  public:
77 
81  { }
82 
84 
86  void resize(int num_entries);
87 
89  void reset();
90 
92  void insert(PhysRegIndex idx, DynInstPtr &new_inst);
93 
95  void setInst(PhysRegIndex idx, DynInstPtr &new_inst)
96  { dependGraph[idx].inst = new_inst; }
97 
100  { dependGraph[idx].inst = NULL; }
101 
103  void remove(PhysRegIndex idx, DynInstPtr &inst_to_remove);
104 
106  DynInstPtr pop(PhysRegIndex idx);
107 
109  bool empty() const;
110 
112  bool empty(PhysRegIndex idx) const { return !dependGraph[idx].next; }
113 
116  void dump();
117 
118  private:
126 
129 
130  // Debug variable, remove when done testing.
131  unsigned memAllocCounter;
132 
133  public:
134  // Debug variable, remove when done testing.
135  uint64_t nodesTraversed;
136  // Debug variable, remove when done testing.
137  uint64_t nodesRemoved;
138 };
139 
140 template <class DynInstPtr>
142 {
143  delete [] dependGraph;
144 }
145 
146 template <class DynInstPtr>
147 void
149 {
150  numEntries = num_entries;
151  dependGraph = new DepEntry[numEntries];
152 }
153 
154 template <class DynInstPtr>
155 void
157 {
158  // Clear the dependency graph
159  DepEntry *curr;
160  DepEntry *prev;
161 
162  for (int i = 0; i < numEntries; ++i) {
163  curr = dependGraph[i].next;
164 
165  while (curr) {
166  memAllocCounter--;
167 
168  prev = curr;
169  curr = prev->next;
170  prev->inst = NULL;
171 
172  delete prev;
173  }
174 
175  if (dependGraph[i].inst) {
176  dependGraph[i].inst = NULL;
177  }
178 
179  dependGraph[i].next = NULL;
180  }
181 }
182 
183 template <class DynInstPtr>
184 void
186 {
187  //Add this new, dependent instruction at the head of the dependency
188  //chain.
189 
190  // First create the entry that will be added to the head of the
191  // dependency chain.
192  DepEntry *new_entry = new DepEntry;
193  new_entry->next = dependGraph[idx].next;
194  new_entry->inst = new_inst;
195 
196  // Then actually add it to the chain.
197  dependGraph[idx].next = new_entry;
198 
199  ++memAllocCounter;
200 }
201 
202 
203 template <class DynInstPtr>
204 void
206  DynInstPtr &inst_to_remove)
207 {
208  DepEntry *prev = &dependGraph[idx];
209  DepEntry *curr = dependGraph[idx].next;
210 
211  // Make sure curr isn't NULL. Because this instruction is being
212  // removed from a dependency list, it must have been placed there at
213  // an earlier time. The dependency chain should not be empty,
214  // unless the instruction dependent upon it is already ready.
215  if (curr == NULL) {
216  return;
217  }
218 
219  nodesRemoved++;
220 
221  // Find the instruction to remove within the dependency linked list.
222  while (curr->inst != inst_to_remove) {
223  prev = curr;
224  curr = curr->next;
225  nodesTraversed++;
226 
227  assert(curr != NULL);
228  }
229 
230  // Now remove this instruction from the list.
231  prev->next = curr->next;
232 
233  --memAllocCounter;
234 
235  // Could push this off to the destructor of DependencyEntry
236  curr->inst = NULL;
237 
238  delete curr;
239 }
240 
241 template <class DynInstPtr>
242 DynInstPtr
244 {
245  DepEntry *node;
246  node = dependGraph[idx].next;
247  DynInstPtr inst = NULL;
248  if (node) {
249  inst = node->inst;
250  dependGraph[idx].next = node->next;
251  node->inst = NULL;
252  memAllocCounter--;
253  delete node;
254  }
255  return inst;
256 }
257 
258 template <class DynInstPtr>
259 bool
261 {
262  for (int i = 0; i < numEntries; ++i) {
263  if (!empty(i))
264  return false;
265  }
266  return true;
267 }
268 
269 template <class DynInstPtr>
270 void
272 {
273  DepEntry *curr;
274 
275  for (int i = 0; i < numEntries; ++i)
276  {
277  curr = &dependGraph[i];
278 
279  if (curr->inst) {
280  cprintf("dependGraph[%i]: producer: %s [sn:%lli] consumer: ",
281  i, curr->inst->pcState(), curr->inst->seqNum);
282  } else {
283  cprintf("dependGraph[%i]: No producer. consumer: ", i);
284  }
285 
286  while (curr->next != NULL) {
287  curr = curr->next;
288 
289  cprintf("%s [sn:%lli] ",
290  curr->inst->pcState(), curr->inst->seqNum);
291  }
292 
293  cprintf("\n");
294  }
295  cprintf("memAllocCounter: %i\n", memAllocCounter);
296 }
297 
298 #endif // __CPU_O3_DEP_GRAPH_HH__
DependencyEntry< DynInstPtr > * next
Definition: dep_graph.hh:60
void reset()
Clears all of the linked lists.
Definition: dep_graph.hh:156
void remove(PhysRegIndex idx, DynInstPtr &inst_to_remove)
Removes an instruction from a single linked list.
Definition: dep_graph.hh:205
Bitfield< 7 > i
Definition: miscregs.hh:1378
Node in a linked list.
Definition: dep_graph.hh:50
uint64_t nodesRemoved
Definition: dep_graph.hh:137
DependencyGraph()
Default construction.
Definition: dep_graph.hh:79
void insert(PhysRegIndex idx, DynInstPtr &new_inst)
Inserts an instruction to be dependent on the given index.
Definition: dep_graph.hh:185
void clearInst(PhysRegIndex idx)
Clears the producing instruction.
Definition: dep_graph.hh:99
void resize(int num_entries)
Resize the dependency graph to have num_entries registers.
Definition: dep_graph.hh:148
Array of linked list that maintains the dependencies between producing instructions and consuming ins...
Definition: dep_graph.hh:73
DepEntry * dependGraph
Array of linked lists.
Definition: dep_graph.hh:125
bool empty(PhysRegIndex idx) const
Checks if there are any dependents on a specific register.
Definition: dep_graph.hh:112
DependencyEntry< DynInstPtr > DepEntry
Definition: dep_graph.hh:76
int numEntries
Number of linked lists; identical to the number of registers.
Definition: dep_graph.hh:128
bool empty() const
Checks if the entire dependency graph is empty.
Definition: dep_graph.hh:260
void dump()
Debugging function to dump out the dependency graph.
Definition: dep_graph.hh:271
unsigned memAllocCounter
Definition: dep_graph.hh:131
short int PhysRegIndex
Definition: comm.hh:57
uint64_t nodesTraversed
Definition: dep_graph.hh:135
DynInstPtr inst
Definition: dep_graph.hh:57
DynInstPtr pop(PhysRegIndex idx)
Removes and returns the newest dependent of a specific register.
Definition: dep_graph.hh:243
void setInst(PhysRegIndex idx, DynInstPtr &new_inst)
Sets the producing instruction of a given register.
Definition: dep_graph.hh:95
void cprintf(const char *format, const Args &...args)
Definition: cprintf.hh:155

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