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