-
/*
* Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
* All rights reserved.
*/
/*
- * System.hh
- *
- * Description: Contains all of the various parts of the system we are
- * simulating. Performs allocation, deallocation, and setup of all
- * the major components of the system
- *
- * $Id$
- *
+ * Contains all of the various parts of the system we are simulating.
+ * Performs allocation, deallocation, and setup of all the major
+ * components of the system
*/
-#ifndef SYSTEM_H
-#define SYSTEM_H
+#ifndef __MEM_RUBY_SYSTEM_SYSTEM_HH__
+#define __MEM_RUBY_SYSTEM_SYSTEM_HH__
-#include "mem/ruby/system/RubyPort.hh"
+#include "base/callback.hh"
#include "mem/ruby/common/Global.hh"
-#include "mem/gems_common/Vector.hh"
#include "mem/ruby/eventqueue/RubyEventQueue.hh"
-#include <map>
+#include "mem/ruby/system/RubyPort.hh"
+#include "mem/ruby/slicc_interface/AbstractController.hh"
+#include "params/RubySystem.hh"
+#include "sim/sim_object.hh"
-class Profiler;
-class Network;
+class AbstractController;
+class AbstractMemory;
class CacheRecorder;
-class Tracer;
-class Sequencer;
-class DMASequencer;
class MemoryVector;
-class AbstractController;
-class MessageBuffer;
-class CacheMemory;
-class DirectoryMemory;
-class Topology;
-class MemoryControl;
+class Network;
+class Profiler;
+class Tracer;
/*
* This defines the number of longs (32-bits on 32 bit machines,
* set sizes at the cost of a (much) larger memory footprint
*
*/
-const int NUMBER_WORDS_PER_SET = 4;
+const int NUMBER_WORDS_PER_SET = 1;
+class RubySystem : public SimObject
+{
+ public:
+ typedef RubySystemParams Params;
+ RubySystem(const Params *p);
+ ~RubySystem();
+
+ // config accessors
+ static int getRandomSeed() { return m_random_seed; }
+ static int getRandomization() { return m_randomization; }
+ static int getBlockSizeBytes() { return m_block_size_bytes; }
+ static int getBlockSizeBits() { return m_block_size_bits; }
+ static uint64 getMemorySizeBytes() { return m_memory_size_bytes; }
+ static int getMemorySizeBits() { return m_memory_size_bits; }
+
+ // Public Methods
+ static Network*
+ getNetwork()
+ {
+ assert(m_network_ptr != NULL);
+ return m_network_ptr;
+ }
-struct RubyObjConf {
- string type;
- string name;
- vector<string> argv;
- RubyObjConf(string _type, string _name, vector<string> _argv)
- : type(_type), name(_name), argv(_argv)
- {}
-};
+ static RubyEventQueue*
+ getEventQueue()
+ {
+ return g_eventQueue_ptr;
+ }
-class RubySystem {
-public:
- static RubySystem* create(const vector <RubyObjConf> & sys_conf);
- // Destructor
- ~RubySystem();
-
- // config accessors
- static int getRandomSeed() { return m_random_seed; }
- static int getRandomization() { return m_randomization; }
- static int getTechNm() { return m_tech_nm; }
- static int getFreqMhz() { return m_freq_mhz; }
- static int getBlockSizeBytes() { return m_block_size_bytes; }
- static int getBlockSizeBits() { return m_block_size_bits; }
- static uint64 getMemorySizeBytes() { return m_memory_size_bytes; }
- static int getMemorySizeBits() { return m_memory_size_bits; }
-
- // Public Methods
- static RubyPort* getPortOnly(const string & name) {
- assert(m_ports.count(name) == 1); return m_ports[name]; }
- static RubyPort* getPort(const string & name, void (*hit_callback)(int64_t)) {
- if (m_ports.count(name) != 1){
- cerr << "Port " << name << " has " << m_ports.count(name) << " instances" << endl;
+ Profiler*
+ getProfiler()
+ {
+ assert(m_profiler_ptr != NULL);
+ return m_profiler_ptr;
}
- assert(m_ports.count(name) == 1); m_ports[name]->registerHitCallback(hit_callback); return m_ports[name]; }
- static Network* getNetwork() { assert(m_network_ptr != NULL); return m_network_ptr; }
- static Topology* getTopology(const string & name) { assert(m_topologies.count(name) == 1); return m_topologies[name]; }
- static CacheMemory* getCache(const string & name) { assert(m_caches.count(name) == 1); return m_caches[name]; }
- static DirectoryMemory* getDirectory(const string & name) { assert(m_directories.count(name) == 1); return m_directories[name]; }
- static MemoryControl* getMemoryControl(const string & name) { assert(m_memorycontrols.count(name) == 1); return m_memorycontrols[name]; }
- static Sequencer* getSequencer(const string & name) { assert(m_sequencers.count(name) == 1); return m_sequencers[name]; }
- static DMASequencer* getDMASequencer(const string & name) { assert(m_dma_sequencers.count(name) == 1); return m_dma_sequencers[name]; }
- static AbstractController* getController(const string & name) { assert(m_controllers.count(name) == 1); return m_controllers[name]; }
-
- static RubyEventQueue* getEventQueue() { return g_eventQueue_ptr; }
-
- static int getNumberOfDirectories() { return m_directories.size(); }
- static int getNumberOfSequencers() { return m_sequencers.size(); }
-
- Profiler* getProfiler() {assert(m_profiler_ptr != NULL); return m_profiler_ptr; }
- static Tracer* getTracer() { assert(m_tracer_ptr != NULL); return m_tracer_ptr; }
- static MemoryVector* getMemoryVector() { assert(m_mem_vec_ptr != NULL); return m_mem_vec_ptr;}
-
- void recordCacheContents(CacheRecorder& tr) const;
- static void printConfig(ostream& out);
- static void printStats(ostream& out);
- void clearStats() const;
-
- uint64 getInstructionCount(int thread) { return 1; }
- static uint64 getCycleCount(int thread) { return g_eventQueue_ptr->getTime(); }
-
- void print(ostream& out) const;
- /*
-#ifdef CHECK_COHERENCE
- void checkGlobalCoherenceInvariant(const Address& addr);
-#endif
- */
-
-private:
- // Constructors
- RubySystem(const vector <RubyObjConf> & cfg_file);
-
- // Private copy constructor and assignment operator
- RubySystem(const RubySystem& obj);
- RubySystem& operator=(const RubySystem& obj);
-
- void init(const vector<string> & argv);
-
- static void printSystemConfig(ostream& out);
-
-private:
- // configuration parameters
- static int m_random_seed;
- static bool m_randomization;
- static int m_tech_nm;
- static int m_freq_mhz;
- static int m_block_size_bytes;
- static int m_block_size_bits;
- static uint64 m_memory_size_bytes;
- static int m_memory_size_bits;
-
- // Data Members (m_ prefix)
- static Network* m_network_ptr;
- static map< string, Topology* > m_topologies;
- static map< string, RubyPort* > m_ports;
- static map< string, CacheMemory* > m_caches;
- static map< string, DirectoryMemory* > m_directories;
- static map< string, Sequencer* > m_sequencers;
- static map< string, DMASequencer* > m_dma_sequencers;
- static map< string, AbstractController* > m_controllers;
- static map< string, MemoryControl* > m_memorycontrols;
-
- //added by SS
- //static map< string, Tracer* > m_tracers;
-
- static Profiler* m_profiler_ptr;
- static Tracer* m_tracer_ptr;
- static MemoryVector* m_mem_vec_ptr;
-};
-// Output operator declaration
-ostream& operator<<(ostream& out, const RubySystem& obj);
+ static Tracer*
+ getTracer()
+ {
+ assert(m_tracer_ptr != NULL);
+ return m_tracer_ptr;
+ }
+
+ static MemoryVector*
+ getMemoryVector()
+ {
+ assert(m_mem_vec_ptr != NULL);
+ return m_mem_vec_ptr;
+ }
+
+ void recordCacheContents(CacheRecorder& tr) const;
+ static void printConfig(std::ostream& out);
+ static void printStats(std::ostream& out);
+ void clearStats() const;
+
+ uint64 getInstructionCount(int thread) { return 1; }
+ static uint64
+ getCycleCount(int thread)
+ {
+ return g_eventQueue_ptr->getTime();
+ }
+
+ void print(std::ostream& out) const;
+
+ virtual void serialize(std::ostream &os);
+ virtual void unserialize(Checkpoint *cp, const std::string §ion);
+
+ void registerNetwork(Network*);
+ void registerProfiler(Profiler*);
+ void registerTracer(Tracer*);
+ void registerAbstractMemory(AbstractMemory*);
+ void registerAbstractController(AbstractController*);
+
+ private:
+ // Private copy constructor and assignment operator
+ RubySystem(const RubySystem& obj);
+ RubySystem& operator=(const RubySystem& obj);
-// ******************* Definitions *******************
+ void init();
-// Output operator definition
-inline
-ostream& operator<<(ostream& out, const RubySystem& obj)
+ static void printSystemConfig(std::ostream& out);
+
+ private:
+ // configuration parameters
+ static int m_random_seed;
+ static bool m_randomization;
+ static Tick m_clock;
+ static int m_block_size_bytes;
+ static int m_block_size_bits;
+ static uint64 m_memory_size_bytes;
+ static int m_memory_size_bits;
+
+ static Network* m_network_ptr;
+
+ public:
+ static Profiler* m_profiler_ptr;
+ static Tracer* m_tracer_ptr;
+ static MemoryVector* m_mem_vec_ptr;
+ std::vector<AbstractController*> m_abs_cntrl_vec;
+};
+
+inline std::ostream&
+operator<<(std::ostream& out, const RubySystem& obj)
{
-// obj.print(out);
- out << flush;
- return out;
+ //obj.print(out);
+ out << std::flush;
+ return out;
}
-#endif //SYSTEM_H
+class RubyExitCallback : public Callback
+{
+ private:
+ std::string stats_filename;
+
+ public:
+ virtual ~RubyExitCallback() {}
+ RubyExitCallback(const std::string& _stats_filename)
+ {
+ stats_filename = _stats_filename;
+ }
+ virtual void process();
+};
+#endif // __MEM_RUBY_SYSTEM_SYSTEM_HH__