RubySystem.hh revision 9206
113481Sgiacomo.travaglini@arm.com/*
213481Sgiacomo.travaglini@arm.com * Copyright (c) 1999-2012 Mark D. Hill and David A. Wood
313481Sgiacomo.travaglini@arm.com * All rights reserved.
413481Sgiacomo.travaglini@arm.com *
513481Sgiacomo.travaglini@arm.com * Redistribution and use in source and binary forms, with or without
613481Sgiacomo.travaglini@arm.com * modification, are permitted provided that the following conditions are
713481Sgiacomo.travaglini@arm.com * met: redistributions of source code must retain the above copyright
813481Sgiacomo.travaglini@arm.com * notice, this list of conditions and the following disclaimer;
913481Sgiacomo.travaglini@arm.com * redistributions in binary form must reproduce the above copyright
1013481Sgiacomo.travaglini@arm.com * notice, this list of conditions and the following disclaimer in the
1113481Sgiacomo.travaglini@arm.com * documentation and/or other materials provided with the distribution;
1213481Sgiacomo.travaglini@arm.com * neither the name of the copyright holders nor the names of its
1313481Sgiacomo.travaglini@arm.com * contributors may be used to endorse or promote products derived from
1413481Sgiacomo.travaglini@arm.com * this software without specific prior written permission.
1513481Sgiacomo.travaglini@arm.com *
1613481Sgiacomo.travaglini@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1713481Sgiacomo.travaglini@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1813481Sgiacomo.travaglini@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1913481Sgiacomo.travaglini@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2013481Sgiacomo.travaglini@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2113481Sgiacomo.travaglini@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2213481Sgiacomo.travaglini@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2313481Sgiacomo.travaglini@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2413481Sgiacomo.travaglini@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2513481Sgiacomo.travaglini@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2613481Sgiacomo.travaglini@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2713481Sgiacomo.travaglini@arm.com */
2813481Sgiacomo.travaglini@arm.com
2913481Sgiacomo.travaglini@arm.com/*
3013481Sgiacomo.travaglini@arm.com * Contains all of the various parts of the system we are simulating.
3113481Sgiacomo.travaglini@arm.com * Performs allocation, deallocation, and setup of all the major
3213481Sgiacomo.travaglini@arm.com * components of the system
3313481Sgiacomo.travaglini@arm.com */
3413481Sgiacomo.travaglini@arm.com
3513481Sgiacomo.travaglini@arm.com#ifndef __MEM_RUBY_SYSTEM_SYSTEM_HH__
3613481Sgiacomo.travaglini@arm.com#define __MEM_RUBY_SYSTEM_SYSTEM_HH__
3713481Sgiacomo.travaglini@arm.com
3813481Sgiacomo.travaglini@arm.com#include "base/callback.hh"
3913481Sgiacomo.travaglini@arm.com#include "mem/ruby/common/Global.hh"
4013481Sgiacomo.travaglini@arm.com#include "mem/ruby/recorder/CacheRecorder.hh"
4113481Sgiacomo.travaglini@arm.com#include "mem/ruby/slicc_interface/AbstractController.hh"
4213481Sgiacomo.travaglini@arm.com#include "mem/ruby/system/MemoryVector.hh"
4313481Sgiacomo.travaglini@arm.com#include "mem/ruby/system/SparseMemory.hh"
4413481Sgiacomo.travaglini@arm.com#include "params/RubySystem.hh"
4513481Sgiacomo.travaglini@arm.com#include "sim/clocked_object.hh"
4613481Sgiacomo.travaglini@arm.com
4713481Sgiacomo.travaglini@arm.comclass Network;
4813481Sgiacomo.travaglini@arm.comclass Profiler;
4913481Sgiacomo.travaglini@arm.comclass MemoryControl;
5013481Sgiacomo.travaglini@arm.com
5113481Sgiacomo.travaglini@arm.comclass RubySystem : public ClockedObject
5213481Sgiacomo.travaglini@arm.com{
5313481Sgiacomo.travaglini@arm.com  public:
5413481Sgiacomo.travaglini@arm.com    class RubyEvent : public Event
5513481Sgiacomo.travaglini@arm.com    {
5613481Sgiacomo.travaglini@arm.com      public:
5713481Sgiacomo.travaglini@arm.com        RubyEvent(RubySystem* _ruby_system)
5813481Sgiacomo.travaglini@arm.com        {
5913481Sgiacomo.travaglini@arm.com            ruby_system = _ruby_system;
6013481Sgiacomo.travaglini@arm.com        }
6113481Sgiacomo.travaglini@arm.com      private:
6213481Sgiacomo.travaglini@arm.com        void process();
6313481Sgiacomo.travaglini@arm.com
6413481Sgiacomo.travaglini@arm.com        RubySystem* ruby_system;
6513481Sgiacomo.travaglini@arm.com    };
6613481Sgiacomo.travaglini@arm.com
6713481Sgiacomo.travaglini@arm.com    friend class RubyEvent;
6813481Sgiacomo.travaglini@arm.com
6913481Sgiacomo.travaglini@arm.com    typedef RubySystemParams Params;
7013481Sgiacomo.travaglini@arm.com    RubySystem(const Params *p);
7113481Sgiacomo.travaglini@arm.com    ~RubySystem();
7213481Sgiacomo.travaglini@arm.com
7313481Sgiacomo.travaglini@arm.com    // config accessors
7413481Sgiacomo.travaglini@arm.com    static int getRandomSeed() { return m_random_seed; }
7513481Sgiacomo.travaglini@arm.com    static int getRandomization() { return m_randomization; }
7613481Sgiacomo.travaglini@arm.com    static int getBlockSizeBytes() { return m_block_size_bytes; }
7713481Sgiacomo.travaglini@arm.com    static int getBlockSizeBits() { return m_block_size_bits; }
7813481Sgiacomo.travaglini@arm.com    static uint64 getMemorySizeBytes() { return m_memory_size_bytes; }
7913481Sgiacomo.travaglini@arm.com    static int getMemorySizeBits() { return m_memory_size_bits; }
8013481Sgiacomo.travaglini@arm.com    Cycles getTime() const { return curCycle(); }
8113481Sgiacomo.travaglini@arm.com
8213481Sgiacomo.travaglini@arm.com    // Public Methods
8313481Sgiacomo.travaglini@arm.com    static Network*
8413481Sgiacomo.travaglini@arm.com    getNetwork()
8513481Sgiacomo.travaglini@arm.com    {
8613481Sgiacomo.travaglini@arm.com        assert(m_network_ptr != NULL);
8713481Sgiacomo.travaglini@arm.com        return m_network_ptr;
8813481Sgiacomo.travaglini@arm.com    }
8913481Sgiacomo.travaglini@arm.com
9013481Sgiacomo.travaglini@arm.com    Profiler*
9113481Sgiacomo.travaglini@arm.com    getProfiler()
9213481Sgiacomo.travaglini@arm.com    {
9313481Sgiacomo.travaglini@arm.com        assert(m_profiler_ptr != NULL);
9413481Sgiacomo.travaglini@arm.com        return m_profiler_ptr;
9513481Sgiacomo.travaglini@arm.com    }
9613481Sgiacomo.travaglini@arm.com
9713481Sgiacomo.travaglini@arm.com    static MemoryVector*
9813481Sgiacomo.travaglini@arm.com    getMemoryVector()
9913481Sgiacomo.travaglini@arm.com    {
10013481Sgiacomo.travaglini@arm.com        assert(m_mem_vec_ptr != NULL);
10113481Sgiacomo.travaglini@arm.com        return m_mem_vec_ptr;
10213481Sgiacomo.travaglini@arm.com    }
10313481Sgiacomo.travaglini@arm.com
10413481Sgiacomo.travaglini@arm.com    static void printStats(std::ostream& out);
10513481Sgiacomo.travaglini@arm.com    void clearStats() const;
10613481Sgiacomo.travaglini@arm.com
10713481Sgiacomo.travaglini@arm.com    uint64 getInstructionCount(int thread) { return 1; }
10813481Sgiacomo.travaglini@arm.com
10913481Sgiacomo.travaglini@arm.com    void print(std::ostream& out) const;
11013481Sgiacomo.travaglini@arm.com
11113481Sgiacomo.travaglini@arm.com    void serialize(std::ostream &os);
11213481Sgiacomo.travaglini@arm.com    void unserialize(Checkpoint *cp, const std::string &section);
11313481Sgiacomo.travaglini@arm.com    void process();
11413481Sgiacomo.travaglini@arm.com    void startup();
11513481Sgiacomo.travaglini@arm.com
11613481Sgiacomo.travaglini@arm.com    void registerNetwork(Network*);
11713481Sgiacomo.travaglini@arm.com    void registerProfiler(Profiler*);
11813481Sgiacomo.travaglini@arm.com    void registerAbstractController(AbstractController*);
11913481Sgiacomo.travaglini@arm.com    void registerSparseMemory(SparseMemory*);
12013481Sgiacomo.travaglini@arm.com    void registerMemController(MemoryControl *mc);
12113481Sgiacomo.travaglini@arm.com
12213481Sgiacomo.travaglini@arm.com    bool eventQueueEmpty() { return eventq->empty(); }
12313481Sgiacomo.travaglini@arm.com    void enqueueRubyEvent(Tick tick)
12413481Sgiacomo.travaglini@arm.com    {
12513481Sgiacomo.travaglini@arm.com        RubyEvent* e = new RubyEvent(this);
12613481Sgiacomo.travaglini@arm.com        schedule(e, tick);
12713481Sgiacomo.travaglini@arm.com    }
12813481Sgiacomo.travaglini@arm.com
12913481Sgiacomo.travaglini@arm.com  private:
13013481Sgiacomo.travaglini@arm.com    // Private copy constructor and assignment operator
13113481Sgiacomo.travaglini@arm.com    RubySystem(const RubySystem& obj);
13213481Sgiacomo.travaglini@arm.com    RubySystem& operator=(const RubySystem& obj);
13313481Sgiacomo.travaglini@arm.com
13413481Sgiacomo.travaglini@arm.com    void init();
13513481Sgiacomo.travaglini@arm.com
13613481Sgiacomo.travaglini@arm.com    static void printSystemConfig(std::ostream& out);
13713481Sgiacomo.travaglini@arm.com    void readCompressedTrace(std::string filename,
13813481Sgiacomo.travaglini@arm.com                             uint8*& raw_data,
13913481Sgiacomo.travaglini@arm.com                             uint64& uncompressed_trace_size);
14013481Sgiacomo.travaglini@arm.com    void writeCompressedTrace(uint8* raw_data, std::string file,
14113481Sgiacomo.travaglini@arm.com                              uint64 uncompressed_trace_size);
14213481Sgiacomo.travaglini@arm.com
14313481Sgiacomo.travaglini@arm.com  private:
14413481Sgiacomo.travaglini@arm.com    // configuration parameters
14513481Sgiacomo.travaglini@arm.com    static int m_random_seed;
14613481Sgiacomo.travaglini@arm.com    static bool m_randomization;
14713481Sgiacomo.travaglini@arm.com    static int m_block_size_bytes;
14813481Sgiacomo.travaglini@arm.com    static int m_block_size_bits;
14913481Sgiacomo.travaglini@arm.com    static uint64 m_memory_size_bytes;
15013481Sgiacomo.travaglini@arm.com    static int m_memory_size_bits;
15113481Sgiacomo.travaglini@arm.com    static Network* m_network_ptr;
15213481Sgiacomo.travaglini@arm.com
15313481Sgiacomo.travaglini@arm.com    MemoryControl *m_memory_controller;
15413481Sgiacomo.travaglini@arm.com
15513481Sgiacomo.travaglini@arm.com  public:
15613481Sgiacomo.travaglini@arm.com    static Profiler* m_profiler_ptr;
15713481Sgiacomo.travaglini@arm.com    static MemoryVector* m_mem_vec_ptr;
15813481Sgiacomo.travaglini@arm.com    std::vector<AbstractController*> m_abs_cntrl_vec;
15913481Sgiacomo.travaglini@arm.com    bool m_warmup_enabled;
16013481Sgiacomo.travaglini@arm.com    bool m_cooldown_enabled;
16113481Sgiacomo.travaglini@arm.com    CacheRecorder* m_cache_recorder;
16213481Sgiacomo.travaglini@arm.com    std::vector<SparseMemory*> m_sparse_memory_vector;
16313481Sgiacomo.travaglini@arm.com};
16413481Sgiacomo.travaglini@arm.com
16513481Sgiacomo.travaglini@arm.cominline std::ostream&
16613481Sgiacomo.travaglini@arm.comoperator<<(std::ostream& out, const RubySystem& obj)
16713481Sgiacomo.travaglini@arm.com{
16813481Sgiacomo.travaglini@arm.com    //obj.print(out);
16913481Sgiacomo.travaglini@arm.com    out << std::flush;
17013481Sgiacomo.travaglini@arm.com    return out;
17113481Sgiacomo.travaglini@arm.com}
17213481Sgiacomo.travaglini@arm.com
17313481Sgiacomo.travaglini@arm.comclass RubyExitCallback : public Callback
17413481Sgiacomo.travaglini@arm.com{
17513481Sgiacomo.travaglini@arm.com  private:
17613481Sgiacomo.travaglini@arm.com    std::string stats_filename;
17713481Sgiacomo.travaglini@arm.com
17813481Sgiacomo.travaglini@arm.com  public:
17913481Sgiacomo.travaglini@arm.com    virtual ~RubyExitCallback() {}
18013481Sgiacomo.travaglini@arm.com
18113481Sgiacomo.travaglini@arm.com    RubyExitCallback(const std::string& _stats_filename)
18213481Sgiacomo.travaglini@arm.com    {
18313481Sgiacomo.travaglini@arm.com        stats_filename = _stats_filename;
18413481Sgiacomo.travaglini@arm.com    }
18513481Sgiacomo.travaglini@arm.com
18613481Sgiacomo.travaglini@arm.com    virtual void process();
18713481Sgiacomo.travaglini@arm.com};
18813481Sgiacomo.travaglini@arm.com
18913481Sgiacomo.travaglini@arm.com#endif // __MEM_RUBY_SYSTEM_SYSTEM_HH__
19013481Sgiacomo.travaglini@arm.com