RubySystem.hh revision 10012
12789Sktlim@umich.edu/* 29814Sandreas.hansson@arm.com * Copyright (c) 1999-2012 Mark D. Hill and David A. Wood 38733Sgeoffrey.blake@arm.com * All rights reserved. 48733Sgeoffrey.blake@arm.com * 58733Sgeoffrey.blake@arm.com * Redistribution and use in source and binary forms, with or without 68733Sgeoffrey.blake@arm.com * modification, are permitted provided that the following conditions are 78733Sgeoffrey.blake@arm.com * met: redistributions of source code must retain the above copyright 88733Sgeoffrey.blake@arm.com * notice, this list of conditions and the following disclaimer; 98733Sgeoffrey.blake@arm.com * redistributions in binary form must reproduce the above copyright 108733Sgeoffrey.blake@arm.com * notice, this list of conditions and the following disclaimer in the 118733Sgeoffrey.blake@arm.com * documentation and/or other materials provided with the distribution; 128733Sgeoffrey.blake@arm.com * neither the name of the copyright holders nor the names of its 138733Sgeoffrey.blake@arm.com * contributors may be used to endorse or promote products derived from 142789Sktlim@umich.edu * this software without specific prior written permission. 152789Sktlim@umich.edu * 162789Sktlim@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172789Sktlim@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182789Sktlim@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192789Sktlim@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202789Sktlim@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212789Sktlim@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222789Sktlim@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232789Sktlim@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242789Sktlim@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252789Sktlim@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262789Sktlim@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272789Sktlim@umich.edu */ 282789Sktlim@umich.edu 292789Sktlim@umich.edu/* 302789Sktlim@umich.edu * Contains all of the various parts of the system we are simulating. 312789Sktlim@umich.edu * Performs allocation, deallocation, and setup of all the major 322789Sktlim@umich.edu * components of the system 332789Sktlim@umich.edu */ 342789Sktlim@umich.edu 352789Sktlim@umich.edu#ifndef __MEM_RUBY_SYSTEM_SYSTEM_HH__ 362789Sktlim@umich.edu#define __MEM_RUBY_SYSTEM_SYSTEM_HH__ 372789Sktlim@umich.edu 382789Sktlim@umich.edu#include "base/callback.hh" 392789Sktlim@umich.edu#include "base/output.hh" 402789Sktlim@umich.edu#include "mem/packet.hh" 418733Sgeoffrey.blake@arm.com#include "mem/ruby/common/Global.hh" 422789Sktlim@umich.edu#include "mem/ruby/profiler/Profiler.hh" 432789Sktlim@umich.edu#include "mem/ruby/recorder/CacheRecorder.hh" 442789Sktlim@umich.edu#include "mem/ruby/slicc_interface/AbstractController.hh" 452789Sktlim@umich.edu#include "mem/ruby/system/MemoryControl.hh" 462789Sktlim@umich.edu#include "mem/ruby/system/MemoryVector.hh" 4710687SAndreas.Sandberg@ARM.com#include "mem/ruby/system/SparseMemory.hh" 488793Sgblack@eecs.umich.edu#include "params/RubySystem.hh" 498793Sgblack@eecs.umich.edu#include "sim/clocked_object.hh" 508229Snate@binkert.org 512789Sktlim@umich.educlass Network; 522789Sktlim@umich.edu 533348Sbinkertn@umich.educlass RubySystem : public ClockedObject 542789Sktlim@umich.edu{ 558733Sgeoffrey.blake@arm.com public: 568887Sgeoffrey.blake@arm.com class RubyEvent : public Event 572789Sktlim@umich.edu { 582789Sktlim@umich.edu public: 598733Sgeoffrey.blake@arm.com RubyEvent(RubySystem* _ruby_system) 602789Sktlim@umich.edu { 612789Sktlim@umich.edu ruby_system = _ruby_system; 622789Sktlim@umich.edu } 632789Sktlim@umich.edu private: 648832SAli.Saidi@ARM.com void process(); 652789Sktlim@umich.edu 662789Sktlim@umich.edu RubySystem* ruby_system; 672789Sktlim@umich.edu }; 689176Sandreas.hansson@arm.com 699176Sandreas.hansson@arm.com friend class RubyEvent; 702789Sktlim@umich.edu 712789Sktlim@umich.edu typedef RubySystemParams Params; 728733Sgeoffrey.blake@arm.com RubySystem(const Params *p); 738733Sgeoffrey.blake@arm.com ~RubySystem(); 742789Sktlim@umich.edu 752789Sktlim@umich.edu // config accessors 762789Sktlim@umich.edu static int getRandomSeed() { return m_random_seed; } 772789Sktlim@umich.edu static int getRandomization() { return m_randomization; } 782789Sktlim@umich.edu static uint32_t getBlockSizeBytes() { return m_block_size_bytes; } 792789Sktlim@umich.edu static uint32_t getBlockSizeBits() { return m_block_size_bits; } 802789Sktlim@umich.edu static uint64_t getMemorySizeBytes() { return m_memory_size_bytes; } 8110034SGeoffrey.Blake@arm.com static uint32_t getMemorySizeBits() { return m_memory_size_bits; } 822789Sktlim@umich.edu 832789Sktlim@umich.edu // Public Methods 842789Sktlim@umich.edu Network* 852789Sktlim@umich.edu getNetwork() 862789Sktlim@umich.edu { 878733Sgeoffrey.blake@arm.com assert(m_network != NULL); 882789Sktlim@umich.edu return m_network; 898733Sgeoffrey.blake@arm.com } 902789Sktlim@umich.edu 912789Sktlim@umich.edu Profiler* 922789Sktlim@umich.edu getProfiler() 932789Sktlim@umich.edu { 942789Sktlim@umich.edu assert(m_profiler != NULL); 952789Sktlim@umich.edu return m_profiler; 962789Sktlim@umich.edu } 972789Sktlim@umich.edu 982789Sktlim@umich.edu MemoryVector* 999384SAndreas.Sandberg@arm.com getMemoryVector() 1009384SAndreas.Sandberg@arm.com { 1012789Sktlim@umich.edu assert(m_mem_vec != NULL); 1022789Sktlim@umich.edu return m_mem_vec; 1038887Sgeoffrey.blake@arm.com } 1049384SAndreas.Sandberg@arm.com 1059384SAndreas.Sandberg@arm.com void regStats() { m_profiler->regStats(name()); } 1068887Sgeoffrey.blake@arm.com void collateStats() { m_profiler->collateStats(); } 1078887Sgeoffrey.blake@arm.com void resetStats(); 1088887Sgeoffrey.blake@arm.com 1099384SAndreas.Sandberg@arm.com void serialize(std::ostream &os); 1108887Sgeoffrey.blake@arm.com void unserialize(Checkpoint *cp, const std::string §ion); 1112789Sktlim@umich.edu void process(); 1122789Sktlim@umich.edu void startup(); 1132789Sktlim@umich.edu bool functionalRead(Packet *ptr); 1142789Sktlim@umich.edu bool functionalWrite(Packet *ptr); 1158887Sgeoffrey.blake@arm.com 1168887Sgeoffrey.blake@arm.com void registerNetwork(Network*); 1172789Sktlim@umich.edu void registerAbstractController(AbstractController*); 1182789Sktlim@umich.edu void registerSparseMemory(SparseMemory*); 1192789Sktlim@umich.edu void registerMemController(MemoryControl *mc); 1209608Sandreas.hansson@arm.com 1212789Sktlim@umich.edu bool eventQueueEmpty() { return eventq->empty(); } 1222789Sktlim@umich.edu void enqueueRubyEvent(Tick tick) 1232789Sktlim@umich.edu { 1242789Sktlim@umich.edu RubyEvent* e = new RubyEvent(this); 1252789Sktlim@umich.edu schedule(e, tick); 1269608Sandreas.hansson@arm.com } 1272789Sktlim@umich.edu 1282789Sktlim@umich.edu private: 1292789Sktlim@umich.edu // Private copy constructor and assignment operator 1302789Sktlim@umich.edu RubySystem(const RubySystem& obj); 1312789Sktlim@umich.edu RubySystem& operator=(const RubySystem& obj); 1322789Sktlim@umich.edu 1332789Sktlim@umich.edu void readCompressedTrace(std::string filename, 1342789Sktlim@umich.edu uint8_t *&raw_data, 1352789Sktlim@umich.edu uint64& uncompressed_trace_size); 1362789Sktlim@umich.edu void writeCompressedTrace(uint8_t *raw_data, std::string file, 1372789Sktlim@umich.edu uint64 uncompressed_trace_size); 1382789Sktlim@umich.edu 1392789Sktlim@umich.edu private: 1402789Sktlim@umich.edu // configuration parameters 1412789Sktlim@umich.edu static int m_random_seed; 1428733Sgeoffrey.blake@arm.com static bool m_randomization; 1432789Sktlim@umich.edu static uint32_t m_block_size_bytes; 1448733Sgeoffrey.blake@arm.com static uint32_t m_block_size_bits; 1458733Sgeoffrey.blake@arm.com static uint64_t m_memory_size_bytes; 1469814Sandreas.hansson@arm.com static uint32_t m_memory_size_bits; 1478733Sgeoffrey.blake@arm.com 1488733Sgeoffrey.blake@arm.com Network* m_network; 1498733Sgeoffrey.blake@arm.com std::vector<MemoryControl *> m_memory_controller_vec; 1502789Sktlim@umich.edu std::vector<AbstractController *> m_abs_cntrl_vec; 1512789Sktlim@umich.edu 1528733Sgeoffrey.blake@arm.com public: 1538733Sgeoffrey.blake@arm.com Profiler* m_profiler; 1542789Sktlim@umich.edu MemoryVector* m_mem_vec; 1558733Sgeoffrey.blake@arm.com bool m_warmup_enabled; 1568733Sgeoffrey.blake@arm.com bool m_cooldown_enabled; 15710653Sandreas.hansson@arm.com CacheRecorder* m_cache_recorder; 15810653Sandreas.hansson@arm.com std::vector<SparseMemory*> m_sparse_memory_vector; 1592789Sktlim@umich.edu}; 1608733Sgeoffrey.blake@arm.com 1618733Sgeoffrey.blake@arm.comclass RubyStatsCallback : public Callback 1622789Sktlim@umich.edu{ 1638733Sgeoffrey.blake@arm.com private: 1648733Sgeoffrey.blake@arm.com RubySystem *ruby_system; 1658733Sgeoffrey.blake@arm.com 1668733Sgeoffrey.blake@arm.com public: 1678733Sgeoffrey.blake@arm.com virtual ~RubyStatsCallback() {} 1688733Sgeoffrey.blake@arm.com RubyStatsCallback(RubySystem *system) : ruby_system(system) {} 1698733Sgeoffrey.blake@arm.com void process() { ruby_system->collateStats(); } 1708733Sgeoffrey.blake@arm.com}; 1718733Sgeoffrey.blake@arm.com 1728733Sgeoffrey.blake@arm.com#endif // __MEM_RUBY_SYSTEM_SYSTEM_HH__ 17310342SCurtis.Dunham@arm.com