blob: 6161e687b1e3020894cac5784b5c39fba5d856c0 [file] [log] [blame] [edit]
/*
* Copyright (c) 2012-2014, TU Delft
* Copyright (c) 2012-2014, TU Eindhoven
* Copyright (c) 2012-2014, TU Kaiserslautern
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Authors: Karthik Chandrasekar
* Matthias Jung
* Omar Naji
* Subash Kannoth
* Éder F. Zulian
* Felipe S. Prado
*
*/
#ifndef COMMAND_TIMINGS_H
#define COMMAND_TIMINGS_H
#include <stdint.h>
#include <vector>
#include <iostream>
#include <deque>
#include <string>
#include "MemCommand.h"
#include "MemorySpecification.h"
#include "Utils.h"
namespace Data {
class CommandAnalysis {
public:
// Power-Down and Self-refresh related memory states
enum memstate {
MS_NOT_IN_PD = 0, MS_PDN_F_ACT = 10, MS_PDN_S_ACT = 11, MS_PDN_F_PRE = 12,
MS_PDN_S_PRE = 13, MS_SREF = 14
};
// Returns number of reads, writes, acts, pres and refs in the trace
CommandAnalysis(const MemorySpecification& memSpec);
// Number of activate commands per bank
std::vector<int64_t> numberofactsBanks;
// Number of precharge commands per bank
std::vector<int64_t> numberofpresBanks;
// Number of reads commands per bank
std::vector<int64_t> numberofreadsBanks;
// Number of writes commands per bank
std::vector<int64_t> numberofwritesBanks;
// Number of refresh commands
int64_t numberofrefs;
// Number of bankwise refresh commands
std::vector<int64_t> numberofrefbBanks;
// Number of precharge cycles
int64_t precycles;
// Number of active cycles
int64_t actcycles;
std::vector<int64_t> actcyclesBanks;
// Number of Idle cycles in the active state
int64_t idlecycles_act;
// Number of Idle cycles in the precharge state
int64_t idlecycles_pre;
// Number of fast-exit activate power-downs
int64_t f_act_pdns;
// Number of slow-exit activate power-downs
int64_t s_act_pdns;
// Number of fast-exit precharged power-downs
int64_t f_pre_pdns;
// Number of slow-exit activate power-downs
int64_t s_pre_pdns;
// Number of self-refresh commands
int64_t numberofsrefs;
// Number of clock cycles in fast-exit activate power-down mode
int64_t f_act_pdcycles;
// Number of clock cycles in slow-exit activate power-down mode
int64_t s_act_pdcycles;
// Number of clock cycles in fast-exit precharged power-down mode
int64_t f_pre_pdcycles;
// Number of clock cycles in slow-exit precharged power-down mode
int64_t s_pre_pdcycles;
// Number of clock cycles in self-refresh mode (excludes the initial
// auto-refresh). During this time the current drawn is IDD6.
int64_t sref_cycles;
// Number of clock cycles in activate power-up mode
int64_t pup_act_cycles;
// Number of clock cycles in precharged power-up mode
int64_t pup_pre_cycles;
// Number of clock cycles in self-refresh power-up mode
int64_t spup_cycles;
// Number of active cycles for the initial auto-refresh when entering
// self-refresh mode.
int64_t sref_ref_act_cycles;
// Number of active auto-refresh cycles in self-refresh mode already used to calculate the energy of the previous windows
int64_t sref_ref_act_cycles_window;
// Number of precharged auto-refresh cycles in self-refresh mode
int64_t sref_ref_pre_cycles;
// Number of precharged auto-refresh cycles in self-refresh mode already used to calculate the energy of the previous window
int64_t sref_ref_pre_cycles_window;
// Number of active auto-refresh cycles during self-refresh exit
int64_t spup_ref_act_cycles;
// Number of precharged auto-refresh cycles during self-refresh exit
int64_t spup_ref_pre_cycles;
// function for clearing counters
void clearStats(const int64_t timestamp);
// function for clearing arrays
void clear();
// To identify auto-precharges
void getCommands(std::vector<MemCommand>& list,
bool lastupdate,
int64_t timestamp = 0);
private:
MemorySpecification memSpec;
// Possible bank states are precharged or active
enum BankState {
BANK_PRECHARGED = 0,
BANK_ACTIVE
};
int64_t zero;
// Cached last read command from the file
std::vector<MemCommand> cached_cmd;
// Stores the memory commands for analysis
std::vector<MemCommand> cmd_list;
//Stores the memory commands for the next window
std::vector<MemCommand> next_window_cmd_list;
// To save states of the different banks, before entering active
// power-down mode (slow/fast-exit).
std::vector<BankState> last_bank_state;
// Bank state vector
std::vector<BankState> bank_state;
std::vector<int64_t> activation_cycle;
// To keep track of the last ACT cycle
int64_t latest_act_cycle;
// To keep track of the last PRE cycle
int64_t latest_pre_cycle;
// To keep track of the last READ cycle
int64_t latest_read_cycle;
// To keep track of the last WRITE cycle
int64_t latest_write_cycle;
// To calculate end of READ operation
int64_t end_read_op;
// To calculate end of WRITE operation
int64_t end_write_op;
// To calculate end of ACT operation
int64_t end_act_op;
// Clock cycle when self-refresh was issued
int64_t sref_cycle;
// Latest Self-Refresh clock cycle used to calculate the energy of the previous window
int64_t sref_cycle_window;
// Clock cycle when the latest power-down was issued
int64_t pdn_cycle;
// Memory State
unsigned mem_state;
int64_t num_banks;
// Clock cycle of first activate command when memory state changes to ACT
int64_t first_act_cycle;
std::vector<int64_t> first_act_cycle_banks;
// Clock cycle of last precharge command when memory state changes to PRE
int64_t last_pre_cycle;
// To perform timing analysis of a given set of commands and update command counters
void evaluateCommands(std::vector<MemCommand>& cmd_list);
// Handlers for commands that are getting processed
void handleAct( unsigned bank, int64_t timestamp);
void handleRd( unsigned bank, int64_t timestamp);
void handleWr( unsigned bank, int64_t timestamp);
void handleRef( unsigned bank, int64_t timestamp);
void handleRefB(unsigned bank, int64_t timestamp);
void handlePre( unsigned bank, int64_t timestamp);
void handlePreA( unsigned bank, int64_t timestamp);
void handlePdnFAct(unsigned bank, int64_t timestamp);
void handlePdnSAct(unsigned bank, int64_t timestamp);
void handlePdnFPre(unsigned bank, int64_t timestamp);
void handlePdnSPre(unsigned bank, int64_t timestamp);
void handlePupAct( int64_t timestamp);
void handlePupPre( int64_t timestamp);
void handleSREn( unsigned bank, int64_t timestamp);
void handleSREx( unsigned bank, int64_t timestamp);
void handleNopEnd( int64_t timestamp);
// To calculate time of completion of any issued command
int64_t timeToCompletion(MemCommand::cmds type);
// To update idle period information whenever active cycles may be idle
void idle_act_update(int64_t latest_read_cycle,
int64_t latest_write_cycle,
int64_t latest_act_cycle,
int64_t timestamp);
// To update idle period information whenever precharged cycles may be idle
void idle_pre_update(int64_t timestamp,
int64_t latest_pre_cycle);
// Returns the number of active banks according to the bank_state vector.
unsigned get_num_active_banks(void);
unsigned nActiveBanks(void);
bool isPrecharged(unsigned bank);
void printWarningIfActive(const std::string& warning, int type, int64_t timestamp, unsigned bank);
void printWarningIfNotActive(const std::string& warning, int type, int64_t timestamp, unsigned bank);
void printWarningIfPoweredDown(const std::string& warning, int type, int64_t timestamp, unsigned bank);
void printWarning(const std::string& warning, int type, int64_t timestamp, unsigned bank);
};
}
#endif // ifndef COMMAND_TIMINGS_H