RubySystem.hh revision 6895
19157Sandreas.hansson@arm.com
29157Sandreas.hansson@arm.com/*
39157Sandreas.hansson@arm.com * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
49157Sandreas.hansson@arm.com * All rights reserved.
59157Sandreas.hansson@arm.com *
69157Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without
79157Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are
89157Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright
99157Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer;
109157Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright
119157Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the
129157Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution;
139157Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its
149157Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from
159157Sandreas.hansson@arm.com * this software without specific prior written permission.
169157Sandreas.hansson@arm.com *
179157Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
189157Sandreas.hansson@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
199157Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
209157Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
219157Sandreas.hansson@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
229157Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
239157Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
249157Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
259157Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
269157Sandreas.hansson@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
279157Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
289157Sandreas.hansson@arm.com */
299157Sandreas.hansson@arm.com
309157Sandreas.hansson@arm.com/*
319157Sandreas.hansson@arm.com * System.hh
329157Sandreas.hansson@arm.com *
339157Sandreas.hansson@arm.com * Description: Contains all of the various parts of the system we are
349157Sandreas.hansson@arm.com * simulating.  Performs allocation, deallocation, and setup of all
359157Sandreas.hansson@arm.com * the major components of the system
369157Sandreas.hansson@arm.com *
379157Sandreas.hansson@arm.com * $Id$
389157Sandreas.hansson@arm.com *
399157Sandreas.hansson@arm.com */
409157Sandreas.hansson@arm.com
419157Sandreas.hansson@arm.com#ifndef SYSTEM_H
429157Sandreas.hansson@arm.com#define SYSTEM_H
439157Sandreas.hansson@arm.com
449157Sandreas.hansson@arm.com#include "mem/ruby/system/RubyPort.hh"
459157Sandreas.hansson@arm.com#include "mem/ruby/common/Global.hh"
469157Sandreas.hansson@arm.com#include "mem/gems_common/Vector.hh"
479157Sandreas.hansson@arm.com#include "mem/ruby/eventqueue/RubyEventQueue.hh"
489157Sandreas.hansson@arm.com#include <map>
499418Sandreas.hansson@arm.com#include "sim/sim_object.hh"
509157Sandreas.hansson@arm.com#include "params/RubySystem.hh"
519356Snilay@cs.wisc.edu#include "base/callback.hh"
529157Sandreas.hansson@arm.com
539157Sandreas.hansson@arm.comclass Profiler;
549157Sandreas.hansson@arm.comclass Network;
559157Sandreas.hansson@arm.comclass CacheRecorder;
569157Sandreas.hansson@arm.comclass Tracer;
579157Sandreas.hansson@arm.comclass Sequencer;
589157Sandreas.hansson@arm.comclass DMASequencer;
599157Sandreas.hansson@arm.comclass MemoryVector;
609157Sandreas.hansson@arm.comclass AbstractController;
619157Sandreas.hansson@arm.comclass MessageBuffer;
629157Sandreas.hansson@arm.comclass CacheMemory;
639179Sandreas.hansson@arm.comclass DirectoryMemory;
649179Sandreas.hansson@arm.comclass Topology;
659179Sandreas.hansson@arm.comclass MemoryControl;
669179Sandreas.hansson@arm.com
679179Sandreas.hansson@arm.com/*
689179Sandreas.hansson@arm.com * This defines the number of longs (32-bits on 32 bit machines,
699180Sandreas.hansson@arm.com * 64-bit on 64-bit AMD machines) to use to hold the set...
709179Sandreas.hansson@arm.com * the default is 4, allowing 128 or 256 different members
719157Sandreas.hansson@arm.com * of the set.
729157Sandreas.hansson@arm.com *
739157Sandreas.hansson@arm.com * This should never need to be changed for correctness reasons,
749157Sandreas.hansson@arm.com * though increasing it will increase performance for larger
759157Sandreas.hansson@arm.com * set sizes at the cost of a (much) larger memory footprint
769157Sandreas.hansson@arm.com *
779157Sandreas.hansson@arm.com */
789179Sandreas.hansson@arm.comconst int NUMBER_WORDS_PER_SET = 4;
799179Sandreas.hansson@arm.com
809179Sandreas.hansson@arm.com
819179Sandreas.hansson@arm.comstruct RubyObjConf {
829179Sandreas.hansson@arm.com  string type;
839179Sandreas.hansson@arm.com  string name;
849179Sandreas.hansson@arm.com  vector<string> argv;
859179Sandreas.hansson@arm.com  RubyObjConf(string _type, string _name, vector<string> _argv)
869179Sandreas.hansson@arm.com    : type(_type), name(_name), argv(_argv)
879179Sandreas.hansson@arm.com  {}
889179Sandreas.hansson@arm.com};
899179Sandreas.hansson@arm.com
909179Sandreas.hansson@arm.comclass RubySystem : public SimObject {
919179Sandreas.hansson@arm.compublic:
929179Sandreas.hansson@arm.com    typedef RubySystemParams Params;
939179Sandreas.hansson@arm.com    RubySystem(const Params *p);
949179Sandreas.hansson@arm.com  // Destructor
959179Sandreas.hansson@arm.com  ~RubySystem();
969179Sandreas.hansson@arm.com
979179Sandreas.hansson@arm.com  // config accessors
989179Sandreas.hansson@arm.com  static int getRandomSeed() { return m_random_seed; }
999179Sandreas.hansson@arm.com  static int getRandomization() { return m_randomization; }
1009179Sandreas.hansson@arm.com  static int getBlockSizeBytes() { return m_block_size_bytes; }
1019180Sandreas.hansson@arm.com  static int getBlockSizeBits() { return m_block_size_bits; }
1029179Sandreas.hansson@arm.com  static uint64 getMemorySizeBytes() { return m_memory_size_bytes; }
1039179Sandreas.hansson@arm.com  static int getMemorySizeBits() { return m_memory_size_bits; }
1049179Sandreas.hansson@arm.com
1059179Sandreas.hansson@arm.com  // Public Methods
1069157Sandreas.hansson@arm.com  static RubyPort* getPortOnly(const string & name) {
1079157Sandreas.hansson@arm.com    assert(m_ports.count(name) == 1); return m_ports[name]; }
1089157Sandreas.hansson@arm.com  static RubyPort* getPort(const string & name, void (*hit_callback)(int64_t)) {
1099545Sandreas.hansson@arm.com    if (m_ports.count(name) != 1){
1109545Sandreas.hansson@arm.com      cerr << "Port " << name << " has " << m_ports.count(name) << " instances" << endl;
1119157Sandreas.hansson@arm.com    }
1129157Sandreas.hansson@arm.com    assert(m_ports.count(name) == 1);
1139157Sandreas.hansson@arm.com    m_ports[name]->registerHitCallback(hit_callback);
1149157Sandreas.hansson@arm.com    return m_ports[name];
1159179Sandreas.hansson@arm.com  }
1169179Sandreas.hansson@arm.com  static Network* getNetwork() { assert(m_network_ptr != NULL); return m_network_ptr; }
1179418Sandreas.hansson@arm.com  static Topology* getTopology(const string & name) { assert(m_topologies.count(name) == 1); return m_topologies[name]; }
1189418Sandreas.hansson@arm.com  static CacheMemory* getCache(const string & name) { assert(m_caches.count(name) == 1); return m_caches[name]; }
1199418Sandreas.hansson@arm.com  static DirectoryMemory* getDirectory(const string & name) { assert(m_directories.count(name) == 1); return m_directories[name]; }
1209418Sandreas.hansson@arm.com  static MemoryControl* getMemoryControl(const string & name) { assert(m_memorycontrols.count(name) == 1); return m_memorycontrols[name]; }
1219418Sandreas.hansson@arm.com  static Sequencer* getSequencer(const string & name) { assert(m_sequencers.count(name) == 1); return m_sequencers[name]; }
1229157Sandreas.hansson@arm.com  static DMASequencer* getDMASequencer(const string & name) { assert(m_dma_sequencers.count(name) == 1); return m_dma_sequencers[name]; }
1239157Sandreas.hansson@arm.com  static AbstractController* getController(const string & name) { assert(m_controllers.count(name) == 1); return m_controllers[name]; }
1249157Sandreas.hansson@arm.com
1259157Sandreas.hansson@arm.com  static RubyEventQueue* getEventQueue() { return g_eventQueue_ptr; }
1269157Sandreas.hansson@arm.com
1279157Sandreas.hansson@arm.com  static int getNumberOfDirectories() { return m_directories.size(); }
1289296Snilay@cs.wisc.edu  static int getNumberOfSequencers() { return m_sequencers.size(); }
1299296Snilay@cs.wisc.edu
1309296Snilay@cs.wisc.edu  Profiler* getProfiler() {assert(m_profiler_ptr != NULL); return m_profiler_ptr; }
1319296Snilay@cs.wisc.edu  static Tracer* getTracer() { assert(m_tracer_ptr != NULL); return m_tracer_ptr; }
1329296Snilay@cs.wisc.edu  static MemoryVector* getMemoryVector() { assert(m_mem_vec_ptr != NULL); return m_mem_vec_ptr;}
1339296Snilay@cs.wisc.edu
1349296Snilay@cs.wisc.edu  void recordCacheContents(CacheRecorder& tr) const;
1359296Snilay@cs.wisc.edu  static void printConfig(ostream& out);
1369296Snilay@cs.wisc.edu  static void printStats(ostream& out);
1379296Snilay@cs.wisc.edu  void clearStats() const;
1389296Snilay@cs.wisc.edu
1399296Snilay@cs.wisc.edu  uint64 getInstructionCount(int thread) { return 1; }
1409157Sandreas.hansson@arm.com  static uint64 getCycleCount(int thread) { return g_eventQueue_ptr->getTime(); }
1419157Sandreas.hansson@arm.com
1429157Sandreas.hansson@arm.com  void print(ostream& out) const;
1439179Sandreas.hansson@arm.com  /*
1449179Sandreas.hansson@arm.com#ifdef CHECK_COHERENCE
1459179Sandreas.hansson@arm.com  void checkGlobalCoherenceInvariant(const Address& addr);
1469179Sandreas.hansson@arm.com#endif
1479179Sandreas.hansson@arm.com  */
1489179Sandreas.hansson@arm.com
1499179Sandreas.hansson@arm.comprivate:
1509179Sandreas.hansson@arm.com  // Constructors
1519180Sandreas.hansson@arm.com  RubySystem(const vector <RubyObjConf> & cfg_file);
1529179Sandreas.hansson@arm.com
1539179Sandreas.hansson@arm.com  // Private copy constructor and assignment operator
1549179Sandreas.hansson@arm.com  RubySystem(const RubySystem& obj);
1559179Sandreas.hansson@arm.com  RubySystem& operator=(const RubySystem& obj);
1569179Sandreas.hansson@arm.com
1579180Sandreas.hansson@arm.com  void init();
1589179Sandreas.hansson@arm.com
1599179Sandreas.hansson@arm.com  static void printSystemConfig(ostream& out);
1609179Sandreas.hansson@arm.com
1619179Sandreas.hansson@arm.comprivate:
1629179Sandreas.hansson@arm.com  // configuration parameters
1639179Sandreas.hansson@arm.com  static int m_random_seed;
1649180Sandreas.hansson@arm.com  static bool m_randomization;
1659179Sandreas.hansson@arm.com  static Tick m_clock;
1669180Sandreas.hansson@arm.com  static int m_block_size_bytes;
1679179Sandreas.hansson@arm.com  static int m_block_size_bits;
1689179Sandreas.hansson@arm.com  static uint64 m_memory_size_bytes;
1699179Sandreas.hansson@arm.com  static int m_memory_size_bits;
1709179Sandreas.hansson@arm.com
1719179Sandreas.hansson@arm.com  // Data Members (m_ prefix)
1729179Sandreas.hansson@arm.com  static Network* m_network_ptr;
1739179Sandreas.hansson@arm.com  static map< string, Topology* > m_topologies;
1749179Sandreas.hansson@arm.com  static map< string, RubyPort* > m_ports;
1759648Sdam.sunwoo@arm.com  static map< string, CacheMemory* > m_caches;
1769648Sdam.sunwoo@arm.com  static map< string, DirectoryMemory* > m_directories;
1779648Sdam.sunwoo@arm.com  static map< string, Sequencer* > m_sequencers;
1789157Sandreas.hansson@arm.com  static map< string, DMASequencer* > m_dma_sequencers;
1799157Sandreas.hansson@arm.com  static map< string, AbstractController* > m_controllers;
1809157Sandreas.hansson@arm.com  static map< string, MemoryControl* > m_memorycontrols;
1819157Sandreas.hansson@arm.com
1829648Sdam.sunwoo@arm.com  //added by SS
1839157Sandreas.hansson@arm.com  //static map< string, Tracer* > m_tracers;
1849180Sandreas.hansson@arm.com
1859157Sandreas.hansson@arm.compublic:
1869179Sandreas.hansson@arm.com  static Profiler* m_profiler_ptr;
1879157Sandreas.hansson@arm.com  static Tracer* m_tracer_ptr;
1889550Sandreas.hansson@arm.com  static MemoryVector* m_mem_vec_ptr;
1899550Sandreas.hansson@arm.com};
1909157Sandreas.hansson@arm.com
1919157Sandreas.hansson@arm.com// Output operator declaration
1929157Sandreas.hansson@arm.comostream& operator<<(ostream& out, const RubySystem& obj);
1939157Sandreas.hansson@arm.com
194// ******************* Definitions *******************
195
196// Output operator definition
197inline
198ostream& operator<<(ostream& out, const RubySystem& obj)
199{
200//  obj.print(out);
201  out << flush;
202  return out;
203}
204
205class RubyExitCallback : public Callback
206{
207  private:
208    string stats_filename;
209
210  public:
211    /**
212     * virtualize the destructor to make sure that the correct one
213     * gets called.
214     */
215
216    virtual ~RubyExitCallback() {}
217
218    RubyExitCallback(const string& _stats_filename)
219    {
220      stats_filename = _stats_filename;
221    }
222
223    virtual void process();
224};
225
226#endif //SYSTEM_H
227
228
229
230