|  | /* | 
|  | * 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 |