110428Sandreas.hansson@arm.com/*
210428Sandreas.hansson@arm.com * Copyright (c) 2012-2014, TU Delft
310428Sandreas.hansson@arm.com * Copyright (c) 2012-2014, TU Eindhoven
410428Sandreas.hansson@arm.com * Copyright (c) 2012-2014, TU Kaiserslautern
510428Sandreas.hansson@arm.com * All rights reserved.
610428Sandreas.hansson@arm.com *
710428Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without
810428Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are
910428Sandreas.hansson@arm.com * met:
1010428Sandreas.hansson@arm.com *
1110428Sandreas.hansson@arm.com * 1. Redistributions of source code must retain the above copyright
1210428Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer.
1310428Sandreas.hansson@arm.com *
1410428Sandreas.hansson@arm.com * 2. Redistributions in binary form must reproduce the above copyright
1510428Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the
1610428Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution.
1710428Sandreas.hansson@arm.com *
1810428Sandreas.hansson@arm.com * 3. Neither the name of the copyright holder nor the names of its
1910428Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from
2010428Sandreas.hansson@arm.com * this software without specific prior written permission.
2110428Sandreas.hansson@arm.com *
2210428Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
2310428Sandreas.hansson@arm.com * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2410428Sandreas.hansson@arm.com * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
2510428Sandreas.hansson@arm.com * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2610428Sandreas.hansson@arm.com * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2710428Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
2810428Sandreas.hansson@arm.com * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
2910428Sandreas.hansson@arm.com * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
3010428Sandreas.hansson@arm.com * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
3110428Sandreas.hansson@arm.com * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3210428Sandreas.hansson@arm.com * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3310428Sandreas.hansson@arm.com *
3412266Sradhika.jagtap@arm.com * Authors: Karthik Chandrasekar
3512266Sradhika.jagtap@arm.com *          Matthias Jung
3612266Sradhika.jagtap@arm.com *          Omar Naji
3712266Sradhika.jagtap@arm.com *          Subash Kannoth
3812266Sradhika.jagtap@arm.com *          Éder F. Zulian
3912266Sradhika.jagtap@arm.com *          Felipe S. Prado
4010428Sandreas.hansson@arm.com *
4110428Sandreas.hansson@arm.com */
4210428Sandreas.hansson@arm.com
4310428Sandreas.hansson@arm.com#ifndef MEMORY_POWER_MODEL_H
4410428Sandreas.hansson@arm.com#define MEMORY_POWER_MODEL_H
4510428Sandreas.hansson@arm.com
4612266Sradhika.jagtap@arm.com#include <numeric>
4710428Sandreas.hansson@arm.com#include "MemorySpecification.h"
4812266Sradhika.jagtap@arm.com#include "MemBankWiseParams.h"
4910428Sandreas.hansson@arm.com#include "CommandAnalysis.h"
5010428Sandreas.hansson@arm.com
5110428Sandreas.hansson@arm.comnamespace Data {
5210428Sandreas.hansson@arm.comclass MemoryPowerModel {
5310428Sandreas.hansson@arm.com public:
5412266Sradhika.jagtap@arm.com
5512266Sradhika.jagtap@arm.com  MemoryPowerModel();
5612266Sradhika.jagtap@arm.com
5710428Sandreas.hansson@arm.com  // Calculate energy and average power consumption for the given memory
5810428Sandreas.hansson@arm.com  // command trace
5911555Sjungma@eit.uni-kl.de  void power_calc(const MemorySpecification& memSpec,
6011555Sjungma@eit.uni-kl.de                  const CommandAnalysis& c,
6112266Sradhika.jagtap@arm.com                  int term,
6212266Sradhika.jagtap@arm.com                  const MemBankWiseParams& bwPowerParams);
6310428Sandreas.hansson@arm.com
6410428Sandreas.hansson@arm.com  // Used to calculate self-refresh active energy
6510428Sandreas.hansson@arm.com  static double engy_sref(double idd6,
6610428Sandreas.hansson@arm.com                          double idd3n,
6710428Sandreas.hansson@arm.com                          double idd5,
6810428Sandreas.hansson@arm.com                          double vdd,
6912266Sradhika.jagtap@arm.com                          double sref_cycles_idd6,
7010428Sandreas.hansson@arm.com                          double sref_ref_act_cycles,
7110428Sandreas.hansson@arm.com                          double sref_ref_pre_cycles,
7210428Sandreas.hansson@arm.com                          double spup_ref_act_cycles,
7310428Sandreas.hansson@arm.com                          double spup_ref_pre_cycles,
7410428Sandreas.hansson@arm.com                          double clk);
7512266Sradhika.jagtap@arm.com  static double engy_sref_banks(double idd6,
7612266Sradhika.jagtap@arm.com                                double idd3n,
7712266Sradhika.jagtap@arm.com                                double idd5,
7812266Sradhika.jagtap@arm.com                                double vdd,
7912266Sradhika.jagtap@arm.com                                double sref_cycles,
8012266Sradhika.jagtap@arm.com                                double sref_ref_act_cycles,
8112266Sradhika.jagtap@arm.com                                double sref_ref_pre_cycles,
8212266Sradhika.jagtap@arm.com                                double spup_ref_act_cycles,
8312266Sradhika.jagtap@arm.com                                double spup_ref_pre_cycles,
8412266Sradhika.jagtap@arm.com                                double clk,
8512266Sradhika.jagtap@arm.com                                double esharedPASR,
8612266Sradhika.jagtap@arm.com                                const MemBankWiseParams& bwPowerParams,
8712266Sradhika.jagtap@arm.com                                unsigned bnkIdx,
8812266Sradhika.jagtap@arm.com                                int64_t nbrofBanks);
8910428Sandreas.hansson@arm.com
9010428Sandreas.hansson@arm.com  int64_t total_cycles;
9110428Sandreas.hansson@arm.com
9212266Sradhika.jagtap@arm.com  int64_t window_cycles;
9312266Sradhika.jagtap@arm.com
9410428Sandreas.hansson@arm.com  struct Energy {
9510428Sandreas.hansson@arm.com    // Total energy of all activates
9610428Sandreas.hansson@arm.com    double act_energy;
9712266Sradhika.jagtap@arm.com    std::vector<double> act_energy_banks;
9810428Sandreas.hansson@arm.com
9910428Sandreas.hansson@arm.com    // Total energy of all precharges
10010428Sandreas.hansson@arm.com    double pre_energy;
10112266Sradhika.jagtap@arm.com    std::vector<double> pre_energy_banks;
10210428Sandreas.hansson@arm.com
10310428Sandreas.hansson@arm.com    // Total energy of all reads
10410428Sandreas.hansson@arm.com    double read_energy;
10512266Sradhika.jagtap@arm.com    std::vector<double> read_energy_banks;
10610428Sandreas.hansson@arm.com
10710428Sandreas.hansson@arm.com    // Total energy of all writes
10810428Sandreas.hansson@arm.com    double write_energy;
10912266Sradhika.jagtap@arm.com    std::vector<double> write_energy_banks;
11010428Sandreas.hansson@arm.com
11110428Sandreas.hansson@arm.com    // Total energy of all refreshes
11210428Sandreas.hansson@arm.com    double ref_energy;
11312266Sradhika.jagtap@arm.com    std::vector<double> ref_energy_banks;
11412266Sradhika.jagtap@arm.com
11512266Sradhika.jagtap@arm.com    // Bankwise refresh energy
11612266Sradhika.jagtap@arm.com    std::vector<double> refb_energy_banks;
11710428Sandreas.hansson@arm.com
11810428Sandreas.hansson@arm.com    // Total background energy of all active standby cycles
11910428Sandreas.hansson@arm.com    double act_stdby_energy;
12012266Sradhika.jagtap@arm.com    std::vector<double> act_stdby_energy_banks;
12110428Sandreas.hansson@arm.com
12210428Sandreas.hansson@arm.com    // Total background energy of all precharge standby cycles
12310428Sandreas.hansson@arm.com    double pre_stdby_energy;
12412266Sradhika.jagtap@arm.com    std::vector<double> pre_stdby_energy_banks;
12510428Sandreas.hansson@arm.com
12610428Sandreas.hansson@arm.com    // Total energy of idle cycles in the active mode
12710428Sandreas.hansson@arm.com    double idle_energy_act;
12812266Sradhika.jagtap@arm.com    std::vector<double> idle_energy_act_banks;
12910428Sandreas.hansson@arm.com
13010428Sandreas.hansson@arm.com    // Total energy of idle cycles in the precharge mode
13110428Sandreas.hansson@arm.com    double idle_energy_pre;
13212266Sradhika.jagtap@arm.com    std::vector<double> idle_energy_pre_banks;
13310428Sandreas.hansson@arm.com
13410428Sandreas.hansson@arm.com    // Total trace/pattern energy
13510428Sandreas.hansson@arm.com    double total_energy;
13612266Sradhika.jagtap@arm.com    std::vector<double> total_energy_banks;
13712266Sradhika.jagtap@arm.com
13812266Sradhika.jagtap@arm.com    // Window energy
13912266Sradhika.jagtap@arm.com    double window_energy;
14010428Sandreas.hansson@arm.com
14110428Sandreas.hansson@arm.com    // Average Power
14210428Sandreas.hansson@arm.com    double average_power;
14310428Sandreas.hansson@arm.com
14410428Sandreas.hansson@arm.com    // Energy consumed in active/precharged fast/slow-exit modes
14510428Sandreas.hansson@arm.com    double f_act_pd_energy;
14612266Sradhika.jagtap@arm.com    std::vector<double> f_act_pd_energy_banks;
14712266Sradhika.jagtap@arm.com
14810428Sandreas.hansson@arm.com    double f_pre_pd_energy;
14912266Sradhika.jagtap@arm.com    std::vector<double> f_pre_pd_energy_banks;
15012266Sradhika.jagtap@arm.com
15110428Sandreas.hansson@arm.com    double s_act_pd_energy;
15212266Sradhika.jagtap@arm.com    std::vector<double> s_act_pd_energy_banks;
15312266Sradhika.jagtap@arm.com
15410428Sandreas.hansson@arm.com    double s_pre_pd_energy;
15512266Sradhika.jagtap@arm.com    std::vector<double> s_pre_pd_energy_banks;
15610428Sandreas.hansson@arm.com
15710428Sandreas.hansson@arm.com    // Energy consumed in self-refresh mode
15810428Sandreas.hansson@arm.com    double sref_energy;
15912266Sradhika.jagtap@arm.com    std::vector<double> sref_energy_banks;
16010428Sandreas.hansson@arm.com
16110428Sandreas.hansson@arm.com    // Energy consumed in auto-refresh during self-refresh mode
16210428Sandreas.hansson@arm.com    double sref_ref_energy;
16312266Sradhika.jagtap@arm.com    std::vector<double> sref_ref_energy_banks;
16412266Sradhika.jagtap@arm.com
16510428Sandreas.hansson@arm.com    double sref_ref_act_energy;
16612266Sradhika.jagtap@arm.com    std::vector<double> sref_ref_act_energy_banks;
16712266Sradhika.jagtap@arm.com
16810428Sandreas.hansson@arm.com    double sref_ref_pre_energy;
16912266Sradhika.jagtap@arm.com    std::vector<double> sref_ref_pre_energy_banks;
17010428Sandreas.hansson@arm.com
17110428Sandreas.hansson@arm.com    // Energy consumed in powering-up from self-refresh mode
17210428Sandreas.hansson@arm.com    double spup_energy;
17312266Sradhika.jagtap@arm.com    std::vector<double> spup_energy_banks;
17410428Sandreas.hansson@arm.com
17510428Sandreas.hansson@arm.com    // Energy consumed in auto-refresh during self-refresh power-up
17610428Sandreas.hansson@arm.com    double spup_ref_energy;
17712266Sradhika.jagtap@arm.com    std::vector<double> spup_ref_energy_banks;
17812266Sradhika.jagtap@arm.com
17910428Sandreas.hansson@arm.com    double spup_ref_act_energy;
18012266Sradhika.jagtap@arm.com    std::vector<double> spup_ref_act_energy_banks;
18112266Sradhika.jagtap@arm.com
18210428Sandreas.hansson@arm.com    double spup_ref_pre_energy;
18312266Sradhika.jagtap@arm.com    std::vector<double> spup_ref_pre_energy_banks;
18410428Sandreas.hansson@arm.com
18510428Sandreas.hansson@arm.com    // Energy consumed in powering-up from active/precharged power-down modes
18610428Sandreas.hansson@arm.com    double pup_act_energy;
18712266Sradhika.jagtap@arm.com    std::vector<double> pup_act_energy_banks;
18812266Sradhika.jagtap@arm.com
18910428Sandreas.hansson@arm.com    double pup_pre_energy;
19012266Sradhika.jagtap@arm.com    std::vector<double> pup_pre_energy_banks;
19110428Sandreas.hansson@arm.com
19210428Sandreas.hansson@arm.com    // Energy consumed by IO and Termination
19310428Sandreas.hansson@arm.com    double read_io_energy;     // Read IO Energy
19410428Sandreas.hansson@arm.com    double write_term_energy;  // Write Termination Energy
19510428Sandreas.hansson@arm.com    double read_oterm_energy;  // Read Termination Energy from idle rank
19610428Sandreas.hansson@arm.com    double write_oterm_energy; // Write Termination Energy from idle rank
19710428Sandreas.hansson@arm.com    // Total IO and Termination Energy
19810428Sandreas.hansson@arm.com    double io_term_energy;
19910428Sandreas.hansson@arm.com  };
20010428Sandreas.hansson@arm.com
20110428Sandreas.hansson@arm.com  struct Power {
20210428Sandreas.hansson@arm.com    // Power measures corresponding to IO and Termination
20310428Sandreas.hansson@arm.com    double IO_power;     // Read IO Power
20410428Sandreas.hansson@arm.com    double WR_ODT_power; // Write ODT Power
20510428Sandreas.hansson@arm.com    double TermRD_power; // Read Termination in idle rank (in dual-rank systems)
20610428Sandreas.hansson@arm.com    double TermWR_power; // Write Termination in idle rank (in dual-rank systems)
20710428Sandreas.hansson@arm.com
20810428Sandreas.hansson@arm.com    // Average Power
20910428Sandreas.hansson@arm.com    double average_power;
21012266Sradhika.jagtap@arm.com
21112266Sradhika.jagtap@arm.com    // Window Average Power
21212266Sradhika.jagtap@arm.com    double window_average_power;
21310428Sandreas.hansson@arm.com  };
21410428Sandreas.hansson@arm.com
21510428Sandreas.hansson@arm.com  // Print the power and energy
21611555Sjungma@eit.uni-kl.de  void power_print(const MemorySpecification& memSpec,
21710428Sandreas.hansson@arm.com                   int                 term,
21812266Sradhika.jagtap@arm.com                   const CommandAnalysis& c,
21912266Sradhika.jagtap@arm.com                   bool bankwiseMode) const;
22010428Sandreas.hansson@arm.com
22110428Sandreas.hansson@arm.com  // To derive IO and Termination Power measures using DRAM specification
22211555Sjungma@eit.uni-kl.de  void io_term_power(const MemorySpecification& memSpec);
22310428Sandreas.hansson@arm.com
22410428Sandreas.hansson@arm.com  Energy energy;
22510428Sandreas.hansson@arm.com  Power  power;
22610428Sandreas.hansson@arm.com
22710428Sandreas.hansson@arm.com private:
22810428Sandreas.hansson@arm.com  double calcIoTermEnergy(int64_t cycles, double period, double power, int64_t numBits) const;
22912266Sradhika.jagtap@arm.com  // Sum quantities (e.g., operations, energy, cycles) that are stored in a per bank basis returning the total amount.
23012266Sradhika.jagtap@arm.com  template <typename T> T sum(const std::vector<T> vec) const { return std::accumulate(vec.begin(), vec.end(), static_cast<T>(0)); }
23110428Sandreas.hansson@arm.com};
23210428Sandreas.hansson@arm.com
23310428Sandreas.hansson@arm.comclass EnergyDomain {
23410428Sandreas.hansson@arm.com public:
23510428Sandreas.hansson@arm.com  EnergyDomain(double voltage, double clkPeriod) :
23610428Sandreas.hansson@arm.com    voltage(voltage),
23710428Sandreas.hansson@arm.com    clkPeriod(clkPeriod)
23810428Sandreas.hansson@arm.com  {}
23910428Sandreas.hansson@arm.com
24010428Sandreas.hansson@arm.com  double calcTivEnergy(int64_t cycles, double current) const;
24112266Sradhika.jagtap@arm.com  double getVoltage() const{ return voltage; };
24210428Sandreas.hansson@arm.com private:
24310428Sandreas.hansson@arm.com  const double voltage;
24410428Sandreas.hansson@arm.com  const double clkPeriod;
24510428Sandreas.hansson@arm.com};
24610428Sandreas.hansson@arm.com
24710428Sandreas.hansson@arm.com}
24810428Sandreas.hansson@arm.com#endif // ifndef MEMORY_POWER_MODEL_H
249