RubySystem.hh revision 9504
111752Snikos.nikoleris@arm.com/*
210705Sandreas.hansson@arm.com * Copyright (c) 1999-2012 Mark D. Hill and David A. Wood
310705Sandreas.hansson@arm.com * All rights reserved.
410705Sandreas.hansson@arm.com *
510705Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without
610705Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are
710705Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright
810705Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer;
910705Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright
1010705Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the
1110705Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution;
1210705Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its
1310705Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from
1410705Sandreas.hansson@arm.com * this software without specific prior written permission.
1510705Sandreas.hansson@arm.com *
1610705Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1710705Sandreas.hansson@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1810705Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1910705Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2010705Sandreas.hansson@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2110705Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2210705Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2310705Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2410705Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2510705Sandreas.hansson@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2610705Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2710705Sandreas.hansson@arm.com */
2810705Sandreas.hansson@arm.com
2910705Sandreas.hansson@arm.com/*
3010705Sandreas.hansson@arm.com * Contains all of the various parts of the system we are simulating.
3110705Sandreas.hansson@arm.com * Performs allocation, deallocation, and setup of all the major
3210705Sandreas.hansson@arm.com * components of the system
3310705Sandreas.hansson@arm.com */
3410705Sandreas.hansson@arm.com
3510705Sandreas.hansson@arm.com#ifndef __MEM_RUBY_SYSTEM_SYSTEM_HH__
3610705Sandreas.hansson@arm.com#define __MEM_RUBY_SYSTEM_SYSTEM_HH__
3710705Sandreas.hansson@arm.com
3810705Sandreas.hansson@arm.com#include "base/callback.hh"
3910705Sandreas.hansson@arm.com#include "base/output.hh"
4010705Sandreas.hansson@arm.com#include "mem/packet.hh"
4110705Sandreas.hansson@arm.com#include "mem/ruby/common/Global.hh"
4210705Sandreas.hansson@arm.com#include "mem/ruby/recorder/CacheRecorder.hh"
4310705Sandreas.hansson@arm.com#include "mem/ruby/slicc_interface/AbstractController.hh"
4410705Sandreas.hansson@arm.com#include "mem/ruby/system/MemoryVector.hh"
4510705Sandreas.hansson@arm.com#include "mem/ruby/system/SparseMemory.hh"
4610705Sandreas.hansson@arm.com#include "params/RubySystem.hh"
4710705Sandreas.hansson@arm.com#include "sim/clocked_object.hh"
4810705Sandreas.hansson@arm.com
4910705Sandreas.hansson@arm.comclass Network;
5010705Sandreas.hansson@arm.comclass Profiler;
5110705Sandreas.hansson@arm.comclass MemoryControl;
5210705Sandreas.hansson@arm.com
5310705Sandreas.hansson@arm.comclass RubySystem : public ClockedObject
5410705Sandreas.hansson@arm.com{
5510705Sandreas.hansson@arm.com  public:
5610705Sandreas.hansson@arm.com    class RubyEvent : public Event
5710705Sandreas.hansson@arm.com    {
5810705Sandreas.hansson@arm.com      public:
5910705Sandreas.hansson@arm.com        RubyEvent(RubySystem* _ruby_system)
6010705Sandreas.hansson@arm.com        {
6110705Sandreas.hansson@arm.com            ruby_system = _ruby_system;
6210705Sandreas.hansson@arm.com        }
6310705Sandreas.hansson@arm.com      private:
6410705Sandreas.hansson@arm.com        void process();
6510705Sandreas.hansson@arm.com
6610705Sandreas.hansson@arm.com        RubySystem* ruby_system;
6710705Sandreas.hansson@arm.com    };
6810705Sandreas.hansson@arm.com
6910705Sandreas.hansson@arm.com    friend class RubyEvent;
7010705Sandreas.hansson@arm.com
7110705Sandreas.hansson@arm.com    typedef RubySystemParams Params;
7210705Sandreas.hansson@arm.com    RubySystem(const Params *p);
7310705Sandreas.hansson@arm.com    ~RubySystem();
7410705Sandreas.hansson@arm.com
7510705Sandreas.hansson@arm.com    // config accessors
7610705Sandreas.hansson@arm.com    static int getRandomSeed() { return m_random_seed; }
7710705Sandreas.hansson@arm.com    static int getRandomization() { return m_randomization; }
7810705Sandreas.hansson@arm.com    static uint32_t getBlockSizeBytes() { return m_block_size_bytes; }
7910705Sandreas.hansson@arm.com    static uint32_t getBlockSizeBits() { return m_block_size_bits; }
8010705Sandreas.hansson@arm.com    static uint64_t getMemorySizeBytes() { return m_memory_size_bytes; }
8110705Sandreas.hansson@arm.com    static uint32_t getMemorySizeBits() { return m_memory_size_bits; }
8210705Sandreas.hansson@arm.com    Cycles getTime() const { return curCycle(); }
8310705Sandreas.hansson@arm.com
8410705Sandreas.hansson@arm.com    // Public Methods
8510705Sandreas.hansson@arm.com    Network*
8610705Sandreas.hansson@arm.com    getNetwork()
8710705Sandreas.hansson@arm.com    {
8810705Sandreas.hansson@arm.com        assert(m_network_ptr != NULL);
8910705Sandreas.hansson@arm.com        return m_network_ptr;
9010705Sandreas.hansson@arm.com    }
9110705Sandreas.hansson@arm.com
9210705Sandreas.hansson@arm.com    Profiler*
9310705Sandreas.hansson@arm.com    getProfiler()
9410705Sandreas.hansson@arm.com    {
9510705Sandreas.hansson@arm.com        assert(m_profiler_ptr != NULL);
9610705Sandreas.hansson@arm.com        return m_profiler_ptr;
9710705Sandreas.hansson@arm.com    }
9810705Sandreas.hansson@arm.com
9910705Sandreas.hansson@arm.com    MemoryVector*
10010705Sandreas.hansson@arm.com    getMemoryVector()
10110705Sandreas.hansson@arm.com    {
10210705Sandreas.hansson@arm.com        assert(m_mem_vec_ptr != NULL);
10310705Sandreas.hansson@arm.com        return m_mem_vec_ptr;
10410705Sandreas.hansson@arm.com    }
10510705Sandreas.hansson@arm.com
10610705Sandreas.hansson@arm.com    void printStats(std::ostream& out);
10710705Sandreas.hansson@arm.com    void resetStats();
10810705Sandreas.hansson@arm.com
10910705Sandreas.hansson@arm.com    uint64 getInstructionCount(int thread) { return 1; }
11010705Sandreas.hansson@arm.com
11110705Sandreas.hansson@arm.com    void print(std::ostream& out) const;
11210705Sandreas.hansson@arm.com
11310705Sandreas.hansson@arm.com    void serialize(std::ostream &os);
11410705Sandreas.hansson@arm.com    void unserialize(Checkpoint *cp, const std::string &section);
11510705Sandreas.hansson@arm.com    void process();
11610705Sandreas.hansson@arm.com    void startup();
11710705Sandreas.hansson@arm.com    bool functionalRead(Packet *ptr);
11810705Sandreas.hansson@arm.com    bool functionalWrite(Packet *ptr);
11910705Sandreas.hansson@arm.com
12010705Sandreas.hansson@arm.com    void registerNetwork(Network*);
12110705Sandreas.hansson@arm.com    void registerProfiler(Profiler*);
12210705Sandreas.hansson@arm.com    void registerAbstractController(AbstractController*);
12310705Sandreas.hansson@arm.com    void registerSparseMemory(SparseMemory*);
12410705Sandreas.hansson@arm.com    void registerMemController(MemoryControl *mc);
12510705Sandreas.hansson@arm.com
12610705Sandreas.hansson@arm.com    bool eventQueueEmpty() { return eventq->empty(); }
12710705Sandreas.hansson@arm.com    void enqueueRubyEvent(Tick tick)
12810705Sandreas.hansson@arm.com    {
12910705Sandreas.hansson@arm.com        RubyEvent* e = new RubyEvent(this);
13010705Sandreas.hansson@arm.com        schedule(e, tick);
13110705Sandreas.hansson@arm.com    }
13210705Sandreas.hansson@arm.com
13310705Sandreas.hansson@arm.com  private:
13410705Sandreas.hansson@arm.com    // Private copy constructor and assignment operator
13510705Sandreas.hansson@arm.com    RubySystem(const RubySystem& obj);
13610705Sandreas.hansson@arm.com    RubySystem& operator=(const RubySystem& obj);
13710705Sandreas.hansson@arm.com
13810705Sandreas.hansson@arm.com    void init();
13910705Sandreas.hansson@arm.com
14010705Sandreas.hansson@arm.com    void readCompressedTrace(std::string filename,
14110705Sandreas.hansson@arm.com                             uint8_t *&raw_data,
14210705Sandreas.hansson@arm.com                             uint64& uncompressed_trace_size);
14310705Sandreas.hansson@arm.com    void writeCompressedTrace(uint8_t *raw_data, std::string file,
14410705Sandreas.hansson@arm.com                              uint64 uncompressed_trace_size);
14510705Sandreas.hansson@arm.com
14610705Sandreas.hansson@arm.com  private:
14710705Sandreas.hansson@arm.com    // configuration parameters
14810705Sandreas.hansson@arm.com    static int m_random_seed;
14910705Sandreas.hansson@arm.com    static bool m_randomization;
15010705Sandreas.hansson@arm.com    static uint32_t m_block_size_bytes;
15110705Sandreas.hansson@arm.com    static uint32_t m_block_size_bits;
15210705Sandreas.hansson@arm.com    static uint64_t m_memory_size_bytes;
15310705Sandreas.hansson@arm.com    static uint32_t m_memory_size_bits;
15410705Sandreas.hansson@arm.com
15511053Sandreas.hansson@arm.com    Network* m_network_ptr;
15611722Ssophiane.senni@gmail.com    std::vector<MemoryControl *> m_memory_controller_vec;
15711053Sandreas.hansson@arm.com    std::vector<AbstractController *> m_abs_cntrl_vec;
15810705Sandreas.hansson@arm.com
15910705Sandreas.hansson@arm.com  public:
16010705Sandreas.hansson@arm.com    Profiler* m_profiler_ptr;
16110705Sandreas.hansson@arm.com    MemoryVector* m_mem_vec_ptr;
16210705Sandreas.hansson@arm.com    bool m_warmup_enabled;
16310705Sandreas.hansson@arm.com    bool m_cooldown_enabled;
16410705Sandreas.hansson@arm.com    CacheRecorder* m_cache_recorder;
16510705Sandreas.hansson@arm.com    std::vector<SparseMemory*> m_sparse_memory_vector;
16610705Sandreas.hansson@arm.com};
16710705Sandreas.hansson@arm.com
16810705Sandreas.hansson@arm.cominline std::ostream&
16910705Sandreas.hansson@arm.comoperator<<(std::ostream& out, const RubySystem& obj)
17010705Sandreas.hansson@arm.com{
17110705Sandreas.hansson@arm.com    //obj.print(out);
17210705Sandreas.hansson@arm.com    out << std::flush;
17310705Sandreas.hansson@arm.com    return out;
17410705Sandreas.hansson@arm.com}
17510705Sandreas.hansson@arm.com
17610705Sandreas.hansson@arm.comclass RubyDumpStatsCallback : public Callback
17710705Sandreas.hansson@arm.com{
17811722Ssophiane.senni@gmail.com  private:
17911722Ssophiane.senni@gmail.com    std::ostream *os;
18010705Sandreas.hansson@arm.com    RubySystem *ruby_system;
18110705Sandreas.hansson@arm.com
18210705Sandreas.hansson@arm.com  public:
18310705Sandreas.hansson@arm.com    virtual ~RubyDumpStatsCallback() {}
18410705Sandreas.hansson@arm.com
18510705Sandreas.hansson@arm.com    RubyDumpStatsCallback(const std::string& _stats_filename,
18610705Sandreas.hansson@arm.com                          RubySystem *system)
18710705Sandreas.hansson@arm.com    {
18810705Sandreas.hansson@arm.com        os = simout.create(_stats_filename);
18910705Sandreas.hansson@arm.com        ruby_system = system;
19010705Sandreas.hansson@arm.com    }
19111752Snikos.nikoleris@arm.com
19210705Sandreas.hansson@arm.com    void process();
19311752Snikos.nikoleris@arm.com};
19410705Sandreas.hansson@arm.com
19510705Sandreas.hansson@arm.com#endif // __MEM_RUBY_SYSTEM_SYSTEM_HH__
19610705Sandreas.hansson@arm.com