diff options
-rw-r--r-- | arch/alpha/alpha_memory.cc | 9 | ||||
-rw-r--r-- | base/callback.hh | 66 | ||||
-rw-r--r-- | base/statistics.cc | 29 | ||||
-rw-r--r-- | base/statistics.hh | 162 | ||||
-rw-r--r-- | cpu/intr_control.cc | 1 | ||||
-rw-r--r-- | cpu/memtest/memtest.cc | 10 | ||||
-rw-r--r-- | cpu/simple_cpu/simple_cpu.cc | 59 | ||||
-rw-r--r-- | dev/alpha_console.cc | 18 | ||||
-rw-r--r-- | dev/console.cc | 6 | ||||
-rw-r--r-- | dev/disk_image.cc | 7 | ||||
-rw-r--r-- | dev/etherbus.cc | 6 | ||||
-rw-r--r-- | dev/etherdump.cc | 2 | ||||
-rw-r--r-- | dev/etherlink.cc | 8 | ||||
-rw-r--r-- | dev/ethertap.cc | 9 | ||||
-rw-r--r-- | dev/simple_disk.cc | 13 | ||||
-rw-r--r-- | kern/tru64/tru64_system.cc | 5 | ||||
-rw-r--r-- | sim/builder.cc | 191 | ||||
-rw-r--r-- | sim/builder.hh | 221 | ||||
-rw-r--r-- | sim/main.cc | 15 | ||||
-rw-r--r-- | sim/prog.cc | 17 | ||||
-rw-r--r-- | sim/sim_object.cc | 152 | ||||
-rw-r--r-- | sim/sim_object.hh | 181 | ||||
-rw-r--r-- | test/Makefile | 26 | ||||
-rw-r--r-- | test/stattest.cc | 12 |
24 files changed, 770 insertions, 455 deletions
diff --git a/arch/alpha/alpha_memory.cc b/arch/alpha/alpha_memory.cc index 669fe92bb..83dd5accf 100644 --- a/arch/alpha/alpha_memory.cc +++ b/arch/alpha/alpha_memory.cc @@ -30,12 +30,13 @@ #include <string> #include <vector> -#include "targetarch/alpha_memory.hh" -#include "targetarch/ev5.hh" -#include "cpu/exec_context.hh" -#include "base/trace.hh" #include "base/inifile.hh" #include "base/str.hh" +#include "base/trace.hh" +#include "cpu/exec_context.hh" +#include "sim/builder.hh" +#include "targetarch/alpha_memory.hh" +#include "targetarch/ev5.hh" using namespace std; diff --git a/base/callback.hh b/base/callback.hh index a1d23b5ed..eee629cf5 100644 --- a/base/callback.hh +++ b/base/callback.hh @@ -31,26 +31,76 @@ #include <list> -class Callback { +/** + * Generic callback class. This base class provides a virutal process + * function that gets called when the callback queue is processed. + */ +class Callback +{ public: + /** + * virtualize the destructor to make sure that the correct one + * gets called. + */ virtual ~Callback() {} + + /** + * virtual process function that is invoked when the callback + * queue is executed. + */ virtual void process() = 0; }; class CallbackQueue { protected: - std::list<Callback *> callbacks; + /** + * Simple typedef for the data structure that stores all of the + * callbacks. + */ + typedef std::list<Callback *> queue; + + /** + * List of all callbacks. To be called in fifo order. + */ + queue callbacks; public: - void add(Callback *callback) { callbacks.push_back(callback); } + /** + * Add a callback to the end of the queue + * @param callback the callback to be added to the queue + */ + void add(Callback *callback) + { + callbacks.push_back(callback); + } + + /** + * Find out if there are any callbacks in the queue + */ bool empty() const { return callbacks.empty(); } - void processOne() { - Callback *c = callbacks.front(); - callbacks.pop_front(); - c->process(); + + /** + * process all callbacks + */ + void process() + { + queue::iterator i = callbacks.begin(); + queue::iterator end = callbacks.end(); + + while (i != end) { + (*i)->process(); + ++i; + } + } + + /** + * clear the callback queue + */ + void clear() + { + callbacks.clear(); } - void processAll() { while (!empty()) processOne(); } }; #endif // __CALLBACK_HH__ diff --git a/base/statistics.cc b/base/statistics.cc index abebcae53..2f52314b9 100644 --- a/base/statistics.cc +++ b/base/statistics.cc @@ -35,6 +35,7 @@ #include <math.h> +#include "base/callback.hh" #include "base/cprintf.hh" #include "base/intmath.hh" #include "base/misc.hh" @@ -143,6 +144,7 @@ class Database StatData *find(const Stat *stat); void check(); + void reset(); void regStat(Stat *stat); StatData *print(Stat *stat); }; @@ -208,6 +210,18 @@ Database::check() } void +Database::reset() +{ + list_t::iterator i = allStats.begin(); + list_t::iterator end = allStats.end(); + + while (i != end) { + (*i)->reset(); + ++i; + } +} + +void Database::regStat(Stat *stat) { if (map.find(stat) != map.end()) @@ -842,4 +856,19 @@ dump(ostream &stream) Detail::StatDB().dump(stream); } +CallbackQueue resetQueue; + +void +regReset(Callback *cb) +{ + resetQueue.add(cb); +} + +void +reset() +{ + Detail::StatDB().reset(); + resetQueue.process(); +} + } // namespace Statistics diff --git a/base/statistics.hh b/base/statistics.hh index bd70cf8a0..d4353bd11 100644 --- a/base/statistics.hh +++ b/base/statistics.hh @@ -76,6 +76,8 @@ float __nan(); /** Print stats out in SS format. */ #define STAT_DISPLAY_COMPAT +class Callback; + /** The current simulated cycle. */ extern Tick curTick; @@ -216,6 +218,10 @@ class Stat */ virtual void display(std::ostream &stream) const = 0; /** + * Reset this stat to the default state. + */ + virtual void reset() = 0; + /** * Return the number of entries in this stat. * @return The number of entries. */ @@ -422,6 +428,10 @@ struct StatStor * @return The value of this stat. */ T value(const Params &p) const { return data; } + /** + * Reset stat value to default + */ + void reset() { data = T(); } }; /** @@ -492,6 +502,15 @@ struct AvgStor * @return The current count. */ T value(const Params &p) const { return current; } + /** + * Reset stat value to default + */ + void reset() + { + current = T(); + total = 0; + last = curTick; + } }; /** @@ -608,6 +627,11 @@ class ScalarBase : public ScalarStat * @return 1. */ virtual size_t size() const { return 1; } + + /** + * Reset stat value to default + */ + void reset() { bin.reset(); } }; ////////////////////////////////////////////////////////////////////// @@ -732,6 +756,10 @@ class VectorBase : public VectorStat * @return The size of the vector. */ virtual size_t size() const { return bin.size(); } + /** + * Reset stat value to default + */ + virtual void reset() { bin.reset(); } }; /** @@ -855,6 +883,10 @@ class ScalarProxy : public ScalarStat * @return 1. */ virtual size_t size() const { return 1; } + /** + * This stat has no state. Nothing to reset + */ + virtual void reset() { } }; template <typename T, template <typename T> class Storage, class Bin> @@ -980,6 +1012,10 @@ class Vector2dBase : public Stat } } + /** + * Reset stat value to default + */ + virtual void reset() { bin.reset(); } }; template <typename T, template <typename T> class Storage, class Bin> @@ -1058,6 +1094,11 @@ class VectorProxy : public VectorStat assert (index >= 0 && index < size()); return ScalarProxy<T, Storage, Bin>(*bin, *params, offset + index); } + + /** + * This stat has no state. Nothing to reset. + */ + virtual void reset() { } }; template <typename T, template <typename T> class Storage, class Bin> @@ -1120,8 +1161,11 @@ struct DistStor */ DistStor(const Params ¶ms) : min_val(INT_MAX), max_val(INT_MIN), underflow(0), overflow(0), - vec(params.size) { + vec(params.size) + { + reset(); } + /** * Add a value to the distribution for the given number of times. * @param val The value to add. @@ -1200,6 +1244,21 @@ struct DistStor rvec, params.min, params.max, params.bucket_size, params.size); } + /** + * Reset stat value to default + */ + void reset() + { + min_val = INT_MAX; + max_val = INT_MIN; + underflow = 0; + overflow = 0; + + int size = vec.size(); + for (int i = 0; i < size; ++i) + vec[i] = T(); + } + }; void FancyDisplay(std::ostream &stream, const std::string &name, @@ -1231,7 +1290,7 @@ struct FancyStor /** * Create and initialize this storage. */ - FancyStor(const Params &) : sum(0), squares(0), total(0) {} + FancyStor(const Params &) : sum(T()), squares(T()), total(0) {} /** * Add a value the given number of times to this running average. @@ -1286,6 +1345,15 @@ struct FancyStor * @return True if no samples have been added. */ bool zero(const Params &) const { return total == 0; } + /** + * Reset stat value to default + */ + virtual void reset() + { + sum = T(); + squares = T(); + total = 0; + } }; /** @@ -1309,7 +1377,7 @@ struct AvgFancy /** * Create and initialize this storage. */ - AvgFancy(const Params &) : sum(0), squares(0) {} + AvgFancy(const Params &) : sum(T()), squares(T()) {} /** * Add a value to the distribution for the given number of times. @@ -1352,6 +1420,14 @@ struct AvgFancy * @return True if the sum is zero. */ bool zero(const Params ¶ms) const { return sum == 0; } + /** + * Reset stat value to default + */ + virtual void reset() + { + sum = T(); + squares = T(); + } }; /** @@ -1433,6 +1509,13 @@ class DistBase : public Stat data()->display(stream, myname(), mydesc(), myprecision(), myflags(), params); } + /** + * Reset stat value to default + */ + virtual void reset() + { + bin.reset(); + } }; template <typename T, template <typename T> class Storage, class Bin> @@ -1472,6 +1555,13 @@ class VectorDistBase : public Stat virtual size_t size() const { return bin.size(); } virtual bool zero() const { return false; } virtual void display(std::ostream &stream) const; + /** + * Reset stat value to default + */ + virtual void reset() + { + bin.reset(); + } }; template <typename T, template <typename T> class Storage, class Bin> @@ -1528,6 +1618,10 @@ class VectorDistProxy : public Stat data()->display(stream, name.str(), desc.str(), cstat->myprecision(), cstat->myflags(), cstat->params); } + /** + * Proxy has no state. Nothing to reset. + */ + virtual void reset() { } }; template <typename T, template <typename T> class Storage, class Bin> @@ -2032,6 +2126,16 @@ struct StatBin : public Detail::BinBase } return reinterpret_cast<Storage *>(ptr); } + void reset() + { + char *ptr = access(); + char *flags = ptr + size() * sizeof(Storage); + if (!(*flags & 0x1)) + return; + + Storage *s = reinterpret_cast<Storage *>(ptr); + s->reset(); + } }; template <class Storage> @@ -2068,6 +2172,19 @@ struct StatBin : public Detail::BinBase } return reinterpret_cast<Storage *>(ptr + index * sizeof(Storage)); } + void reset() + { + char *ptr = access(); + char *flags = ptr + size() * sizeof(Storage); + if (!(*flags & 0x1)) + return; + + for (int i = 0; i < _size; ++i) { + char *p = ptr + i * sizeof(Storage); + Storage *s = reinterpret_cast<Storage *>(p); + s->reset(); + } + } }; }; @@ -2086,6 +2203,11 @@ struct NoBin char ptr[sizeof(Storage)]; public: + ~Bin() + { + reinterpret_cast<Storage *>(ptr)->~Storage(); + } + bool initialized() const { return true; } void init(const Params ¶ms) { new (ptr) Storage(params); @@ -2095,6 +2217,11 @@ struct NoBin assert(initialized()); return reinterpret_cast<Storage *>(ptr); } + void reset() + { + Storage *s = reinterpret_cast<Storage *>(ptr); + s->reset(); + } }; template <class Storage> @@ -2109,10 +2236,18 @@ struct NoBin public: VectorBin() : ptr(NULL) { } - ~VectorBin() { - if (initialized()) - delete [] ptr; + ~VectorBin() + { + if (!initialized()) + return; + + for (int i = 0; i < _size; ++i) { + char *p = ptr + i * sizeof(Storage); + reinterpret_cast<Storage *>(p)->~Storage(); + } + delete [] ptr; } + bool initialized() const { return ptr != NULL; } void init(int s, const Params ¶ms) { assert(s > 0 && "size must be positive!"); @@ -2130,6 +2265,14 @@ struct NoBin assert(index >= 0 && index < size()); return reinterpret_cast<Storage *>(ptr + index * sizeof(Storage)); } + void reset() + { + for (int i = 0; i < _size; ++i) { + char *p = ptr + i * sizeof(Storage); + Storage *s = reinterpret_cast<Storage *>(p); + s->reset(); + } + } }; }; @@ -2454,6 +2597,11 @@ class Formula : public Detail::VectorStat else return root->size(); } + + /** + * Formulas don't need to be reset + */ + virtual void reset() {} }; /** @@ -2462,6 +2610,8 @@ class Formula : public Detail::VectorStat void check(); void dump(std::ostream &stream); +void reset(); +void regReset(Callback *cb); inline Detail::Temp operator+(Detail::Temp l, Detail::Temp r) diff --git a/cpu/intr_control.cc b/cpu/intr_control.cc index bce427eea..037b00ef4 100644 --- a/cpu/intr_control.cc +++ b/cpu/intr_control.cc @@ -31,6 +31,7 @@ #include "cpu/base_cpu.hh" #include "cpu/intr_control.hh" +#include "sim/builder.hh" #include "sim/sim_object.hh" using namespace std; diff --git a/cpu/memtest/memtest.cc b/cpu/memtest/memtest.cc index b3a6434ff..15e47e416 100644 --- a/cpu/memtest/memtest.cc +++ b/cpu/memtest/memtest.cc @@ -33,13 +33,13 @@ #include <iomanip> #include <vector> -#include "cpu/memtest/memtest.hh" #include "base/misc.hh" -#include "sim/sim_events.hh" -#include "mem/functional_mem/main_memory.hh" -#include "mem/cache/base_cache.hh" - #include "base/statistics.hh" +#include "cpu/memtest/memtest.hh" +#include "mem/cache/base_cache.hh" +#include "mem/functional_mem/main_memory.hh" +#include "sim/builder.hh" +#include "sim/sim_events.hh" #include "sim/sim_stats.hh" using namespace std; diff --git a/cpu/simple_cpu/simple_cpu.cc b/cpu/simple_cpu/simple_cpu.cc index 20790bfb6..3c9be172f 100644 --- a/cpu/simple_cpu/simple_cpu.cc +++ b/cpu/simple_cpu/simple_cpu.cc @@ -26,60 +26,53 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include <cmath> +#include <cstdio> +#include <cstdlib> #include <iostream> #include <iomanip> #include <list> #include <sstream> #include <string> -#include <stdio.h> -#include <stdlib.h> -#include <math.h> - -#include "sim/host.hh" #include "base/cprintf.hh" +#include "base/inifile.hh" +#include "base/loader/symtab.hh" #include "base/misc.hh" -#include "cpu/full_cpu/smt.hh" - -#include "sim/annotation.hh" -#include "cpu/exec_context.hh" +#include "base/pollevent.hh" +#include "base/range.hh" +#include "base/trace.hh" #include "cpu/base_cpu.hh" -#include "sim/debug.hh" +#include "cpu/exec_context.hh" +#include "cpu/exetrace.hh" +#include "cpu/full_cpu/smt.hh" #include "cpu/simple_cpu/simple_cpu.hh" -#include "base/inifile.hh" -#include "mem/mem_interface.hh" -#include "mem/base_mem.hh" #include "cpu/static_inst.hh" +#include "mem/base_mem.hh" +#include "mem/mem_interface.hh" +#include "sim/annotation.hh" +#include "sim/builder.hh" +#include "sim/debug.hh" +#include "sim/host.hh" +#include "sim/sim_events.hh" +#include "sim/sim_object.hh" +#include "sim/sim_stats.hh" #ifdef FULL_SYSTEM +#include "base/remote_gdb.hh" +#include "dev/alpha_access.h" +#include "dev/pciareg.h" #include "mem/functional_mem/memory_control.hh" #include "mem/functional_mem/physical_memory.hh" -#include "targetarch/alpha_memory.hh" #include "sim/system.hh" +#include "targetarch/alpha_memory.hh" +#include "targetarch/vtophys.hh" #else // !FULL_SYSTEM +#include "eio/eio.hh" #include "mem/functional_mem/functional_memory.hh" #include "sim/prog.hh" -#include "eio/eio.hh" #endif // FULL_SYSTEM -#include "cpu/exetrace.hh" -#include "base/trace.hh" -#include "sim/sim_events.hh" -#include "base/pollevent.hh" -#include "sim/sim_object.hh" -#include "sim/sim_stats.hh" - -#include "base/range.hh" -#include "base/loader/symtab.hh" - -#ifdef FULL_SYSTEM -#include "targetarch/vtophys.hh" -#include "dev/pciareg.h" -#include "base/remote_gdb.hh" -#include "dev/alpha_access.h" -#endif - - using namespace std; SimpleCPU::CacheCompletionEvent::CacheCompletionEvent(SimpleCPU *_cpu) diff --git a/dev/alpha_console.cc b/dev/alpha_console.cc index 526ef0b3c..b917d7a96 100644 --- a/dev/alpha_console.cc +++ b/dev/alpha_console.cc @@ -30,22 +30,22 @@ * System Console Definition */ -#include <stddef.h> -#include <stdio.h> - +#include <cstddef> +#include <cstdio> #include <string> -#include "dev/alpha_console.hh" +#include "base/inifile.hh" +#include "base/str.hh" // for to_number() +#include "base/trace.hh" #include "cpu/base_cpu.hh" -#include "dev/console.hh" #include "cpu/exec_context.hh" -#include "mem/functional_mem/memory_control.hh" +#include "dev/alpha_console.hh" +#include "dev/console.hh" #include "dev/simple_disk.hh" #include "dev/tlaser_clock.hh" +#include "mem/functional_mem/memory_control.hh" +#include "sim/builder.hh" #include "sim/system.hh" -#include "base/trace.hh" -#include "base/inifile.hh" -#include "base/str.hh" // for to_number() using namespace std; diff --git a/dev/console.cc b/dev/console.cc index 976118e2f..168907417 100644 --- a/dev/console.cc +++ b/dev/console.cc @@ -43,12 +43,12 @@ #include <string> #include "base/misc.hh" -#include "targetarch/ev5.hh" - -#include "dev/console.hh" #include "base/socket.hh" #include "base/trace.hh" +#include "dev/console.hh" #include "mem/functional_mem/memory_control.hh" +#include "sim/builder.hh" +#include "targetarch/ev5.hh" using namespace std; diff --git a/dev/disk_image.cc b/dev/disk_image.cc index 0a3955ed1..78599f8d7 100644 --- a/dev/disk_image.cc +++ b/dev/disk_image.cc @@ -33,18 +33,19 @@ #include <sys/types.h> #include <sys/uio.h> #include <errno.h> -#include <string.h> #include <unistd.h> #include <cstdio> +#include <cstring> #include <fstream> #include <string> -#include "dev/disk_image.hh" +#include "base/callback.hh" #include "base/misc.hh" #include "base/trace.hh" +#include "dev/disk_image.hh" +#include "sim/builder.hh" #include "sim/sim_exit.hh" -#include "base/callback.hh" using namespace std; diff --git a/dev/etherbus.cc b/dev/etherbus.cc index fa1d84272..3f6036f72 100644 --- a/dev/etherbus.cc +++ b/dev/etherbus.cc @@ -30,17 +30,17 @@ * Device module for modelling an ethernet hub */ +#include <cmath> #include <deque> #include <string> #include <vector> -#include <math.h> - +#include "base/trace.hh" #include "dev/etherbus.hh" #include "dev/etherdump.hh" #include "dev/etherint.hh" #include "dev/etherpkt.hh" -#include "base/trace.hh" +#include "sim/builder.hh" #include "sim/universe.hh" using namespace std; diff --git a/dev/etherdump.cc b/dev/etherdump.cc index dcca0e458..60dc1559d 100644 --- a/dev/etherdump.cc +++ b/dev/etherdump.cc @@ -34,8 +34,8 @@ #include <string> -#include "sim/universe.hh" #include "dev/etherdump.hh" +#include "sim/builder.hh" #include "sim/universe.hh" using std::string; diff --git a/dev/etherlink.cc b/dev/etherlink.cc index 699e9f331..e5665c7b1 100644 --- a/dev/etherlink.cc +++ b/dev/etherlink.cc @@ -30,17 +30,17 @@ * Device module for modelling a fixed bandwidth full duplex ethernet link */ +#include <cmath> #include <deque> #include <string> #include <vector> -#include <math.h> - -#include "dev/etherlink.hh" +#include "base/trace.hh" #include "dev/etherdump.hh" #include "dev/etherint.hh" +#include "dev/etherlink.hh" #include "dev/etherpkt.hh" -#include "base/trace.hh" +#include "sim/builder.hh" #include "sim/universe.hh" using namespace std; diff --git a/dev/ethertap.cc b/dev/ethertap.cc index e12c07c26..b99d46ce5 100644 --- a/dev/ethertap.cc +++ b/dev/ethertap.cc @@ -40,14 +40,15 @@ #include <deque> #include <string> +#include "base/misc.hh" +#include "base/pollevent.hh" +#include "base/socket.hh" +#include "base/trace.hh" #include "dev/etherdump.hh" #include "dev/etherint.hh" #include "dev/etherpkt.hh" #include "dev/ethertap.hh" -#include "base/pollevent.hh" -#include "base/socket.hh" -#include "base/trace.hh" -#include "base/misc.hh" +#include "sim/builder.hh" using namespace std; diff --git a/dev/simple_disk.cc b/dev/simple_disk.cc index d26cf44ea..aa6ff5b38 100644 --- a/dev/simple_disk.cc +++ b/dev/simple_disk.cc @@ -30,19 +30,20 @@ * Simple disk interface for the system console */ -#include <string> - #include <sys/types.h> #include <sys/uio.h> #include <fcntl.h> -#include <string.h> #include <unistd.h> -#include "dev/disk_image.hh" +#include <cstring> +#include <string> + #include "base/misc.hh" -#include "mem/functional_mem/physical_memory.hh" -#include "dev/simple_disk.hh" #include "base/trace.hh" +#include "dev/disk_image.hh" +#include "dev/simple_disk.hh" +#include "mem/functional_mem/physical_memory.hh" +#include "sim/builder.hh" using namespace std; diff --git a/kern/tru64/tru64_system.cc b/kern/tru64/tru64_system.cc index 02b6c4fae..b31b82644 100644 --- a/kern/tru64/tru64_system.cc +++ b/kern/tru64/tru64_system.cc @@ -26,17 +26,18 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "base/remote_gdb.hh" -#include "base/trace.hh" #include "base/loader/aout_object.hh" #include "base/loader/ecoff_object.hh" #include "base/loader/object_file.hh" #include "base/loader/symtab.hh" +#include "base/remote_gdb.hh" +#include "base/trace.hh" #include "cpu/exec_context.hh" #include "kern/tru64/tru64_events.hh" #include "kern/tru64/tru64_system.hh" #include "mem/functional_mem/memory_control.hh" #include "mem/functional_mem/physical_memory.hh" +#include "sim/builder.hh" #include "targetarch/isa_traits.hh" #include "targetarch/vtophys.hh" diff --git a/sim/builder.cc b/sim/builder.cc new file mode 100644 index 000000000..fa435d322 --- /dev/null +++ b/sim/builder.cc @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2003 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. + */ + +#include <assert.h> + +#include "base/inifile.hh" +#include "base/misc.hh" +#include "sim/builder.hh" +#include "sim/configfile.hh" +#include "sim/host.hh" +#include "sim/sim_object.hh" +#include "sim/sim_stats.hh" + +using namespace std; + +/////////////////////////////////////////// +// +// SimObjectBuilder member definitions +// +/////////////////////////////////////////// + +// override ParamContext::parseParams() to check params based on +// instance name first. If not found, then check based on iniSection +// (as in default ParamContext implementation). +void +SimObjectBuilder::parseParams(IniFile &iniFile) +{ + iniFilePtr = &iniFile; // set object member + + ParamList::iterator i; + + for (i = paramList->begin(); i != paramList->end(); ++i) { + string string_value; + + if (iniFile.findDefault(instanceName, (*i)->name, string_value)) { + (*i)->parse(string_value); + } + else if (iniFile.findDefault(iniSection, (*i)->name, string_value)) { + (*i)->parse(string_value); + } + } +} + + +void +SimObjectBuilder::printErrorProlog(ostream &os) +{ + os << "Error creating object '" << getInstanceName() + << "' of type '" << simObjClassName + << "', section '" << iniSection << "':" << endl; +} + + +//////////////////////////////////////////////////////////////////////// +// +// SimObjectClass member definitions +// +//////////////////////////////////////////////////////////////////////// + +// Map of class names to SimObjectBuilder creation functions. Need to +// make this a pointer so we can force initialization on the first +// reference; otherwise, some SimObjectClass constructors may be invoked +// before the classMap constructor. +map<string,SimObjectClass::CreateFunc> *SimObjectClass::classMap = NULL; + +// SimObjectClass constructor: add mapping to classMap +SimObjectClass::SimObjectClass(const string &className, CreateFunc createFunc) +{ + if (classMap == NULL) + classMap = new map<string,SimObjectClass::CreateFunc>(); + + if ((*classMap)[className]) + { + cerr << "Error: simulation object class " << className << " redefined" + << endl; + fatal(""); + } + + // add className --> createFunc to class map + (*classMap)[className] = createFunc; +} + + +// +// +SimObject * +SimObjectClass::createObject(IniFile &configDB, + const string &configClassName, + const string &objName, + ConfigNode *configNode) +{ + // find simulation object class name from configuration class + // (specified by 'type=' parameter) + string simObjClassName; + + if (!configDB.findDefault(configClassName, "type", simObjClassName)) { + cerr << "Configuration class '" << configClassName << "' not found." + << endl; + abort(); + } + + // look up className to get appropriate createFunc + if (classMap->find(simObjClassName) == classMap->end()) { + cerr << "Simulator object class '" << simObjClassName << "' not found." + << endl; + abort(); + } + + CreateFunc createFunc = (*classMap)[simObjClassName]; + + // call createFunc with config hierarchy node to get object + // builder instance (context with parameters for object creation) + SimObjectBuilder *objectBuilder = (*createFunc)(configClassName, + objName, configNode, + simObjClassName); + + assert(objectBuilder != NULL); + + // parse all parameters in context to generate parameter values + objectBuilder->parseParams(configDB); + + // now create the actual simulation object + SimObject *object = objectBuilder->create(); + + assert(object != NULL); + + // echo object parameters to stats file (for documenting the + // config used to generate the associated stats) + *statStream << "[" << object->name() << "]" << endl; + *statStream << "type=" << simObjClassName << endl; + objectBuilder->showParams(*statStream); + *statStream << endl; + + // done with the SimObjectBuilder now + delete objectBuilder; + + return object; +} + + +// +// static method: +// +void +SimObjectClass::describeAllClasses(ostream &os) +{ + map<string,CreateFunc>::iterator iter; + + for (iter = classMap->begin(); iter != classMap->end(); ++iter) { + const string &className = iter->first; + CreateFunc createFunc = iter->second; + + os << "[" << className << "]\n"; + + // create dummy object builder just to instantiate parameters + SimObjectBuilder *objectBuilder = (*createFunc)("", "", NULL, ""); + + // now get the object builder to describe ite params + objectBuilder->describeParams(os); + + os << endl; + + // done with the object builder now + delete objectBuilder; + } +} diff --git a/sim/builder.hh b/sim/builder.hh new file mode 100644 index 000000000..0364276bf --- /dev/null +++ b/sim/builder.hh @@ -0,0 +1,221 @@ +/* + * Copyright (c) 2003 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. + */ + +#ifndef __BUILDER_HH__ +#define __BUILDER_HH__ + +#include <map> +#include <list> +#include <vector> +#include <iostream> + +#include "sim/param.hh" + +class SimObject; + +// +// A SimObjectBuilder serves as an evaluation context for a set of +// parameters that describe a specific instance of a SimObject. This +// evaluation context corresponds to a section in the .ini file (as +// with the base ParamContext) plus an optional node in the +// configuration hierarchy (the configNode member) for resolving +// SimObject references. SimObjectBuilder is an abstract superclass; +// derived classes specialize the class for particular subclasses of +// SimObject (e.g., BaseCache). +// +// For typical usage, see the definition of +// SimObjectClass::createObject(). +// +class SimObjectBuilder : public ParamContext +{ + private: + // name of the instance we are creating + std::string instanceName; + + // The corresponding node in the configuration hierarchy. + // (optional: may be null if the created object is not in the + // hierarchy) + ConfigNode *configNode; + + // The external SimObject class name (for error messages) + std::string simObjClassName; + + public: + SimObjectBuilder(const std::string &_configClass, + const std::string &_instanceName, + ConfigNode *_configNode, + const std::string &_simObjClassName) + : ParamContext(_configClass, true), + instanceName(_instanceName), + configNode(_configNode), + simObjClassName(_simObjClassName) + { + } + + virtual ~SimObjectBuilder() {} + + // call parse() on all params in this context to convert string + // representations to parameter values + virtual void parseParams(IniFile &iniFile); + + // parameter error prolog (override of ParamContext) + virtual void printErrorProlog(std::ostream &); + + // generate the name for this SimObject instance (derived from the + // configuration hierarchy node label and position) + virtual const std::string &getInstanceName() { return instanceName; } + + // return the configuration hierarchy node for this context. + virtual ConfigNode *getConfigNode() { return configNode; } + + // Create the actual SimObject corresponding to the parameter + // values in this context. This function is overridden in derived + // classes to call a specific constructor for a particular + // subclass of SimObject. + virtual SimObject *create() = 0; +}; + + +// +// Handy macros for initializing parameter members of classes derived +// from SimObjectBuilder. Assumes that the name of the parameter +// member object is the same as the textual parameter name seen by the +// user. (Note that '#p' is expanded by the preprocessor to '"p"'.) +// +#define INIT_PARAM(p, desc) p(this, #p, desc) +#define INIT_PARAM_DFLT(p, desc, dflt) p(this, #p, desc, dflt) + +// +// Initialize an enumeration variable... assumes that 'map' is the +// name of an array of mappings (char * for SimpleEnumParam, or +// EnumParamMap for MappedEnumParam). +// +#define INIT_ENUM_PARAM(p, desc, map) \ + p(this, #p, desc, map, sizeof(map)/sizeof(map[0])) +#define INIT_ENUM_PARAM_DFLT(p, desc, map, dflt) \ + p(this, #p, desc, map, sizeof(map)/sizeof(map[0]), dflt) + +// +// An instance of SimObjectClass corresponds to a class derived from +// SimObject. The SimObjectClass instance serves to bind the string +// name (found in the config file) to a function that creates an +// instance of the appropriate derived class. +// +// This would be much cleaner in Smalltalk or Objective-C, where types +// are first-class objects themselves. +// +class SimObjectClass +{ + public: + // Type CreateFunc is a pointer to a function that creates a new + // simulation object builder based on a .ini-file parameter + // section (specified by the first string argument), a unique name + // for the object (specified by the second string argument), and + // an optional config hierarchy node (specified by the third + // argument). A pointer to the new SimObjectBuilder is returned. + typedef SimObjectBuilder *(*CreateFunc)(const std::string &configClassName, + const std::string &objName, + ConfigNode *configNode, + const std::string &simObjClassName); + + static std::map<std::string,CreateFunc> *classMap; + + // Constructor. For example: + // + // SimObjectClass baseCacheClass("BaseCache", newBaseCacheBuilder); + // + SimObjectClass(const std::string &className, CreateFunc createFunc); + + // create SimObject given name of class and pointer to + // configuration hierarchy node + static SimObject *createObject(IniFile &configDB, + const std::string &configClassName, + const std::string &objName, + ConfigNode *configNode); + + // print descriptions of all parameters registered with all + // SimObject classes + static void describeAllClasses(std::ostream &os); +}; + +// +// Macros to encapsulate the magic of declaring & defining +// SimObjectBuilder and SimObjectClass objects +// + +#define BEGIN_DECLARE_SIM_OBJECT_PARAMS(OBJ_CLASS) \ +class OBJ_CLASS##Builder : public SimObjectBuilder \ +{ \ + public: + +#define END_DECLARE_SIM_OBJECT_PARAMS(OBJ_CLASS) \ + \ + OBJ_CLASS##Builder(const std::string &configClass, \ + const std::string &instanceName, \ + ConfigNode *configNode, \ + const std::string &simObjClassName); \ + virtual ~OBJ_CLASS##Builder() {} \ + \ + OBJ_CLASS *create(); \ +}; + +#define BEGIN_INIT_SIM_OBJECT_PARAMS(OBJ_CLASS) \ +OBJ_CLASS##Builder::OBJ_CLASS##Builder(const std::string &configClass, \ + const std::string &instanceName, \ + ConfigNode *configNode, \ + const std::string &simObjClassName) \ + : SimObjectBuilder(configClass, instanceName, \ + configNode, simObjClassName), + + +#define END_INIT_SIM_OBJECT_PARAMS(OBJ_CLASS) \ +{ \ +} + +#define CREATE_SIM_OBJECT(OBJ_CLASS) \ +OBJ_CLASS *OBJ_CLASS##Builder::create() + +#define REGISTER_SIM_OBJECT(CLASS_NAME, OBJ_CLASS) \ +SimObjectBuilder * \ +new##OBJ_CLASS##Builder(const std::string &configClass, \ + const std::string &instanceName, \ + ConfigNode *configNode, \ + const std::string &simObjClassName) \ +{ \ + return new OBJ_CLASS##Builder(configClass, instanceName, \ + configNode, simObjClassName); \ +} \ + \ +SimObjectClass the##OBJ_CLASS##Class(CLASS_NAME, \ + new##OBJ_CLASS##Builder); \ + \ +/* see param.hh */ \ +DEFINE_SIM_OBJECT_CLASS_NAME(CLASS_NAME, OBJ_CLASS) + + +#endif // __BUILDER_HH__ diff --git a/sim/main.cc b/sim/main.cc index ae4b5af77..ce9ef5819 100644 --- a/sim/main.cc +++ b/sim/main.cc @@ -37,23 +37,22 @@ #include <string> #include <vector> -#include "sim/host.hh" -#include "base/misc.hh" - #include "base/copyright.hh" #include "base/inifile.hh" -#include "sim/configfile.hh" +#include "base/misc.hh" #include "base/pollevent.hh" #include "base/statistics.hh" +#include "cpu/base_cpu.hh" +#include "cpu/full_cpu/smt.hh" +#include "sim/async.hh" +#include "sim/builder.hh" +#include "sim/configfile.hh" +#include "sim/host.hh" #include "sim/sim_events.hh" #include "sim/sim_exit.hh" #include "sim/sim_object.hh" #include "sim/sim_stats.hh" #include "sim/sim_time.hh" -#include "cpu/full_cpu/smt.hh" - -#include "cpu/base_cpu.hh" -#include "sim/async.hh" using namespace std; diff --git a/sim/prog.cc b/sim/prog.cc index c52d51f63..275e1551b 100644 --- a/sim/prog.cc +++ b/sim/prog.cc @@ -28,22 +28,21 @@ #include <unistd.h> #include <fcntl.h> -#include <stdio.h> +#include <cstdio> #include <string> -#include "mem/functional_mem/main_memory.hh" -#include "sim/prog.hh" - -#include "eio/eio.hh" #include "base/intmath.hh" -#include "cpu/full_cpu/thread.hh" -#include "sim/fake_syscall.hh" #include "base/loader/object_file.hh" +#include "base/statistics.hh" #include "cpu/exec_context.hh" #include "cpu/full_cpu/smt.hh" - -#include "base/statistics.hh" +#include "cpu/full_cpu/thread.hh" +#include "eio/eio.hh" +#include "mem/functional_mem/main_memory.hh" +#include "sim/builder.hh" +#include "sim/fake_syscall.hh" +#include "sim/prog.hh" #include "sim/sim_stats.hh" using namespace std; diff --git a/sim/sim_object.cc b/sim/sim_object.cc index 955c43bb8..1ddb15c82 100644 --- a/sim/sim_object.cc +++ b/sim/sim_object.cc @@ -121,155 +121,3 @@ SimObject::printAllExtraOutput(ostream &os) (*i)->printExtraOutput(os); } } - -/////////////////////////////////////////// -// -// SimObjectBuilder member definitions -// -/////////////////////////////////////////// - -// override ParamContext::parseParams() to check params based on -// instance name first. If not found, then check based on iniSection -// (as in default ParamContext implementation). -void -SimObjectBuilder::parseParams(IniFile &iniFile) -{ - iniFilePtr = &iniFile; // set object member - - ParamList::iterator i; - - for (i = paramList->begin(); i != paramList->end(); ++i) { - string string_value; - - if (iniFile.findDefault(instanceName, (*i)->name, string_value)) { - (*i)->parse(string_value); - } - else if (iniFile.findDefault(iniSection, (*i)->name, string_value)) { - (*i)->parse(string_value); - } - } -} - - -void -SimObjectBuilder::printErrorProlog(ostream &os) -{ - os << "Error creating object '" << getInstanceName() - << "' of type '" << simObjClassName - << "', section '" << iniSection << "':" << endl; -} - - -//////////////////////////////////////////////////////////////////////// -// -// SimObjectClass member definitions -// -//////////////////////////////////////////////////////////////////////// - -// Map of class names to SimObjectBuilder creation functions. Need to -// make this a pointer so we can force initialization on the first -// reference; otherwise, some SimObjectClass constructors may be invoked -// before the classMap constructor. -map<string,SimObjectClass::CreateFunc> *SimObjectClass::classMap = NULL; - -// SimObjectClass constructor: add mapping to classMap -SimObjectClass::SimObjectClass(const string &className, CreateFunc createFunc) -{ - if (classMap == NULL) - classMap = new map<string,SimObjectClass::CreateFunc>(); - - if ((*classMap)[className]) - { - cerr << "Error: simulation object class " << className << " redefined" - << endl; - fatal(""); - } - - // add className --> createFunc to class map - (*classMap)[className] = createFunc; -} - - -// -// -SimObject * -SimObjectClass::createObject(IniFile &configDB, - const string &configClassName, - const string &objName, - ConfigNode *configNode) -{ - // find simulation object class name from configuration class - // (specified by 'type=' parameter) - string simObjClassName; - - if (!configDB.findDefault(configClassName, "type", simObjClassName)) { - cerr << "Configuration class '" << configClassName << "' not found." - << endl; - abort(); - } - - // look up className to get appropriate createFunc - if (classMap->find(simObjClassName) == classMap->end()) { - cerr << "Simulator object class '" << simObjClassName << "' not found." - << endl; - abort(); - } - - CreateFunc createFunc = (*classMap)[simObjClassName]; - - // call createFunc with config hierarchy node to get object - // builder instance (context with parameters for object creation) - SimObjectBuilder *objectBuilder = (*createFunc)(configClassName, - objName, configNode, - simObjClassName); - - assert(objectBuilder != NULL); - - // parse all parameters in context to generate parameter values - objectBuilder->parseParams(configDB); - - // now create the actual simulation object - SimObject *object = objectBuilder->create(); - - assert(object != NULL); - - // echo object parameters to stats file (for documenting the - // config used to generate the associated stats) - *statStream << "[" << object->name() << "]" << endl; - *statStream << "type=" << simObjClassName << endl; - objectBuilder->showParams(*statStream); - *statStream << endl; - - // done with the SimObjectBuilder now - delete objectBuilder; - - return object; -} - - -// -// static method: -// -void -SimObjectClass::describeAllClasses(ostream &os) -{ - map<string,CreateFunc>::iterator iter; - - for (iter = classMap->begin(); iter != classMap->end(); ++iter) { - const string &className = iter->first; - CreateFunc createFunc = iter->second; - - os << "[" << className << "]\n"; - - // create dummy object builder just to instantiate parameters - SimObjectBuilder *objectBuilder = (*createFunc)("", "", NULL, ""); - - // now get the object builder to describe ite params - objectBuilder->describeParams(os); - - os << endl; - - // done with the object builder now - delete objectBuilder; - } -} diff --git a/sim/sim_object.hh b/sim/sim_object.hh index 7f71d1852..6c15fc88f 100644 --- a/sim/sim_object.hh +++ b/sim/sim_object.hh @@ -76,185 +76,4 @@ class SimObject : public Serializeable static void printAllExtraOutput(std::ostream&); }; - -// -// A SimObjectBuilder serves as an evaluation context for a set of -// parameters that describe a specific instance of a SimObject. This -// evaluation context corresponds to a section in the .ini file (as -// with the base ParamContext) plus an optional node in the -// configuration hierarchy (the configNode member) for resolving -// SimObject references. SimObjectBuilder is an abstract superclass; -// derived classes specialize the class for particular subclasses of -// SimObject (e.g., BaseCache). -// -// For typical usage, see the definition of -// SimObjectClass::createObject(). -// -class SimObjectBuilder : public ParamContext -{ - private: - // name of the instance we are creating - std::string instanceName; - - // The corresponding node in the configuration hierarchy. - // (optional: may be null if the created object is not in the - // hierarchy) - ConfigNode *configNode; - - // The external SimObject class name (for error messages) - std::string simObjClassName; - - public: - SimObjectBuilder(const std::string &_configClass, - const std::string &_instanceName, - ConfigNode *_configNode, - const std::string &_simObjClassName) - : ParamContext(_configClass, true), - instanceName(_instanceName), - configNode(_configNode), - simObjClassName(_simObjClassName) - { - } - - virtual ~SimObjectBuilder() {} - - // call parse() on all params in this context to convert string - // representations to parameter values - virtual void parseParams(IniFile &iniFile); - - // parameter error prolog (override of ParamContext) - virtual void printErrorProlog(std::ostream &); - - // generate the name for this SimObject instance (derived from the - // configuration hierarchy node label and position) - virtual const std::string &getInstanceName() { return instanceName; } - - // return the configuration hierarchy node for this context. - virtual ConfigNode *getConfigNode() { return configNode; } - - // Create the actual SimObject corresponding to the parameter - // values in this context. This function is overridden in derived - // classes to call a specific constructor for a particular - // subclass of SimObject. - virtual SimObject *create() = 0; -}; - - -// -// Handy macros for initializing parameter members of classes derived -// from SimObjectBuilder. Assumes that the name of the parameter -// member object is the same as the textual parameter name seen by the -// user. (Note that '#p' is expanded by the preprocessor to '"p"'.) -// -#define INIT_PARAM(p, desc) p(this, #p, desc) -#define INIT_PARAM_DFLT(p, desc, dflt) p(this, #p, desc, dflt) - -// -// Initialize an enumeration variable... assumes that 'map' is the -// name of an array of mappings (char * for SimpleEnumParam, or -// EnumParamMap for MappedEnumParam). -// -#define INIT_ENUM_PARAM(p, desc, map) \ - p(this, #p, desc, map, sizeof(map)/sizeof(map[0])) -#define INIT_ENUM_PARAM_DFLT(p, desc, map, dflt) \ - p(this, #p, desc, map, sizeof(map)/sizeof(map[0]), dflt) - -// -// An instance of SimObjectClass corresponds to a class derived from -// SimObject. The SimObjectClass instance serves to bind the string -// name (found in the config file) to a function that creates an -// instance of the appropriate derived class. -// -// This would be much cleaner in Smalltalk or Objective-C, where types -// are first-class objects themselves. -// -class SimObjectClass -{ - public: - // Type CreateFunc is a pointer to a function that creates a new - // simulation object builder based on a .ini-file parameter - // section (specified by the first string argument), a unique name - // for the object (specified by the second string argument), and - // an optional config hierarchy node (specified by the third - // argument). A pointer to the new SimObjectBuilder is returned. - typedef SimObjectBuilder *(*CreateFunc)(const std::string &configClassName, - const std::string &objName, - ConfigNode *configNode, - const std::string &simObjClassName); - - static std::map<std::string,CreateFunc> *classMap; - - // Constructor. For example: - // - // SimObjectClass baseCacheClass("BaseCache", newBaseCacheBuilder); - // - SimObjectClass(const std::string &className, CreateFunc createFunc); - - // create SimObject given name of class and pointer to - // configuration hierarchy node - static SimObject *createObject(IniFile &configDB, - const std::string &configClassName, - const std::string &objName, - ConfigNode *configNode); - - // print descriptions of all parameters registered with all - // SimObject classes - static void describeAllClasses(std::ostream &os); -}; - -// -// Macros to encapsulate the magic of declaring & defining -// SimObjectBuilder and SimObjectClass objects -// - -#define BEGIN_DECLARE_SIM_OBJECT_PARAMS(OBJ_CLASS) \ -class OBJ_CLASS##Builder : public SimObjectBuilder \ -{ \ - public: - -#define END_DECLARE_SIM_OBJECT_PARAMS(OBJ_CLASS) \ - \ - OBJ_CLASS##Builder(const std::string &configClass, \ - const std::string &instanceName, \ - ConfigNode *configNode, \ - const std::string &simObjClassName); \ - virtual ~OBJ_CLASS##Builder() {} \ - \ - OBJ_CLASS *create(); \ -}; - -#define BEGIN_INIT_SIM_OBJECT_PARAMS(OBJ_CLASS) \ -OBJ_CLASS##Builder::OBJ_CLASS##Builder(const std::string &configClass, \ - const std::string &instanceName, \ - ConfigNode *configNode, \ - const std::string &simObjClassName) \ - : SimObjectBuilder(configClass, instanceName, \ - configNode, simObjClassName), - - -#define END_INIT_SIM_OBJECT_PARAMS(OBJ_CLASS) \ -{ \ -} - -#define CREATE_SIM_OBJECT(OBJ_CLASS) \ -OBJ_CLASS *OBJ_CLASS##Builder::create() - -#define REGISTER_SIM_OBJECT(CLASS_NAME, OBJ_CLASS) \ -SimObjectBuilder * \ -new##OBJ_CLASS##Builder(const std::string &configClass, \ - const std::string &instanceName, \ - ConfigNode *configNode, \ - const std::string &simObjClassName) \ -{ \ - return new OBJ_CLASS##Builder(configClass, instanceName, \ - configNode, simObjClassName); \ -} \ - \ -SimObjectClass the##OBJ_CLASS##Class(CLASS_NAME, \ - new##OBJ_CLASS##Builder); \ - \ -/* see param.hh */ \ -DEFINE_SIM_OBJECT_CLASS_NAME(CLASS_NAME, OBJ_CLASS) - - #endif // __SIM_OBJECT_HH__ diff --git a/test/Makefile b/test/Makefile index 8c36f9806..c95f8cb8d 100644 --- a/test/Makefile +++ b/test/Makefile @@ -4,15 +4,15 @@ CC= gcc CXX= g++ CURDIR?= $(shell /bin/pwd) -SRCDIR?= . +SRCDIR?= .. TARGET?= alpha -TEST_SRCDIR?= $(SRCDIR) -ARCH_SRCDIR?= $(SRCDIR)/../arch/$(TARGET) -BASE_SRCDIR?= $(SRCDIR)/../base -SIM_SRCDIR?= $(SRCDIR)/../sim -CACHE_SRCDIR?= $(SRCDIR)/../sim/cache -OLD_SRCDIR= $(SRCDIR)/../old +TEST_SRCDIR?= $(SRCDIR)/test +ARCH_SRCDIR?= $(SRCDIR)/arch/$(TARGET) +BASE_SRCDIR?= $(SRCDIR)/base +SIM_SRCDIR?= $(SRCDIR)/sim +CACHE_SRCDIR?= $(SRCDIR)/sim/cache +OLD_SRCDIR= $(SRCDIR)/old vpath % $(TEST_SRCDIR) vpath % $(BASE_SRCDIR) @@ -20,13 +20,14 @@ vpath % $(SIM_SRCDIR) vpath % $(CACHE_SRCDIR) vpath % $(OLD_SRCDIR) -INCLDIRS= -I$(ARCH_SRCDIR) -I$(BASE_SRCDIR) -I$(SIM_SRCDIR) \ - -I$(CACHE_SRCDIR) -I$(OLD_SRCDIR) -CCFLAGS= -g -O0 -MMD -I. $(INCLDIRS) -I- -DTRACING_ON=0 +CCFLAGS= -g -O0 -MMD -I. -I$(SRCDIR) -I- -DTRACING_ON=0 default: @echo "You must specify a target" +targetarch: + ln -s ../arch/$(TARGET) targetarch + bitvectest: bitvectest.o $(CXX) $(LFLAGS) -o $@ $^ @@ -51,7 +52,8 @@ offtest: offtest.o rangetest: rangetest.o str.o $(CXX) $(LFLAGS) -o $@ $^ -stattest: statistics.o stattest.o cprintf.o misc.o omisc.o str.o +stattest: cprintf.o hostinfo.o misc.o sim_stats.o sim_time.o \ + statistics.o stattest.o str.o $(CXX) $(LFLAGS) -o $@ $^ strnumtest: strnumtest.o str.o @@ -63,7 +65,7 @@ symtest: misc.o symtest.o symtab.o str.o tokentest: tokentest.o str.o $(CXX) $(LFLAGS) -o $@ $^ -tracetest: tracetest.o trace.o trace_flags.o cprintf.o str.o misc.o omisc.o +tracetest: tracetest.o trace.o trace_flags.o cprintf.o str.o misc.o $(CXX) $(LFLAGS) -o $@ $^ clean: diff --git a/test/stattest.cc b/test/stattest.cc index a009c16d8..38a15900d 100644 --- a/test/stattest.cc +++ b/test/stattest.cc @@ -32,15 +32,16 @@ #include <unistd.h> #include "base/cprintf.hh" -#include "sim/host.hh" #include "base/misc.hh" #include "base/statistics.hh" +#include "sim/host.hh" +#include "sim/sim_stats.hh" using namespace std; using namespace Statistics; Tick curTick = 0; -//Tick ticksPerSecond = ULL(2000000000); +Tick ticksPerSecond = ULL(2000000000); Scalar<> s1; Scalar<> s2; @@ -493,10 +494,17 @@ main(int argc, char *argv[]) s12.sample(100); MainBin::activate(bin1); + cout << "dump 1" << endl; dump(cout); cout << endl << endl; MainBin::activate(bin2); + cout << "dump 2" << endl; + dump(cout); + cout << endl << endl; + + cout << "dump 3" << endl; + reset(); dump(cout); cout << endl << endl; |