RubySystem.hh revision 11523
19537Satgutier@umich.edu/* 29537Satgutier@umich.edu * Copyright (c) 1999-2012 Mark D. Hill and David A. Wood 39537Satgutier@umich.edu * All rights reserved. 49537Satgutier@umich.edu * 59537Satgutier@umich.edu * Redistribution and use in source and binary forms, with or without 69537Satgutier@umich.edu * modification, are permitted provided that the following conditions are 79537Satgutier@umich.edu * met: redistributions of source code must retain the above copyright 89537Satgutier@umich.edu * notice, this list of conditions and the following disclaimer; 99537Satgutier@umich.edu * redistributions in binary form must reproduce the above copyright 109537Satgutier@umich.edu * notice, this list of conditions and the following disclaimer in the 119537Satgutier@umich.edu * documentation and/or other materials provided with the distribution; 129537Satgutier@umich.edu * neither the name of the copyright holders nor the names of its 139537Satgutier@umich.edu * contributors may be used to endorse or promote products derived from 149537Satgutier@umich.edu * this software without specific prior written permission. 159537Satgutier@umich.edu * 169537Satgutier@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 179537Satgutier@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 189537Satgutier@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 199537Satgutier@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 209537Satgutier@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 219537Satgutier@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 229537Satgutier@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 239537Satgutier@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 249537Satgutier@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 259537Satgutier@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 269537Satgutier@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 279537Satgutier@umich.edu */ 289537Satgutier@umich.edu 299537Satgutier@umich.edu/* 309537Satgutier@umich.edu * Contains all of the various parts of the system we are simulating. 319537Satgutier@umich.edu * Performs allocation, deallocation, and setup of all the major 329537Satgutier@umich.edu * components of the system 339537Satgutier@umich.edu */ 349537Satgutier@umich.edu 359537Satgutier@umich.edu#ifndef __MEM_RUBY_SYSTEM_SYSTEM_HH__ 369537Satgutier@umich.edu#define __MEM_RUBY_SYSTEM_SYSTEM_HH__ 379537Satgutier@umich.edu 389537Satgutier@umich.edu#include "base/callback.hh" 399537Satgutier@umich.edu#include "base/output.hh" 409537Satgutier@umich.edu#include "mem/packet.hh" 419537Satgutier@umich.edu#include "mem/ruby/profiler/Profiler.hh" 429537Satgutier@umich.edu#include "mem/ruby/slicc_interface/AbstractController.hh" 439537Satgutier@umich.edu#include "mem/ruby/system/CacheRecorder.hh" 449537Satgutier@umich.edu#include "params/RubySystem.hh" 459537Satgutier@umich.edu#include "sim/clocked_object.hh" 469537Satgutier@umich.edu 479537Satgutier@umich.educlass Network; 489537Satgutier@umich.educlass AbstractController; 499537Satgutier@umich.edu 509537Satgutier@umich.educlass RubySystem : public ClockedObject 519537Satgutier@umich.edu{ 529537Satgutier@umich.edu public: 539537Satgutier@umich.edu class RubyEvent : public Event 549537Satgutier@umich.edu { 559537Satgutier@umich.edu public: 569537Satgutier@umich.edu RubyEvent(RubySystem* _ruby_system) 579537Satgutier@umich.edu { 589537Satgutier@umich.edu m_ruby_system = _ruby_system; 599537Satgutier@umich.edu } 609537Satgutier@umich.edu private: 619537Satgutier@umich.edu void process(); 629537Satgutier@umich.edu 639537Satgutier@umich.edu RubySystem* m_ruby_system; 649537Satgutier@umich.edu }; 659537Satgutier@umich.edu 669537Satgutier@umich.edu friend class RubyEvent; 679537Satgutier@umich.edu 689537Satgutier@umich.edu typedef RubySystemParams Params; 699537Satgutier@umich.edu RubySystem(const Params *p); 709537Satgutier@umich.edu ~RubySystem(); 719537Satgutier@umich.edu 729537Satgutier@umich.edu // config accessors 739537Satgutier@umich.edu static int getRandomization() { return m_randomization; } 749537Satgutier@umich.edu static uint32_t getBlockSizeBytes() { return m_block_size_bytes; } 759537Satgutier@umich.edu static uint32_t getBlockSizeBits() { return m_block_size_bits; } 769537Satgutier@umich.edu static uint32_t getMemorySizeBits() { return m_memory_size_bits; } 779537Satgutier@umich.edu static bool getWarmupEnabled() { return m_warmup_enabled; } 789537Satgutier@umich.edu static bool getCooldownEnabled() { return m_cooldown_enabled; } 799537Satgutier@umich.edu 809537Satgutier@umich.edu SimpleMemory *getPhysMem() { return m_phys_mem; } 819537Satgutier@umich.edu Cycles getStartCycle() { return m_start_cycle; } 829537Satgutier@umich.edu bool getAccessBackingStore() { return m_access_backing_store; } 839537Satgutier@umich.edu 849537Satgutier@umich.edu // Public Methods 859537Satgutier@umich.edu Profiler* 869537Satgutier@umich.edu getProfiler() 879537Satgutier@umich.edu { 889537Satgutier@umich.edu assert(m_profiler != NULL); 899537Satgutier@umich.edu return m_profiler; 909537Satgutier@umich.edu } 919537Satgutier@umich.edu 929537Satgutier@umich.edu void regStats() override { 939537Satgutier@umich.edu ClockedObject::regStats(); 949537Satgutier@umich.edu m_profiler->regStats(name()); 959537Satgutier@umich.edu } 969537Satgutier@umich.edu void collateStats() { m_profiler->collateStats(); } 979537Satgutier@umich.edu void resetStats() override; 989537Satgutier@umich.edu 999537Satgutier@umich.edu void memWriteback() override; 1009537Satgutier@umich.edu void serialize(CheckpointOut &cp) const override; 1019537Satgutier@umich.edu void unserialize(CheckpointIn &cp) override; 1029537Satgutier@umich.edu void drainResume() override; 1039537Satgutier@umich.edu void process(); 1049537Satgutier@umich.edu void startup() override; 1059537Satgutier@umich.edu bool functionalRead(Packet *ptr); 1069537Satgutier@umich.edu bool functionalWrite(Packet *ptr); 1079537Satgutier@umich.edu 1089537Satgutier@umich.edu void registerNetwork(Network*); 1099537Satgutier@umich.edu void registerAbstractController(AbstractController*); 1109537Satgutier@umich.edu 1119537Satgutier@umich.edu bool eventQueueEmpty() { return eventq->empty(); } 1129537Satgutier@umich.edu void enqueueRubyEvent(Tick tick) 1139537Satgutier@umich.edu { 1149537Satgutier@umich.edu RubyEvent* e = new RubyEvent(this); 1159537Satgutier@umich.edu schedule(e, tick); 1169537Satgutier@umich.edu } 1179537Satgutier@umich.edu 1189537Satgutier@umich.edu private: 1199537Satgutier@umich.edu // Private copy constructor and assignment operator 1209537Satgutier@umich.edu RubySystem(const RubySystem& obj); 1219537Satgutier@umich.edu RubySystem& operator=(const RubySystem& obj); 1229537Satgutier@umich.edu 1239537Satgutier@umich.edu void makeCacheRecorder(uint8_t *uncompressed_trace, 1249537Satgutier@umich.edu uint64_t cache_trace_size, 1259537Satgutier@umich.edu uint64_t block_size_bytes); 1269537Satgutier@umich.edu 1279537Satgutier@umich.edu static void readCompressedTrace(std::string filename, 1289537Satgutier@umich.edu uint8_t *&raw_data, 1299537Satgutier@umich.edu uint64_t &uncompressed_trace_size); 1309537Satgutier@umich.edu static void writeCompressedTrace(uint8_t *raw_data, std::string file, 1319537Satgutier@umich.edu uint64_t uncompressed_trace_size); 1329537Satgutier@umich.edu 1339537Satgutier@umich.edu private: 1349537Satgutier@umich.edu // configuration parameters 1359537Satgutier@umich.edu static bool m_randomization; 1369537Satgutier@umich.edu static uint32_t m_block_size_bytes; 1379537Satgutier@umich.edu static uint32_t m_block_size_bits; 1389537Satgutier@umich.edu static uint32_t m_memory_size_bits; 1399537Satgutier@umich.edu 1409537Satgutier@umich.edu static bool m_warmup_enabled; 1419537Satgutier@umich.edu static unsigned m_systems_to_warmup; 1429537Satgutier@umich.edu static bool m_cooldown_enabled; 1439537Satgutier@umich.edu SimpleMemory *m_phys_mem; 1449537Satgutier@umich.edu const bool m_access_backing_store; 1459537Satgutier@umich.edu 1469537Satgutier@umich.edu Network* m_network; 1479537Satgutier@umich.edu std::vector<AbstractController *> m_abs_cntrl_vec; 1489537Satgutier@umich.edu Cycles m_start_cycle; 1499537Satgutier@umich.edu 1509537Satgutier@umich.edu public: 1519537Satgutier@umich.edu Profiler* m_profiler; 1529537Satgutier@umich.edu CacheRecorder* m_cache_recorder; 1539537Satgutier@umich.edu std::vector<std::map<uint32_t, AbstractController *> > m_abstract_controls; 1549537Satgutier@umich.edu}; 1559537Satgutier@umich.edu 1569537Satgutier@umich.educlass RubyStatsCallback : public Callback 1579537Satgutier@umich.edu{ 1589537Satgutier@umich.edu private: 1599537Satgutier@umich.edu RubySystem *m_ruby_system; 1609537Satgutier@umich.edu 1619537Satgutier@umich.edu public: 1629537Satgutier@umich.edu virtual ~RubyStatsCallback() {} 1639537Satgutier@umich.edu RubyStatsCallback(RubySystem *system) : m_ruby_system(system) {} 1649537Satgutier@umich.edu void process() { m_ruby_system->collateStats(); } 1659537Satgutier@umich.edu}; 1669537Satgutier@umich.edu 1679537Satgutier@umich.edu#endif // __MEM_RUBY_SYSTEM_SYSTEM_HH__ 1689537Satgutier@umich.edu