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 &section);
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