Move sched_list.hh and timebuf.hh from src/base to src/cpu.
authorSteve Reinhardt <steve.reinhardt@amd.com>
Mon, 3 Jan 2011 22:35:47 +0000 (14:35 -0800)
committerSteve Reinhardt <steve.reinhardt@amd.com>
Mon, 3 Jan 2011 22:35:47 +0000 (14:35 -0800)
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

25 files changed:
src/base/sched_list.hh [deleted file]
src/base/timebuf.hh [deleted file]
src/cpu/activity.cc
src/cpu/activity.hh
src/cpu/inorder/cpu.hh
src/cpu/inorder/first_stage.hh
src/cpu/inorder/pipeline_stage.hh
src/cpu/o3/commit.hh
src/cpu/o3/commit_impl.hh
src/cpu/o3/cpu.hh
src/cpu/o3/decode.hh
src/cpu/o3/fetch.hh
src/cpu/o3/fu_pool.hh
src/cpu/o3/iew.hh
src/cpu/o3/iew_impl.hh
src/cpu/o3/inst_queue.hh
src/cpu/o3/rename.hh
src/cpu/ozone/back_end.hh
src/cpu/ozone/cpu.hh
src/cpu/ozone/front_end.hh
src/cpu/ozone/inorder_back_end.hh
src/cpu/ozone/inst_queue.hh
src/cpu/ozone/lw_back_end.hh
src/cpu/sched_list.hh [new file with mode: 0644]
src/cpu/timebuf.hh [new file with mode: 0644]

diff --git a/src/base/sched_list.hh b/src/base/sched_list.hh
deleted file mode 100644 (file)
index 56ee2f8..0000000
+++ /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 <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/base/timebuf.hh b/src/base/timebuf.hh
deleted file mode 100644 (file)
index b6f709d..0000000
+++ /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 <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__
-
index a2a34edf9bad09f5c1946a02c7a98cf57ea4ac75..9c9288c4d225e0bf43c8492e73fba3afcdc76205 100644 (file)
@@ -30,7 +30,7 @@
 
 #include <string>
 
-#include "base/timebuf.hh"
+#include "cpu/timebuf.hh"
 #include "cpu/activity.hh"
 
 using namespace std;
index d75ff150eeb3686355db3045b7680bb9fd58e0ea..8d3469c4e0c697717d2d8100b13b62b990ba9628 100644 (file)
@@ -31,7 +31,7 @@
 #ifndef __CPU_ACTIVITY_HH__
 #define __CPU_ACTIVITY_HH__
 
-#include "base/timebuf.hh"
+#include "cpu/timebuf.hh"
 #include "base/trace.hh"
 
 /**
index 65c82233192827c95ea0ec2e0c59ecfcdc7d2e2d..3b2041cfa5fe1eb44f9fa4010dafca64886b7b83 100644 (file)
@@ -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"
index f479dd812215f45ba8c8a8a56742bb42dfe8cae6..3a3d550a0fbc536c627c993e4ec598dd2a5a9e82 100644 (file)
@@ -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"
index 6df104e6cfdbc938b0408f52f17864349994d5e1..a562a6415864f65f7beb8cab0d7fe2290743faff 100644 (file)
@@ -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"
index 468153dc77880852b24fd7fd4ffa5e2b2166b886..a38d6a96f2981099f9a7620336dbb4924bb2bb40 100644 (file)
@@ -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"
 
index 2895de2938c06f2d647d40445a3b2237a85cebf2..e8681f6e3a6a699cd6c16bccbbe16f1d35802297 100644 (file)
@@ -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"
index 2669016ff8d6dc68846659edd83430f75bc1a7c4..832d98f55026334fd315f5f57a9399ed527d1ae0 100644 (file)
@@ -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"
index e272b661fa787299789c596e8e4b58d1726ad215..482b4b7fcf5f4787849f4ae6d2614308c182a21e 100644 (file)
@@ -34,7 +34,7 @@
 #include <queue>
 
 #include "base/statistics.hh"
-#include "base/timebuf.hh"
+#include "cpu/timebuf.hh"
 
 class DerivO3CPUParams;
 
index 56f97e46334b87817c063c9f252ba9557f360e11..87dde1da85571a6f19c75ae6a54844ad2f84712b 100644 (file)
@@ -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"
index 48037324c83625af19d5007a860dac9b97653251..20d742cc8749956ee387d2adaeadd23d9107b6f9 100644 (file)
@@ -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"
index df9180ea6e58ee2c64390d612d3b31a6429c5bbc..6599964b6f1576b347ec8133bba35b7f518929fc 100644 (file)
@@ -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"
index 521f070891eafbc4edd89fd1d77fb7963a190c0a..c809b93abf3d395ce39729284153afccfebb872b 100644 (file)
@@ -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"
index bccb1aa0ea06f773cb1030bf193cb4a3cb87fafc..56124d60f59a645bf779f49050fb27bf101fea5e 100644 (file)
@@ -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"
index 8c21dda0a2f9d8cfbd2d406cf030d6bf994255eb..4598a8d7bc6c40444c9b53aab41b5dc6fab5959c 100644 (file)
@@ -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;
index d8afb152678583ae63167affdc41671435762b13..7a2da3239c08d6f05b7cbb1ffc3b71ad15fd5f08 100644 (file)
@@ -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"
index 05ff9228971b1c30a5c817de4720698ac371942f..fcc5602eb8b8ff5ff98c9b213c03b3faabb9b7c2 100644 (file)
@@ -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"
index 892e279c0911d8ad663bcc6529d6bc71206462aa..7f400e82a82335a5f5587e56aa71b1f3844010bf 100644 (file)
@@ -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"
index 28e02bafbb5a2404d9952f3ca51c3e3671bcdef6..9c26996105213be5693e760f91887fa927551fa4 100644 (file)
@@ -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"
index 2f544e307485c17178d2ace5f1437c08978aa7e5..fb302f01e105cb665550864d9fb93b0ef6aacf6a 100644 (file)
@@ -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"
 
index 4a1657c9b131d2e4dc5c791d855c85935442704b..4c6eb5fb62168fb2f220fb66bc34b59ee0ffdf32 100644 (file)
@@ -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 (file)
index 0000000..56ee2f8
--- /dev/null
@@ -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 (file)
index 0000000..b6f709d
--- /dev/null
@@ -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__
+