diff options
author | Steve Reinhardt <steve.reinhardt@amd.com> | 2011-01-03 14:35:47 -0800 |
---|---|---|
committer | Steve Reinhardt <steve.reinhardt@amd.com> | 2011-01-03 14:35:47 -0800 |
commit | 89cf3f6e853e3d9a95536372ab78a4a11a8c6ad1 (patch) | |
tree | 21d17151b13183dbc225a93ef98e32fe45b804b0 /src/cpu | |
parent | 2f4c71968af8e0d2d72f4a2e8699921dcd1e0c77 (diff) | |
download | gem5-89cf3f6e853e3d9a95536372ab78a4a11a8c6ad1.tar.xz |
Move sched_list.hh and timebuf.hh from src/base to src/cpu.
These files really aren't general enough to belong in src/base.
This patch doesn't reorder include lines, leaving them unsorted
in many cases, but Nate's magic script will fix that up shortly.
--HG--
rename : src/base/sched_list.hh => src/cpu/sched_list.hh
rename : src/base/timebuf.hh => src/cpu/timebuf.hh
Diffstat (limited to 'src/cpu')
-rw-r--r-- | src/cpu/activity.cc | 2 | ||||
-rw-r--r-- | src/cpu/activity.hh | 2 | ||||
-rw-r--r-- | src/cpu/inorder/cpu.hh | 2 | ||||
-rw-r--r-- | src/cpu/inorder/first_stage.hh | 2 | ||||
-rw-r--r-- | src/cpu/inorder/pipeline_stage.hh | 2 | ||||
-rw-r--r-- | src/cpu/o3/commit.hh | 2 | ||||
-rw-r--r-- | src/cpu/o3/commit_impl.hh | 2 | ||||
-rw-r--r-- | src/cpu/o3/cpu.hh | 2 | ||||
-rw-r--r-- | src/cpu/o3/decode.hh | 2 | ||||
-rw-r--r-- | src/cpu/o3/fetch.hh | 2 | ||||
-rw-r--r-- | src/cpu/o3/fu_pool.hh | 2 | ||||
-rw-r--r-- | src/cpu/o3/iew.hh | 2 | ||||
-rw-r--r-- | src/cpu/o3/iew_impl.hh | 2 | ||||
-rw-r--r-- | src/cpu/o3/inst_queue.hh | 2 | ||||
-rw-r--r-- | src/cpu/o3/rename.hh | 2 | ||||
-rw-r--r-- | src/cpu/ozone/back_end.hh | 2 | ||||
-rw-r--r-- | src/cpu/ozone/cpu.hh | 2 | ||||
-rw-r--r-- | src/cpu/ozone/front_end.hh | 2 | ||||
-rw-r--r-- | src/cpu/ozone/inorder_back_end.hh | 2 | ||||
-rw-r--r-- | src/cpu/ozone/inst_queue.hh | 2 | ||||
-rw-r--r-- | src/cpu/ozone/lw_back_end.hh | 2 | ||||
-rw-r--r-- | src/cpu/sched_list.hh | 180 | ||||
-rw-r--r-- | src/cpu/timebuf.hh | 241 |
23 files changed, 442 insertions, 21 deletions
diff --git a/src/cpu/activity.cc b/src/cpu/activity.cc index a2a34edf9..9c9288c4d 100644 --- a/src/cpu/activity.cc +++ b/src/cpu/activity.cc @@ -30,7 +30,7 @@ #include <string> -#include "base/timebuf.hh" +#include "cpu/timebuf.hh" #include "cpu/activity.hh" using namespace std; diff --git a/src/cpu/activity.hh b/src/cpu/activity.hh index d75ff150e..8d3469c4e 100644 --- a/src/cpu/activity.hh +++ b/src/cpu/activity.hh @@ -31,7 +31,7 @@ #ifndef __CPU_ACTIVITY_HH__ #define __CPU_ACTIVITY_HH__ -#include "base/timebuf.hh" +#include "cpu/timebuf.hh" #include "base/trace.hh" /** diff --git a/src/cpu/inorder/cpu.hh b/src/cpu/inorder/cpu.hh index 65c822331..3b2041cfa 100644 --- a/src/cpu/inorder/cpu.hh +++ b/src/cpu/inorder/cpu.hh @@ -42,7 +42,7 @@ #include "arch/types.hh" #include "arch/registers.hh" #include "base/statistics.hh" -#include "base/timebuf.hh" +#include "cpu/timebuf.hh" #include "base/types.hh" #include "config/full_system.hh" #include "config/the_isa.hh" diff --git a/src/cpu/inorder/first_stage.hh b/src/cpu/inorder/first_stage.hh index f479dd812..3a3d550a0 100644 --- a/src/cpu/inorder/first_stage.hh +++ b/src/cpu/inorder/first_stage.hh @@ -36,7 +36,7 @@ #include <vector> #include "base/statistics.hh" -#include "base/timebuf.hh" +#include "cpu/timebuf.hh" #include "cpu/inorder/inorder_dyn_inst.hh" #include "cpu/inorder/comm.hh" #include "cpu/inorder/params.hh" diff --git a/src/cpu/inorder/pipeline_stage.hh b/src/cpu/inorder/pipeline_stage.hh index 6df104e6c..a562a6415 100644 --- a/src/cpu/inorder/pipeline_stage.hh +++ b/src/cpu/inorder/pipeline_stage.hh @@ -36,7 +36,7 @@ #include <vector> #include "base/statistics.hh" -#include "base/timebuf.hh" +#include "cpu/timebuf.hh" #include "cpu/inorder/inorder_dyn_inst.hh" #include "cpu/inorder/comm.hh" #include "params/InOrderCPU.hh" diff --git a/src/cpu/o3/commit.hh b/src/cpu/o3/commit.hh index 468153dc7..a38d6a96f 100644 --- a/src/cpu/o3/commit.hh +++ b/src/cpu/o3/commit.hh @@ -33,7 +33,7 @@ #define __CPU_O3_COMMIT_HH__ #include "base/statistics.hh" -#include "base/timebuf.hh" +#include "cpu/timebuf.hh" #include "cpu/exetrace.hh" #include "cpu/inst_seq.hh" diff --git a/src/cpu/o3/commit_impl.hh b/src/cpu/o3/commit_impl.hh index 2895de293..e8681f6e3 100644 --- a/src/cpu/o3/commit_impl.hh +++ b/src/cpu/o3/commit_impl.hh @@ -47,7 +47,7 @@ #include "arch/utility.hh" #include "base/cp_annotate.hh" #include "base/loader/symtab.hh" -#include "base/timebuf.hh" +#include "cpu/timebuf.hh" #include "config/full_system.hh" #include "config/the_isa.hh" #include "config/use_checker.hh" diff --git a/src/cpu/o3/cpu.hh b/src/cpu/o3/cpu.hh index 2669016ff..832d98f55 100644 --- a/src/cpu/o3/cpu.hh +++ b/src/cpu/o3/cpu.hh @@ -40,7 +40,7 @@ #include "arch/types.hh" #include "base/statistics.hh" -#include "base/timebuf.hh" +#include "cpu/timebuf.hh" #include "config/full_system.hh" #include "config/the_isa.hh" #include "config/use_checker.hh" diff --git a/src/cpu/o3/decode.hh b/src/cpu/o3/decode.hh index e272b661f..482b4b7fc 100644 --- a/src/cpu/o3/decode.hh +++ b/src/cpu/o3/decode.hh @@ -34,7 +34,7 @@ #include <queue> #include "base/statistics.hh" -#include "base/timebuf.hh" +#include "cpu/timebuf.hh" class DerivO3CPUParams; diff --git a/src/cpu/o3/fetch.hh b/src/cpu/o3/fetch.hh index 56f97e463..87dde1da8 100644 --- a/src/cpu/o3/fetch.hh +++ b/src/cpu/o3/fetch.hh @@ -35,7 +35,7 @@ #include "arch/utility.hh" #include "arch/predecoder.hh" #include "base/statistics.hh" -#include "base/timebuf.hh" +#include "cpu/timebuf.hh" #include "config/the_isa.hh" #include "cpu/pc_event.hh" #include "mem/packet.hh" diff --git a/src/cpu/o3/fu_pool.hh b/src/cpu/o3/fu_pool.hh index 48037324c..20d742cc8 100644 --- a/src/cpu/o3/fu_pool.hh +++ b/src/cpu/o3/fu_pool.hh @@ -36,7 +36,7 @@ #include <string> #include <vector> -#include "base/sched_list.hh" +#include "cpu/sched_list.hh" #include "cpu/op_class.hh" #include "params/FUPool.hh" #include "sim/sim_object.hh" diff --git a/src/cpu/o3/iew.hh b/src/cpu/o3/iew.hh index df9180ea6..6599964b6 100644 --- a/src/cpu/o3/iew.hh +++ b/src/cpu/o3/iew.hh @@ -46,7 +46,7 @@ #include <queue> #include "base/statistics.hh" -#include "base/timebuf.hh" +#include "cpu/timebuf.hh" #include "config/full_system.hh" #include "cpu/o3/comm.hh" #include "cpu/o3/scoreboard.hh" diff --git a/src/cpu/o3/iew_impl.hh b/src/cpu/o3/iew_impl.hh index 521f07089..c809b93ab 100644 --- a/src/cpu/o3/iew_impl.hh +++ b/src/cpu/o3/iew_impl.hh @@ -46,7 +46,7 @@ #include <queue> -#include "base/timebuf.hh" +#include "cpu/timebuf.hh" #include "config/the_isa.hh" #include "cpu/o3/fu_pool.hh" #include "cpu/o3/iew.hh" diff --git a/src/cpu/o3/inst_queue.hh b/src/cpu/o3/inst_queue.hh index bccb1aa0e..56124d60f 100644 --- a/src/cpu/o3/inst_queue.hh +++ b/src/cpu/o3/inst_queue.hh @@ -37,7 +37,7 @@ #include <vector> #include "base/statistics.hh" -#include "base/timebuf.hh" +#include "cpu/timebuf.hh" #include "base/types.hh" #include "cpu/inst_seq.hh" #include "cpu/o3/dep_graph.hh" diff --git a/src/cpu/o3/rename.hh b/src/cpu/o3/rename.hh index 8c21dda0a..4598a8d7b 100644 --- a/src/cpu/o3/rename.hh +++ b/src/cpu/o3/rename.hh @@ -34,7 +34,7 @@ #include <list> #include "base/statistics.hh" -#include "base/timebuf.hh" +#include "cpu/timebuf.hh" #include "config/the_isa.hh" class DerivO3CPUParams; diff --git a/src/cpu/ozone/back_end.hh b/src/cpu/ozone/back_end.hh index d8afb1526..7a2da3239 100644 --- a/src/cpu/ozone/back_end.hh +++ b/src/cpu/ozone/back_end.hh @@ -36,7 +36,7 @@ #include <string> #include "sim/faults.hh" -#include "base/timebuf.hh" +#include "cpu/timebuf.hh" #include "cpu/inst_seq.hh" #include "cpu/ozone/rename_table.hh" #include "cpu/ozone/thread_state.hh" diff --git a/src/cpu/ozone/cpu.hh b/src/cpu/ozone/cpu.hh index 05ff92289..fcc5602eb 100644 --- a/src/cpu/ozone/cpu.hh +++ b/src/cpu/ozone/cpu.hh @@ -34,7 +34,7 @@ #include <set> #include "base/statistics.hh" -#include "base/timebuf.hh" +#include "cpu/timebuf.hh" #include "config/full_system.hh" #include "config/the_isa.hh" #include "cpu/base.hh" diff --git a/src/cpu/ozone/front_end.hh b/src/cpu/ozone/front_end.hh index 892e279c0..7f400e82a 100644 --- a/src/cpu/ozone/front_end.hh +++ b/src/cpu/ozone/front_end.hh @@ -34,7 +34,7 @@ #include <deque> #include "arch/utility.hh" -#include "base/timebuf.hh" +#include "cpu/timebuf.hh" #include "config/the_isa.hh" #include "cpu/inst_seq.hh" #include "cpu/o3/bpred_unit.hh" diff --git a/src/cpu/ozone/inorder_back_end.hh b/src/cpu/ozone/inorder_back_end.hh index 28e02bafb..9c2699610 100644 --- a/src/cpu/ozone/inorder_back_end.hh +++ b/src/cpu/ozone/inorder_back_end.hh @@ -34,7 +34,7 @@ #include <list> #include "sim/faults.hh" -#include "base/timebuf.hh" +#include "cpu/timebuf.hh" #include "cpu/thread_context.hh" #include "cpu/inst_seq.hh" #include "cpu/ozone/rename_table.hh" diff --git a/src/cpu/ozone/inst_queue.hh b/src/cpu/ozone/inst_queue.hh index 2f544e307..fb302f01e 100644 --- a/src/cpu/ozone/inst_queue.hh +++ b/src/cpu/ozone/inst_queue.hh @@ -37,7 +37,7 @@ #include <vector> #include "base/statistics.hh" -#include "base/timebuf.hh" +#include "cpu/timebuf.hh" #include "base/types.hh" #include "cpu/inst_seq.hh" diff --git a/src/cpu/ozone/lw_back_end.hh b/src/cpu/ozone/lw_back_end.hh index 4a1657c9b..4c6eb5fb6 100644 --- a/src/cpu/ozone/lw_back_end.hh +++ b/src/cpu/ozone/lw_back_end.hh @@ -37,7 +37,7 @@ #include <string> #include "sim/faults.hh" -#include "base/timebuf.hh" +#include "cpu/timebuf.hh" #include "cpu/inst_seq.hh" #include "cpu/ozone/rename_table.hh" #include "cpu/ozone/thread_state.hh" diff --git a/src/cpu/sched_list.hh b/src/cpu/sched_list.hh new file mode 100644 index 000000000..56ee2f8ec --- /dev/null +++ b/src/cpu/sched_list.hh @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2002-2005 The Regents of The University of Michigan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Authors: Steve Raasch + */ + +#ifndef SCHED_LIST_HH +#define SCHED_LIST_HH + +#include <list> +#include "base/intmath.hh" +#include "base/misc.hh" + + +// Any types you use this class for must be covered here... +namespace { + void ClearEntry(int &i) { i = 0; }; + void ClearEntry(unsigned &i) { i = 0; }; + void ClearEntry(double &i) { i = 0; }; + template <class T> void ClearEntry(std::list<T> &l) { l.clear(); }; +}; + + +// +// this is a special list type that allows the user to insert elements at a +// specified positive offset from the "current" element, but only allow them +// be extracted from the "current" element +// + + +template <class T> +class SchedList +{ + T *data_array; + unsigned position; + unsigned size; + unsigned mask; + + public: + SchedList(unsigned size); + SchedList(void); + + void init(unsigned size); + + T &operator[](unsigned offset); + + void advance(void); + + void clear(void); +}; + + + +// +// Constructor +// +template<class T> +SchedList<T>::SchedList(unsigned _size) +{ + size = _size; + + // size must be a power of two + if (!isPowerOf2(size)) { + panic("SchedList: size must be a power of two"); + } + + if (size < 2) { + panic("SchedList: you don't want a list that small"); + } + + // calculate the bit mask for the modulo operation + mask = size - 1; + + data_array = new T[size]; + + if (!data_array) { + panic("SchedList: could not allocate memory"); + } + + clear(); +} + +template<class T> +SchedList<T>::SchedList(void) +{ + data_array = 0; + size = 0; +} + + +template<class T> void +SchedList<T>::init(unsigned _size) +{ + size = _size; + + if (!data_array) { + // size must be a power of two + if (size & (size-1)) { + panic("SchedList: size must be a power of two"); + } + + if (size < 2) { + panic("SchedList: you don't want a list that small"); + } + + // calculate the bit mask for the modulo operation + mask = size - 1; + + data_array = new T[size]; + + if (!data_array) { + panic("SchedList: could not allocate memory"); + } + + clear(); + } +} + + +template<class T> void +SchedList<T>::advance(void) +{ + ClearEntry(data_array[position]); + + // position = (++position % size); + position = ++position & mask; +} + + +template<class T> void +SchedList<T>::clear(void) +{ + for (unsigned i=0; i<size; ++i) { + ClearEntry(data_array[i]); + } + + position = 0; +} + + +template<class T> T& +SchedList<T>::operator[](unsigned offset) +{ + if (offset >= size) { + panic("SchedList: can't access element beyond current pointer"); + } + + // unsigned p = (position + offset) % size; + unsigned p = (position + offset) & mask; + + return data_array[p]; +} + + + +#endif diff --git a/src/cpu/timebuf.hh b/src/cpu/timebuf.hh new file mode 100644 index 000000000..b6f709d71 --- /dev/null +++ b/src/cpu/timebuf.hh @@ -0,0 +1,241 @@ +/* + * Copyright (c) 2004-2005 The Regents of The University of Michigan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Authors: Nathan Binkert + * Kevin Lim + */ + +#ifndef __BASE_TIMEBUF_HH__ +#define __BASE_TIMEBUF_HH__ + +#include <cassert> +#include <cstring> +#include <vector> + +template <class T> +class TimeBuffer +{ + protected: + int past; + int future; + unsigned size; + int _id; + + char *data; + std::vector<char *> index; + unsigned base; + + void valid(int idx) + { + assert (idx >= -past && idx <= future); + } + + public: + friend class wire; + class wire + { + friend class TimeBuffer; + protected: + TimeBuffer<T> *buffer; + int index; + + void set(int idx) + { + buffer->valid(idx); + index = idx; + } + + wire(TimeBuffer<T> *buf, int i) + : buffer(buf), index(i) + { } + + public: + wire() + { } + + wire(const wire &i) + : buffer(i.buffer), index(i.index) + { } + + const wire &operator=(const wire &i) + { + buffer = i.buffer; + set(i.index); + return *this; + } + + const wire &operator=(int idx) + { + set(idx); + return *this; + } + + const wire &operator+=(int offset) + { + set(index + offset); + return *this; + } + + const wire &operator-=(int offset) + { + set(index - offset); + return *this; + } + + wire &operator++() + { + set(index + 1); + return *this; + } + + wire &operator++(int) + { + int i = index; + set(index + 1); + return wire(this, i); + } + + wire &operator--() + { + set(index - 1); + return *this; + } + + wire &operator--(int) + { + int i = index; + set(index - 1); + return wire(this, i); + } + T &operator*() const { return *buffer->access(index); } + T *operator->() const { return buffer->access(index); } + }; + + + public: + TimeBuffer(int p, int f) + : past(p), future(f), size(past + future + 1), + data(new char[size * sizeof(T)]), index(size), base(0) + { + assert(past >= 0 && future >= 0); + char *ptr = data; + for (unsigned i = 0; i < size; i++) { + index[i] = ptr; + std::memset(ptr, 0, sizeof(T)); + new (ptr) T; + ptr += sizeof(T); + } + + _id = -1; + } + + TimeBuffer() + : data(NULL) + { + } + + ~TimeBuffer() + { + for (unsigned i = 0; i < size; ++i) + (reinterpret_cast<T *>(index[i]))->~T(); + delete [] data; + } + + void id(int id) + { + _id = id; + } + + int id() + { + return _id; + } + + void + advance() + { + if (++base >= size) + base = 0; + + int ptr = base + future; + if (ptr >= (int)size) + ptr -= size; + (reinterpret_cast<T *>(index[ptr]))->~T(); + std::memset(index[ptr], 0, sizeof(T)); + new (index[ptr]) T; + } + + T *access(int idx) + { + //Need more complex math here to calculate index. + valid(idx); + + int vector_index = idx + base; + if (vector_index >= (int)size) { + vector_index -= size; + } else if (vector_index < 0) { + vector_index += size; + } + + return reinterpret_cast<T *>(index[vector_index]); + } + + T &operator[](int idx) + { + //Need more complex math here to calculate index. + valid(idx); + + int vector_index = idx + base; + if (vector_index >= (int)size) { + vector_index -= size; + } else if (vector_index < 0) { + vector_index += size; + } + + return reinterpret_cast<T &>(*index[vector_index]); + } + + wire getWire(int idx) + { + valid(idx); + + return wire(this, idx); + } + + wire zero() + { + return wire(this, 0); + } + + unsigned getSize() + { + return size; + } +}; + +#endif // __BASE_TIMEBUF_HH__ + |