/* * 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 * */ #ifndef MEMCOMMAND_H #define MEMCOMMAND_H #include #include #include #include "MemorySpecification.h" namespace Data { class MemCommand { public: /* * 1. ACT - Activate * 2. RD - Read * 3. WR - Write * 4. PRE - Explicit Precharge per bank * 5. REF - Refresh all banks * 6 REFB- Refresh a particular bank * 7. END - To indicate end of trace * 8. RDA - Read with auto-precharge * 9. WRA - Write with auto-precharge * 10. PREA - Precharge all banks * 11. PDN_F_PRE - Precharge Power-down Entry command (Fast-Exit) * 12. PDN_S_PRE - Precharge Power-down Entry command (Slow-Exit) * 13. PDN_F_ACT - Active Power-down Entry command (Fast-Exit) * 14. PDN_S_ACT - Active Power-down Entry command (Slow-Exit) * 15. PUP_PRE - Precharge Power-down Exit * 16. PUP_ACT - Active Power-down Exit * 17. SREN - Self-Refresh Entry command * 18. SREX - Self-refresh Exit * 19. NOP - To indicate end of trace */ enum cmds { ACT = 0, RD = 1, WR = 2, PRE = 3, REF = 4, REFB = 5, END = 6, RDA = 7, WRA = 8, PREA = 9, PDN_F_PRE = 10, PDN_S_PRE = 11, PDN_F_ACT = 12, PDN_S_ACT = 13, PUP_PRE = 14, PUP_ACT = 15, SREN = 16, SREX = 17, NOP = 18, UNINITIALIZED = 19 }; // MemCommand(); MemCommand( // Command Type MemCommand::cmds type = UNINITIALIZED, // Target Bank unsigned bank = 0, // Command Issue Timestamp (in cc) int64_t timestamp = 0L); // Get command type cmds getType() const; // Set command type void setType(MemCommand::cmds type); // Set target Bank void setBank(unsigned bank); // Get target Bank unsigned getBank() const; // Set timestamp void setTime(int64_t _timestamp); // Get timestamp int64_t getTimeInt64() const; cmds typeWithoutAutoPrechargeFlag() const; // To calculate precharge offset after read or write with auto-precharge int64_t getPrechargeOffset(const MemorySpecification& memSpec, MemCommand::cmds type) const; // To check for equivalence bool operator==(const MemCommand& other) const { if ((getType() == other.getType()) && (getBank() == other.getBank()) ) { return true; } else { return false; } } static const unsigned int nCommands = 20; static std::string* getCommandTypeStrings() { static std::string type_map[nCommands] = { "ACT", "RD", "WR", "PRE", "REF", "REFB", "END", "RDA", "WRA", "PREA", "PDN_F_PRE", "PDN_S_PRE", "PDN_F_ACT", "PDN_S_ACT", "PUP_PRE", "PUP_ACT", "SREN", "SREX", "NOP", "UNINITIALIZED" }; return type_map; } // To identify command type from name static cmds getTypeFromName(const std::string& name) { std::string* typeStrings = getCommandTypeStrings(); for (size_t typeId = 0; typeId < nCommands; typeId++) { if (typeStrings[typeId] == name) { cmds commandType = static_cast(typeId); return commandType; } } assert(false); // Unknown name. return NOP; // For clang compilation } private: MemCommand::cmds type; unsigned bank; int64_t timestamp; }; } #endif // ifndef MEMCOMMAND_H