From 89cf3f6e853e3d9a95536372ab78a4a11a8c6ad1 Mon Sep 17 00:00:00 2001 From: Steve Reinhardt Date: Mon, 3 Jan 2011 14:35:47 -0800 Subject: 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 --- src/base/sched_list.hh | 180 ---------------------------- src/base/timebuf.hh | 241 -------------------------------------- src/cpu/activity.cc | 2 +- src/cpu/activity.hh | 2 +- src/cpu/inorder/cpu.hh | 2 +- src/cpu/inorder/first_stage.hh | 2 +- src/cpu/inorder/pipeline_stage.hh | 2 +- src/cpu/o3/commit.hh | 2 +- src/cpu/o3/commit_impl.hh | 2 +- src/cpu/o3/cpu.hh | 2 +- src/cpu/o3/decode.hh | 2 +- src/cpu/o3/fetch.hh | 2 +- src/cpu/o3/fu_pool.hh | 2 +- src/cpu/o3/iew.hh | 2 +- src/cpu/o3/iew_impl.hh | 2 +- src/cpu/o3/inst_queue.hh | 2 +- src/cpu/o3/rename.hh | 2 +- src/cpu/ozone/back_end.hh | 2 +- src/cpu/ozone/cpu.hh | 2 +- src/cpu/ozone/front_end.hh | 2 +- src/cpu/ozone/inorder_back_end.hh | 2 +- src/cpu/ozone/inst_queue.hh | 2 +- src/cpu/ozone/lw_back_end.hh | 2 +- src/cpu/sched_list.hh | 180 ++++++++++++++++++++++++++++ src/cpu/timebuf.hh | 241 ++++++++++++++++++++++++++++++++++++++ 25 files changed, 442 insertions(+), 442 deletions(-) delete mode 100644 src/base/sched_list.hh delete mode 100644 src/base/timebuf.hh create mode 100644 src/cpu/sched_list.hh create mode 100644 src/cpu/timebuf.hh (limited to 'src') diff --git a/src/base/sched_list.hh b/src/base/sched_list.hh deleted file mode 100644 index 56ee2f8ec..000000000 --- a/src/base/sched_list.hh +++ /dev/null @@ -1,180 +0,0 @@ -/* - * 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 -#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 void ClearEntry(std::list &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 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 -SchedList::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 -SchedList::SchedList(void) -{ - data_array = 0; - size = 0; -} - - -template void -SchedList::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 void -SchedList::advance(void) -{ - ClearEntry(data_array[position]); - - // position = (++position % size); - position = ++position & mask; -} - - -template void -SchedList::clear(void) -{ - for (unsigned i=0; i T& -SchedList::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/base/timebuf.hh b/src/base/timebuf.hh deleted file mode 100644 index b6f709d71..000000000 --- a/src/base/timebuf.hh +++ /dev/null @@ -1,241 +0,0 @@ -/* - * 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 -#include -#include - -template -class TimeBuffer -{ - protected: - int past; - int future; - unsigned size; - int _id; - - char *data; - std::vector index; - unsigned base; - - void valid(int idx) - { - assert (idx >= -past && idx <= future); - } - - public: - friend class wire; - class wire - { - friend class TimeBuffer; - protected: - TimeBuffer *buffer; - int index; - - void set(int idx) - { - buffer->valid(idx); - index = idx; - } - - wire(TimeBuffer *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(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(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(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(*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__ - 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 -#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 #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 #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 #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 #include -#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 #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 -#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 #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 #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 #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 #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 #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 #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 #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 #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 +#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 void ClearEntry(std::list &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 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 +SchedList::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 +SchedList::SchedList(void) +{ + data_array = 0; + size = 0; +} + + +template void +SchedList::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 void +SchedList::advance(void) +{ + ClearEntry(data_array[position]); + + // position = (++position % size); + position = ++position & mask; +} + + +template void +SchedList::clear(void) +{ + for (unsigned i=0; i T& +SchedList::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 +#include +#include + +template +class TimeBuffer +{ + protected: + int past; + int future; + unsigned size; + int _id; + + char *data; + std::vector index; + unsigned base; + + void valid(int idx) + { + assert (idx >= -past && idx <= future); + } + + public: + friend class wire; + class wire + { + friend class TimeBuffer; + protected: + TimeBuffer *buffer; + int index; + + void set(int idx) + { + buffer->valid(idx); + index = idx; + } + + wire(TimeBuffer *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(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(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(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(*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__ + -- cgit v1.2.3