Ruby: Add support for functional accesses
[gem5.git] / src / mem / ruby / system / System.hh
index 38ef091775de46ca191acf0b3c95501a4803c146..88a0186c5dfffe9f69332b27f0586f7e172fb4eb 100644 (file)
@@ -1,4 +1,3 @@
-
 /*
  * 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,
@@ -72,132 +62,131 @@ class MemoryControl;
  * 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 &section);
+
+    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__