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 COMMAND_TIMINGS_H
4410428Sandreas.hansson@arm.com#define COMMAND_TIMINGS_H
4510428Sandreas.hansson@arm.com
4610428Sandreas.hansson@arm.com#include <stdint.h>
4710428Sandreas.hansson@arm.com
4810428Sandreas.hansson@arm.com#include <vector>
4910428Sandreas.hansson@arm.com#include <iostream>
5010428Sandreas.hansson@arm.com#include <deque>
5110428Sandreas.hansson@arm.com#include <string>
5210428Sandreas.hansson@arm.com
5310428Sandreas.hansson@arm.com#include "MemCommand.h"
5410428Sandreas.hansson@arm.com#include "MemorySpecification.h"
5510428Sandreas.hansson@arm.com#include "Utils.h"
5610428Sandreas.hansson@arm.com
5710428Sandreas.hansson@arm.comnamespace Data {
5810428Sandreas.hansson@arm.comclass CommandAnalysis {
5910428Sandreas.hansson@arm.com public:
6010428Sandreas.hansson@arm.com  // Power-Down and Self-refresh related memory states
6110428Sandreas.hansson@arm.com  enum memstate {
6212266Sradhika.jagtap@arm.com    MS_NOT_IN_PD = 0, MS_PDN_F_ACT = 10, MS_PDN_S_ACT = 11, MS_PDN_F_PRE = 12,
6310428Sandreas.hansson@arm.com    MS_PDN_S_PRE = 13, MS_SREF = 14
6410428Sandreas.hansson@arm.com  };
6510428Sandreas.hansson@arm.com
6610428Sandreas.hansson@arm.com  // Returns number of reads, writes, acts, pres and refs in the trace
6712266Sradhika.jagtap@arm.com  CommandAnalysis(const MemorySpecification& memSpec);
6810428Sandreas.hansson@arm.com
6912266Sradhika.jagtap@arm.com  // Number of activate commands per bank
7012266Sradhika.jagtap@arm.com  std::vector<int64_t> numberofactsBanks;
7112266Sradhika.jagtap@arm.com  // Number of precharge commands per bank
7212266Sradhika.jagtap@arm.com  std::vector<int64_t> numberofpresBanks;
7312266Sradhika.jagtap@arm.com  // Number of reads commands per bank
7412266Sradhika.jagtap@arm.com  std::vector<int64_t> numberofreadsBanks;
7512266Sradhika.jagtap@arm.com  // Number of writes commands per bank
7612266Sradhika.jagtap@arm.com  std::vector<int64_t> numberofwritesBanks;
7710428Sandreas.hansson@arm.com  // Number of refresh commands
7810428Sandreas.hansson@arm.com  int64_t numberofrefs;
7912266Sradhika.jagtap@arm.com  // Number of bankwise refresh commands
8012266Sradhika.jagtap@arm.com  std::vector<int64_t> numberofrefbBanks;
8110428Sandreas.hansson@arm.com  // Number of precharge cycles
8210428Sandreas.hansson@arm.com  int64_t precycles;
8310428Sandreas.hansson@arm.com  // Number of active cycles
8410428Sandreas.hansson@arm.com  int64_t actcycles;
8512266Sradhika.jagtap@arm.com  std::vector<int64_t> actcyclesBanks;
8610428Sandreas.hansson@arm.com  // Number of Idle cycles in the active state
8710428Sandreas.hansson@arm.com  int64_t idlecycles_act;
8810428Sandreas.hansson@arm.com  // Number of Idle cycles in the precharge state
8910428Sandreas.hansson@arm.com  int64_t idlecycles_pre;
9010428Sandreas.hansson@arm.com  // Number of fast-exit activate power-downs
9110428Sandreas.hansson@arm.com  int64_t f_act_pdns;
9210428Sandreas.hansson@arm.com  // Number of slow-exit activate power-downs
9310428Sandreas.hansson@arm.com  int64_t s_act_pdns;
9410428Sandreas.hansson@arm.com  // Number of fast-exit precharged power-downs
9510428Sandreas.hansson@arm.com  int64_t f_pre_pdns;
9610428Sandreas.hansson@arm.com  // Number of slow-exit activate power-downs
9710428Sandreas.hansson@arm.com  int64_t s_pre_pdns;
9810428Sandreas.hansson@arm.com  // Number of self-refresh commands
9910428Sandreas.hansson@arm.com  int64_t numberofsrefs;
10010428Sandreas.hansson@arm.com  // Number of clock cycles in fast-exit activate power-down mode
10110428Sandreas.hansson@arm.com  int64_t f_act_pdcycles;
10210428Sandreas.hansson@arm.com  // Number of clock cycles in slow-exit activate power-down mode
10310428Sandreas.hansson@arm.com  int64_t s_act_pdcycles;
10410428Sandreas.hansson@arm.com  // Number of clock cycles in fast-exit precharged power-down mode
10510428Sandreas.hansson@arm.com  int64_t f_pre_pdcycles;
10610428Sandreas.hansson@arm.com  // Number of clock cycles in slow-exit precharged power-down mode
10710428Sandreas.hansson@arm.com  int64_t s_pre_pdcycles;
10812266Sradhika.jagtap@arm.com  // Number of clock cycles in self-refresh mode (excludes the initial
10912266Sradhika.jagtap@arm.com  // auto-refresh). During this time the current drawn is IDD6.
11010428Sandreas.hansson@arm.com  int64_t sref_cycles;
11110428Sandreas.hansson@arm.com  // Number of clock cycles in activate power-up mode
11210428Sandreas.hansson@arm.com  int64_t pup_act_cycles;
11310428Sandreas.hansson@arm.com  // Number of clock cycles in precharged power-up mode
11410428Sandreas.hansson@arm.com  int64_t pup_pre_cycles;
11510428Sandreas.hansson@arm.com  // Number of clock cycles in self-refresh power-up mode
11610428Sandreas.hansson@arm.com  int64_t spup_cycles;
11710428Sandreas.hansson@arm.com
11812266Sradhika.jagtap@arm.com  // Number of active cycles for the initial auto-refresh when entering
11912266Sradhika.jagtap@arm.com  // self-refresh mode.
12010428Sandreas.hansson@arm.com  int64_t sref_ref_act_cycles;
12112266Sradhika.jagtap@arm.com  // Number of active auto-refresh cycles in self-refresh mode already used to calculate the energy of the previous windows
12212266Sradhika.jagtap@arm.com  int64_t sref_ref_act_cycles_window;
12310428Sandreas.hansson@arm.com  // Number of precharged auto-refresh cycles in self-refresh mode
12410428Sandreas.hansson@arm.com  int64_t sref_ref_pre_cycles;
12512266Sradhika.jagtap@arm.com  // Number of precharged auto-refresh cycles in self-refresh mode already used to calculate the energy of the previous window
12612266Sradhika.jagtap@arm.com  int64_t sref_ref_pre_cycles_window;
12710428Sandreas.hansson@arm.com  // Number of active auto-refresh cycles during self-refresh exit
12810428Sandreas.hansson@arm.com  int64_t spup_ref_act_cycles;
12910428Sandreas.hansson@arm.com  // Number of precharged auto-refresh cycles during self-refresh exit
13010428Sandreas.hansson@arm.com  int64_t spup_ref_pre_cycles;
13110428Sandreas.hansson@arm.com
13211555Sjungma@eit.uni-kl.de  // function for clearing counters
13311555Sjungma@eit.uni-kl.de  void clearStats(const int64_t timestamp);
13411555Sjungma@eit.uni-kl.de
13510428Sandreas.hansson@arm.com  // function for clearing arrays
13610428Sandreas.hansson@arm.com  void clear();
13710428Sandreas.hansson@arm.com
13810428Sandreas.hansson@arm.com  // To identify auto-precharges
13912266Sradhika.jagtap@arm.com  void getCommands(std::vector<MemCommand>&   list,
14012266Sradhika.jagtap@arm.com                   bool                       lastupdate,
14112266Sradhika.jagtap@arm.com                   int64_t timestamp = 0);
14210428Sandreas.hansson@arm.com
14310428Sandreas.hansson@arm.com private:
14412266Sradhika.jagtap@arm.com  MemorySpecification memSpec;
14512266Sradhika.jagtap@arm.com
14612266Sradhika.jagtap@arm.com  // Possible bank states are precharged or active
14712266Sradhika.jagtap@arm.com  enum BankState {
14812266Sradhika.jagtap@arm.com    BANK_PRECHARGED = 0,
14912266Sradhika.jagtap@arm.com    BANK_ACTIVE
15012266Sradhika.jagtap@arm.com  };
15112266Sradhika.jagtap@arm.com
15210428Sandreas.hansson@arm.com  int64_t  zero;
15310428Sandreas.hansson@arm.com  // Cached last read command from the file
15410428Sandreas.hansson@arm.com  std::vector<MemCommand> cached_cmd;
15510428Sandreas.hansson@arm.com
15610428Sandreas.hansson@arm.com  // Stores the memory commands for analysis
15710428Sandreas.hansson@arm.com  std::vector<MemCommand> cmd_list;
15810428Sandreas.hansson@arm.com
15912266Sradhika.jagtap@arm.com  //Stores the memory commands for the next window
16012266Sradhika.jagtap@arm.com  std::vector<MemCommand> next_window_cmd_list;
16112266Sradhika.jagtap@arm.com
16210428Sandreas.hansson@arm.com  // To save states of the different banks, before entering active
16310428Sandreas.hansson@arm.com  // power-down mode (slow/fast-exit).
16412266Sradhika.jagtap@arm.com  std::vector<BankState> last_bank_state;
16510428Sandreas.hansson@arm.com  // Bank state vector
16612266Sradhika.jagtap@arm.com  std::vector<BankState> bank_state;
16710428Sandreas.hansson@arm.com
16810428Sandreas.hansson@arm.com  std::vector<int64_t> activation_cycle;
16910428Sandreas.hansson@arm.com  // To keep track of the last ACT cycle
17010428Sandreas.hansson@arm.com  int64_t latest_act_cycle;
17110428Sandreas.hansson@arm.com  // To keep track of the last PRE cycle
17210428Sandreas.hansson@arm.com  int64_t latest_pre_cycle;
17310428Sandreas.hansson@arm.com  // To keep track of the last READ cycle
17410428Sandreas.hansson@arm.com  int64_t latest_read_cycle;
17510428Sandreas.hansson@arm.com  // To keep track of the last WRITE cycle
17610428Sandreas.hansson@arm.com  int64_t latest_write_cycle;
17710428Sandreas.hansson@arm.com
17810428Sandreas.hansson@arm.com  // To calculate end of READ operation
17910428Sandreas.hansson@arm.com  int64_t end_read_op;
18010428Sandreas.hansson@arm.com  // To calculate end of WRITE operation
18110428Sandreas.hansson@arm.com  int64_t end_write_op;
18210428Sandreas.hansson@arm.com  // To calculate end of ACT operation
18310428Sandreas.hansson@arm.com  int64_t end_act_op;
18410428Sandreas.hansson@arm.com
18510428Sandreas.hansson@arm.com  // Clock cycle when self-refresh was issued
18610428Sandreas.hansson@arm.com  int64_t sref_cycle;
18710428Sandreas.hansson@arm.com
18812266Sradhika.jagtap@arm.com  // Latest Self-Refresh clock cycle used to calculate the energy of the previous window
18912266Sradhika.jagtap@arm.com  int64_t sref_cycle_window;
19012266Sradhika.jagtap@arm.com
19110428Sandreas.hansson@arm.com  // Clock cycle when the latest power-down was issued
19210428Sandreas.hansson@arm.com  int64_t pdn_cycle;
19310428Sandreas.hansson@arm.com
19410428Sandreas.hansson@arm.com  // Memory State
19510428Sandreas.hansson@arm.com  unsigned mem_state;
19612266Sradhika.jagtap@arm.com
19712266Sradhika.jagtap@arm.com  int64_t num_banks;
19810428Sandreas.hansson@arm.com
19910428Sandreas.hansson@arm.com  // Clock cycle of first activate command when memory state changes to ACT
20010428Sandreas.hansson@arm.com  int64_t first_act_cycle;
20112266Sradhika.jagtap@arm.com  std::vector<int64_t> first_act_cycle_banks;
20210428Sandreas.hansson@arm.com
20310428Sandreas.hansson@arm.com  // Clock cycle of last precharge command when memory state changes to PRE
20410428Sandreas.hansson@arm.com  int64_t last_pre_cycle;
20511555Sjungma@eit.uni-kl.de
20610428Sandreas.hansson@arm.com  // To perform timing analysis of a given set of commands and update command counters
20712266Sradhika.jagtap@arm.com  void evaluateCommands(std::vector<MemCommand>& cmd_list);
20812266Sradhika.jagtap@arm.com
20912266Sradhika.jagtap@arm.com  // Handlers for commands that are getting processed
21012266Sradhika.jagtap@arm.com  void handleAct(    unsigned bank, int64_t timestamp);
21112266Sradhika.jagtap@arm.com  void handleRd(     unsigned bank, int64_t timestamp);
21212266Sradhika.jagtap@arm.com  void handleWr(     unsigned bank, int64_t timestamp);
21312266Sradhika.jagtap@arm.com  void handleRef(    unsigned bank, int64_t timestamp);
21412266Sradhika.jagtap@arm.com  void handleRefB(unsigned bank, int64_t timestamp);
21512266Sradhika.jagtap@arm.com  void handlePre(    unsigned bank, int64_t timestamp);
21612266Sradhika.jagtap@arm.com  void handlePreA(   unsigned bank, int64_t timestamp);
21712266Sradhika.jagtap@arm.com  void handlePdnFAct(unsigned bank, int64_t timestamp);
21812266Sradhika.jagtap@arm.com  void handlePdnSAct(unsigned bank, int64_t timestamp);
21912266Sradhika.jagtap@arm.com  void handlePdnFPre(unsigned bank, int64_t timestamp);
22012266Sradhika.jagtap@arm.com  void handlePdnSPre(unsigned bank, int64_t timestamp);
22112266Sradhika.jagtap@arm.com  void handlePupAct( int64_t timestamp);
22212266Sradhika.jagtap@arm.com  void handlePupPre( int64_t timestamp);
22312266Sradhika.jagtap@arm.com  void handleSREn(   unsigned bank, int64_t timestamp);
22412266Sradhika.jagtap@arm.com  void handleSREx(   unsigned bank, int64_t timestamp);
22512266Sradhika.jagtap@arm.com  void handleNopEnd( int64_t timestamp);
22610428Sandreas.hansson@arm.com
22710428Sandreas.hansson@arm.com  // To calculate time of completion of any issued command
22812266Sradhika.jagtap@arm.com  int64_t timeToCompletion(MemCommand::cmds           type);
22910428Sandreas.hansson@arm.com
23010428Sandreas.hansson@arm.com  // To update idle period information whenever active cycles may be idle
23112266Sradhika.jagtap@arm.com  void idle_act_update(int64_t                     latest_read_cycle,
23210428Sandreas.hansson@arm.com                       int64_t                     latest_write_cycle,
23310428Sandreas.hansson@arm.com                       int64_t                     latest_act_cycle,
23410428Sandreas.hansson@arm.com                       int64_t                     timestamp);
23510428Sandreas.hansson@arm.com
23610428Sandreas.hansson@arm.com  // To update idle period information whenever precharged cycles may be idle
23712266Sradhika.jagtap@arm.com  void idle_pre_update(int64_t                     timestamp,
23810428Sandreas.hansson@arm.com                       int64_t                     latest_pre_cycle);
23910428Sandreas.hansson@arm.com
24012266Sradhika.jagtap@arm.com  // Returns the number of active banks according to the bank_state vector.
24112266Sradhika.jagtap@arm.com  unsigned get_num_active_banks(void);
24212266Sradhika.jagtap@arm.com  unsigned nActiveBanks(void);
24312266Sradhika.jagtap@arm.com
24412266Sradhika.jagtap@arm.com  bool isPrecharged(unsigned bank);
24512266Sradhika.jagtap@arm.com
24612266Sradhika.jagtap@arm.com  void printWarningIfActive(const std::string& warning, int type, int64_t timestamp, unsigned bank);
24712266Sradhika.jagtap@arm.com  void printWarningIfNotActive(const std::string& warning, int type, int64_t timestamp, unsigned bank);
24812266Sradhika.jagtap@arm.com  void printWarningIfPoweredDown(const std::string& warning, int type, int64_t timestamp, unsigned bank);
24912266Sradhika.jagtap@arm.com  void printWarning(const std::string& warning, int type, int64_t timestamp, unsigned bank);
25010428Sandreas.hansson@arm.com};
25110428Sandreas.hansson@arm.com}
25210428Sandreas.hansson@arm.com#endif // ifndef COMMAND_TIMINGS_H
253