RubySystem.hh revision 9504
111308Santhony.gutierrez@amd.com/* 211308Santhony.gutierrez@amd.com * Copyright (c) 1999-2012 Mark D. Hill and David A. Wood 311308Santhony.gutierrez@amd.com * All rights reserved. 411308Santhony.gutierrez@amd.com * 511308Santhony.gutierrez@amd.com * Redistribution and use in source and binary forms, with or without 611308Santhony.gutierrez@amd.com * modification, are permitted provided that the following conditions are 711308Santhony.gutierrez@amd.com * met: redistributions of source code must retain the above copyright 811308Santhony.gutierrez@amd.com * notice, this list of conditions and the following disclaimer; 911308Santhony.gutierrez@amd.com * redistributions in binary form must reproduce the above copyright 1011308Santhony.gutierrez@amd.com * notice, this list of conditions and the following disclaimer in the 1111308Santhony.gutierrez@amd.com * documentation and/or other materials provided with the distribution; 1211308Santhony.gutierrez@amd.com * neither the name of the copyright holders nor the names of its 1311308Santhony.gutierrez@amd.com * contributors may be used to endorse or promote products derived from 1411308Santhony.gutierrez@amd.com * this software without specific prior written permission. 1511308Santhony.gutierrez@amd.com * 1611308Santhony.gutierrez@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1712697Santhony.gutierrez@amd.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1812697Santhony.gutierrez@amd.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1912697Santhony.gutierrez@amd.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2011308Santhony.gutierrez@amd.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2111308Santhony.gutierrez@amd.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2211308Santhony.gutierrez@amd.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2311308Santhony.gutierrez@amd.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2411308Santhony.gutierrez@amd.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2511308Santhony.gutierrez@amd.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2611308Santhony.gutierrez@amd.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711308Santhony.gutierrez@amd.com */ 2811308Santhony.gutierrez@amd.com 2911308Santhony.gutierrez@amd.com/* 3011308Santhony.gutierrez@amd.com * Contains all of the various parts of the system we are simulating. 3111308Santhony.gutierrez@amd.com * Performs allocation, deallocation, and setup of all the major 3211308Santhony.gutierrez@amd.com * components of the system 3312697Santhony.gutierrez@amd.com */ 3412697Santhony.gutierrez@amd.com 3511308Santhony.gutierrez@amd.com#ifndef __MEM_RUBY_SYSTEM_SYSTEM_HH__ 3611308Santhony.gutierrez@amd.com#define __MEM_RUBY_SYSTEM_SYSTEM_HH__ 3711308Santhony.gutierrez@amd.com 3811308Santhony.gutierrez@amd.com#include "base/callback.hh" 3911308Santhony.gutierrez@amd.com#include "base/output.hh" 4011308Santhony.gutierrez@amd.com#include "mem/packet.hh" 4111308Santhony.gutierrez@amd.com#include "mem/ruby/common/Global.hh" 4211308Santhony.gutierrez@amd.com#include "mem/ruby/recorder/CacheRecorder.hh" 4311308Santhony.gutierrez@amd.com#include "mem/ruby/slicc_interface/AbstractController.hh" 4411308Santhony.gutierrez@amd.com#include "mem/ruby/system/MemoryVector.hh" 4511308Santhony.gutierrez@amd.com#include "mem/ruby/system/SparseMemory.hh" 4611308Santhony.gutierrez@amd.com#include "params/RubySystem.hh" 4711308Santhony.gutierrez@amd.com#include "sim/clocked_object.hh" 4811308Santhony.gutierrez@amd.com 4911308Santhony.gutierrez@amd.comclass Network; 5011308Santhony.gutierrez@amd.comclass Profiler; 5111308Santhony.gutierrez@amd.comclass MemoryControl; 5211308Santhony.gutierrez@amd.com 5311308Santhony.gutierrez@amd.comclass RubySystem : public ClockedObject 5411308Santhony.gutierrez@amd.com{ 5511308Santhony.gutierrez@amd.com public: 5611308Santhony.gutierrez@amd.com class RubyEvent : public Event 5711308Santhony.gutierrez@amd.com { 5811308Santhony.gutierrez@amd.com public: 5911308Santhony.gutierrez@amd.com RubyEvent(RubySystem* _ruby_system) 6011308Santhony.gutierrez@amd.com { 6111308Santhony.gutierrez@amd.com ruby_system = _ruby_system; 6211308Santhony.gutierrez@amd.com } 6311308Santhony.gutierrez@amd.com private: 6411308Santhony.gutierrez@amd.com void process(); 6511308Santhony.gutierrez@amd.com 6611308Santhony.gutierrez@amd.com RubySystem* ruby_system; 6711308Santhony.gutierrez@amd.com }; 6811308Santhony.gutierrez@amd.com 6911308Santhony.gutierrez@amd.com friend class RubyEvent; 7011308Santhony.gutierrez@amd.com 7111308Santhony.gutierrez@amd.com typedef RubySystemParams Params; 7211308Santhony.gutierrez@amd.com RubySystem(const Params *p); 7311308Santhony.gutierrez@amd.com ~RubySystem(); 7411308Santhony.gutierrez@amd.com 7511308Santhony.gutierrez@amd.com // config accessors 7611308Santhony.gutierrez@amd.com static int getRandomSeed() { return m_random_seed; } 7711308Santhony.gutierrez@amd.com static int getRandomization() { return m_randomization; } 7811308Santhony.gutierrez@amd.com static uint32_t getBlockSizeBytes() { return m_block_size_bytes; } 7911308Santhony.gutierrez@amd.com static uint32_t getBlockSizeBits() { return m_block_size_bits; } 8011308Santhony.gutierrez@amd.com static uint64_t getMemorySizeBytes() { return m_memory_size_bytes; } 8111308Santhony.gutierrez@amd.com static uint32_t getMemorySizeBits() { return m_memory_size_bits; } 8211308Santhony.gutierrez@amd.com Cycles getTime() const { return curCycle(); } 8311308Santhony.gutierrez@amd.com 8411308Santhony.gutierrez@amd.com // Public Methods 8511308Santhony.gutierrez@amd.com Network* 8611308Santhony.gutierrez@amd.com getNetwork() 8711308Santhony.gutierrez@amd.com { 8811308Santhony.gutierrez@amd.com assert(m_network_ptr != NULL); 8911308Santhony.gutierrez@amd.com return m_network_ptr; 9011308Santhony.gutierrez@amd.com } 9111308Santhony.gutierrez@amd.com 9211308Santhony.gutierrez@amd.com Profiler* 9311308Santhony.gutierrez@amd.com getProfiler() 9411308Santhony.gutierrez@amd.com { 9511308Santhony.gutierrez@amd.com assert(m_profiler_ptr != NULL); 9611308Santhony.gutierrez@amd.com return m_profiler_ptr; 9711308Santhony.gutierrez@amd.com } 9811308Santhony.gutierrez@amd.com 9911308Santhony.gutierrez@amd.com MemoryVector* 10011308Santhony.gutierrez@amd.com getMemoryVector() 10111308Santhony.gutierrez@amd.com { 10211308Santhony.gutierrez@amd.com assert(m_mem_vec_ptr != NULL); 10311308Santhony.gutierrez@amd.com return m_mem_vec_ptr; 10411308Santhony.gutierrez@amd.com } 10511308Santhony.gutierrez@amd.com 10611308Santhony.gutierrez@amd.com void printStats(std::ostream& out); 10711308Santhony.gutierrez@amd.com void resetStats(); 10811308Santhony.gutierrez@amd.com 10911308Santhony.gutierrez@amd.com uint64 getInstructionCount(int thread) { return 1; } 11011308Santhony.gutierrez@amd.com 11111308Santhony.gutierrez@amd.com void print(std::ostream& out) const; 11211308Santhony.gutierrez@amd.com 11311308Santhony.gutierrez@amd.com void serialize(std::ostream &os); 11411308Santhony.gutierrez@amd.com void unserialize(Checkpoint *cp, const std::string §ion); 11511308Santhony.gutierrez@amd.com void process(); 11611308Santhony.gutierrez@amd.com void startup(); 11711308Santhony.gutierrez@amd.com bool functionalRead(Packet *ptr); 11811308Santhony.gutierrez@amd.com bool functionalWrite(Packet *ptr); 11911308Santhony.gutierrez@amd.com 12011308Santhony.gutierrez@amd.com void registerNetwork(Network*); 12111308Santhony.gutierrez@amd.com void registerProfiler(Profiler*); 12211308Santhony.gutierrez@amd.com void registerAbstractController(AbstractController*); 12311308Santhony.gutierrez@amd.com void registerSparseMemory(SparseMemory*); 12411308Santhony.gutierrez@amd.com void registerMemController(MemoryControl *mc); 12511308Santhony.gutierrez@amd.com 12611308Santhony.gutierrez@amd.com bool eventQueueEmpty() { return eventq->empty(); } 12711308Santhony.gutierrez@amd.com void enqueueRubyEvent(Tick tick) 12811308Santhony.gutierrez@amd.com { 12911308Santhony.gutierrez@amd.com RubyEvent* e = new RubyEvent(this); 13011308Santhony.gutierrez@amd.com schedule(e, tick); 13111308Santhony.gutierrez@amd.com } 13211308Santhony.gutierrez@amd.com 13311308Santhony.gutierrez@amd.com private: 13411308Santhony.gutierrez@amd.com // Private copy constructor and assignment operator 13511308Santhony.gutierrez@amd.com RubySystem(const RubySystem& obj); 13611308Santhony.gutierrez@amd.com RubySystem& operator=(const RubySystem& obj); 13711308Santhony.gutierrez@amd.com 13811308Santhony.gutierrez@amd.com void init(); 13911308Santhony.gutierrez@amd.com 14011308Santhony.gutierrez@amd.com void readCompressedTrace(std::string filename, 14111308Santhony.gutierrez@amd.com uint8_t *&raw_data, 14211308Santhony.gutierrez@amd.com uint64& uncompressed_trace_size); 14311308Santhony.gutierrez@amd.com void writeCompressedTrace(uint8_t *raw_data, std::string file, 14411308Santhony.gutierrez@amd.com uint64 uncompressed_trace_size); 14511308Santhony.gutierrez@amd.com 14611308Santhony.gutierrez@amd.com private: 14711308Santhony.gutierrez@amd.com // configuration parameters 14811308Santhony.gutierrez@amd.com static int m_random_seed; 14911308Santhony.gutierrez@amd.com static bool m_randomization; 15011308Santhony.gutierrez@amd.com static uint32_t m_block_size_bytes; 15111308Santhony.gutierrez@amd.com static uint32_t m_block_size_bits; 15211308Santhony.gutierrez@amd.com static uint64_t m_memory_size_bytes; 15311308Santhony.gutierrez@amd.com static uint32_t m_memory_size_bits; 15411308Santhony.gutierrez@amd.com 15511308Santhony.gutierrez@amd.com Network* m_network_ptr; 15611308Santhony.gutierrez@amd.com std::vector<MemoryControl *> m_memory_controller_vec; 15711308Santhony.gutierrez@amd.com std::vector<AbstractController *> m_abs_cntrl_vec; 15811308Santhony.gutierrez@amd.com 15911308Santhony.gutierrez@amd.com public: 16011308Santhony.gutierrez@amd.com Profiler* m_profiler_ptr; 16111308Santhony.gutierrez@amd.com MemoryVector* m_mem_vec_ptr; 16211308Santhony.gutierrez@amd.com bool m_warmup_enabled; 16311308Santhony.gutierrez@amd.com bool m_cooldown_enabled; 16411308Santhony.gutierrez@amd.com CacheRecorder* m_cache_recorder; 16511308Santhony.gutierrez@amd.com std::vector<SparseMemory*> m_sparse_memory_vector; 16611308Santhony.gutierrez@amd.com}; 16711308Santhony.gutierrez@amd.com 16811308Santhony.gutierrez@amd.cominline std::ostream& 16911308Santhony.gutierrez@amd.comoperator<<(std::ostream& out, const RubySystem& obj) 17011308Santhony.gutierrez@amd.com{ 17111308Santhony.gutierrez@amd.com //obj.print(out); 17211308Santhony.gutierrez@amd.com out << std::flush; 17311308Santhony.gutierrez@amd.com return out; 17411308Santhony.gutierrez@amd.com} 17511308Santhony.gutierrez@amd.com 17611308Santhony.gutierrez@amd.comclass RubyDumpStatsCallback : public Callback 17711308Santhony.gutierrez@amd.com{ 17811308Santhony.gutierrez@amd.com private: 17911308Santhony.gutierrez@amd.com std::ostream *os; 18011308Santhony.gutierrez@amd.com RubySystem *ruby_system; 18111308Santhony.gutierrez@amd.com 18211308Santhony.gutierrez@amd.com public: 18311308Santhony.gutierrez@amd.com virtual ~RubyDumpStatsCallback() {} 18411308Santhony.gutierrez@amd.com 18511308Santhony.gutierrez@amd.com RubyDumpStatsCallback(const std::string& _stats_filename, 18611308Santhony.gutierrez@amd.com RubySystem *system) 18711308Santhony.gutierrez@amd.com { 18811308Santhony.gutierrez@amd.com os = simout.create(_stats_filename); 18911308Santhony.gutierrez@amd.com ruby_system = system; 19011308Santhony.gutierrez@amd.com } 19111308Santhony.gutierrez@amd.com 19211308Santhony.gutierrez@amd.com void process(); 19311308Santhony.gutierrez@amd.com}; 19411308Santhony.gutierrez@amd.com 19511308Santhony.gutierrez@amd.com#endif // __MEM_RUBY_SYSTEM_SYSTEM_HH__ 19611308Santhony.gutierrez@amd.com