Merge branch 'cpp_speedups' into develop

This commit is contained in:
Lukas Steiner
2020-09-24 13:44:48 +02:00
34 changed files with 137 additions and 97 deletions

View File

@@ -45,6 +45,7 @@ set(DCMAKE_SH="CMAKE_SH-NOTFOUND")
add_subdirectory(src/common/third_party/DRAMPower)
# Add nlohmann:
set(JSON_BuildTests OFF)
add_subdirectory(src/common/third_party/nlohmann)
# Add SystemC:

View File

@@ -37,6 +37,14 @@
#ifndef DEBUGMANAGER_H
#define DEBUGMANAGER_H
#if __has_cpp_attribute(maybe_unused)
#define NDEBUG_UNUSED(var_decl) [[maybe_unused]] var_decl
#elif (__GNUC__ || __clang__)
#define NDEBUG_UNUSED(var_decl) var_decl __attribute__((unused))
#else
#define NDEBUG_UNUSED(var_decl) var_decl
#endif
#ifdef NDEBUG
#define PRINTDEBUGMESSAGE(sender, message) {}
#else

View File

@@ -112,14 +112,14 @@ struct TemperatureSimConfig
void showTemperatureSimConfig()
{
int i __attribute__((unused)) = 0;
for (auto e __attribute__((unused)) : powerInitialValues)
NDEBUG_UNUSED(int i) = 0;
for (NDEBUG_UNUSED(auto e) : powerInitialValues)
{
PRINTDEBUGMESSAGE("TemperatureSimConfig", "powerInitialValues["
+ std::to_string(i++) + "]: " + std::to_string(e));
}
i = 0;
for (auto e __attribute__((unused)) : powerThresholds)
for (NDEBUG_UNUSED(auto e) : powerThresholds)
{
PRINTDEBUGMESSAGE("TemperatureSimConfig", "powerThreshold["
+ std::to_string(i++) + "]: " + std::to_string(e));

View File

@@ -33,6 +33,7 @@
*/
#include "BankMachine.h"
#include "../configuration/Configuration.h"
using namespace tlm;
@@ -44,9 +45,9 @@ BankMachine::BankMachine(SchedulerIF *scheduler, CheckerIF *checker, Bank bank)
bankgroup = BankGroup(bank.ID() / memSpec->banksPerGroup);
}
std::tuple<Command, tlm_generic_payload *, sc_time> BankMachine::getNextCommand()
CommandTuple::Type BankMachine::getNextCommand()
{
return std::tuple<Command, tlm_generic_payload *, sc_time>(nextCommand, currentPayload, timeToSchedule);
return CommandTuple::Type(nextCommand, currentPayload, timeToSchedule);
}
void BankMachine::updateState(Command command)

View File

@@ -39,14 +39,10 @@
#include <tlm.h>
#include <utility>
#include "../common/dramExtensions.h"
#include "Controller.h"
#include "Command.h"
#include "scheduler/SchedulerIF.h"
#include "checker/CheckerIF.h"
class SchedulerIF;
class CheckerIF;
enum class BmState
{
Precharged,
@@ -58,7 +54,7 @@ class BankMachine
public:
virtual ~BankMachine() {}
virtual sc_time start() = 0;
std::tuple<Command, tlm::tlm_generic_payload *, sc_time> getNextCommand();
CommandTuple::Type getNextCommand();
void updateState(Command);
void block();

View File

@@ -38,7 +38,10 @@
#include <string>
#include <vector>
#include <list>
#include <algorithm>
#include <array>
#include <systemc.h>
#include <tlm.h>
#include "../common/third_party/DRAMPower/src/MemCommand.h"
@@ -101,4 +104,17 @@ bool isRankCommand(Command);
bool isCasCommand(Command);
bool isRasCommand(Command);
struct CommandTuple
{
using Type = std::tuple<::Command, tlm::tlm_generic_payload *, sc_time>;
enum Accessor
{
Command = 0,
Payload = 1,
Timestamp = 2
};
};
using ReadyCommands = std::vector<CommandTuple::Type>;
#endif // COMMAND_H

View File

@@ -71,6 +71,9 @@ Controller::Controller(sc_module_name name) :
memSpec = config.memSpec;
ranksNumberOfPayloads = std::vector<unsigned>(memSpec->numberOfRanks);
// reserve buffer for a least 100 command tuples
readyCommands.reserve(100);
// instantiate timing checker
if (memSpec->memoryType == "DDR3")
checker = new CheckerDDR3();
@@ -216,6 +219,9 @@ Controller::~Controller()
void Controller::controllerMethod()
{
// clear command buffer
readyCommands.clear();
// (1) Release payload if arbiter has accepted the result (finish END_RESP)
if (payloadToRelease != nullptr && timeToRelease <= sc_time_stamp())
finishEndResp();
@@ -239,27 +245,27 @@ void Controller::controllerMethod()
it->start();
// (5) Choose one request and send it to DRAM
std::tuple<Command, tlm_generic_payload *, sc_time> commandTuple;
std::list<std::tuple<Command, tlm_generic_payload *, sc_time>> readyCommands;
CommandTuple::Type commandTuple;
for (unsigned rankID = 0; rankID < memSpec->numberOfRanks; rankID++)
{
// (5.1) Check for power-down commands (PDEA/PDEP/SREFEN or PDXA/PDXP/SREFEX)
commandTuple = powerDownManagers[rankID]->getNextCommand();
if (std::get<0>(commandTuple) != Command::NOP)
readyCommands.push_back(commandTuple);
if (std::get<CommandTuple::Command>(commandTuple) != Command::NOP)
readyCommands.emplace_back(commandTuple);
else
{
// (5.2) Check for refresh commands (PREA/PRE or REFA/REFB)
commandTuple = refreshManagers[rankID]->getNextCommand();
if (std::get<0>(commandTuple) != Command::NOP)
readyCommands.push_back(commandTuple);
if (std::get<CommandTuple::Command>(commandTuple) != Command::NOP)
readyCommands.emplace_back(commandTuple);
// (5.3) Check for bank commands (PRE, ACT, RD/RDA or WR/WRA)
for (auto it : bankMachinesOnRank[rankID])
{
commandTuple = it->getNextCommand();
if (std::get<0>(commandTuple) != Command::NOP)
readyCommands.push_back(commandTuple);
if (std::get<CommandTuple::Command>(commandTuple) != Command::NOP)
readyCommands.emplace_back(commandTuple);
}
}
}
@@ -268,28 +274,28 @@ void Controller::controllerMethod()
if (!readyCommands.empty())
{
commandTuple = cmdMux->selectCommand(readyCommands);
if (std::get<0>(commandTuple) != Command::NOP) // can happen with FIFO strict
if (std::get<CommandTuple::Command>(commandTuple) != Command::NOP) // can happen with FIFO strict
{
Rank rank = DramExtension::getRank(std::get<1>(commandTuple));
BankGroup bankgroup = DramExtension::getBankGroup(std::get<1>(commandTuple));
Bank bank = DramExtension::getBank(std::get<1>(commandTuple));
Rank rank = DramExtension::getRank(std::get<CommandTuple::Payload>(commandTuple));
BankGroup bankgroup = DramExtension::getBankGroup(std::get<CommandTuple::Payload>(commandTuple));
Bank bank = DramExtension::getBank(std::get<CommandTuple::Payload>(commandTuple));
if (isRankCommand(std::get<0>(commandTuple)))
if (isRankCommand(std::get<CommandTuple::Command>(commandTuple)))
{
for (auto it : bankMachinesOnRank[rank.ID()])
it->updateState(std::get<0>(commandTuple));
it->updateState(std::get<CommandTuple::Command>(commandTuple));
}
else
bankMachines[bank.ID()]->updateState(std::get<0>(commandTuple));
bankMachines[bank.ID()]->updateState(std::get<CommandTuple::Command>(commandTuple));
refreshManagers[rank.ID()]->updateState(std::get<0>(commandTuple));
powerDownManagers[rank.ID()]->updateState(std::get<0>(commandTuple));
checker->insert(std::get<0>(commandTuple), rank, bankgroup, bank);
refreshManagers[rank.ID()]->updateState(std::get<CommandTuple::Command>(commandTuple));
powerDownManagers[rank.ID()]->updateState(std::get<CommandTuple::Command>(commandTuple));
checker->insert(std::get<CommandTuple::Command>(commandTuple), rank, bankgroup, bank);
if (isCasCommand(std::get<0>(commandTuple)))
if (isCasCommand(std::get<CommandTuple::Command>(commandTuple)))
{
scheduler->removeRequest(std::get<1>(commandTuple));
respQueue->insertPayload(std::get<1>(commandTuple), memSpec->getIntervalOnDataStrobe(std::get<0>(commandTuple)).end);
scheduler->removeRequest(std::get<CommandTuple::Payload>(commandTuple));
respQueue->insertPayload(std::get<CommandTuple::Payload>(commandTuple), memSpec->getIntervalOnDataStrobe(std::get<CommandTuple::Command>(commandTuple)).end);
sc_time triggerTime = respQueue->getTriggerTime();
if (triggerTime != sc_max_time())
@@ -300,7 +306,7 @@ void Controller::controllerMethod()
if (ranksNumberOfPayloads[rank.ID()] == 0)
powerDownManagers[rank.ID()]->triggerEntry();
sendToDram(std::get<0>(commandTuple), std::get<1>(commandTuple));
sendToDram(std::get<CommandTuple::Command>(commandTuple), std::get<CommandTuple::Payload>(commandTuple));
}
else
readyCmdBlocked = true;
@@ -367,7 +373,7 @@ unsigned int Controller::transport_dbg(tlm_generic_payload &trans)
void Controller::finishBeginReq()
{
uint64_t id __attribute__((unused)) = DramExtension::getPayloadID(payloadToAcquire);
NDEBUG_UNUSED(uint64_t id) = DramExtension::getPayloadID(payloadToAcquire);
PRINTDEBUGMESSAGE(name(), "Payload " + std::to_string(id) + " entered system.");
if (totalNumberOfPayloads == 0)
@@ -413,7 +419,7 @@ void Controller::startBeginResp()
void Controller::finishEndResp()
{
uint64_t id __attribute__((unused)) = DramExtension::getPayloadID(payloadToRelease);
NDEBUG_UNUSED(uint64_t id) = DramExtension::getPayloadID(payloadToRelease);
PRINTDEBUGMESSAGE(name(), "Payload " + std::to_string(id) + " left system.");
payloadToRelease->release();

View File

@@ -75,6 +75,7 @@ protected:
private:
unsigned totalNumberOfPayloads = 0;
std::vector<unsigned> ranksNumberOfPayloads;
ReadyCommands readyCommands;
MemSpec *memSpec;

View File

@@ -72,13 +72,13 @@ void ControllerRecordable::recordPhase(tlm_generic_payload &trans, tlm_phase pha
{
sc_time recTime = delay + sc_time_stamp();
unsigned int thr __attribute__((unused)) = DramExtension::getExtension(trans).getThread().ID();
unsigned int ch __attribute__((unused)) = DramExtension::getExtension(trans).getChannel().ID();
unsigned int bg __attribute__((unused)) = DramExtension::getExtension(trans).getBankGroup().ID();
unsigned int bank __attribute__((unused)) = DramExtension::getExtension(trans).getBank().ID();
unsigned int row __attribute__((unused)) = DramExtension::getExtension(trans).getRow().ID();
unsigned int col __attribute__((unused)) = DramExtension::getExtension(trans).getColumn().ID();
uint64_t id __attribute__((unused)) = DramExtension::getExtension(trans).getPayloadID();
NDEBUG_UNUSED(unsigned thr) = DramExtension::getExtension(trans).getThread().ID();
NDEBUG_UNUSED(unsigned ch) = DramExtension::getExtension(trans).getChannel().ID();
NDEBUG_UNUSED(unsigned bg) = DramExtension::getExtension(trans).getBankGroup().ID();
NDEBUG_UNUSED(unsigned bank) = DramExtension::getExtension(trans).getBank().ID();
NDEBUG_UNUSED(unsigned row) = DramExtension::getExtension(trans).getRow().ID();
NDEBUG_UNUSED(unsigned col) = DramExtension::getExtension(trans).getColumn().ID();
NDEBUG_UNUSED(uint64_t id) = DramExtension::getExtension(trans).getPayloadID();
PRINTDEBUGMESSAGE(name(), "Recording " + getPhaseName(phase) + " thread " +
std::to_string(thr) + " channel " + std::to_string(ch) + " bank group " + std::to_string(

View File

@@ -45,8 +45,7 @@ class CmdMuxIF
{
public:
virtual ~CmdMuxIF() {}
virtual std::tuple<Command, tlm::tlm_generic_payload *, sc_time>
selectCommand(std::list<std::tuple<Command, tlm::tlm_generic_payload *, sc_time>> &) = 0;
virtual CommandTuple::Type selectCommand(ReadyCommands &) = 0;
};
#endif // CMDMUXIF_H

View File

@@ -38,21 +38,24 @@
using namespace tlm;
std::tuple<Command, tlm_generic_payload *, sc_time>
CmdMuxOldest::selectCommand(std::list<std::tuple<Command, tlm_generic_payload *, sc_time>> &readyCommands)
CommandTuple::Type CmdMuxOldest::selectCommand(ReadyCommands &readyCommands)
{
readyCommands.remove_if([](std::tuple<Command, tlm_generic_payload *, sc_time> element){return std::get<2>(element) != sc_time_stamp();});
readyCommands.erase(std::remove_if(readyCommands.begin(), readyCommands.end(),
[](CommandTuple::Type element) {
return std::get<CommandTuple::Timestamp>(element) != sc_time_stamp();
}),
readyCommands.end());
if (!readyCommands.empty())
{
auto it = readyCommands.begin();
auto result = it;
uint64_t lastPayloadID = DramExtension::getPayloadID(std::get<1>(*it));
uint64_t lastPayloadID = DramExtension::getPayloadID(std::get<CommandTuple::Payload>(*it));
it++;
while (it != readyCommands.end())
{
uint64_t newPayloadID = DramExtension::getPayloadID(std::get<1>(*it));
uint64_t newPayloadID = DramExtension::getPayloadID(std::get<CommandTuple::Payload>(*it));
if (newPayloadID < lastPayloadID)
{
lastPayloadID = newPayloadID;
@@ -63,5 +66,5 @@ CmdMuxOldest::selectCommand(std::list<std::tuple<Command, tlm_generic_payload *,
return *result;
}
else
return std::tuple<Command, tlm_generic_payload *, sc_time>(Command::NOP, nullptr, sc_max_time());
return CommandTuple::Type(Command::NOP, nullptr, sc_max_time());
}

View File

@@ -40,8 +40,7 @@
class CmdMuxOldest : public CmdMuxIF
{
public:
std::tuple<Command, tlm::tlm_generic_payload *, sc_time>
selectCommand(std::list<std::tuple<Command, tlm::tlm_generic_payload *, sc_time>> &);
CommandTuple::Type selectCommand(ReadyCommands &);
};
#endif // CMDMUXOLDEST_H

View File

@@ -38,18 +38,22 @@
using namespace tlm;
std::tuple<Command, tlm_generic_payload *, sc_time>
CmdMuxStrict::selectCommand(std::list<std::tuple<Command, tlm_generic_payload *, sc_time>> &readyCommands)
CommandTuple::Type
CmdMuxStrict::selectCommand(ReadyCommands &readyCommands)
{
readyCommands.remove_if([](std::tuple<Command, tlm_generic_payload *, sc_time> element){return std::get<2>(element) != sc_time_stamp();});
readyCommands.erase(std::remove_if(readyCommands.begin(), readyCommands.end(),
[](CommandTuple::Type element) {
return std::get<CommandTuple::Timestamp>(element) != sc_time_stamp();
}),
readyCommands.end());
if (!readyCommands.empty())
{
for (auto it : readyCommands)
{
if (isCasCommand(std::get<0>(it)))
if (isCasCommand(std::get<CommandTuple::Command>(it)))
{
if (DramExtension::getPayloadID(std::get<1>(it)) == nextPayloadID)
if (DramExtension::getPayloadID(std::get<CommandTuple::Payload>(it)) == nextPayloadID)
{
nextPayloadID++;
return it;
@@ -58,9 +62,9 @@ CmdMuxStrict::selectCommand(std::list<std::tuple<Command, tlm_generic_payload *,
}
for (auto it : readyCommands)
{
if (isRasCommand(std::get<0>(it)))
if (isRasCommand(std::get<CommandTuple::Command>(it)))
return it;
}
}
return std::tuple<Command, tlm_generic_payload *, sc_time>(Command::NOP, nullptr, sc_max_time());
return CommandTuple::Type(Command::NOP, nullptr, sc_max_time());
}

View File

@@ -40,8 +40,7 @@
class CmdMuxStrict : public CmdMuxIF
{
public:
std::tuple<Command, tlm::tlm_generic_payload *, sc_time>
selectCommand(std::list<std::tuple<Command, tlm::tlm_generic_payload *, sc_time>> &);
CommandTuple::Type selectCommand(ReadyCommands &);
private:
uint64_t nextPayloadID = 0;

View File

@@ -36,9 +36,9 @@
using namespace tlm;
std::tuple<Command, tlm_generic_payload *, sc_time> PowerDownManagerDummy::getNextCommand()
CommandTuple::Type PowerDownManagerDummy::getNextCommand()
{
return std::tuple<Command, tlm_generic_payload *, sc_time>(Command::NOP, nullptr, sc_max_time());
return CommandTuple::Type(Command::NOP, nullptr, sc_max_time());
}
sc_time PowerDownManagerDummy::start()

View File

@@ -46,7 +46,7 @@ public:
virtual void triggerExit() override {}
virtual void triggerInterruption() override {}
virtual std::tuple<Command, tlm::tlm_generic_payload *, sc_time> getNextCommand() override;
virtual CommandTuple::Type getNextCommand() override;
virtual void updateState(Command) override {}
virtual sc_time start() override;
};

View File

@@ -49,7 +49,7 @@ public:
virtual void triggerExit() = 0;
virtual void triggerInterruption() = 0;
virtual std::tuple<Command, tlm::tlm_generic_payload *, sc_time> getNextCommand() = 0;
virtual CommandTuple::Type getNextCommand() = 0;
virtual void updateState(Command) = 0;
virtual sc_time start() = 0;
};

View File

@@ -69,9 +69,9 @@ void PowerDownManagerStaggered::triggerInterruption()
exitTriggered = true;
}
std::tuple<Command, tlm_generic_payload *, sc_time> PowerDownManagerStaggered::getNextCommand()
CommandTuple::Type PowerDownManagerStaggered::getNextCommand()
{
return std::tuple<Command, tlm_generic_payload *, sc_time>(nextCommand, &powerDownPayload, timeToSchedule);
return CommandTuple::Type(nextCommand, &powerDownPayload, timeToSchedule);
}
sc_time PowerDownManagerStaggered::start()

View File

@@ -48,7 +48,7 @@ public:
virtual void triggerExit() override;
virtual void triggerInterruption() override;
virtual std::tuple<Command, tlm::tlm_generic_payload *, sc_time> getNextCommand() override;
virtual CommandTuple::Type getNextCommand() override;
virtual void updateState(Command) override;
virtual sc_time start() override;

View File

@@ -60,9 +60,9 @@ RefreshManagerBankwise::RefreshManagerBankwise(std::vector<BankMachine *> &bankM
maxPulledin = -(config.refreshMaxPulledin * memSpec->banksPerRank);
}
std::tuple<Command, tlm_generic_payload *, sc_time> RefreshManagerBankwise::getNextCommand()
CommandTuple::Type RefreshManagerBankwise::getNextCommand()
{
return std::tuple<Command, tlm_generic_payload *, sc_time>
return CommandTuple::Type
(nextCommand, &refreshPayloads[currentBankMachine->getBank().ID() % memSpec->banksPerRank], timeToSchedule);
}

View File

@@ -48,7 +48,7 @@ class RefreshManagerBankwise final : public RefreshManagerIF
public:
RefreshManagerBankwise(std::vector<BankMachine *> &, PowerDownManagerIF *, Rank, CheckerIF *);
virtual std::tuple<Command, tlm::tlm_generic_payload *, sc_time> getNextCommand() override;
virtual CommandTuple::Type getNextCommand() override;
virtual sc_time start() override;
virtual void updateState(Command) override;

View File

@@ -36,9 +36,9 @@
using namespace tlm;
std::tuple<Command, tlm_generic_payload *, sc_time> RefreshManagerDummy::getNextCommand()
CommandTuple::Type RefreshManagerDummy::getNextCommand()
{
return std::tuple<Command, tlm_generic_payload *, sc_time>(Command::NOP, nullptr, sc_max_time());
return CommandTuple::Type(Command::NOP, nullptr, sc_max_time());
}
sc_time RefreshManagerDummy::start()

View File

@@ -44,7 +44,7 @@
class RefreshManagerDummy final : public RefreshManagerIF
{
public:
virtual std::tuple<Command, tlm::tlm_generic_payload *, sc_time> getNextCommand() override;
virtual CommandTuple::Type getNextCommand() override;
virtual sc_time start() override;
virtual void updateState(Command) override {}
};

View File

@@ -45,7 +45,7 @@ class RefreshManagerIF
public:
virtual ~RefreshManagerIF() {}
virtual std::tuple<Command, tlm::tlm_generic_payload *, sc_time> getNextCommand() = 0;
virtual CommandTuple::Type getNextCommand() = 0;
virtual sc_time start() = 0;
virtual void updateState(Command) = 0;
};

View File

@@ -52,9 +52,9 @@ RefreshManagerRankwise::RefreshManagerRankwise(std::vector<BankMachine *> &bankM
maxPulledin = -config.refreshMaxPulledin;
}
std::tuple<Command, tlm_generic_payload *, sc_time> RefreshManagerRankwise::getNextCommand()
CommandTuple::Type RefreshManagerRankwise::getNextCommand()
{
return std::tuple<Command, tlm_generic_payload *, sc_time>(nextCommand, &refreshPayload, timeToSchedule);
return CommandTuple::Type(nextCommand, &refreshPayload, timeToSchedule);
}
sc_time RefreshManagerRankwise::start()

View File

@@ -46,7 +46,7 @@ class RefreshManagerRankwise final : public RefreshManagerIF
public:
RefreshManagerRankwise(std::vector<BankMachine *> &, PowerDownManagerIF *, Rank, CheckerIF *);
virtual std::tuple<Command, tlm::tlm_generic_payload *, sc_time> getNextCommand() override;
virtual CommandTuple::Type getNextCommand() override;
virtual sc_time start() override;
virtual void updateState(Command) override;

View File

@@ -33,6 +33,7 @@
*/
#include "SchedulerFifo.h"
#include "../../configuration/Configuration.h"
using namespace tlm;

View File

@@ -34,6 +34,7 @@
#include "SchedulerFrFcfs.h"
#include "../../configuration/Configuration.h"
#include <systemc.h>
using namespace tlm;
@@ -111,8 +112,5 @@ bool SchedulerFrFcfs::hasFurtherRowHit(Bank bank, Row row)
bool SchedulerFrFcfs::hasFurtherRequest(Bank bank)
{
if (buffer[bank.ID()].size() >= 2)
return true;
else
return false;
return (buffer[bank.ID()].size() >= 2);
}

View File

@@ -33,6 +33,7 @@
*/
#include "SchedulerFrFcfsGrp.h"
#include "../../configuration/Configuration.h"
using namespace tlm;

View File

@@ -38,7 +38,6 @@
#include <tlm.h>
#include "../../common/dramExtensions.h"
#include "../../common/DebugManager.h"
#include "../BankMachine.h"
enum class BmState;
class BankMachine;

View File

@@ -166,7 +166,7 @@ void DRAMSys::logo()
#undef BOLDTXT
}
void DRAMSys::setupDebugManager(const std::string &traceName __attribute__((unused)))
void DRAMSys::setupDebugManager(NDEBUG_UNUSED(const std::string &traceName))
{
#ifndef NDEBUG
auto &dbg = DebugManager::getInstance();

View File

@@ -164,8 +164,8 @@ void TemperatureController::temperatureThread()
updateTemperatures();
double p = adjustThermalSimPeriod();
int i __attribute__((unused)) = 0;
for (auto t __attribute__((unused)) : temperatureValues) {
NDEBUG_UNUSED(int i) = 0;
for (NDEBUG_UNUSED(auto t) : temperatureValues) {
PRINTDEBUGMESSAGE(name(), "Temperature[" + std::to_string(i++)
+ "] is " + std::to_string(t));
}

View File

@@ -88,12 +88,12 @@ void DramRecordable<BaseDram>::recordPhase(tlm_generic_payload &trans, tlm_phase
if (phase == END_PDNA || phase == END_PDNP || phase == END_SREF)
recTime += this->memSpec->getCommandLength(phaseToCommand(phase));
unsigned int thr __attribute__((unused)) = DramExtension::getExtension(trans).getThread().ID();
unsigned int ch __attribute__((unused)) = DramExtension::getExtension(trans).getChannel().ID();
unsigned int bg __attribute__((unused)) = DramExtension::getExtension(trans).getBankGroup().ID();
unsigned int bank __attribute__((unused)) = DramExtension::getExtension(trans).getBank().ID();
unsigned int row __attribute__((unused)) = DramExtension::getExtension(trans).getRow().ID();
unsigned int col __attribute__((unused)) = DramExtension::getExtension(trans).getColumn().ID();
NDEBUG_UNUSED(unsigned thr) = DramExtension::getExtension(trans).getThread().ID();
NDEBUG_UNUSED(unsigned ch) = DramExtension::getExtension(trans).getChannel().ID();
NDEBUG_UNUSED(unsigned bg) = DramExtension::getExtension(trans).getBankGroup().ID();
NDEBUG_UNUSED(unsigned bank) = DramExtension::getExtension(trans).getBank().ID();
NDEBUG_UNUSED(unsigned row) = DramExtension::getExtension(trans).getRow().ID();
NDEBUG_UNUSED(unsigned col) = DramExtension::getExtension(trans).getColumn().ID();
PRINTDEBUGMESSAGE(this->name(), "Recording " + getPhaseName(phase) + " thread " +
std::to_string(thr) + " channel " + std::to_string(ch) + " bank group " + std::to_string(

View File

@@ -75,7 +75,6 @@ public:
void parseTraceFile()
{
std::string line;
unsigned parsedLines = 0;
lineContents.clear();
while (file && !file.eof() && parsedLines < 10000)
@@ -94,12 +93,13 @@ public:
// Trace files MUST provide timestamp, command and address for every
// transaction. The data information depends on the storage mode
// configuration.
std::string time;
std::string command;
std::string address;
std::string dataStr;
time.clear();
command.clear();
address.clear();
dataStr.clear();
std::istringstream iss(line);
iss.clear();
iss.str(line);
// Get the timestamp for the transaction.
iss >> time;
@@ -213,6 +213,14 @@ private:
std::vector<LineContent> lineContents;
std::vector<LineContent>::const_iterator lineIterator;
std::string time;
std::string command;
std::string address;
std::string dataStr;
std::string line;
std::istringstream iss;
};
#endif // STLPLAYER_H