MemoryPowerModel.h revision 10428
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 *
3410428Sandreas.hansson@arm.com * Authors: Karthik Chandrasekar, Matthias Jung, Omar Naji
3510428Sandreas.hansson@arm.com *
3610428Sandreas.hansson@arm.com */
3710428Sandreas.hansson@arm.com
3810428Sandreas.hansson@arm.com#ifndef MEMORY_POWER_MODEL_H
3910428Sandreas.hansson@arm.com#define MEMORY_POWER_MODEL_H
4010428Sandreas.hansson@arm.com
4110428Sandreas.hansson@arm.com#include "MemorySpecification.h"
4210428Sandreas.hansson@arm.com#include "CommandAnalysis.h"
4310428Sandreas.hansson@arm.com
4410428Sandreas.hansson@arm.comnamespace Data {
4510428Sandreas.hansson@arm.comclass MemoryPowerModel {
4610428Sandreas.hansson@arm.com public:
4710428Sandreas.hansson@arm.com  // Calculate energy and average power consumption for the given memory
4810428Sandreas.hansson@arm.com  // command trace
4910428Sandreas.hansson@arm.com  void power_calc(MemorySpecification    memSpec,
5010428Sandreas.hansson@arm.com                  const CommandAnalysis& counters,
5110428Sandreas.hansson@arm.com                  int                    term);
5210428Sandreas.hansson@arm.com
5310428Sandreas.hansson@arm.com  // Used to calculate self-refresh active energy
5410428Sandreas.hansson@arm.com  static double engy_sref(double idd6,
5510428Sandreas.hansson@arm.com                          double idd3n,
5610428Sandreas.hansson@arm.com                          double idd5,
5710428Sandreas.hansson@arm.com                          double vdd,
5810428Sandreas.hansson@arm.com                          double sref_cycles,
5910428Sandreas.hansson@arm.com                          double sref_ref_act_cycles,
6010428Sandreas.hansson@arm.com                          double sref_ref_pre_cycles,
6110428Sandreas.hansson@arm.com                          double spup_ref_act_cycles,
6210428Sandreas.hansson@arm.com                          double spup_ref_pre_cycles,
6310428Sandreas.hansson@arm.com                          double clk);
6410428Sandreas.hansson@arm.com
6510428Sandreas.hansson@arm.com  int64_t total_cycles;
6610428Sandreas.hansson@arm.com
6710428Sandreas.hansson@arm.com  struct Energy {
6810428Sandreas.hansson@arm.com    // Total energy of all activates
6910428Sandreas.hansson@arm.com    double act_energy;
7010428Sandreas.hansson@arm.com
7110428Sandreas.hansson@arm.com    // Total energy of all precharges
7210428Sandreas.hansson@arm.com    double pre_energy;
7310428Sandreas.hansson@arm.com
7410428Sandreas.hansson@arm.com    // Total energy of all reads
7510428Sandreas.hansson@arm.com    double read_energy;
7610428Sandreas.hansson@arm.com
7710428Sandreas.hansson@arm.com    // Total energy of all writes
7810428Sandreas.hansson@arm.com    double write_energy;
7910428Sandreas.hansson@arm.com
8010428Sandreas.hansson@arm.com    // Total energy of all refreshes
8110428Sandreas.hansson@arm.com    double ref_energy;
8210428Sandreas.hansson@arm.com
8310428Sandreas.hansson@arm.com    // Total background energy of all active standby cycles
8410428Sandreas.hansson@arm.com    double act_stdby_energy;
8510428Sandreas.hansson@arm.com
8610428Sandreas.hansson@arm.com    // Total background energy of all precharge standby cycles
8710428Sandreas.hansson@arm.com    double pre_stdby_energy;
8810428Sandreas.hansson@arm.com
8910428Sandreas.hansson@arm.com    // Total energy of idle cycles in the active mode
9010428Sandreas.hansson@arm.com    double idle_energy_act;
9110428Sandreas.hansson@arm.com
9210428Sandreas.hansson@arm.com    // Total energy of idle cycles in the precharge mode
9310428Sandreas.hansson@arm.com    double idle_energy_pre;
9410428Sandreas.hansson@arm.com
9510428Sandreas.hansson@arm.com    // Total trace/pattern energy
9610428Sandreas.hansson@arm.com    double total_energy;
9710428Sandreas.hansson@arm.com
9810428Sandreas.hansson@arm.com    // Average Power
9910428Sandreas.hansson@arm.com    double average_power;
10010428Sandreas.hansson@arm.com
10110428Sandreas.hansson@arm.com    // Energy consumed in active/precharged fast/slow-exit modes
10210428Sandreas.hansson@arm.com    double f_act_pd_energy;
10310428Sandreas.hansson@arm.com    double f_pre_pd_energy;
10410428Sandreas.hansson@arm.com    double s_act_pd_energy;
10510428Sandreas.hansson@arm.com    double s_pre_pd_energy;
10610428Sandreas.hansson@arm.com
10710428Sandreas.hansson@arm.com    // Energy consumed in self-refresh mode
10810428Sandreas.hansson@arm.com    double sref_energy;
10910428Sandreas.hansson@arm.com
11010428Sandreas.hansson@arm.com    // Energy consumed in auto-refresh during self-refresh mode
11110428Sandreas.hansson@arm.com    double sref_ref_energy;
11210428Sandreas.hansson@arm.com    double sref_ref_act_energy;
11310428Sandreas.hansson@arm.com    double sref_ref_pre_energy;
11410428Sandreas.hansson@arm.com
11510428Sandreas.hansson@arm.com    // Energy consumed in powering-up from self-refresh mode
11610428Sandreas.hansson@arm.com    double spup_energy;
11710428Sandreas.hansson@arm.com
11810428Sandreas.hansson@arm.com    // Energy consumed in auto-refresh during self-refresh power-up
11910428Sandreas.hansson@arm.com    double spup_ref_energy;
12010428Sandreas.hansson@arm.com    double spup_ref_act_energy;
12110428Sandreas.hansson@arm.com    double spup_ref_pre_energy;
12210428Sandreas.hansson@arm.com
12310428Sandreas.hansson@arm.com    // Energy consumed in powering-up from active/precharged power-down modes
12410428Sandreas.hansson@arm.com    double pup_act_energy;
12510428Sandreas.hansson@arm.com    double pup_pre_energy;
12610428Sandreas.hansson@arm.com
12710428Sandreas.hansson@arm.com    // Energy consumed by IO and Termination
12810428Sandreas.hansson@arm.com    double read_io_energy;     // Read IO Energy
12910428Sandreas.hansson@arm.com    double write_term_energy;  // Write Termination Energy
13010428Sandreas.hansson@arm.com    double read_oterm_energy;  // Read Termination Energy from idle rank
13110428Sandreas.hansson@arm.com    double write_oterm_energy; // Write Termination Energy from idle rank
13210428Sandreas.hansson@arm.com    // Total IO and Termination Energy
13310428Sandreas.hansson@arm.com    double io_term_energy;
13410428Sandreas.hansson@arm.com  };
13510428Sandreas.hansson@arm.com
13610428Sandreas.hansson@arm.com  struct Power {
13710428Sandreas.hansson@arm.com    // Power measures corresponding to IO and Termination
13810428Sandreas.hansson@arm.com    double IO_power;     // Read IO Power
13910428Sandreas.hansson@arm.com    double WR_ODT_power; // Write ODT Power
14010428Sandreas.hansson@arm.com    double TermRD_power; // Read Termination in idle rank (in dual-rank systems)
14110428Sandreas.hansson@arm.com    double TermWR_power; // Write Termination in idle rank (in dual-rank systems)
14210428Sandreas.hansson@arm.com
14310428Sandreas.hansson@arm.com    // Average Power
14410428Sandreas.hansson@arm.com    double average_power;
14510428Sandreas.hansson@arm.com  };
14610428Sandreas.hansson@arm.com
14710428Sandreas.hansson@arm.com  // Print the power and energy
14810428Sandreas.hansson@arm.com  void power_print(MemorySpecification memSpec,
14910428Sandreas.hansson@arm.com                   int                 term,
15010428Sandreas.hansson@arm.com                   const CommandAnalysis& counters) const;
15110428Sandreas.hansson@arm.com
15210428Sandreas.hansson@arm.com  // To derive IO and Termination Power measures using DRAM specification
15310428Sandreas.hansson@arm.com  void io_term_power(MemorySpecification memSpec);
15410428Sandreas.hansson@arm.com
15510428Sandreas.hansson@arm.com  Energy energy;
15610428Sandreas.hansson@arm.com  Power  power;
15710428Sandreas.hansson@arm.com
15810428Sandreas.hansson@arm.com private:
15910428Sandreas.hansson@arm.com  double calcIoTermEnergy(int64_t cycles, double period, double power, int64_t numBits) const;
16010428Sandreas.hansson@arm.com};
16110428Sandreas.hansson@arm.com
16210428Sandreas.hansson@arm.comclass EnergyDomain {
16310428Sandreas.hansson@arm.com public:
16410428Sandreas.hansson@arm.com  EnergyDomain(double voltage, double clkPeriod) :
16510428Sandreas.hansson@arm.com    voltage(voltage),
16610428Sandreas.hansson@arm.com    clkPeriod(clkPeriod)
16710428Sandreas.hansson@arm.com  {}
16810428Sandreas.hansson@arm.com
16910428Sandreas.hansson@arm.com  double calcTivEnergy(int64_t cycles, double current) const;
17010428Sandreas.hansson@arm.com private:
17110428Sandreas.hansson@arm.com  const double voltage;
17210428Sandreas.hansson@arm.com  const double clkPeriod;
17310428Sandreas.hansson@arm.com};
17410428Sandreas.hansson@arm.com
17510428Sandreas.hansson@arm.com}
17610428Sandreas.hansson@arm.com#endif // ifndef MEMORY_POWER_MODEL_H
177