RubySystem.hh revision 9504
111308Santhony.gutierrez@amd.com/*
211308Santhony.gutierrez@amd.com * Copyright (c) 1999-2012 Mark D. Hill and David A. Wood
311308Santhony.gutierrez@amd.com * All rights reserved.
411308Santhony.gutierrez@amd.com *
511308Santhony.gutierrez@amd.com * Redistribution and use in source and binary forms, with or without
611308Santhony.gutierrez@amd.com * modification, are permitted provided that the following conditions are
711308Santhony.gutierrez@amd.com * met: redistributions of source code must retain the above copyright
811308Santhony.gutierrez@amd.com * notice, this list of conditions and the following disclaimer;
911308Santhony.gutierrez@amd.com * redistributions in binary form must reproduce the above copyright
1011308Santhony.gutierrez@amd.com * notice, this list of conditions and the following disclaimer in the
1111308Santhony.gutierrez@amd.com * documentation and/or other materials provided with the distribution;
1211308Santhony.gutierrez@amd.com * neither the name of the copyright holders nor the names of its
1311308Santhony.gutierrez@amd.com * contributors may be used to endorse or promote products derived from
1411308Santhony.gutierrez@amd.com * this software without specific prior written permission.
1511308Santhony.gutierrez@amd.com *
1611308Santhony.gutierrez@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1712697Santhony.gutierrez@amd.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1812697Santhony.gutierrez@amd.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1912697Santhony.gutierrez@amd.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2011308Santhony.gutierrez@amd.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2111308Santhony.gutierrez@amd.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2211308Santhony.gutierrez@amd.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2311308Santhony.gutierrez@amd.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2411308Santhony.gutierrez@amd.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2511308Santhony.gutierrez@amd.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2611308Santhony.gutierrez@amd.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2711308Santhony.gutierrez@amd.com */
2811308Santhony.gutierrez@amd.com
2911308Santhony.gutierrez@amd.com/*
3011308Santhony.gutierrez@amd.com * Contains all of the various parts of the system we are simulating.
3111308Santhony.gutierrez@amd.com * Performs allocation, deallocation, and setup of all the major
3211308Santhony.gutierrez@amd.com * components of the system
3312697Santhony.gutierrez@amd.com */
3412697Santhony.gutierrez@amd.com
3511308Santhony.gutierrez@amd.com#ifndef __MEM_RUBY_SYSTEM_SYSTEM_HH__
3611308Santhony.gutierrez@amd.com#define __MEM_RUBY_SYSTEM_SYSTEM_HH__
3711308Santhony.gutierrez@amd.com
3811308Santhony.gutierrez@amd.com#include "base/callback.hh"
3911308Santhony.gutierrez@amd.com#include "base/output.hh"
4011308Santhony.gutierrez@amd.com#include "mem/packet.hh"
4111308Santhony.gutierrez@amd.com#include "mem/ruby/common/Global.hh"
4211308Santhony.gutierrez@amd.com#include "mem/ruby/recorder/CacheRecorder.hh"
4311308Santhony.gutierrez@amd.com#include "mem/ruby/slicc_interface/AbstractController.hh"
4411308Santhony.gutierrez@amd.com#include "mem/ruby/system/MemoryVector.hh"
4511308Santhony.gutierrez@amd.com#include "mem/ruby/system/SparseMemory.hh"
4611308Santhony.gutierrez@amd.com#include "params/RubySystem.hh"
4711308Santhony.gutierrez@amd.com#include "sim/clocked_object.hh"
4811308Santhony.gutierrez@amd.com
4911308Santhony.gutierrez@amd.comclass Network;
5011308Santhony.gutierrez@amd.comclass Profiler;
5111308Santhony.gutierrez@amd.comclass MemoryControl;
5211308Santhony.gutierrez@amd.com
5311308Santhony.gutierrez@amd.comclass RubySystem : public ClockedObject
5411308Santhony.gutierrez@amd.com{
5511308Santhony.gutierrez@amd.com  public:
5611308Santhony.gutierrez@amd.com    class RubyEvent : public Event
5711308Santhony.gutierrez@amd.com    {
5811308Santhony.gutierrez@amd.com      public:
5911308Santhony.gutierrez@amd.com        RubyEvent(RubySystem* _ruby_system)
6011308Santhony.gutierrez@amd.com        {
6111308Santhony.gutierrez@amd.com            ruby_system = _ruby_system;
6211308Santhony.gutierrez@amd.com        }
6311308Santhony.gutierrez@amd.com      private:
6411308Santhony.gutierrez@amd.com        void process();
6511308Santhony.gutierrez@amd.com
6611308Santhony.gutierrez@amd.com        RubySystem* ruby_system;
6711308Santhony.gutierrez@amd.com    };
6811308Santhony.gutierrez@amd.com
6911308Santhony.gutierrez@amd.com    friend class RubyEvent;
7011308Santhony.gutierrez@amd.com
7111308Santhony.gutierrez@amd.com    typedef RubySystemParams Params;
7211308Santhony.gutierrez@amd.com    RubySystem(const Params *p);
7311308Santhony.gutierrez@amd.com    ~RubySystem();
7411308Santhony.gutierrez@amd.com
7511308Santhony.gutierrez@amd.com    // config accessors
7611308Santhony.gutierrez@amd.com    static int getRandomSeed() { return m_random_seed; }
7711308Santhony.gutierrez@amd.com    static int getRandomization() { return m_randomization; }
7811308Santhony.gutierrez@amd.com    static uint32_t getBlockSizeBytes() { return m_block_size_bytes; }
7911308Santhony.gutierrez@amd.com    static uint32_t getBlockSizeBits() { return m_block_size_bits; }
8011308Santhony.gutierrez@amd.com    static uint64_t getMemorySizeBytes() { return m_memory_size_bytes; }
8111308Santhony.gutierrez@amd.com    static uint32_t getMemorySizeBits() { return m_memory_size_bits; }
8211308Santhony.gutierrez@amd.com    Cycles getTime() const { return curCycle(); }
8311308Santhony.gutierrez@amd.com
8411308Santhony.gutierrez@amd.com    // Public Methods
8511308Santhony.gutierrez@amd.com    Network*
8611308Santhony.gutierrez@amd.com    getNetwork()
8711308Santhony.gutierrez@amd.com    {
8811308Santhony.gutierrez@amd.com        assert(m_network_ptr != NULL);
8911308Santhony.gutierrez@amd.com        return m_network_ptr;
9011308Santhony.gutierrez@amd.com    }
9111308Santhony.gutierrez@amd.com
9211308Santhony.gutierrez@amd.com    Profiler*
9311308Santhony.gutierrez@amd.com    getProfiler()
9411308Santhony.gutierrez@amd.com    {
9511308Santhony.gutierrez@amd.com        assert(m_profiler_ptr != NULL);
9611308Santhony.gutierrez@amd.com        return m_profiler_ptr;
9711308Santhony.gutierrez@amd.com    }
9811308Santhony.gutierrez@amd.com
9911308Santhony.gutierrez@amd.com    MemoryVector*
10011308Santhony.gutierrez@amd.com    getMemoryVector()
10111308Santhony.gutierrez@amd.com    {
10211308Santhony.gutierrez@amd.com        assert(m_mem_vec_ptr != NULL);
10311308Santhony.gutierrez@amd.com        return m_mem_vec_ptr;
10411308Santhony.gutierrez@amd.com    }
10511308Santhony.gutierrez@amd.com
10611308Santhony.gutierrez@amd.com    void printStats(std::ostream& out);
10711308Santhony.gutierrez@amd.com    void resetStats();
10811308Santhony.gutierrez@amd.com
10911308Santhony.gutierrez@amd.com    uint64 getInstructionCount(int thread) { return 1; }
11011308Santhony.gutierrez@amd.com
11111308Santhony.gutierrez@amd.com    void print(std::ostream& out) const;
11211308Santhony.gutierrez@amd.com
11311308Santhony.gutierrez@amd.com    void serialize(std::ostream &os);
11411308Santhony.gutierrez@amd.com    void unserialize(Checkpoint *cp, const std::string &section);
11511308Santhony.gutierrez@amd.com    void process();
11611308Santhony.gutierrez@amd.com    void startup();
11711308Santhony.gutierrez@amd.com    bool functionalRead(Packet *ptr);
11811308Santhony.gutierrez@amd.com    bool functionalWrite(Packet *ptr);
11911308Santhony.gutierrez@amd.com
12011308Santhony.gutierrez@amd.com    void registerNetwork(Network*);
12111308Santhony.gutierrez@amd.com    void registerProfiler(Profiler*);
12211308Santhony.gutierrez@amd.com    void registerAbstractController(AbstractController*);
12311308Santhony.gutierrez@amd.com    void registerSparseMemory(SparseMemory*);
12411308Santhony.gutierrez@amd.com    void registerMemController(MemoryControl *mc);
12511308Santhony.gutierrez@amd.com
12611308Santhony.gutierrez@amd.com    bool eventQueueEmpty() { return eventq->empty(); }
12711308Santhony.gutierrez@amd.com    void enqueueRubyEvent(Tick tick)
12811308Santhony.gutierrez@amd.com    {
12911308Santhony.gutierrez@amd.com        RubyEvent* e = new RubyEvent(this);
13011308Santhony.gutierrez@amd.com        schedule(e, tick);
13111308Santhony.gutierrez@amd.com    }
13211308Santhony.gutierrez@amd.com
13311308Santhony.gutierrez@amd.com  private:
13411308Santhony.gutierrez@amd.com    // Private copy constructor and assignment operator
13511308Santhony.gutierrez@amd.com    RubySystem(const RubySystem& obj);
13611308Santhony.gutierrez@amd.com    RubySystem& operator=(const RubySystem& obj);
13711308Santhony.gutierrez@amd.com
13811308Santhony.gutierrez@amd.com    void init();
13911308Santhony.gutierrez@amd.com
14011308Santhony.gutierrez@amd.com    void readCompressedTrace(std::string filename,
14111308Santhony.gutierrez@amd.com                             uint8_t *&raw_data,
14211308Santhony.gutierrez@amd.com                             uint64& uncompressed_trace_size);
14311308Santhony.gutierrez@amd.com    void writeCompressedTrace(uint8_t *raw_data, std::string file,
14411308Santhony.gutierrez@amd.com                              uint64 uncompressed_trace_size);
14511308Santhony.gutierrez@amd.com
14611308Santhony.gutierrez@amd.com  private:
14711308Santhony.gutierrez@amd.com    // configuration parameters
14811308Santhony.gutierrez@amd.com    static int m_random_seed;
14911308Santhony.gutierrez@amd.com    static bool m_randomization;
15011308Santhony.gutierrez@amd.com    static uint32_t m_block_size_bytes;
15111308Santhony.gutierrez@amd.com    static uint32_t m_block_size_bits;
15211308Santhony.gutierrez@amd.com    static uint64_t m_memory_size_bytes;
15311308Santhony.gutierrez@amd.com    static uint32_t m_memory_size_bits;
15411308Santhony.gutierrez@amd.com
15511308Santhony.gutierrez@amd.com    Network* m_network_ptr;
15611308Santhony.gutierrez@amd.com    std::vector<MemoryControl *> m_memory_controller_vec;
15711308Santhony.gutierrez@amd.com    std::vector<AbstractController *> m_abs_cntrl_vec;
15811308Santhony.gutierrez@amd.com
15911308Santhony.gutierrez@amd.com  public:
16011308Santhony.gutierrez@amd.com    Profiler* m_profiler_ptr;
16111308Santhony.gutierrez@amd.com    MemoryVector* m_mem_vec_ptr;
16211308Santhony.gutierrez@amd.com    bool m_warmup_enabled;
16311308Santhony.gutierrez@amd.com    bool m_cooldown_enabled;
16411308Santhony.gutierrez@amd.com    CacheRecorder* m_cache_recorder;
16511308Santhony.gutierrez@amd.com    std::vector<SparseMemory*> m_sparse_memory_vector;
16611308Santhony.gutierrez@amd.com};
16711308Santhony.gutierrez@amd.com
16811308Santhony.gutierrez@amd.cominline std::ostream&
16911308Santhony.gutierrez@amd.comoperator<<(std::ostream& out, const RubySystem& obj)
17011308Santhony.gutierrez@amd.com{
17111308Santhony.gutierrez@amd.com    //obj.print(out);
17211308Santhony.gutierrez@amd.com    out << std::flush;
17311308Santhony.gutierrez@amd.com    return out;
17411308Santhony.gutierrez@amd.com}
17511308Santhony.gutierrez@amd.com
17611308Santhony.gutierrez@amd.comclass RubyDumpStatsCallback : public Callback
17711308Santhony.gutierrez@amd.com{
17811308Santhony.gutierrez@amd.com  private:
17911308Santhony.gutierrez@amd.com    std::ostream *os;
18011308Santhony.gutierrez@amd.com    RubySystem *ruby_system;
18111308Santhony.gutierrez@amd.com
18211308Santhony.gutierrez@amd.com  public:
18311308Santhony.gutierrez@amd.com    virtual ~RubyDumpStatsCallback() {}
18411308Santhony.gutierrez@amd.com
18511308Santhony.gutierrez@amd.com    RubyDumpStatsCallback(const std::string& _stats_filename,
18611308Santhony.gutierrez@amd.com                          RubySystem *system)
18711308Santhony.gutierrez@amd.com    {
18811308Santhony.gutierrez@amd.com        os = simout.create(_stats_filename);
18911308Santhony.gutierrez@amd.com        ruby_system = system;
19011308Santhony.gutierrez@amd.com    }
19111308Santhony.gutierrez@amd.com
19211308Santhony.gutierrez@amd.com    void process();
19311308Santhony.gutierrez@amd.com};
19411308Santhony.gutierrez@amd.com
19511308Santhony.gutierrez@amd.com#endif // __MEM_RUBY_SYSTEM_SYSTEM_HH__
19611308Santhony.gutierrez@amd.com