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