RubySystem.hh revision 9504
111752Snikos.nikoleris@arm.com/* 210705Sandreas.hansson@arm.com * Copyright (c) 1999-2012 Mark D. Hill and David A. Wood 310705Sandreas.hansson@arm.com * All rights reserved. 410705Sandreas.hansson@arm.com * 510705Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 610705Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 710705Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 810705Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 910705Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 1010705Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 1110705Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 1210705Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 1310705Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 1410705Sandreas.hansson@arm.com * this software without specific prior written permission. 1510705Sandreas.hansson@arm.com * 1610705Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1710705Sandreas.hansson@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1810705Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1910705Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2010705Sandreas.hansson@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2110705Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2210705Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2310705Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2410705Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2510705Sandreas.hansson@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2610705Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2710705Sandreas.hansson@arm.com */ 2810705Sandreas.hansson@arm.com 2910705Sandreas.hansson@arm.com/* 3010705Sandreas.hansson@arm.com * Contains all of the various parts of the system we are simulating. 3110705Sandreas.hansson@arm.com * Performs allocation, deallocation, and setup of all the major 3210705Sandreas.hansson@arm.com * components of the system 3310705Sandreas.hansson@arm.com */ 3410705Sandreas.hansson@arm.com 3510705Sandreas.hansson@arm.com#ifndef __MEM_RUBY_SYSTEM_SYSTEM_HH__ 3610705Sandreas.hansson@arm.com#define __MEM_RUBY_SYSTEM_SYSTEM_HH__ 3710705Sandreas.hansson@arm.com 3810705Sandreas.hansson@arm.com#include "base/callback.hh" 3910705Sandreas.hansson@arm.com#include "base/output.hh" 4010705Sandreas.hansson@arm.com#include "mem/packet.hh" 4110705Sandreas.hansson@arm.com#include "mem/ruby/common/Global.hh" 4210705Sandreas.hansson@arm.com#include "mem/ruby/recorder/CacheRecorder.hh" 4310705Sandreas.hansson@arm.com#include "mem/ruby/slicc_interface/AbstractController.hh" 4410705Sandreas.hansson@arm.com#include "mem/ruby/system/MemoryVector.hh" 4510705Sandreas.hansson@arm.com#include "mem/ruby/system/SparseMemory.hh" 4610705Sandreas.hansson@arm.com#include "params/RubySystem.hh" 4710705Sandreas.hansson@arm.com#include "sim/clocked_object.hh" 4810705Sandreas.hansson@arm.com 4910705Sandreas.hansson@arm.comclass Network; 5010705Sandreas.hansson@arm.comclass Profiler; 5110705Sandreas.hansson@arm.comclass MemoryControl; 5210705Sandreas.hansson@arm.com 5310705Sandreas.hansson@arm.comclass RubySystem : public ClockedObject 5410705Sandreas.hansson@arm.com{ 5510705Sandreas.hansson@arm.com public: 5610705Sandreas.hansson@arm.com class RubyEvent : public Event 5710705Sandreas.hansson@arm.com { 5810705Sandreas.hansson@arm.com public: 5910705Sandreas.hansson@arm.com RubyEvent(RubySystem* _ruby_system) 6010705Sandreas.hansson@arm.com { 6110705Sandreas.hansson@arm.com ruby_system = _ruby_system; 6210705Sandreas.hansson@arm.com } 6310705Sandreas.hansson@arm.com private: 6410705Sandreas.hansson@arm.com void process(); 6510705Sandreas.hansson@arm.com 6610705Sandreas.hansson@arm.com RubySystem* ruby_system; 6710705Sandreas.hansson@arm.com }; 6810705Sandreas.hansson@arm.com 6910705Sandreas.hansson@arm.com friend class RubyEvent; 7010705Sandreas.hansson@arm.com 7110705Sandreas.hansson@arm.com typedef RubySystemParams Params; 7210705Sandreas.hansson@arm.com RubySystem(const Params *p); 7310705Sandreas.hansson@arm.com ~RubySystem(); 7410705Sandreas.hansson@arm.com 7510705Sandreas.hansson@arm.com // config accessors 7610705Sandreas.hansson@arm.com static int getRandomSeed() { return m_random_seed; } 7710705Sandreas.hansson@arm.com static int getRandomization() { return m_randomization; } 7810705Sandreas.hansson@arm.com static uint32_t getBlockSizeBytes() { return m_block_size_bytes; } 7910705Sandreas.hansson@arm.com static uint32_t getBlockSizeBits() { return m_block_size_bits; } 8010705Sandreas.hansson@arm.com static uint64_t getMemorySizeBytes() { return m_memory_size_bytes; } 8110705Sandreas.hansson@arm.com static uint32_t getMemorySizeBits() { return m_memory_size_bits; } 8210705Sandreas.hansson@arm.com Cycles getTime() const { return curCycle(); } 8310705Sandreas.hansson@arm.com 8410705Sandreas.hansson@arm.com // Public Methods 8510705Sandreas.hansson@arm.com Network* 8610705Sandreas.hansson@arm.com getNetwork() 8710705Sandreas.hansson@arm.com { 8810705Sandreas.hansson@arm.com assert(m_network_ptr != NULL); 8910705Sandreas.hansson@arm.com return m_network_ptr; 9010705Sandreas.hansson@arm.com } 9110705Sandreas.hansson@arm.com 9210705Sandreas.hansson@arm.com Profiler* 9310705Sandreas.hansson@arm.com getProfiler() 9410705Sandreas.hansson@arm.com { 9510705Sandreas.hansson@arm.com assert(m_profiler_ptr != NULL); 9610705Sandreas.hansson@arm.com return m_profiler_ptr; 9710705Sandreas.hansson@arm.com } 9810705Sandreas.hansson@arm.com 9910705Sandreas.hansson@arm.com MemoryVector* 10010705Sandreas.hansson@arm.com getMemoryVector() 10110705Sandreas.hansson@arm.com { 10210705Sandreas.hansson@arm.com assert(m_mem_vec_ptr != NULL); 10310705Sandreas.hansson@arm.com return m_mem_vec_ptr; 10410705Sandreas.hansson@arm.com } 10510705Sandreas.hansson@arm.com 10610705Sandreas.hansson@arm.com void printStats(std::ostream& out); 10710705Sandreas.hansson@arm.com void resetStats(); 10810705Sandreas.hansson@arm.com 10910705Sandreas.hansson@arm.com uint64 getInstructionCount(int thread) { return 1; } 11010705Sandreas.hansson@arm.com 11110705Sandreas.hansson@arm.com void print(std::ostream& out) const; 11210705Sandreas.hansson@arm.com 11310705Sandreas.hansson@arm.com void serialize(std::ostream &os); 11410705Sandreas.hansson@arm.com void unserialize(Checkpoint *cp, const std::string §ion); 11510705Sandreas.hansson@arm.com void process(); 11610705Sandreas.hansson@arm.com void startup(); 11710705Sandreas.hansson@arm.com bool functionalRead(Packet *ptr); 11810705Sandreas.hansson@arm.com bool functionalWrite(Packet *ptr); 11910705Sandreas.hansson@arm.com 12010705Sandreas.hansson@arm.com void registerNetwork(Network*); 12110705Sandreas.hansson@arm.com void registerProfiler(Profiler*); 12210705Sandreas.hansson@arm.com void registerAbstractController(AbstractController*); 12310705Sandreas.hansson@arm.com void registerSparseMemory(SparseMemory*); 12410705Sandreas.hansson@arm.com void registerMemController(MemoryControl *mc); 12510705Sandreas.hansson@arm.com 12610705Sandreas.hansson@arm.com bool eventQueueEmpty() { return eventq->empty(); } 12710705Sandreas.hansson@arm.com void enqueueRubyEvent(Tick tick) 12810705Sandreas.hansson@arm.com { 12910705Sandreas.hansson@arm.com RubyEvent* e = new RubyEvent(this); 13010705Sandreas.hansson@arm.com schedule(e, tick); 13110705Sandreas.hansson@arm.com } 13210705Sandreas.hansson@arm.com 13310705Sandreas.hansson@arm.com private: 13410705Sandreas.hansson@arm.com // Private copy constructor and assignment operator 13510705Sandreas.hansson@arm.com RubySystem(const RubySystem& obj); 13610705Sandreas.hansson@arm.com RubySystem& operator=(const RubySystem& obj); 13710705Sandreas.hansson@arm.com 13810705Sandreas.hansson@arm.com void init(); 13910705Sandreas.hansson@arm.com 14010705Sandreas.hansson@arm.com void readCompressedTrace(std::string filename, 14110705Sandreas.hansson@arm.com uint8_t *&raw_data, 14210705Sandreas.hansson@arm.com uint64& uncompressed_trace_size); 14310705Sandreas.hansson@arm.com void writeCompressedTrace(uint8_t *raw_data, std::string file, 14410705Sandreas.hansson@arm.com uint64 uncompressed_trace_size); 14510705Sandreas.hansson@arm.com 14610705Sandreas.hansson@arm.com private: 14710705Sandreas.hansson@arm.com // configuration parameters 14810705Sandreas.hansson@arm.com static int m_random_seed; 14910705Sandreas.hansson@arm.com static bool m_randomization; 15010705Sandreas.hansson@arm.com static uint32_t m_block_size_bytes; 15110705Sandreas.hansson@arm.com static uint32_t m_block_size_bits; 15210705Sandreas.hansson@arm.com static uint64_t m_memory_size_bytes; 15310705Sandreas.hansson@arm.com static uint32_t m_memory_size_bits; 15410705Sandreas.hansson@arm.com 15511053Sandreas.hansson@arm.com Network* m_network_ptr; 15611722Ssophiane.senni@gmail.com std::vector<MemoryControl *> m_memory_controller_vec; 15711053Sandreas.hansson@arm.com std::vector<AbstractController *> m_abs_cntrl_vec; 15810705Sandreas.hansson@arm.com 15910705Sandreas.hansson@arm.com public: 16010705Sandreas.hansson@arm.com Profiler* m_profiler_ptr; 16110705Sandreas.hansson@arm.com MemoryVector* m_mem_vec_ptr; 16210705Sandreas.hansson@arm.com bool m_warmup_enabled; 16310705Sandreas.hansson@arm.com bool m_cooldown_enabled; 16410705Sandreas.hansson@arm.com CacheRecorder* m_cache_recorder; 16510705Sandreas.hansson@arm.com std::vector<SparseMemory*> m_sparse_memory_vector; 16610705Sandreas.hansson@arm.com}; 16710705Sandreas.hansson@arm.com 16810705Sandreas.hansson@arm.cominline std::ostream& 16910705Sandreas.hansson@arm.comoperator<<(std::ostream& out, const RubySystem& obj) 17010705Sandreas.hansson@arm.com{ 17110705Sandreas.hansson@arm.com //obj.print(out); 17210705Sandreas.hansson@arm.com out << std::flush; 17310705Sandreas.hansson@arm.com return out; 17410705Sandreas.hansson@arm.com} 17510705Sandreas.hansson@arm.com 17610705Sandreas.hansson@arm.comclass RubyDumpStatsCallback : public Callback 17710705Sandreas.hansson@arm.com{ 17811722Ssophiane.senni@gmail.com private: 17911722Ssophiane.senni@gmail.com std::ostream *os; 18010705Sandreas.hansson@arm.com RubySystem *ruby_system; 18110705Sandreas.hansson@arm.com 18210705Sandreas.hansson@arm.com public: 18310705Sandreas.hansson@arm.com virtual ~RubyDumpStatsCallback() {} 18410705Sandreas.hansson@arm.com 18510705Sandreas.hansson@arm.com RubyDumpStatsCallback(const std::string& _stats_filename, 18610705Sandreas.hansson@arm.com RubySystem *system) 18710705Sandreas.hansson@arm.com { 18810705Sandreas.hansson@arm.com os = simout.create(_stats_filename); 18910705Sandreas.hansson@arm.com ruby_system = system; 19010705Sandreas.hansson@arm.com } 19111752Snikos.nikoleris@arm.com 19210705Sandreas.hansson@arm.com void process(); 19311752Snikos.nikoleris@arm.com}; 19410705Sandreas.hansson@arm.com 19510705Sandreas.hansson@arm.com#endif // __MEM_RUBY_SYSTEM_SYSTEM_HH__ 19610705Sandreas.hansson@arm.com