110066Sandreas.hansson@arm.com/*
210066Sandreas.hansson@arm.com * Copyright (c) 2013 ARM Limited
310066Sandreas.hansson@arm.com * All rights reserved
410066Sandreas.hansson@arm.com *
510066Sandreas.hansson@arm.com * The license below extends only to copyright in the software and shall
610066Sandreas.hansson@arm.com * not be construed as granting a license to any other intellectual
710066Sandreas.hansson@arm.com * property including but not limited to intellectual property relating
810066Sandreas.hansson@arm.com * to a hardware implementation of the functionality of the software
910066Sandreas.hansson@arm.com * licensed hereunder.  You may use the software subject to the license
1010066Sandreas.hansson@arm.com * terms below provided that you ensure that this notice is replicated
1110066Sandreas.hansson@arm.com * unmodified and in its entirety in all distributions of the software,
1210066Sandreas.hansson@arm.com * modified or unmodified, in source code or in binary form.
1310066Sandreas.hansson@arm.com *
1410066Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without
1510066Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are
1610066Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright
1710066Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer;
1810066Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright
1910066Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the
2010066Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution;
2110066Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its
2210066Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from
2310066Sandreas.hansson@arm.com * this software without specific prior written permission.
2410066Sandreas.hansson@arm.com *
2510066Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2610066Sandreas.hansson@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2710066Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2810066Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2910066Sandreas.hansson@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3010066Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3110066Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3210066Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3310066Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3410066Sandreas.hansson@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3510066Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3610066Sandreas.hansson@arm.com *
3710066Sandreas.hansson@arm.com * Authors: Andreas Hansson
3810066Sandreas.hansson@arm.com */
3910066Sandreas.hansson@arm.com
4010066Sandreas.hansson@arm.com/**
4110066Sandreas.hansson@arm.com * @file
4210066Sandreas.hansson@arm.com * DRAMSim2Wrapper declaration
4310066Sandreas.hansson@arm.com */
4410066Sandreas.hansson@arm.com
4510066Sandreas.hansson@arm.com#ifndef __MEM_DRAMSIM2_WRAPPER_HH__
4610066Sandreas.hansson@arm.com#define __MEM_DRAMSIM2_WRAPPER_HH__
4710066Sandreas.hansson@arm.com
4810066Sandreas.hansson@arm.com#include <string>
4910066Sandreas.hansson@arm.com
5010066Sandreas.hansson@arm.com#include "DRAMSim2/Callback.h"
5110066Sandreas.hansson@arm.com
5210066Sandreas.hansson@arm.com/**
5310066Sandreas.hansson@arm.com * Forward declaration to avoid includes
5410066Sandreas.hansson@arm.com */
5510066Sandreas.hansson@arm.comnamespace DRAMSim {
5610066Sandreas.hansson@arm.com
5710066Sandreas.hansson@arm.comclass MultiChannelMemorySystem;
5810066Sandreas.hansson@arm.com
5910066Sandreas.hansson@arm.com}
6010066Sandreas.hansson@arm.com
6110066Sandreas.hansson@arm.com/**
6210066Sandreas.hansson@arm.com * Wrapper class to avoid having DRAMSim2 names like ClockDomain etc
6310066Sandreas.hansson@arm.com * clashing with the normal gem5 world. Many of the DRAMSim2 headers
6410066Sandreas.hansson@arm.com * do not make use of namespaces, and quite a few also open up
6510066Sandreas.hansson@arm.com * std. The only thing that needs to be exposed externally are the
6610066Sandreas.hansson@arm.com * callbacks. This wrapper effectively avoids clashes by not including
6710066Sandreas.hansson@arm.com * any of the conventional gem5 headers (e.g. Packet or SimObject).
6810066Sandreas.hansson@arm.com */
6910066Sandreas.hansson@arm.comclass DRAMSim2Wrapper
7010066Sandreas.hansson@arm.com{
7110066Sandreas.hansson@arm.com
7210066Sandreas.hansson@arm.com  private:
7310066Sandreas.hansson@arm.com
7410066Sandreas.hansson@arm.com    DRAMSim::MultiChannelMemorySystem* dramsim;
7510066Sandreas.hansson@arm.com
7610066Sandreas.hansson@arm.com    double _clockPeriod;
7710066Sandreas.hansson@arm.com
7810066Sandreas.hansson@arm.com    unsigned int _queueSize;
7910066Sandreas.hansson@arm.com
8010066Sandreas.hansson@arm.com    unsigned int _burstSize;
8110066Sandreas.hansson@arm.com
8210066Sandreas.hansson@arm.com    template <typename T>
8310066Sandreas.hansson@arm.com    T extractConfig(const std::string& field_name,
8410066Sandreas.hansson@arm.com                    const std::string& file_name) const;
8510066Sandreas.hansson@arm.com
8610066Sandreas.hansson@arm.com  public:
8710066Sandreas.hansson@arm.com
8810066Sandreas.hansson@arm.com    /**
8910066Sandreas.hansson@arm.com     * Create an instance of the DRAMSim2 multi-channel memory
9010066Sandreas.hansson@arm.com     * controller using a specific config and system description.
9110066Sandreas.hansson@arm.com     *
9210066Sandreas.hansson@arm.com     * @param config_file Memory config file
9310066Sandreas.hansson@arm.com     * @param system_file Controller config file
9410066Sandreas.hansson@arm.com     * @param working_dir Path pre-pended to config files
9510066Sandreas.hansson@arm.com     * @param trace_file Output trace file
9610066Sandreas.hansson@arm.com     * @param memory_size_mb Total memory size in MByte
9710066Sandreas.hansson@arm.com     * @param enable_debug Enable debug output
9810066Sandreas.hansson@arm.com     */
9910066Sandreas.hansson@arm.com    DRAMSim2Wrapper(const std::string& config_file,
10010066Sandreas.hansson@arm.com                    const std::string& system_file,
10110066Sandreas.hansson@arm.com                    const std::string& working_dir,
10210066Sandreas.hansson@arm.com                    const std::string& trace_file,
10310066Sandreas.hansson@arm.com                    unsigned int memory_size_mb,
10410066Sandreas.hansson@arm.com                    bool enable_debug);
10510066Sandreas.hansson@arm.com    ~DRAMSim2Wrapper();
10610066Sandreas.hansson@arm.com
10710066Sandreas.hansson@arm.com    /**
10810066Sandreas.hansson@arm.com     * Print the stats gathered in DRAMsim2.
10910066Sandreas.hansson@arm.com     */
11010066Sandreas.hansson@arm.com    void printStats();
11110066Sandreas.hansson@arm.com
11210066Sandreas.hansson@arm.com    /**
11310066Sandreas.hansson@arm.com     * Set the callbacks to use for read and write completion.
11410066Sandreas.hansson@arm.com     *
11510066Sandreas.hansson@arm.com     * @param read_callback Callback used for read completions
11610066Sandreas.hansson@arm.com     * @param write_callback Callback used for write completions
11710066Sandreas.hansson@arm.com     */
11810066Sandreas.hansson@arm.com    void setCallbacks(DRAMSim::TransactionCompleteCB* read_callback,
11910066Sandreas.hansson@arm.com                      DRAMSim::TransactionCompleteCB* write_callback);
12010066Sandreas.hansson@arm.com
12110066Sandreas.hansson@arm.com    /**
12210066Sandreas.hansson@arm.com     * Determine if the controller can accept a new packet or not.
12310066Sandreas.hansson@arm.com     *
12410066Sandreas.hansson@arm.com     * @return true if the controller can accept transactions
12510066Sandreas.hansson@arm.com     */
12610066Sandreas.hansson@arm.com    bool canAccept() const;
12710066Sandreas.hansson@arm.com
12810066Sandreas.hansson@arm.com    /**
12910066Sandreas.hansson@arm.com     * Enqueue a packet. This assumes that canAccept has returned true.
13010066Sandreas.hansson@arm.com     *
13110066Sandreas.hansson@arm.com     * @param pkt Packet to turn into a DRAMSim2 transaction
13210066Sandreas.hansson@arm.com     */
13310066Sandreas.hansson@arm.com    void enqueue(bool is_write, uint64_t addr);
13410066Sandreas.hansson@arm.com
13510066Sandreas.hansson@arm.com    /**
13610066Sandreas.hansson@arm.com     * Get the internal clock period used by DRAMSim2, specified in
13710066Sandreas.hansson@arm.com     * ns.
13810066Sandreas.hansson@arm.com     *
13910066Sandreas.hansson@arm.com     * @return The clock period of the DRAM interface in ns
14010066Sandreas.hansson@arm.com     */
14110066Sandreas.hansson@arm.com    double clockPeriod() const;
14210066Sandreas.hansson@arm.com
14310066Sandreas.hansson@arm.com    /**
14410066Sandreas.hansson@arm.com     * Get the transaction queue size used by DRAMSim2.
14510066Sandreas.hansson@arm.com     *
14610066Sandreas.hansson@arm.com     * @return The queue size counted in number of transactions
14710066Sandreas.hansson@arm.com     */
14810066Sandreas.hansson@arm.com    unsigned int queueSize() const;
14910066Sandreas.hansson@arm.com
15010066Sandreas.hansson@arm.com    /**
15110066Sandreas.hansson@arm.com     * Get the burst size in bytes used by DRAMSim2.
15210066Sandreas.hansson@arm.com     *
15310066Sandreas.hansson@arm.com     * @return The burst size in bytes (data width * burst length)
15410066Sandreas.hansson@arm.com     */
15510066Sandreas.hansson@arm.com    unsigned int burstSize() const;
15610066Sandreas.hansson@arm.com
15710066Sandreas.hansson@arm.com    /**
15810066Sandreas.hansson@arm.com     * Progress the memory controller one cycle
15910066Sandreas.hansson@arm.com     */
16010066Sandreas.hansson@arm.com    void tick();
16110066Sandreas.hansson@arm.com};
16210066Sandreas.hansson@arm.com
16310066Sandreas.hansson@arm.com#endif //__MEM_DRAMSIM2_WRAPPER_HH__
164