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#include "MemCommand.h"
3910428Sandreas.hansson@arm.com
4010428Sandreas.hansson@arm.com#include <algorithm>  // for max
4110428Sandreas.hansson@arm.com
4210428Sandreas.hansson@arm.com#include "MemorySpecification.h"
4310428Sandreas.hansson@arm.com
4410428Sandreas.hansson@arm.comusing namespace Data;
4510428Sandreas.hansson@arm.comusing namespace std;
4610428Sandreas.hansson@arm.com
4710428Sandreas.hansson@arm.com
4810428Sandreas.hansson@arm.comMemCommand::MemCommand(MemCommand::cmds type,
4911555Sjungma@eit.uni-kl.de                       unsigned bank, int64_t timestamp) :
5010428Sandreas.hansson@arm.com  type(type),
5110428Sandreas.hansson@arm.com  bank(bank),
5210428Sandreas.hansson@arm.com  timestamp(timestamp)
5310428Sandreas.hansson@arm.com{
5410428Sandreas.hansson@arm.com}
5510428Sandreas.hansson@arm.com
5610428Sandreas.hansson@arm.comvoid MemCommand::setType(MemCommand::cmds _type)
5710428Sandreas.hansson@arm.com{
5810428Sandreas.hansson@arm.com  type = _type;
5910428Sandreas.hansson@arm.com}
6010428Sandreas.hansson@arm.com
6110428Sandreas.hansson@arm.comMemCommand::cmds MemCommand::getType() const
6210428Sandreas.hansson@arm.com{
6310428Sandreas.hansson@arm.com  return type;
6410428Sandreas.hansson@arm.com}
6510428Sandreas.hansson@arm.com
6610428Sandreas.hansson@arm.comvoid MemCommand::setBank(unsigned _bank)
6710428Sandreas.hansson@arm.com{
6810428Sandreas.hansson@arm.com  bank = _bank;
6910428Sandreas.hansson@arm.com}
7010428Sandreas.hansson@arm.com
7110428Sandreas.hansson@arm.comunsigned MemCommand::getBank() const
7210428Sandreas.hansson@arm.com{
7310428Sandreas.hansson@arm.com  return bank;
7410428Sandreas.hansson@arm.com}
7510428Sandreas.hansson@arm.com
7610428Sandreas.hansson@arm.com// For auto-precharge with read or write - to calculate cycle of precharge
7711555Sjungma@eit.uni-kl.deint64_t MemCommand::getPrechargeOffset(const MemorySpecification& memSpec,
7810428Sandreas.hansson@arm.com                                   MemCommand::cmds           type) const
7910428Sandreas.hansson@arm.com{
8011555Sjungma@eit.uni-kl.de  int64_t precharge_offset = 0;
8110428Sandreas.hansson@arm.com
8211555Sjungma@eit.uni-kl.de  int64_t BL = memSpec.memArchSpec.burstLength;
8311555Sjungma@eit.uni-kl.de  int64_t RTP = memSpec.memTimingSpec.RTP;
8411555Sjungma@eit.uni-kl.de  int64_t dataRate = memSpec.memArchSpec.dataRate;
8511555Sjungma@eit.uni-kl.de  int64_t AL = memSpec.memTimingSpec.AL;
8611555Sjungma@eit.uni-kl.de  int64_t WL = memSpec.memTimingSpec.WL;
8711555Sjungma@eit.uni-kl.de  int64_t WR = memSpec.memTimingSpec.WR;
8811555Sjungma@eit.uni-kl.de  int64_t B = BL/dataRate;
8910428Sandreas.hansson@arm.com
9010428Sandreas.hansson@arm.com  const MemoryType::MemoryType_t& memType = memSpec.memoryType;
9110428Sandreas.hansson@arm.com
9210428Sandreas.hansson@arm.com  // Read with auto-precharge
9310428Sandreas.hansson@arm.com  if (type == MemCommand::RDA) {
9410428Sandreas.hansson@arm.com    if (memType == MemoryType::DDR2) {
9511555Sjungma@eit.uni-kl.de      precharge_offset = B + AL - 2 + max(RTP, int64_t(2));
9610428Sandreas.hansson@arm.com    } else if (memType == MemoryType::DDR3) {
9711555Sjungma@eit.uni-kl.de      precharge_offset = AL + max(RTP, int64_t(4));
9810428Sandreas.hansson@arm.com    } else if (memType == MemoryType::DDR4) {
9910428Sandreas.hansson@arm.com      precharge_offset = AL + RTP;
10010428Sandreas.hansson@arm.com    } else if (memType == MemoryType::LPDDR) {
10110428Sandreas.hansson@arm.com      precharge_offset = B;
10210428Sandreas.hansson@arm.com    } else if (memType == MemoryType::LPDDR2) {
10311555Sjungma@eit.uni-kl.de      precharge_offset = B + max(int64_t(0), RTP - 2);
10410428Sandreas.hansson@arm.com    } else if (memType == MemoryType::LPDDR3) {
10511555Sjungma@eit.uni-kl.de      precharge_offset = B + max(int64_t(0), RTP - 4);
10610428Sandreas.hansson@arm.com    } else if (memType == MemoryType::WIDEIO_SDR) {
10710428Sandreas.hansson@arm.com      precharge_offset = B;
10810428Sandreas.hansson@arm.com    }
10910428Sandreas.hansson@arm.com  } else if (type == MemCommand::WRA) { // Write with auto-precharge
11010428Sandreas.hansson@arm.com    if (memType == MemoryType::DDR2) {
11110428Sandreas.hansson@arm.com      precharge_offset = B + WL + WR;
11210428Sandreas.hansson@arm.com    } else if (memType == MemoryType::DDR3) {
11310428Sandreas.hansson@arm.com      precharge_offset = B + WL + WR;
11410428Sandreas.hansson@arm.com    } else if (memType == MemoryType::DDR4) {
11510428Sandreas.hansson@arm.com      precharge_offset = B + WL + WR;
11610428Sandreas.hansson@arm.com    } else if (memType == MemoryType::LPDDR) {
11710428Sandreas.hansson@arm.com      precharge_offset = B + WR;  // + DQSS actually, but we don't have that parameter.
11810428Sandreas.hansson@arm.com    } else if (memType == MemoryType::LPDDR2) {
11910428Sandreas.hansson@arm.com      precharge_offset = B +  WL + WR + 1;
12010428Sandreas.hansson@arm.com    } else if (memType == MemoryType::LPDDR3) {
12110428Sandreas.hansson@arm.com      precharge_offset = B +  WL + WR + 1;
12210428Sandreas.hansson@arm.com    } else if (memType == MemoryType::WIDEIO_SDR) {
12310428Sandreas.hansson@arm.com      precharge_offset = B + WL + WR - 1;
12410428Sandreas.hansson@arm.com    }
12510428Sandreas.hansson@arm.com  }
12610428Sandreas.hansson@arm.com
12710428Sandreas.hansson@arm.com  return precharge_offset;
12810428Sandreas.hansson@arm.com} // MemCommand::getPrechargeOffset
12910428Sandreas.hansson@arm.com
13011555Sjungma@eit.uni-kl.devoid MemCommand::setTime(int64_t _timestamp)
13110428Sandreas.hansson@arm.com{
13210428Sandreas.hansson@arm.com  timestamp = _timestamp;
13310428Sandreas.hansson@arm.com}
13410428Sandreas.hansson@arm.com
13511555Sjungma@eit.uni-kl.deint64_t MemCommand::getTimeInt64() const
13610428Sandreas.hansson@arm.com{
13710428Sandreas.hansson@arm.com  return timestamp;
13810428Sandreas.hansson@arm.com}
13910428Sandreas.hansson@arm.com
14010428Sandreas.hansson@arm.comMemCommand::cmds MemCommand::typeWithoutAutoPrechargeFlag() const
14110428Sandreas.hansson@arm.com{
14210428Sandreas.hansson@arm.com  if (type == MemCommand::RDA) {
14310428Sandreas.hansson@arm.com    return MemCommand::RD;
14410428Sandreas.hansson@arm.com  } else if (type == MemCommand::WRA) {
14510428Sandreas.hansson@arm.com    return MemCommand::WR;
14610428Sandreas.hansson@arm.com  }
14710428Sandreas.hansson@arm.com  return type;
14810428Sandreas.hansson@arm.com}
149