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 *
3410428Sandreas.hansson@arm.com * Authors: Karthik Chandrasekar
3510428Sandreas.hansson@arm.com *
3610428Sandreas.hansson@arm.com */
3710428Sandreas.hansson@arm.com
3810428Sandreas.hansson@arm.com#ifndef MEMCOMMAND_H
3910428Sandreas.hansson@arm.com#define MEMCOMMAND_H
4010428Sandreas.hansson@arm.com
4110428Sandreas.hansson@arm.com#include <stdint.h>
4210428Sandreas.hansson@arm.com#include <cassert>
4310428Sandreas.hansson@arm.com#include <string>
4410428Sandreas.hansson@arm.com
4510428Sandreas.hansson@arm.com#include "MemorySpecification.h"
4610428Sandreas.hansson@arm.com
4710428Sandreas.hansson@arm.comnamespace Data {
4810428Sandreas.hansson@arm.comclass MemCommand {
4910428Sandreas.hansson@arm.com public:
5010428Sandreas.hansson@arm.com  /*
5110428Sandreas.hansson@arm.com   * 1. ACT - Activate
5210428Sandreas.hansson@arm.com   * 2. RD - Read
5310428Sandreas.hansson@arm.com   * 3. WR - Write
5410428Sandreas.hansson@arm.com   * 4. PRE - Explicit Precharge per bank
5510428Sandreas.hansson@arm.com   * 5. REF - Refresh all banks
5612266Sradhika.jagtap@arm.com   * 6  REFB- Refresh a particular bank
5712266Sradhika.jagtap@arm.com   * 7. END - To indicate end of trace
5812266Sradhika.jagtap@arm.com   * 8. RDA - Read with auto-precharge
5912266Sradhika.jagtap@arm.com   * 9. WRA - Write with auto-precharge
6012266Sradhika.jagtap@arm.com   * 10. PREA - Precharge all banks
6112266Sradhika.jagtap@arm.com   * 11. PDN_F_PRE - Precharge Power-down Entry command (Fast-Exit)
6212266Sradhika.jagtap@arm.com   * 12. PDN_S_PRE - Precharge Power-down Entry command (Slow-Exit)
6312266Sradhika.jagtap@arm.com   * 13. PDN_F_ACT - Active Power-down Entry command (Fast-Exit)
6412266Sradhika.jagtap@arm.com   * 14. PDN_S_ACT - Active Power-down Entry command (Slow-Exit)
6512266Sradhika.jagtap@arm.com   * 15. PUP_PRE - Precharge Power-down Exit
6612266Sradhika.jagtap@arm.com   * 16. PUP_ACT - Active Power-down Exit
6712266Sradhika.jagtap@arm.com   * 17. SREN - Self-Refresh Entry command
6812266Sradhika.jagtap@arm.com   * 18. SREX - Self-refresh Exit
6912266Sradhika.jagtap@arm.com   * 19. NOP - To indicate end of trace
7010428Sandreas.hansson@arm.com   */
7110428Sandreas.hansson@arm.com
7210428Sandreas.hansson@arm.com  enum cmds {
7310428Sandreas.hansson@arm.com    ACT       = 0,
7410428Sandreas.hansson@arm.com    RD        = 1,
7510428Sandreas.hansson@arm.com    WR        = 2,
7610428Sandreas.hansson@arm.com    PRE       = 3,
7710428Sandreas.hansson@arm.com    REF       = 4,
7812266Sradhika.jagtap@arm.com    REFB      = 5,
7912266Sradhika.jagtap@arm.com    END       = 6,
8012266Sradhika.jagtap@arm.com    RDA       = 7,
8112266Sradhika.jagtap@arm.com    WRA       = 8,
8212266Sradhika.jagtap@arm.com    PREA      = 9,
8312266Sradhika.jagtap@arm.com    PDN_F_PRE = 10,
8412266Sradhika.jagtap@arm.com    PDN_S_PRE = 11,
8512266Sradhika.jagtap@arm.com    PDN_F_ACT = 12,
8612266Sradhika.jagtap@arm.com    PDN_S_ACT = 13,
8712266Sradhika.jagtap@arm.com    PUP_PRE   = 14,
8812266Sradhika.jagtap@arm.com    PUP_ACT   = 15,
8912266Sradhika.jagtap@arm.com    SREN      = 16,
9012266Sradhika.jagtap@arm.com    SREX      = 17,
9112266Sradhika.jagtap@arm.com    NOP       = 18,
9212266Sradhika.jagtap@arm.com    UNINITIALIZED = 19
9310428Sandreas.hansson@arm.com  };
9410428Sandreas.hansson@arm.com
9511555Sjungma@eit.uni-kl.de//  MemCommand();
9610428Sandreas.hansson@arm.com  MemCommand(
9710428Sandreas.hansson@arm.com    // Command Type
9811555Sjungma@eit.uni-kl.de    MemCommand::cmds type = UNINITIALIZED,
9910428Sandreas.hansson@arm.com    // Target Bank
10010428Sandreas.hansson@arm.com    unsigned         bank = 0,
10110428Sandreas.hansson@arm.com    // Command Issue Timestamp (in cc)
10211555Sjungma@eit.uni-kl.de    int64_t          timestamp = 0L);
10310428Sandreas.hansson@arm.com
10410428Sandreas.hansson@arm.com  // Get command type
10510428Sandreas.hansson@arm.com  cmds getType() const;
10610428Sandreas.hansson@arm.com
10710428Sandreas.hansson@arm.com  // Set command type
10810428Sandreas.hansson@arm.com  void setType(MemCommand::cmds type);
10910428Sandreas.hansson@arm.com
11010428Sandreas.hansson@arm.com  // Set target Bank
11110428Sandreas.hansson@arm.com  void setBank(unsigned bank);
11210428Sandreas.hansson@arm.com
11310428Sandreas.hansson@arm.com  // Get target Bank
11410428Sandreas.hansson@arm.com  unsigned getBank() const;
11510428Sandreas.hansson@arm.com
11610428Sandreas.hansson@arm.com  // Set timestamp
11711555Sjungma@eit.uni-kl.de  void setTime(int64_t _timestamp);
11810428Sandreas.hansson@arm.com
11910428Sandreas.hansson@arm.com  // Get timestamp
12010428Sandreas.hansson@arm.com  int64_t getTimeInt64() const;
12110428Sandreas.hansson@arm.com
12210428Sandreas.hansson@arm.com  cmds typeWithoutAutoPrechargeFlag() const;
12310428Sandreas.hansson@arm.com
12410428Sandreas.hansson@arm.com  // To calculate precharge offset after read or write with auto-precharge
12511555Sjungma@eit.uni-kl.de  int64_t getPrechargeOffset(const MemorySpecification& memSpec,
12610428Sandreas.hansson@arm.com                         MemCommand::cmds           type) const;
12710428Sandreas.hansson@arm.com
12810428Sandreas.hansson@arm.com  // To check for equivalence
12910428Sandreas.hansson@arm.com
13010428Sandreas.hansson@arm.com  bool operator==(const MemCommand& other) const
13110428Sandreas.hansson@arm.com  {
13210428Sandreas.hansson@arm.com    if ((getType() == other.getType()) &&
13310428Sandreas.hansson@arm.com        (getBank() == other.getBank())
13410428Sandreas.hansson@arm.com        ) {
13510428Sandreas.hansson@arm.com      return true;
13610428Sandreas.hansson@arm.com    } else {
13710428Sandreas.hansson@arm.com      return false;
13810428Sandreas.hansson@arm.com    }
13910428Sandreas.hansson@arm.com  }
14010428Sandreas.hansson@arm.com
14112266Sradhika.jagtap@arm.com  static const unsigned int nCommands = 20;
14210428Sandreas.hansson@arm.com
14310428Sandreas.hansson@arm.com  static std::string* getCommandTypeStrings()
14410428Sandreas.hansson@arm.com  {
14511555Sjungma@eit.uni-kl.de    static std::string type_map[nCommands] = { "ACT",
14611555Sjungma@eit.uni-kl.de                                               "RD",
14711555Sjungma@eit.uni-kl.de                                               "WR",
14811555Sjungma@eit.uni-kl.de                                               "PRE",
14911555Sjungma@eit.uni-kl.de                                               "REF",
15012266Sradhika.jagtap@arm.com                                               "REFB",
15111555Sjungma@eit.uni-kl.de                                               "END",
15211555Sjungma@eit.uni-kl.de                                               "RDA",
15311555Sjungma@eit.uni-kl.de                                               "WRA",
15411555Sjungma@eit.uni-kl.de                                               "PREA",
15511555Sjungma@eit.uni-kl.de                                               "PDN_F_PRE",
15611555Sjungma@eit.uni-kl.de                                               "PDN_S_PRE",
15711555Sjungma@eit.uni-kl.de                                               "PDN_F_ACT",
15811555Sjungma@eit.uni-kl.de                                               "PDN_S_ACT",
15911555Sjungma@eit.uni-kl.de                                               "PUP_PRE",
16011555Sjungma@eit.uni-kl.de                                               "PUP_ACT",
16111555Sjungma@eit.uni-kl.de                                               "SREN",
16211555Sjungma@eit.uni-kl.de                                               "SREX",
16311555Sjungma@eit.uni-kl.de                                               "NOP",
16411555Sjungma@eit.uni-kl.de                                               "UNINITIALIZED" };
16510428Sandreas.hansson@arm.com
16610428Sandreas.hansson@arm.com    return type_map;
16710428Sandreas.hansson@arm.com  }
16810428Sandreas.hansson@arm.com
16910428Sandreas.hansson@arm.com  // To identify command type from name
17011555Sjungma@eit.uni-kl.de  static cmds getTypeFromName(const std::string& name)
17110428Sandreas.hansson@arm.com  {
17210428Sandreas.hansson@arm.com    std::string* typeStrings = getCommandTypeStrings();
17310428Sandreas.hansson@arm.com
17410428Sandreas.hansson@arm.com    for (size_t typeId = 0; typeId < nCommands; typeId++) {
17510428Sandreas.hansson@arm.com      if (typeStrings[typeId] == name) {
17610428Sandreas.hansson@arm.com        cmds commandType = static_cast<cmds>(typeId);
17710428Sandreas.hansson@arm.com        return commandType;
17810428Sandreas.hansson@arm.com      }
17910428Sandreas.hansson@arm.com    }
18010428Sandreas.hansson@arm.com    assert(false); // Unknown name.
18110490Sandreas.hansson@arm.com    return NOP;  // For clang compilation
18210428Sandreas.hansson@arm.com  }
18310428Sandreas.hansson@arm.com
18410428Sandreas.hansson@arm.com private:
18510428Sandreas.hansson@arm.com  MemCommand::cmds type;
18610428Sandreas.hansson@arm.com  unsigned bank;
18711555Sjungma@eit.uni-kl.de  int64_t timestamp;
18810428Sandreas.hansson@arm.com};
18910428Sandreas.hansson@arm.com}
19010428Sandreas.hansson@arm.com#endif // ifndef MEMCOMMAND_H
191