diff --git a/README.md b/README.md
index 2605c5cb..809303a3 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
-**DRAMSys** is a flexible DRAM subsystem design space exploration framework based on SystemC TLM-2.0. It was developed by the [Microelectronic Systems Design Research Group](https://eit.rptu.de/en/fgs/ems/home/seite) at [RPTU Kaiserslautern-Landau](https://rptu.de/en/) and by [Fraunhofer IESE](https://www.iese.fraunhofer.de/en.html).
+**DRAMSys** is a flexible DRAM subsystem design space exploration framework based on SystemC TLM-2.0. It was developed by the [Microelectronic Systems Design Research Group](https://eit.rptu.de/en/fgs/ems/home/seite) at [RPTU Kaiserslautern-Landau](https://rptu.de/en/), by [Fraunhofer IESE](https://www.iese.fraunhofer.de/en.html) and by the [Computer Engineering Group](https://www.informatik.uni-wuerzburg.de/ce/) at [JMU Würzburg](https://www.uni-wuerzburg.de/en/home/).
\>> [Official Website](https://www.iese.fraunhofer.de/en/innovation_trends/autonomous-systems/memtonomy/DRAMSys.html) <<
@@ -47,7 +47,7 @@ If you are interested in the Trace Analyzer, if you need support with the setup
## Basic Setup
-Start using DRAMSys by cloning the repository.
+To use DRAMSys, first clone the repository. Make sure that Git LFS is installed on your machine.
### Dependencies
diff --git a/extensions/apps/traceAnalyzer/CMakeLists.txt b/extensions/apps/traceAnalyzer/CMakeLists.txt
index 82cd3c90..eb3c0574 100644
--- a/extensions/apps/traceAnalyzer/CMakeLists.txt
+++ b/extensions/apps/traceAnalyzer/CMakeLists.txt
@@ -28,7 +28,7 @@
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
-# Authors:
+# Authors:
# Matthias Jung
# Lukas Steiner
# Derek Christ
@@ -94,10 +94,9 @@ target_link_libraries(TraceAnalyzer
set(DRAMSYS_TRACEANALYZER_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
-target_compile_definitions(${PROJECT_NAME}
- PUBLIC
+target_compile_definitions(${PROJECT_NAME}
+ PUBLIC
DRAMSYS_TRACEANALYZER_DIR="${DRAMSYS_TRACEANALYZER_DIR}"
)
build_source_group()
-diagnostics_print(${PROJECT_NAME})
diff --git a/extensions/apps/traceAnalyzer/data/tracedb.cpp b/extensions/apps/traceAnalyzer/data/tracedb.cpp
index e3526b39..ec30ba0b 100644
--- a/extensions/apps/traceAnalyzer/data/tracedb.cpp
+++ b/extensions/apps/traceAnalyzer/data/tracedb.cpp
@@ -290,11 +290,6 @@ ID TraceDB::getTransactionIDFromPhaseID(ID phaseID)
GeneralInfo TraceDB::getGeneralInfoFromDB()
{
QVariant parameter;
- parameter = getParameterFromTable("NumberOfTransactions", "GeneralInfo");
- uint64_t numberOfTransactions = parameter.isValid() ? parameter.toULongLong() : 0;
- parameter = getParameterFromTable("TraceEnd", "GeneralInfo");
- traceTime traceEnd = parameter.isValid() ? static_cast(parameter.toULongLong()) : 0;
- parameter = getParameterFromTable("NumberOfRanks", "GeneralInfo");
unsigned numberOfRanks = parameter.isValid() ? parameter.toUInt() : 1;
parameter = getParameterFromTable("NumberOfBankgroups", "GeneralInfo");
unsigned numberOfBankGroups = parameter.isValid() ? parameter.toUInt() : numberOfRanks;
@@ -328,6 +323,8 @@ GeneralInfo TraceDB::getGeneralInfoFromDB()
bool pseudoChannelMode = parameter.isValid() && parameter.toBool();
uint64_t numberOfPhases = getNumberOfPhases();
+ uint64_t numberOfTransactions = getNumberOfTransactions();
+ auto traceEnd = static_cast(getTraceLength());
QString description = (traces + "\n");
description += mcconfig + "\n";
@@ -417,6 +414,26 @@ QVariant TraceDB::getParameterFromTable(const std::string& parameter, const std:
}
}
+uint64_t TraceDB::getTraceLength()
+{
+ QSqlQuery query(database);
+ query.prepare("SELECT MAX(PhaseEnd) FROM Phases");
+ executeQuery(query);
+
+ query.next();
+ return query.value(0).toULongLong();
+}
+
+uint64_t TraceDB::getNumberOfTransactions()
+{
+ QSqlQuery query(database);
+ query.prepare("SELECT COUNT(ID) FROM Transactions");
+ executeQuery(query);
+
+ query.next();
+ return query.value(0).toULongLong();
+}
+
uint64_t TraceDB::getNumberOfPhases()
{
QSqlQuery query(database);
@@ -480,7 +497,7 @@ DependencyInfos TraceDB::getDependencyInfos(DependencyInfos::Type infoType)
selectTimeDependencyPercentages = QSqlQuery(database);
if (!selectTimeDependencyPercentages.prepare(queryTexts.selectTimeDependencyPercentages))
qDebug() << database.lastError().text();
-
+
executeQuery(selectTimeDependencyPercentages);
return parseDependencyInfos(selectTimeDependencyPercentages, infoType);
}
@@ -714,4 +731,3 @@ void TraceDB::executeScriptFile(const QString& fileName)
}
}
}
-
diff --git a/extensions/apps/traceAnalyzer/data/tracedb.h b/extensions/apps/traceAnalyzer/data/tracedb.h
index 47232ce4..c4e38be6 100644
--- a/extensions/apps/traceAnalyzer/data/tracedb.h
+++ b/extensions/apps/traceAnalyzer/data/tracedb.h
@@ -145,6 +145,8 @@ private:
void executeScriptFile(const QString& fileName);
void dropAndCreateTables();
+ uint64_t getTraceLength();
+ uint64_t getNumberOfTransactions();
uint64_t getNumberOfPhases();
GeneralInfo getGeneralInfoFromDB();
CommandLengths getCommandLengthsFromDB();
@@ -174,6 +176,3 @@ public:
}
};
#endif // TRACEDB_H
-
-
-
diff --git a/extensions/apps/traceAnalyzer/simulationdialog.cpp b/extensions/apps/traceAnalyzer/simulationdialog.cpp
index 45d7f1b6..a50e474b 100644
--- a/extensions/apps/traceAnalyzer/simulationdialog.cpp
+++ b/extensions/apps/traceAnalyzer/simulationdialog.cpp
@@ -246,7 +246,7 @@ void SimulationDialog::loadConfigurationFromTextFields()
MemSpec memSpec;
SimConfig simConfig;
std::string simulationId;
- TraceSetup traceSetup;
+ std::vector traceSetup;
simulationId = ui->simulationIdLineEdit->text().toStdString();
@@ -266,12 +266,14 @@ void SimulationDialog::loadConfigurationFromTextFields()
return;
}
- configuration = DRAMSys::Config::Configuration{addressMapping,
- mcConfig,
- memSpec,
- simConfig,
- simulationId,
- std::make_optional(std::move(traceSetup))};
+ configuration = DRAMSys::Config::Configuration{
+ addressMapping,
+ mcConfig,
+ memSpec,
+ simConfig,
+ simulationId,
+ std::make_optional>(std::move(traceSetup))
+ };
loadConfiguration();
}
diff --git a/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.cpp b/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.cpp
index 32b49f73..ffbc1803 100644
--- a/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.cpp
+++ b/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.cpp
@@ -50,40 +50,43 @@ CheckerDDR5::CheckerDDR5(const Configuration& config)
if (memSpec == nullptr)
SC_REPORT_FATAL("CheckerDDR5", "Wrong MemSpec chosen");
- lastScheduledByCommandAndDimmRank = std::vector>
- (Command::numberOfCommands(), std::vector(memSpec->dimmRanksPerChannel, scMaxTime));
- lastScheduledByCommandAndPhysicalRank = std::vector>
- (Command::numberOfCommands(), std::vector(memSpec->physicalRanksPerChannel, scMaxTime));
- lastScheduledByCommandAndLogicalRank = std::vector>
- (Command::numberOfCommands(), std::vector(memSpec->logicalRanksPerChannel, scMaxTime));
- lastScheduledByCommandAndBankGroup = std::vector>
- (Command::numberOfCommands(), std::vector(memSpec->bankGroupsPerChannel, scMaxTime));
- lastScheduledByCommandAndBank = std::vector>
- (Command::numberOfCommands(), std::vector(memSpec->banksPerChannel, scMaxTime));
+ lastScheduledByCommandAndDimmRank = std::vector>
+ (Command::numberOfCommands(), ControllerVector(memSpec->dimmRanksPerChannel, scMaxTime));
+ lastScheduledByCommandAndPhysicalRank = std::vector>
+ (Command::numberOfCommands(),
+ ControllerVector(memSpec->physicalRanksPerChannel, scMaxTime));
+ lastScheduledByCommandAndLogicalRank = std::vector>
+ (Command::numberOfCommands(),
+ ControllerVector(memSpec->logicalRanksPerChannel, scMaxTime));
+ lastScheduledByCommandAndBankGroup = std::vector>
+ (Command::numberOfCommands(),
+ ControllerVector(memSpec->bankGroupsPerChannel, scMaxTime));
+ lastScheduledByCommandAndBank = std::vector>
+ (Command::numberOfCommands(), ControllerVector(memSpec->banksPerChannel, scMaxTime));
lastScheduledByCommand = std::vector(Command::numberOfCommands(), scMaxTime);
// Required for Same Bank Refresh
- lastScheduledByCommandAndBankInGroup = std::vector>(Command::numberOfCommands(),
- std::vector(memSpec->ranksPerChannel * memSpec->banksPerGroup, scMaxTime));
+ lastScheduledByCommandAndBankInGroup = std::vector>(Command::numberOfCommands(),
+ ControllerVector(memSpec->ranksPerChannel * memSpec->banksPerGroup, scMaxTime));
lastCommandOnBus = scMaxTime;
dummyCommandOnBus.start = scMaxTime;
dummyCommandOnBus.end = scMaxTime;
- last4ActivatesLogical = std::vector>(memSpec->logicalRanksPerChannel);
- last4ActivatesPhysical = std::vector>(memSpec->physicalRanksPerChannel);
+ last4ActivatesLogical = ControllerVector>(memSpec->logicalRanksPerChannel);
+ last4ActivatesPhysical = ControllerVector>(memSpec->physicalRanksPerChannel);
- lastBurstLengthByCommandAndDimmRank = std::vector>
- (Command::WRA + 1, std::vector(memSpec->dimmRanksPerChannel));
- lastBurstLengthByCommandAndPhysicalRank = std::vector>
- (Command::WRA + 1, std::vector(memSpec->physicalRanksPerChannel));
- lastBurstLengthByCommandAndLogicalRank = std::vector>
- (Command::WRA + 1, std::vector(memSpec->logicalRanksPerChannel));
- lastBurstLengthByCommandAndBankGroup = std::vector>
- (Command::WRA + 1, std::vector(memSpec->bankGroupsPerChannel));
- lastBurstLengthByCommandAndBank = std::vector>
- (Command::WRA + 1, std::vector(memSpec->banksPerChannel));
+ lastBurstLengthByCommandAndDimmRank = std::vector>
+ (Command::WRA + 1, ControllerVector(memSpec->dimmRanksPerChannel));
+ lastBurstLengthByCommandAndPhysicalRank = std::vector>
+ (Command::WRA + 1, ControllerVector(memSpec->physicalRanksPerChannel));
+ lastBurstLengthByCommandAndLogicalRank = std::vector>
+ (Command::WRA + 1, ControllerVector(memSpec->logicalRanksPerChannel));
+ lastBurstLengthByCommandAndBankGroup = std::vector>
+ (Command::WRA + 1, ControllerVector(memSpec->bankGroupsPerChannel));
+ lastBurstLengthByCommandAndBank = std::vector>
+ (Command::WRA + 1, ControllerVector(memSpec->banksPerChannel));
lastBurstLengthByCommand = std::vector(Command::WRA + 1);
- lastBurstLengthByCommandAndBankInGroup = std::vector>
- (Command::WRA + 1, std::vector(memSpec->ranksPerChannel * memSpec->banksPerGroup));
+ lastBurstLengthByCommandAndBankInGroup = std::vector>
+ (Command::WRA + 1, ControllerVector(memSpec->ranksPerChannel * memSpec->banksPerGroup));
cmdLengthDiff = memSpec->cmdMode * memSpec->tCK;
@@ -123,13 +126,15 @@ CheckerDDR5::CheckerDDR5(const Configuration& config)
sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic_payload& payload) const
{
- Rank logicalRank = ControllerExtension::getRank(payload);
- Rank physicalRank = Rank(logicalRank.ID() / memSpec->logicalRanksPerPhysicalRank);
- Rank dimmRank = Rank(physicalRank.ID() / memSpec->physicalRanksPerDimmRank);
+ LogicalRank logicalRank = LogicalRank(ControllerExtension::getRank(payload));
+ PhysicalRank physicalRank = PhysicalRank(
+ static_cast(logicalRank) / memSpec->logicalRanksPerPhysicalRank);
+ DimmRank dimmRank = DimmRank(static_cast(physicalRank) / memSpec->physicalRanksPerDimmRank);
BankGroup bankGroup = ControllerExtension::getBankGroup(payload);
Bank bank = ControllerExtension::getBank(payload);
- Bank bankInGroup = Bank(logicalRank.ID() * memSpec->banksPerGroup + bank.ID() % memSpec->banksPerGroup);
-
+ Bank bankInGroup = Bank(static_cast(logicalRank) * memSpec->banksPerGroup
+ + static_cast(bank) % memSpec->banksPerGroup);
+
sc_time lastCommandStart;
sc_time earliestTimeToStart = sc_time_stamp();
@@ -140,37 +145,37 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic
assert(!(burstLength == 32) || (memSpec->bitWidth == 4));
assert(burstLength <= memSpec->maxBurstLength);
- lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD);
- lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_L_slr);
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_M_slr);
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RD][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RD][logicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_S_slr);
- lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RD][physicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RD][physicalRank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndPhysicalRank[Command::RD][physicalRank.ID()] == 32)
+ if (lastBurstLengthByCommandAndPhysicalRank[Command::RD][physicalRank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST32);
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_dlr);
}
lastCommandStart = lastScheduledByCommand[Command::RD];
- if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::RD][physicalRank.ID()]) // different physical rank
+ if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::RD][physicalRank]) // different physical rank
{
- if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::RD][dimmRank.ID()]) // same DIMM
+ if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::RD][dimmRank]) // same DIMM
{
- if (lastBurstLengthByCommandAndDimmRank[Command::RD][dimmRank.ID()] == 32)
+ if (lastBurstLengthByCommandAndDimmRank[Command::RD][dimmRank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDRD_dpr + tBURST16);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDRD_dpr);
@@ -184,29 +189,29 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic
}
}
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_M_slr);
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RDA][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RDA][logicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_S_slr);
- lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndPhysicalRank[Command::RDA][physicalRank.ID()] == 32)
+ if (lastBurstLengthByCommandAndPhysicalRank[Command::RDA][physicalRank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST32);
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_dlr);
}
lastCommandStart = lastScheduledByCommand[Command::RDA];
- if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank.ID()]) // different physical rank
+ if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank]) // different physical rank
{
- if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::RDA][dimmRank.ID()]) // same DIMM
+ if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::RDA][dimmRank]) // same DIMM
{
- if (lastBurstLengthByCommandAndDimmRank[Command::RDA][dimmRank.ID()] == 32)
+ if (lastBurstLengthByCommandAndDimmRank[Command::RDA][dimmRank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDRD_dpr + tBURST16);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDRD_dpr);
@@ -222,58 +227,58 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic
if (command == Command::RDA)
{
- lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBank[Command::WR][bank.ID()] == 32)
+ if (lastBurstLengthByCommandAndBank[Command::WR][bank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDA + tBURST16);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDA);
}
}
- lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBank[Command::WR][bank.ID()] == 32)
+ if (lastBurstLengthByCommandAndBank[Command::WR][bank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_L_WTR_slr + tBURST16);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_L_WTR_slr);
}
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup.ID()] == 32)
+ if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_M_WTR_slr + tBURST16);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_M_WTR_slr);
}
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WR][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WR][logicalRank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndLogicalRank[Command::WR][logicalRank.ID()] == 32)
+ if (lastBurstLengthByCommandAndLogicalRank[Command::WR][logicalRank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_S_WTR_slr + tBURST16);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_S_WTR_slr);
}
- lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::WR][physicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::WR][physicalRank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndPhysicalRank[Command::WR][physicalRank.ID()] == 32)
+ if (lastBurstLengthByCommandAndPhysicalRank[Command::WR][physicalRank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_WTR_dlr + tBURST16);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_WTR_dlr);
}
lastCommandStart = lastScheduledByCommand[Command::WR];
- if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::WR][physicalRank.ID()]) // different physical rank
+ if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::WR][physicalRank]) // different physical rank
{
- if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::WR][dimmRank.ID()]) // same DIMM
+ if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::WR][dimmRank]) // same DIMM
{
- if (lastBurstLengthByCommandAndDimmRank[Command::WR][dimmRank.ID()] == 32)
+ if (lastBurstLengthByCommandAndDimmRank[Command::WR][dimmRank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_dpr + tBURST16);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_dpr);
@@ -287,39 +292,39 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic
}
}
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup.ID()] == 32)
+ if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_M_WTR_slr + tBURST16);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_M_WTR_slr);
}
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WRA][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WRA][logicalRank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndLogicalRank[Command::WRA][logicalRank.ID()] == 32)
+ if (lastBurstLengthByCommandAndLogicalRank[Command::WRA][logicalRank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_S_WTR_slr + tBURST16);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_S_WTR_slr);
}
- lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::WRA][physicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::WRA][physicalRank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndPhysicalRank[Command::WRA][physicalRank.ID()] == 32)
+ if (lastBurstLengthByCommandAndPhysicalRank[Command::WRA][physicalRank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_WTR_dlr + tBURST16);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_WTR_dlr);
}
lastCommandStart = lastScheduledByCommand[Command::WRA];
- if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::WRA][physicalRank.ID()]) // different physical rank
+ if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::WRA][physicalRank]) // different physical rank
{
- if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::WRA][dimmRank.ID()]) // same DIMM
+ if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::WRA][dimmRank]) // same DIMM
{
- if (lastBurstLengthByCommandAndDimmRank[Command::WRA][dimmRank.ID()] == 32)
+ if (lastBurstLengthByCommandAndDimmRank[Command::WRA][dimmRank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_dpr + tBURST16);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRD_dpr);
@@ -340,43 +345,43 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic
assert(!(burstLength == 32) || (memSpec->bitWidth == 4));
assert(burstLength <= memSpec->maxBurstLength);
- lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD);
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBankGroup[Command::RD][bankGroup.ID()] == 32)
+ if (lastBurstLengthByCommandAndBankGroup[Command::RD][bankGroup] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_L_RTW_slr + tBURST16);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_L_RTW_slr);
}
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RD][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RD][logicalRank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndLogicalRank[Command::RD][logicalRank.ID()] == 32)
+ if (lastBurstLengthByCommandAndLogicalRank[Command::RD][logicalRank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_S_RTW_slr + tBURST16);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_S_RTW_slr);
}
- lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RD][physicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RD][physicalRank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndPhysicalRank[Command::RD][physicalRank.ID()] == 32)
+ if (lastBurstLengthByCommandAndPhysicalRank[Command::RD][physicalRank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_RTW_dlr + tBURST16);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_RTW_dlr);
}
lastCommandStart = lastScheduledByCommand[Command::RD];
- if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::RD][physicalRank.ID()]) // different physical rank
+ if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::RD][physicalRank]) // different physical rank
{
- if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::RD][dimmRank.ID()]) // same DIMM
+ if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::RD][dimmRank]) // same DIMM
{
- if (lastBurstLengthByCommandAndDimmRank[Command::RD][dimmRank.ID()] == 32)
+ if (lastBurstLengthByCommandAndDimmRank[Command::RD][dimmRank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_dpr + tBURST16);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_dpr);
@@ -390,39 +395,39 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic
}
}
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBankGroup[Command::RDA][bankGroup.ID()] == 32)
+ if (lastBurstLengthByCommandAndBankGroup[Command::RDA][bankGroup] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_L_RTW_slr + tBURST16);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_L_RTW_slr);
}
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RDA][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RDA][logicalRank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndLogicalRank[Command::RDA][logicalRank.ID()] == 32)
+ if (lastBurstLengthByCommandAndLogicalRank[Command::RDA][logicalRank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_S_RTW_slr + tBURST16);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_S_RTW_slr);
}
- lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndPhysicalRank[Command::RDA][physicalRank.ID()] == 32)
+ if (lastBurstLengthByCommandAndPhysicalRank[Command::RDA][physicalRank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_RTW_dlr + tBURST16);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tCCD_RTW_dlr);
}
lastCommandStart = lastScheduledByCommand[Command::RDA];
- if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank.ID()]) // different physical rank
+ if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank]) // different physical rank
{
- if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::RDA][dimmRank.ID()]) // same DIMM
+ if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::RDA][dimmRank]) // same DIMM
{
- if (lastBurstLengthByCommandAndDimmRank[Command::RDA][dimmRank.ID()] == 32)
+ if (lastBurstLengthByCommandAndDimmRank[Command::RDA][dimmRank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_dpr + tBURST16);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDWR_dpr);
@@ -438,10 +443,10 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic
if (burstLength == 16 && memSpec->bitWidth == 4) // second WR requires RMW
{
- lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBank[Command::WR][bank.ID()] == 32)
+ if (lastBurstLengthByCommandAndBank[Command::WR][bank] == 32)
{
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST16 + memSpec->tCCD_L_WR_slr);
}
@@ -451,10 +456,10 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic
}
}
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()];
- if (lastCommandStart != lastScheduledByCommandAndBank[Command::WR][bank.ID()]) // different bank
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup];
+ if (lastCommandStart != lastScheduledByCommandAndBank[Command::WR][bank]) // different bank
{
- if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup.ID()] == 32)
+ if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup] == 32)
{
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST16 + memSpec->tCCD_M_WR_slr);
}
@@ -466,10 +471,10 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic
}
else // no RMW
{
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup.ID()] == 32)
+ if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup] == 32)
{
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST16 + memSpec->tCCD_L_WR2_slr);
}
@@ -480,25 +485,25 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic
}
}
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WR][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WR][logicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_S_WR_slr);
- lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::WR][physicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::WR][physicalRank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndPhysicalRank[Command::WR][physicalRank.ID()] == 32)
+ if (lastBurstLengthByCommandAndPhysicalRank[Command::WR][physicalRank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST32);
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_WR_dlr);
}
lastCommandStart = lastScheduledByCommand[Command::WR];
- if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::WR][physicalRank.ID()]) // different physical rank
+ if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::WR][physicalRank]) // different physical rank
{
- if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::WR][dimmRank.ID()]) // same DIMM
+ if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::WR][dimmRank]) // same DIMM
{
- if (lastBurstLengthByCommandAndDimmRank[Command::WR][dimmRank.ID()] == 32)
+ if (lastBurstLengthByCommandAndDimmRank[Command::WR][dimmRank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRWR_dpr + tBURST16);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRWR_dpr);
@@ -514,10 +519,10 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic
if (burstLength == 16 && memSpec->bitWidth == 4) // second WR requires RMW
{
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup.ID()] == 32)
+ if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup] == 32)
{
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST16 + memSpec->tCCD_M_WR_slr);
}
@@ -529,10 +534,10 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic
}
else // no RMW
{
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup.ID()] == 32)
+ if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup] == 32)
{
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST16 + memSpec->tCCD_L_WR2_slr);
}
@@ -543,25 +548,25 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic
}
}
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WRA][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WRA][logicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_S_WR_slr);
- lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::WRA][physicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::WRA][physicalRank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndPhysicalRank[Command::WRA][physicalRank.ID()] == 32)
+ if (lastBurstLengthByCommandAndPhysicalRank[Command::WRA][physicalRank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tBURST32);
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCD_WR_dlr);
}
lastCommandStart = lastScheduledByCommand[Command::WRA];
- if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::WRA][physicalRank.ID()]) // different physical rank
+ if (lastCommandStart != lastScheduledByCommandAndPhysicalRank[Command::WRA][physicalRank]) // different physical rank
{
- if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::WRA][dimmRank.ID()]) // same DIMM
+ if (lastCommandStart == lastScheduledByCommandAndDimmRank[Command::WRA][dimmRank]) // same DIMM
{
- if (lastBurstLengthByCommandAndDimmRank[Command::WRA][dimmRank.ID()] == 32)
+ if (lastBurstLengthByCommandAndDimmRank[Command::WRA][dimmRank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRWR_dpr + tBURST16);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRWR_dpr);
@@ -577,159 +582,159 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic
}
else if (command == Command::ACT)
{
- lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC);
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD_L_slr);
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::ACT][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::ACT][logicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD_S_slr);
- lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::ACT][physicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::ACT][physicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD_dlr);
- lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDAACT);
- lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBank[Command::WRA][bank.ID()] == 32)
+ if (lastBurstLengthByCommandAndBank[Command::WRA][bank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAACT + tBURST16);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAACT);
}
- lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - cmdLengthDiff);
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PREAB][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PREAB][logicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - cmdLengthDiff);
- lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::PRESB][bankInGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::PRESB][bankInGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - cmdLengthDiff);
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFAB][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFAB][logicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_slr - cmdLengthDiff);
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMAB][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMAB][logicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_slr - cmdLengthDiff);
// TODO: No tRFC_dlr and tRFC_dpr between REFAB and ACT?
- lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::REFSB][bankInGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::REFSB][bankInGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCsb_slr - cmdLengthDiff);
// TODO: No tRFCsb_dlr between REFSB and ACT?
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFSB][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFSB][logicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFSBRD_slr - cmdLengthDiff);
- lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFSB][physicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFSB][physicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFSBRD_dlr - cmdLengthDiff);
- lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::RFMSB][bankInGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::RFMSB][bankInGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCsb_slr - cmdLengthDiff);
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMSB][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMSB][logicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFSBRD_slr - cmdLengthDiff);
- lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RFMSB][physicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RFMSB][physicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFSBRD_dlr - cmdLengthDiff);
- if (last4ActivatesLogical[logicalRank.ID()].size() >= 4)
- earliestTimeToStart = std::max(earliestTimeToStart, last4ActivatesLogical[logicalRank.ID()].front()
+ if (last4ActivatesLogical[logicalRank].size() >= 4)
+ earliestTimeToStart = std::max(earliestTimeToStart, last4ActivatesLogical[logicalRank].front()
+ memSpec->tFAW_slr - memSpec->longCmdOffset);
- if (last4ActivatesPhysical[physicalRank.ID()].size() >= 4)
- earliestTimeToStart = std::max(earliestTimeToStart, last4ActivatesPhysical[physicalRank.ID()].front()
+ if (last4ActivatesPhysical[physicalRank].size() >= 4)
+ earliestTimeToStart = std::max(earliestTimeToStart, last4ActivatesPhysical[physicalRank].front()
+ memSpec->tFAW_dlr - memSpec->longCmdOffset);
}
else if (command == Command::PREPB)
{
- lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + cmdLengthDiff);
- lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + cmdLengthDiff);
- lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBank[Command::WR][bank.ID()] == 32)
+ if (lastBurstLengthByCommandAndBank[Command::WR][bank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + tBURST16 + cmdLengthDiff);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + cmdLengthDiff);
}
- lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREPB][physicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREPB][physicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD);
- lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREAB][physicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREAB][physicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD);
- lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PRESB][physicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PRESB][physicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD);
}
else if (command == Command::PREAB)
{
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::ACT][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::ACT][logicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + cmdLengthDiff);
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RD][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RD][logicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + cmdLengthDiff);
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RDA][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RDA][logicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + cmdLengthDiff);
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WR][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WR][logicalRank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndLogicalRank[Command::WR][logicalRank.ID()] == 32)
+ if (lastBurstLengthByCommandAndLogicalRank[Command::WR][logicalRank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + tBURST16 + cmdLengthDiff);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + cmdLengthDiff);
}
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WRA][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WRA][logicalRank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndLogicalRank[Command::WRA][logicalRank.ID()])
+ if (lastBurstLengthByCommandAndLogicalRank[Command::WRA][logicalRank])
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + tBURST16 + cmdLengthDiff);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + cmdLengthDiff);
}
- lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREPB][physicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREPB][physicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD);
- lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREAB][physicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREAB][physicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD);
@@ -737,94 +742,94 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic
}
else if (command == Command::PRESB)
{
- lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::ACT][bankInGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::ACT][bankInGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + cmdLengthDiff);
- lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::RD][bankInGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::RD][bankInGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + cmdLengthDiff);
- lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::RDA][bankInGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::RDA][bankInGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + cmdLengthDiff);
- lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::WR][bankInGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::WR][bankInGroup];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBankInGroup[Command::WR][bankInGroup.ID()] == 32)
+ if (lastBurstLengthByCommandAndBankInGroup[Command::WR][bankInGroup] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + tBURST16 + cmdLengthDiff);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + cmdLengthDiff);
}
- lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::WRA][bankInGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::WRA][bankInGroup];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBankInGroup[Command::WRA][bankInGroup.ID()] == 32)
+ if (lastBurstLengthByCommandAndBankInGroup[Command::WRA][bankInGroup] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + tBURST16 + cmdLengthDiff);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + cmdLengthDiff);
}
- lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREPB][physicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREPB][physicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD);
// PREA tRP
- lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PRESB][physicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PRESB][physicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD);
}
else if (command == Command::REFAB || command == Command::RFMAB)
{
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::ACT][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::ACT][logicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC + cmdLengthDiff);
- lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RDA][physicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDAACT + cmdLengthDiff);
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WRA][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::WRA][logicalRank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndLogicalRank[Command::WRA][logicalRank.ID()] == 32)
+ if (lastBurstLengthByCommandAndLogicalRank[Command::WRA][logicalRank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + tBURST16 + memSpec->tRP + cmdLengthDiff);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP + cmdLengthDiff);
}
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PREPB][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PREPB][logicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PREAB][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PREAB][logicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFAB][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFAB][logicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_slr);
- lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFAB][physicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFAB][physicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dlr);
- lastCommandStart = lastScheduledByCommandAndDimmRank[Command::REFAB][dimmRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndDimmRank[Command::REFAB][dimmRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dpr);
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMAB][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMAB][logicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_slr);
- lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RFMAB][physicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RFMAB][physicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dlr);
- lastCommandStart = lastScheduledByCommandAndDimmRank[Command::RFMAB][dimmRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndDimmRank[Command::RFMAB][dimmRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dpr);
@@ -833,87 +838,87 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic
}
else if (command == Command::REFSB || command == Command::RFMSB)
{
- lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::ACT][bankInGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::ACT][bankInGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC + cmdLengthDiff);
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::ACT][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::ACT][logicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD_L_slr + cmdLengthDiff);
- lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::RDA][bankInGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::RDA][bankInGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDAACT + cmdLengthDiff);
- lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::WRA][bankInGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::WRA][bankInGroup];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBankInGroup[Command::WRA][bankInGroup.ID()] == 32)
+ if (lastBurstLengthByCommandAndBankInGroup[Command::WRA][bankInGroup] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAACT + tBURST16 + cmdLengthDiff);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAACT + cmdLengthDiff);
}
- lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::PREPB][bankInGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::PREPB][bankInGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
// PREA tRP
- lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::PRESB][bankInGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::PRESB][bankInGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFAB][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFAB][logicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_slr);
// TODO: check this
- lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFAB][physicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFAB][physicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dlr);
// TODO: check this
- lastCommandStart = lastScheduledByCommandAndDimmRank[Command::REFAB][dimmRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndDimmRank[Command::REFAB][dimmRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dpr);
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMAB][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMAB][logicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_slr);
// TODO: check this
- lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RFMAB][physicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RFMAB][physicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dlr);
// TODO: check this
- lastCommandStart = lastScheduledByCommandAndDimmRank[Command::RFMAB][dimmRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndDimmRank[Command::RFMAB][dimmRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dpr);
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFSB][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFSB][logicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCsb_slr);
- lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFSB][physicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFSB][physicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCsb_dlr);
- lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMSB][logicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::RFMSB][logicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCsb_slr);
- lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RFMSB][physicalRank.ID()];
+ lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::RFMSB][physicalRank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCsb_dlr);
- if (last4ActivatesLogical[logicalRank.ID()].size() >= 4)
- earliestTimeToStart = std::max(earliestTimeToStart, last4ActivatesLogical[logicalRank.ID()].front()
+ if (last4ActivatesLogical[logicalRank].size() >= 4)
+ earliestTimeToStart = std::max(earliestTimeToStart, last4ActivatesLogical[logicalRank].front()
+ memSpec->tFAW_slr - memSpec->shortCmdOffset);
- if (last4ActivatesPhysical[physicalRank.ID()].size() >= 4)
- earliestTimeToStart = std::max(earliestTimeToStart, last4ActivatesPhysical[physicalRank.ID()].front()
+ if (last4ActivatesPhysical[physicalRank].size() >= 4)
+ earliestTimeToStart = std::max(earliestTimeToStart, last4ActivatesPhysical[physicalRank].front()
+ memSpec->tFAW_dlr - memSpec->shortCmdOffset);
}
else
@@ -935,34 +940,36 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, const tlm_generic
void CheckerDDR5::insert(Command command, const tlm_generic_payload& payload)
{
- Rank logicalRank = ControllerExtension::getRank(payload);
- Rank physicalRank = Rank(logicalRank.ID() / memSpec->logicalRanksPerPhysicalRank);
- Rank dimmRank = Rank(physicalRank.ID() / memSpec->physicalRanksPerDimmRank);
+ LogicalRank logicalRank = LogicalRank(ControllerExtension::getRank(payload));
+ PhysicalRank physicalRank = PhysicalRank(
+ static_cast(logicalRank) / memSpec->logicalRanksPerPhysicalRank);
+ DimmRank dimmRank = DimmRank(static_cast(physicalRank) / memSpec->physicalRanksPerDimmRank);
BankGroup bankGroup = ControllerExtension::getBankGroup(payload);
Bank bank = ControllerExtension::getBank(payload);
- Bank bankInGroup = Bank(logicalRank.ID() * memSpec->banksPerGroup + bank.ID() % memSpec->banksPerGroup);
+ Bank bankInGroup = Bank(static_cast(logicalRank) * memSpec->banksPerGroup
+ + static_cast(bank) % memSpec->banksPerGroup);
unsigned burstLength = ControllerExtension::getBurstLength(payload);
- PRINTDEBUGMESSAGE("CheckerDDR5", "Changing state on bank " + std::to_string(bank.ID())
+ PRINTDEBUGMESSAGE("CheckerDDR5", "Changing state on bank " + std::to_string(static_cast(bank))
+ " command is " + command.toString());
- lastScheduledByCommandAndDimmRank[command][dimmRank.ID()] = sc_time_stamp();
- lastScheduledByCommandAndPhysicalRank[command][physicalRank.ID()] = sc_time_stamp();
- lastScheduledByCommandAndLogicalRank[command][logicalRank.ID()] = sc_time_stamp();
- lastScheduledByCommandAndBankGroup[command][bankGroup.ID()] = sc_time_stamp();
- lastScheduledByCommandAndBank[command][bank.ID()] = sc_time_stamp();
+ lastScheduledByCommandAndDimmRank[command][dimmRank] = sc_time_stamp();
+ lastScheduledByCommandAndPhysicalRank[command][physicalRank] = sc_time_stamp();
+ lastScheduledByCommandAndLogicalRank[command][logicalRank] = sc_time_stamp();
+ lastScheduledByCommandAndBankGroup[command][bankGroup] = sc_time_stamp();
+ lastScheduledByCommandAndBank[command][bank] = sc_time_stamp();
lastScheduledByCommand[command] = sc_time_stamp();
- lastScheduledByCommandAndBankInGroup[command][bankInGroup.ID()] = sc_time_stamp();
+ lastScheduledByCommandAndBankInGroup[command][bankInGroup] = sc_time_stamp();
if (command.isCasCommand())
{
- lastBurstLengthByCommandAndDimmRank[command][dimmRank.ID()] = burstLength;
- lastBurstLengthByCommandAndPhysicalRank[command ][physicalRank.ID()] = burstLength;
- lastBurstLengthByCommandAndLogicalRank[command][logicalRank.ID()] = burstLength;
- lastBurstLengthByCommandAndBankGroup[command][bankGroup.ID()] = burstLength;
- lastBurstLengthByCommandAndBank[command][bank.ID()] = burstLength;
+ lastBurstLengthByCommandAndDimmRank[command][dimmRank] = burstLength;
+ lastBurstLengthByCommandAndPhysicalRank[command ][physicalRank] = burstLength;
+ lastBurstLengthByCommandAndLogicalRank[command][logicalRank] = burstLength;
+ lastBurstLengthByCommandAndBankGroup[command][bankGroup] = burstLength;
+ lastBurstLengthByCommandAndBank[command][bank] = burstLength;
lastBurstLengthByCommand[command] = burstLength;
- lastBurstLengthByCommandAndBankInGroup[command][bankInGroup.ID()] = burstLength;
+ lastBurstLengthByCommandAndBankInGroup[command][bankInGroup] = burstLength;
if (burstLength == 32)
{
@@ -975,13 +982,13 @@ void CheckerDDR5::insert(Command command, const tlm_generic_payload& payload)
if (command == Command::ACT || command == Command::REFSB || command == Command::RFMSB)
{
- if (last4ActivatesLogical[logicalRank.ID()].size() == 4)
- last4ActivatesLogical[logicalRank.ID()].pop();
- last4ActivatesLogical[logicalRank.ID()].push(lastCommandOnBus);
+ if (last4ActivatesLogical[logicalRank].size() == 4)
+ last4ActivatesLogical[logicalRank].pop();
+ last4ActivatesLogical[logicalRank].push(lastCommandOnBus);
- if (last4ActivatesPhysical[physicalRank.ID()].size() == 4)
- last4ActivatesPhysical[physicalRank.ID()].pop();
- last4ActivatesPhysical[physicalRank.ID()].push(lastCommandOnBus);
+ if (last4ActivatesPhysical[physicalRank].size() == 4)
+ last4ActivatesPhysical[physicalRank].pop();
+ last4ActivatesPhysical[physicalRank].push(lastCommandOnBus);
}
}
diff --git a/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.h b/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.h
index 96ca9291..db0c3144 100644
--- a/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.h
+++ b/extensions/standards/DDR5/DRAMSys/controller/checker/CheckerDDR5.h
@@ -57,28 +57,28 @@ public:
private:
const MemSpecDDR5 *memSpec;
- std::vector> lastScheduledByCommandAndDimmRank;
- std::vector> lastScheduledByCommandAndPhysicalRank;
- std::vector> lastScheduledByCommandAndLogicalRank;
- std::vector> lastScheduledByCommandAndBankGroup;
- std::vector> lastScheduledByCommandAndBank;
+ std::vector> lastScheduledByCommandAndDimmRank;
+ std::vector> lastScheduledByCommandAndPhysicalRank;
+ std::vector> lastScheduledByCommandAndLogicalRank;
+ std::vector> lastScheduledByCommandAndBankGroup;
+ std::vector> lastScheduledByCommandAndBank;
std::vector lastScheduledByCommand;
sc_core::sc_time lastCommandOnBus;
TimeInterval dummyCommandOnBus;
- std::vector> lastScheduledByCommandAndBankInGroup;
+ std::vector> lastScheduledByCommandAndBankInGroup;
- std::vector> last4ActivatesPhysical;
- std::vector> last4ActivatesLogical;
+ ControllerVector> last4ActivatesPhysical;
+ ControllerVector> last4ActivatesLogical;
- std::vector> lastBurstLengthByCommandAndDimmRank;
- std::vector> lastBurstLengthByCommandAndPhysicalRank;
- std::vector> lastBurstLengthByCommandAndLogicalRank;
- std::vector> lastBurstLengthByCommandAndBankGroup;
- std::vector> lastBurstLengthByCommandAndBank;
+ std::vector> lastBurstLengthByCommandAndDimmRank;
+ std::vector> lastBurstLengthByCommandAndPhysicalRank;
+ std::vector> lastBurstLengthByCommandAndLogicalRank;
+ std::vector> lastBurstLengthByCommandAndBankGroup;
+ std::vector> lastBurstLengthByCommandAndBank;
std::vector lastBurstLengthByCommand;
- std::vector> lastBurstLengthByCommandAndBankInGroup;
+ std::vector> lastBurstLengthByCommandAndBankInGroup;
// TODO: store BL of last RD and WR globally or for each hierarchy?
diff --git a/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp b/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp
index 16b69f06..f081e85a 100644
--- a/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp
+++ b/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.cpp
@@ -50,18 +50,18 @@ CheckerHBM3::CheckerHBM3(const Configuration &config)
if (memSpec == nullptr)
SC_REPORT_FATAL("CheckerHBM3", "Wrong MemSpec chosen");
- lastScheduledByCommandAndBank = std::vector>(
- Command::numberOfCommands(), std::vector(memSpec->banksPerChannel, scMaxTime));
- lastScheduledByCommandAndBankGroup = std::vector>(
- Command::numberOfCommands(), std::vector(memSpec->bankGroupsPerChannel, scMaxTime));
- lastScheduledByCommandAndRank = std::vector>(
- Command::numberOfCommands(), std::vector(memSpec->ranksPerChannel, scMaxTime));
+ lastScheduledByCommandAndBank = std::vector>(
+ Command::numberOfCommands(), ControllerVector(memSpec->banksPerChannel, scMaxTime));
+ lastScheduledByCommandAndBankGroup = std::vector>(
+ Command::numberOfCommands(), ControllerVector(memSpec->bankGroupsPerChannel, scMaxTime));
+ lastScheduledByCommandAndRank = std::vector>(
+ Command::numberOfCommands(), ControllerVector(memSpec->ranksPerChannel, scMaxTime));
lastScheduledByCommand = std::vector(Command::numberOfCommands(), scMaxTime);
lastCommandOnRasBus = scMaxTime;
lastCommandOnCasBus = scMaxTime;
- last4Activates = std::vector>(memSpec->ranksPerChannel);
+ last4Activates = ControllerVector>(memSpec->ranksPerChannel);
- bankwiseRefreshCounter = std::vector(memSpec->ranksPerChannel);
+ bankwiseRefreshCounter = ControllerVector(memSpec->ranksPerChannel);
tRDPDE = memSpec->tRL + memSpec->tPL + 2 * memSpec->tCK;
tRDSRE = memSpec->tRL + memSpec->tPL + 3 * memSpec->tCK;
@@ -83,682 +83,637 @@ sc_time CheckerHBM3::timeToSatisfyConstraints(Command command, const tlm_generic
if (command == Command::PREPB)
{
- lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP);
- lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE);
- lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD);
- lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD);
- lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK / 2);
+ if (lastCommandOnRasBus != scMaxTime)
+ earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK / 2);
}
else if (command == Command::RD)
{
- lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDRD + memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL);
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()];
- if (lastCommandStart != scMaxTime)
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL);
-
- lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS);
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL);
- lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS);
- lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDL);
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()];
- if (lastCommandStart != scMaxTime)
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDL);
-
- lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDS);
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDL);
- lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDS);
- lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnCasBus + memSpec->tCK);
+ if (lastCommandOnCasBus != scMaxTime)
+ earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnCasBus + memSpec->tCK);
}
else if (command == Command::WR)
{
- lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDWR + memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW);
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW);
- lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()];
- if (lastCommandStart != scMaxTime)
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW);
-
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()];
- if (lastCommandStart != scMaxTime)
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW);
-
- lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()];
- if (lastCommandStart != scMaxTime)
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW);
-
- lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL);
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()];
- if (lastCommandStart != scMaxTime)
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL);
-
- lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS);
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL);
- lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS);
- lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnCasBus + memSpec->tCK);
+ if (lastCommandOnCasBus != scMaxTime)
+ earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnCasBus + memSpec->tCK);
}
else if (command == Command::RDA)
{
- lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDRD + memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL);
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()];
- if (lastCommandStart != scMaxTime)
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL);
-
- lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS);
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL);
- lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS);
- lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL + 2 * memSpec->tCK +
std::max(memSpec->tWR - memSpec->tRTP, memSpec->tWTRL));
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDL);
- lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDS);
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDL);
- lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRRDS);
- lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnCasBus + memSpec->tCK);
+ if (lastCommandOnCasBus != scMaxTime)
+ earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnCasBus + memSpec->tCK);
}
else if (command == Command::WRA)
{
- lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCDWR + memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW);
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW);
- lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()];
- if (lastCommandStart != scMaxTime)
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW);
-
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()];
- if (lastCommandStart != scMaxTime)
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW);
-
- lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()];
- if (lastCommandStart != scMaxTime)
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTW);
-
- lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL);
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()];
- if (lastCommandStart != scMaxTime)
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL);
-
- lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS);
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDL);
- lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCCDS);
- lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnCasBus + memSpec->tCK);
+ if (lastCommandOnCasBus != scMaxTime)
+ earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnCasBus + memSpec->tCK);
}
else if (command == Command::ACT)
{
- lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC);
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDL);
- lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDS);
- lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart =
std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP - memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart =
std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP - memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP - memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP - memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC - memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB - memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::REFPB][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::REFPB][bankGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD - memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD - memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC - memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndBank[Command::RFMPB][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::RFMPB][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB);
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RFMPB][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD);
- lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank.ID()];
- if (lastCommandStart != scMaxTime)
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD);
-
- lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS - memSpec->tCK);
- if (last4Activates[rank.ID()].size() >= 4)
+ if (last4Activates[rank].size() >= 4)
earliestTimeToStart =
- std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW);
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK);
+ std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW);
+
+ if (lastCommandOnRasBus != scMaxTime)
+ earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK);
}
else if (command == Command::REFAB)
{
- lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC + memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP);
- lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP);
- lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
- lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
- lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
- lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
- lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB);
- lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
- lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB);
- lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS);
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK);
+ if (lastCommandOnRasBus != scMaxTime)
+ earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK);
}
else if (command == Command::PREAB)
{
- lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP);
- lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP);
- lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE);
- lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE);
- lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD);
- lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD);
- lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
- lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB);
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK / 2);
+ if (lastCommandOnRasBus != scMaxTime)
+ earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK / 2);
}
else if (command == Command::REFPB)
{
- lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC + memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDL + memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDS + memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRTP + memSpec->tRP);
- lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP);
- lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
- lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
- lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
- lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
- lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
- lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB);
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::REFPB][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD);
- lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
- if (lastCommandStart != scMaxTime)
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD);
-
- lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
- lastCommandStart = lastScheduledByCommandAndBank[Command::RFMPB][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::RFMPB][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB);
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RFMPB][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD);
- lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank.ID()];
- if (lastCommandStart != scMaxTime)
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD);
-
- lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS);
- lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank];
if (lastCommandStart != scMaxTime)
{
- if (bankwiseRefreshCounter[rank.ID()] == 0)
+ if (bankwiseRefreshCounter[rank] == 0)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD);
}
- if (last4Activates[rank.ID()].size() >= 4)
+ if (last4Activates[rank].size() >= 4)
earliestTimeToStart =
- std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW);
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK);
+ std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW);
+
+ if (lastCommandOnRasBus != scMaxTime)
+ earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK);
}
else if (command == Command::SREFEN)
{
- lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC + memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart =
std::max(earliestTimeToStart, lastCommandStart + std::max(memSpec->tRTP + memSpec->tRP, tRDSRE));
- lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP);
- lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
- lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
- lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
- lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
- lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB);
- lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS);
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK);
+ if (lastCommandOnRasBus != scMaxTime)
+ earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK);
}
else if (command == Command::RFMAB)
{
- lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC + memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
- lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB);
- lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
- lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB);
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK);
+ if (lastCommandOnRasBus != scMaxTime)
+ earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK);
}
else if (command == Command::RFMAB)
{
- lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRC + memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::ACT][bankGroup];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDL + memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRDS + memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
- lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB);
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::REFPB][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD);
- lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
- if (lastCommandStart != scMaxTime)
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD);
-
- lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RFMAB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
- lastCommandStart = lastScheduledByCommandAndBank[Command::RFMPB][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::RFMPB][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB);
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RFMPB][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD);
- lastCommandStart = lastScheduledByCommandAndRank[Command::RFMPB][rank.ID()];
- if (lastCommandStart != scMaxTime)
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD);
-
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK);
+ if (lastCommandOnRasBus != scMaxTime)
+ earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK);
}
else if (command == Command::PDEA)
{
- lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDE);
- lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDE);
- lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPDE);
- lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDE);
- lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PDXA][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE);
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK);
+ if (lastCommandOnRasBus != scMaxTime)
+ earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK);
}
else if (command == Command::PDEP)
{
- lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDE);
- lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tRDPDE);
- lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDE);
- lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PDXP][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE);
- lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS);
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK);
+ if (lastCommandOnRasBus != scMaxTime)
+ earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK);
}
else if (command == Command::PDXP)
{
- lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PDEP][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPD);
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK);
+ if (lastCommandOnRasBus != scMaxTime)
+ earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK);
}
else if (command == Command::PDXA)
{
- lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PDEA][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPD);
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK);
+ if (lastCommandOnRasBus != scMaxTime)
+ earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK);
}
else if (command == Command::SREFEX)
{
- lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEN][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKESR);
- earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK);
+ if (lastCommandOnRasBus != scMaxTime)
+ earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK);
}
else
{
@@ -778,12 +733,12 @@ void CheckerHBM3::insert(Command command, const tlm_generic_payload &payload)
BankGroup bankGroup = ControllerExtension::getBankGroup(payload);
Bank bank = ControllerExtension::getBank(payload);
- PRINTDEBUGMESSAGE("CheckerHBM3",
- "Changing state on bank " + std::to_string(bank.ID()) + " command is " + command.toString());
+ PRINTDEBUGMESSAGE("CheckerHBM3", "Changing state on bank " + std::to_string(static_cast(bank))
+ + " command is " + command.toString());
- lastScheduledByCommandAndBank[command][bank.ID()] = sc_time_stamp();
- lastScheduledByCommandAndBankGroup[command][bankGroup.ID()] = sc_time_stamp();
- lastScheduledByCommandAndRank[command][rank.ID()] = sc_time_stamp();
+ lastScheduledByCommandAndBank[command][bank] = sc_time_stamp();
+ lastScheduledByCommandAndBankGroup[command][bankGroup] = sc_time_stamp();
+ lastScheduledByCommandAndRank[command][rank] = sc_time_stamp();
lastScheduledByCommand[command] = sc_time_stamp();
if (command.isCasCommand())
@@ -795,13 +750,13 @@ void CheckerHBM3::insert(Command command, const tlm_generic_payload &payload)
if (command == Command::ACT || command == Command::REFPB)
{
- if (last4Activates[rank.ID()].size() == 4)
- last4Activates[rank.ID()].pop();
- last4Activates[rank.ID()].push(lastCommandOnRasBus);
+ if (last4Activates[rank].size() == 4)
+ last4Activates[rank].pop();
+ last4Activates[rank].push(lastCommandOnRasBus);
}
if (command == Command::REFPB)
- bankwiseRefreshCounter[rank.ID()] = (bankwiseRefreshCounter[rank.ID()] + 1) % memSpec->banksPerRank;
+ bankwiseRefreshCounter[rank] = (bankwiseRefreshCounter[rank] + 1) % memSpec->banksPerRank;
}
bool CheckerHBM3::isFullCycle(const sc_core::sc_time& time) const
diff --git a/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.h b/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.h
index 679b2aa5..979418a9 100644
--- a/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.h
+++ b/extensions/standards/HBM3/DRAMSys/controller/checker/CheckerHBM3.h
@@ -60,17 +60,17 @@ private:
const MemSpecHBM3 *memSpec;
- std::vector> lastScheduledByCommandAndBank;
- std::vector> lastScheduledByCommandAndBankGroup;
- std::vector> lastScheduledByCommandAndRank;
+ std::vector> lastScheduledByCommandAndBank;
+ std::vector> lastScheduledByCommandAndBankGroup;
+ std::vector> lastScheduledByCommandAndRank;
std::vector lastScheduledByCommand;
sc_core::sc_time lastCommandOnRasBus;
sc_core::sc_time lastCommandOnCasBus;
// Four activate window
- std::vector> last4Activates;
- std::vector bankwiseRefreshCounter;
+ ControllerVector> last4Activates;
+ ControllerVector bankwiseRefreshCounter;
const sc_core::sc_time scMaxTime = sc_core::sc_max_time();
sc_core::sc_time tRDPDE;
diff --git a/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.cpp b/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.cpp
index 81246e92..52edc578 100644
--- a/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.cpp
+++ b/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.cpp
@@ -51,23 +51,24 @@ CheckerLPDDR5::CheckerLPDDR5(const Configuration& config)
SC_REPORT_FATAL("CheckerLPDDR5", "Wrong MemSpec chosen");
else
{
- lastScheduledByCommandAndRank = std::vector>
- (Command::numberOfCommands(), std::vector(memSpec->ranksPerChannel, scMaxTime));
- lastScheduledByCommandAndBankGroup = std::vector>
- (Command::numberOfCommands(), std::vector(memSpec->bankGroupsPerChannel, scMaxTime));
- lastScheduledByCommandAndBank = std::vector>
- (Command::numberOfCommands(), std::vector(memSpec->banksPerChannel, scMaxTime));
+ lastScheduledByCommandAndRank = std::vector>
+ (Command::numberOfCommands(), ControllerVector(memSpec->ranksPerChannel, scMaxTime));
+ lastScheduledByCommandAndBankGroup = std::vector>
+ (Command::numberOfCommands(),
+ ControllerVector(memSpec->bankGroupsPerChannel, scMaxTime));
+ lastScheduledByCommandAndBank = std::vector>
+ (Command::numberOfCommands(), ControllerVector(memSpec->banksPerChannel, scMaxTime));
lastScheduledByCommand = std::vector(Command::numberOfCommands(), scMaxTime);
lastCommandOnBus = scMaxTime;
- last4Activates = std::vector>(memSpec->ranksPerChannel);
+ last4Activates = ControllerVector>(memSpec->ranksPerChannel);
- lastBurstLengthByCommandAndRank = std::vector>
- (Command::WRA + 1, std::vector(memSpec->ranksPerChannel));
- lastBurstLengthByCommandAndBankGroup = std::vector>
- (Command::WRA + 1, std::vector(memSpec->bankGroupsPerChannel));
- lastBurstLengthByCommandAndBank = std::vector>
- (Command::WRA + 1, std::vector(memSpec->banksPerChannel));
+ lastBurstLengthByCommandAndRank = std::vector>
+ (Command::WRA + 1, ControllerVector(memSpec->ranksPerChannel));
+ lastBurstLengthByCommandAndBankGroup = std::vector>
+ (Command::WRA + 1, ControllerVector(memSpec->bankGroupsPerChannel));
+ lastBurstLengthByCommandAndBank = std::vector>
+ (Command::WRA + 1, ControllerVector(memSpec->banksPerChannel));
lastBurstLengthByCommand = std::vector(Command::WRA + 1);
tBURST16 = 16 / memSpec->dataRate * memSpec->tCK;
@@ -92,23 +93,23 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
assert(!(memSpec->bankMode == MemSpecLPDDR5::BankMode::MBG) || (memSpec->dataRate == 8)); // BG mode -> 4:1 ratio
assert(burstLength <= memSpec->maxBurstLength);
- lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD_L + memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBankGroup[Command::RD][bankGroup.ID()] == 32)
+ if (lastBurstLengthByCommandAndBankGroup[Command::RD][bankGroup] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_L_32);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_L_16);
}
- lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndRank[Command::RD][rank.ID()] == 32)
+ if (lastBurstLengthByCommandAndRank[Command::RD][rank] == 32)
{
// TODO: model BG mode BL32 interleaved burst, remove this fix
if (memSpec->bankMode == MemSpecLPDDR5::BankMode::MBG)
@@ -120,7 +121,7 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_S_16);
}
- lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ?
+ lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ?
lastScheduledByCommand[Command::RD] : scMaxTime;
if (lastCommandStart != scMaxTime)
{
@@ -132,19 +133,19 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->tCK + memSpec->tRPST + memSpec->tRPRE);
}
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBankGroup[Command::RDA][bankGroup.ID()] == 32)
+ if (lastBurstLengthByCommandAndBankGroup[Command::RDA][bankGroup] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_L_32);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_L_16);
}
- lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndRank[Command::RDA][rank.ID()] == 32)
+ if (lastBurstLengthByCommandAndRank[Command::RDA][rank] == 32)
{
// TODO: model BG mode BL32 interleaved burst, remove this fix
if (memSpec->bankMode == MemSpecLPDDR5::BankMode::MBG)
@@ -156,7 +157,7 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_S_16);
}
- lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ?
+ lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ?
lastScheduledByCommand[Command::RDA] : scMaxTime;
if (lastCommandStart != scMaxTime)
{
@@ -169,10 +170,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->tCK + memSpec->tRPST + memSpec->tRPRE);
}
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup.ID()] == 32)
+ if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL
+ memSpec->BL_n_max_32 + memSpec->tWTR_L);
else
@@ -180,10 +181,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->BL_n_max_16 + memSpec->tWTR_L);
}
- lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndRank[Command::WR][rank.ID()] == 32)
+ if (lastBurstLengthByCommandAndRank[Command::WR][rank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL
+ memSpec->BL_n_min_32 + memSpec->tWTR_S);
else
@@ -191,7 +192,7 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->BL_n_min_16 + memSpec->tWTR_S);
}
- lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ?
+ lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ?
lastScheduledByCommand[Command::WR] : scMaxTime;
if (lastCommandStart != scMaxTime)
{
@@ -204,10 +205,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->tWL + memSpec->BL_n_min_16 + memSpec->tCK - memSpec->tRL);
}
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup.ID()] == 32)
+ if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL
+ memSpec->BL_n_max_32 + memSpec->tWTR_L);
else
@@ -215,10 +216,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->BL_n_max_16 + memSpec->tWTR_L);
}
- lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndRank[Command::WRA][rank.ID()] == 32)
+ if (lastBurstLengthByCommandAndRank[Command::WRA][rank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL
+ memSpec->BL_n_min_32 + memSpec->tWTR_S);
else
@@ -226,7 +227,7 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->BL_n_min_16 + memSpec->tWTR_S);
}
- lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ?
+ lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ?
lastScheduledByCommand[Command::WRA] : scMaxTime;
if (lastCommandStart != scMaxTime)
{
@@ -246,14 +247,14 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
assert(!(memSpec->bankMode == MemSpecLPDDR5::BankMode::MBG) || (memSpec->dataRate == 8)); // BG mode -> 4:1 ratio
assert(burstLength <= memSpec->maxBurstLength);
- lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCD_S + memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RD][bankGroup];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBankGroup[Command::RD][bankGroup.ID()] == 32)
+ if (lastBurstLengthByCommandAndBankGroup[Command::RD][bankGroup] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRL
+ memSpec->BL_n_max_32 + memSpec->tWCK2DQO - memSpec->tWL);
else
@@ -261,10 +262,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->BL_n_max_16 + memSpec->tWCK2DQO - memSpec->tWL);
}
- lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndRank[Command::RD][rank.ID()] == 32)
+ if (lastBurstLengthByCommandAndRank[Command::RD][rank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRL
+ memSpec->BL_n_min_32 + memSpec->tWCK2DQO - memSpec->tWL);
else
@@ -272,7 +273,7 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->BL_n_min_16 + memSpec->tWCK2DQO - memSpec->tWL);
}
- lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank.ID()] ?
+ lastCommandStart = lastScheduledByCommand[Command::RD] != lastScheduledByCommandAndRank[Command::RD][rank] ?
lastScheduledByCommand[Command::RD] : scMaxTime;
if (lastCommandStart != scMaxTime)
{
@@ -285,10 +286,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->tRL + memSpec->BL_n_min_16 + memSpec->tWCK2DQO + memSpec->tRPST - memSpec->tWL);
}
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::RDA][bankGroup];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBankGroup[Command::RDA][bankGroup.ID()] == 32)
+ if (lastBurstLengthByCommandAndBankGroup[Command::RDA][bankGroup] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRL
+ memSpec->BL_n_max_32 + memSpec->tWCK2DQO - memSpec->tWL);
else
@@ -296,10 +297,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->BL_n_max_16 + memSpec->tWCK2DQO - memSpec->tWL);
}
- lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndRank[Command::RDA][rank.ID()] == 32)
+ if (lastBurstLengthByCommandAndRank[Command::RDA][rank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRL
+ memSpec->BL_n_min_32 + memSpec->tWCK2DQO - memSpec->tWL);
else
@@ -307,7 +308,7 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->BL_n_min_16 + memSpec->tWCK2DQO - memSpec->tWL);
}
- lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank.ID()] ?
+ lastCommandStart = lastScheduledByCommand[Command::RDA] != lastScheduledByCommandAndRank[Command::RDA][rank] ?
lastScheduledByCommand[Command::RDA] : scMaxTime;
if (lastCommandStart != scMaxTime)
{
@@ -320,19 +321,19 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->tRL + memSpec->BL_n_min_16 + memSpec->tWCK2DQO + memSpec->tRPST - memSpec->tWL);
}
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WR][bankGroup];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup.ID()] == 32)
+ if (lastBurstLengthByCommandAndBankGroup[Command::WR][bankGroup] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_L_32);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_L_16);
}
- lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndRank[Command::WR][rank.ID()] == 32)
+ if (lastBurstLengthByCommandAndRank[Command::WR][rank] == 32)
{
// TODO: model BG mode BL32 interleaved burst, remove this fix
if (memSpec->bankMode == MemSpecLPDDR5::BankMode::MBG)
@@ -344,7 +345,7 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_S_16);
}
- lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank.ID()] ?
+ lastCommandStart = lastScheduledByCommand[Command::WR] != lastScheduledByCommandAndRank[Command::WR][rank] ?
lastScheduledByCommand[Command::WR] : scMaxTime;
if (lastCommandStart != scMaxTime)
{
@@ -355,19 +356,19 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_16 + memSpec->tCK);
}
- lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup.ID()];
+ lastCommandStart = lastScheduledByCommandAndBankGroup[Command::WRA][bankGroup];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup.ID()] == 32)
+ if (lastBurstLengthByCommandAndBankGroup[Command::WRA][bankGroup] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_L_32);
else
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_L_16);
}
- lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndRank[Command::WRA][rank.ID()] == 32)
+ if (lastBurstLengthByCommandAndRank[Command::WRA][rank] == 32)
{
// TODO: model BG mode BL32 interleaved burst, remove this fix
if (memSpec->bankMode == MemSpecLPDDR5::BankMode::MBG)
@@ -379,7 +380,7 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_S_16);
}
- lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank.ID()] ?
+ lastCommandStart = lastScheduledByCommand[Command::WRA] != lastScheduledByCommandAndRank[Command::WRA][rank] ?
lastScheduledByCommand[Command::WRA] : scMaxTime;
if (lastCommandStart != scMaxTime)
{
@@ -391,18 +392,18 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
}
else if (command == Command::ACT)
{
- lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb);
- lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD);
- lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBank[Command::RDA][bank.ID()] == 32)
+ if (lastBurstLengthByCommandAndBank[Command::RDA][bank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_32
+ memSpec->tRBTP + memSpec->tRPpb - memSpec->tCK);
else
@@ -410,10 +411,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->tRBTP + memSpec->tRPpb - memSpec->tCK);
}
- lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBank[Command::RDA][bank.ID()] == 32)
+ if (lastBurstLengthByCommandAndBank[Command::RDA][bank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL
+ memSpec->BL_n_min_32 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb - memSpec->tCK);
else
@@ -421,47 +422,47 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->BL_n_min_16 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb - memSpec->tCK);
}
- lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb - memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab - memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab - memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tpbR2act - memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndRank[Command::REFP2B][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::REFP2B][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tpbR2act - memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb - memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndBank[Command::REFP2B][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::REFP2B][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb - memSpec->tCK);
- if (last4Activates[rank.ID()].size() >= 4)
- earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW - memSpec->tCK);
+ if (last4Activates[rank].size() >= 4)
+ earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW - memSpec->tCK);
}
else if (command == Command::PREPB)
{
- lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::RD][bank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBank[Command::RD][bank.ID()] == 32)
+ if (lastBurstLengthByCommandAndBank[Command::RD][bank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_32
+ memSpec->tRBTP);
else
@@ -469,10 +470,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->tRBTP);
}
- lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::WR][bank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBank[Command::WR][bank.ID()] == 32)
+ if (lastBurstLengthByCommandAndBank[Command::WR][bank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL
+ memSpec->BL_n_min_32 + memSpec->tCK + memSpec->tWR);
else
@@ -480,20 +481,20 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->BL_n_min_16 + memSpec->tCK + memSpec->tWR);
}
- lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD);
}
else if (command == Command::PREAB)
{
- lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRAS + memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RD][rank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndRank[Command::RD][rank.ID()] == 32)
+ if (lastBurstLengthByCommandAndRank[Command::RD][rank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_32
+ memSpec->tRBTP);
else
@@ -501,10 +502,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->tRBTP);
}
- lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndRank[Command::RDA][rank.ID()] == 32)
+ if (lastBurstLengthByCommandAndRank[Command::RDA][rank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_32
+ memSpec->tRBTP);
else
@@ -512,10 +513,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->tRBTP);
}
- lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::WR][rank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndRank[Command::WR][rank.ID()] == 32)
+ if (lastBurstLengthByCommandAndRank[Command::WR][rank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL
+ memSpec->BL_n_min_32 + memSpec->tCK + memSpec->tWR);
else
@@ -523,10 +524,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->BL_n_min_16 + memSpec->tCK + memSpec->tWR);
}
- lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndRank[Command::WRA][rank.ID()] == 32)
+ if (lastBurstLengthByCommandAndRank[Command::WRA][rank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL
+ memSpec->BL_n_min_32 + memSpec->tCK + memSpec->tWR);
else
@@ -534,20 +535,20 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->BL_n_min_16 + memSpec->tCK + memSpec->tWR);
}
- lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD);
}
else if (command == Command::REFAB)
{
- lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb + memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::RDA][rank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndRank[Command::RDA][rank.ID()] == 32)
+ if (lastBurstLengthByCommandAndRank[Command::RDA][rank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_32
+ memSpec->tRBTP + memSpec->tRPpb);
else
@@ -555,10 +556,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->tRBTP + memSpec->tRPpb);
}
- lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::WRA][rank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndRank[Command::WRA][rank.ID()] == 32)
+ if (lastBurstLengthByCommandAndRank[Command::WRA][rank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL
+ memSpec->BL_n_min_32 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb);
else
@@ -566,32 +567,32 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->BL_n_min_16 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb);
}
- lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb);
- lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab);
- lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab);
}
else if (command == Command::REFPB)
{
- lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb + memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD + memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBank[Command::RDA][bank.ID()] == 32)
+ if (lastBurstLengthByCommandAndBank[Command::RDA][bank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_32
+ memSpec->tRBTP + memSpec->tRPpb);
else
@@ -599,10 +600,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->tRBTP + memSpec->tRPpb);
}
- lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBank[Command::WRA][bank.ID()] == 32)
+ if (lastBurstLengthByCommandAndBank[Command::WRA][bank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL
+ memSpec->BL_n_min_32 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb);
else
@@ -610,45 +611,45 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->BL_n_min_16 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb);
}
- lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb);
- lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab);
- lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb);
- lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tpbR2pbR);
- if (last4Activates[rank.ID()].size() >= 4)
- earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW);
+ if (last4Activates[rank].size() >= 4)
+ earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW);
}
else if (command == Command::REFP2B)
{
- Bank secondBank = Bank(bank.ID() + memSpec->getPer2BankOffset());
+ Bank secondBank = Bank(static_cast(bank) + memSpec->getPer2BankOffset());
- lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb + memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][secondBank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][secondBank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRCpb + memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD + memSpec->tCK);
- lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][bank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBank[Command::RDA][bank.ID()] == 32)
+ if (lastBurstLengthByCommandAndBank[Command::RDA][bank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_32
+ memSpec->tRBTP + memSpec->tRPpb);
else
@@ -656,10 +657,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->tRBTP + memSpec->tRPpb);
}
- lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][secondBank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::RDA][secondBank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBank[Command::RDA][secondBank.ID()] == 32)
+ if (lastBurstLengthByCommandAndBank[Command::RDA][secondBank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->BL_n_min_32
+ memSpec->tRBTP + memSpec->tRPpb);
else
@@ -667,10 +668,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->tRBTP + memSpec->tRPpb);
}
- lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][bank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBank[Command::WRA][bank.ID()] == 32)
+ if (lastBurstLengthByCommandAndBank[Command::WRA][bank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL
+ memSpec->BL_n_min_32 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb);
else
@@ -678,10 +679,10 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->BL_n_min_16 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb);
}
- lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][secondBank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::WRA][secondBank];
if (lastCommandStart != scMaxTime)
{
- if (lastBurstLengthByCommandAndBank[Command::WRA][secondBank.ID()] == 32)
+ if (lastBurstLengthByCommandAndBank[Command::WRA][secondBank] == 32)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tWL
+ memSpec->BL_n_min_32 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb);
else
@@ -689,28 +690,28 @@ sc_time CheckerLPDDR5::timeToSatisfyConstraints(Command command, const tlm_gener
+ memSpec->BL_n_min_16 + memSpec->tCK + memSpec->tWR + memSpec->tRPpb);
}
- lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb);
- lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][secondBank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][secondBank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb);
- lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab);
- lastCommandStart = lastScheduledByCommandAndBank[Command::REFP2B][bank.ID()];
+ lastCommandStart = lastScheduledByCommandAndBank[Command::REFP2B][bank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb);
- lastCommandStart = lastScheduledByCommandAndRank[Command::REFP2B][rank.ID()];
+ lastCommandStart = lastScheduledByCommandAndRank[Command::REFP2B][rank];
if (lastCommandStart != scMaxTime)
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tpbR2pbR);
- if (last4Activates[rank.ID()].size() >= 4)
- earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW);
+ if (last4Activates[rank].size() >= 4)
+ earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank].front() + memSpec->tFAW);
}
else
SC_REPORT_FATAL("CheckerLPDDR5", "Unknown command!");
@@ -729,33 +730,36 @@ void CheckerLPDDR5::insert(Command command, const tlm_generic_payload& payload)
Bank bank = ControllerExtension::getBank(payload);
unsigned burstLength = ControllerExtension::getBurstLength(payload);
- PRINTDEBUGMESSAGE("CheckerLPDDR5", "Changing state on bank " + std::to_string(bank.ID())
+ PRINTDEBUGMESSAGE("CheckerLPDDR5", "Changing state on bank " + std::to_string(static_cast(bank))
+ " command is " + command.toString());
- lastScheduledByCommandAndRank[command][rank.ID()] = sc_time_stamp();
- lastScheduledByCommandAndBankGroup[command][bankGroup.ID()] = sc_time_stamp();
- lastScheduledByCommandAndBank[command][bank.ID()] = sc_time_stamp();
+ lastScheduledByCommandAndRank[command][rank] = sc_time_stamp();
+ lastScheduledByCommandAndBankGroup[command][bankGroup] = sc_time_stamp();
+ lastScheduledByCommandAndBank[command][bank] = sc_time_stamp();
lastScheduledByCommand[command] = sc_time_stamp();
if (command.isCasCommand())
{
- lastBurstLengthByCommandAndRank[command][rank.ID()] = burstLength;
- lastBurstLengthByCommandAndBankGroup[command][bankGroup.ID()] = burstLength;
- lastBurstLengthByCommandAndBank[command][bank.ID()] = burstLength;
+ lastBurstLengthByCommandAndRank[command][rank] = burstLength;
+ lastBurstLengthByCommandAndBankGroup[command][bankGroup] = burstLength;
+ lastBurstLengthByCommandAndBank[command][bank] = burstLength;
lastBurstLengthByCommand[command] = burstLength;
}
if (command == Command::REFP2B)
- lastScheduledByCommandAndBank[command][bank.ID() + memSpec->getPer2BankOffset()] = sc_time_stamp();
+ {
+ Bank secondBank = Bank(static_cast(bank) + memSpec->getPer2BankOffset());
+ lastScheduledByCommandAndBank[command][secondBank] = sc_time_stamp();
+ }
lastCommandOnBus = sc_time_stamp() + memSpec->getCommandLength(command) - memSpec->tCK;
if (command == Command::ACT || command == Command::REFPB || command == Command::REFP2B
|| command == Command::RFMPB || command == Command::RFMP2B)
{
- if (last4Activates[rank.ID()].size() == 4)
- last4Activates[rank.ID()].pop();
- last4Activates[rank.ID()].push(lastCommandOnBus);
+ if (last4Activates[rank].size() == 4)
+ last4Activates[rank].pop();
+ last4Activates[rank].push(lastCommandOnBus);
}
}
diff --git a/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.h b/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.h
index 23ed17c2..7887dda3 100644
--- a/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.h
+++ b/extensions/standards/LPDDR5/DRAMSys/controller/checker/CheckerLPDDR5.h
@@ -57,16 +57,16 @@ public:
private:
const MemSpecLPDDR5 *memSpec;
- std::vector> lastScheduledByCommandAndRank;
- std::vector> lastScheduledByCommandAndBankGroup;
- std::vector> lastScheduledByCommandAndBank;
+ std::vector> lastScheduledByCommandAndRank;
+ std::vector> lastScheduledByCommandAndBankGroup;
+ std::vector> lastScheduledByCommandAndBank;
std::vector lastScheduledByCommand;
sc_core::sc_time lastCommandOnBus;
- std::vector> last4Activates;
+ ControllerVector> last4Activates;
- std::vector> lastBurstLengthByCommandAndRank;
- std::vector> lastBurstLengthByCommandAndBankGroup;
- std::vector> lastBurstLengthByCommandAndBank;
+ std::vector> lastBurstLengthByCommandAndRank;
+ std::vector> lastBurstLengthByCommandAndBankGroup;
+ std::vector> lastBurstLengthByCommandAndBank;
std::vector lastBurstLengthByCommand;
const sc_core::sc_time scMaxTime = sc_core::sc_max_time();
diff --git a/src/configuration/CMakeLists.txt b/src/configuration/CMakeLists.txt
index 8d875e41..d64f76a0 100644
--- a/src/configuration/CMakeLists.txt
+++ b/src/configuration/CMakeLists.txt
@@ -45,17 +45,16 @@ add_library(${PROJECT_NAME} STATIC ${SOURCE_FILES} ${HEADER_FILES})
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
-target_link_libraries(${PROJECT_NAME}
- PUBLIC
+target_link_libraries(${PROJECT_NAME}
+ PUBLIC
DRAMSys::util
)
-target_compile_definitions(${PROJECT_NAME}
- PUBLIC
+target_compile_definitions(${PROJECT_NAME}
+ PUBLIC
DRAMSYS_RESOURCE_DIR="${DRAMSYS_RESOURCE_DIR}"
)
add_library(DRAMSys::config ALIAS ${PROJECT_NAME})
-build_source_group()
-diagnostics_print(${PROJECT_NAME})
\ No newline at end of file
+build_source_group()
\ No newline at end of file
diff --git a/src/configuration/DRAMSys/config/DRAMSysConfiguration.h b/src/configuration/DRAMSys/config/DRAMSysConfiguration.h
index e899b19a..dce71332 100644
--- a/src/configuration/DRAMSys/config/DRAMSysConfiguration.h
+++ b/src/configuration/DRAMSys/config/DRAMSysConfiguration.h
@@ -62,13 +62,13 @@ namespace DRAMSys::Config {
struct Configuration
{
static constexpr std::string_view KEY = "simulation";
-
+
AddressMapping addressmapping;
McConfig mcconfig;
MemSpec memspec;
SimConfig simconfig;
std::string simulationid;
- std::optional tracesetup;
+ std::optional> tracesetup;
};
NLOHMANN_JSONIFY_ALL_THINGS(Configuration,
diff --git a/src/configuration/DRAMSys/config/TraceSetup.h b/src/configuration/DRAMSys/config/TraceSetup.h
index 8a4d9aa3..f59629d1 100644
--- a/src/configuration/DRAMSys/config/TraceSetup.h
+++ b/src/configuration/DRAMSys/config/TraceSetup.h
@@ -129,7 +129,7 @@ struct TrafficGenerator
std::optional maxTransactions;
std::optional dataLength;
std::optional dataAlignment;
-
+
uint64_t numRequests{};
double rwRatio{};
AddressDistribution addressDistribution;
@@ -201,8 +201,7 @@ struct TraceSetupConstants
static constexpr std::string_view SUB_DIR = "tracesetup";
};
-using TraceSetup = std::vector<
- std::variant>;
+using Initiator = std::variant;
} // namespace Configuration
diff --git a/src/libdramsys/CMakeLists.txt b/src/libdramsys/CMakeLists.txt
index f7ad7214..13819ab6 100644
--- a/src/libdramsys/CMakeLists.txt
+++ b/src/libdramsys/CMakeLists.txt
@@ -45,8 +45,8 @@ add_library(${PROJECT_NAME} STATIC ${SOURCE_FILES} ${HEADER_FILES})
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
-target_link_libraries(${PROJECT_NAME}
- PUBLIC
+target_link_libraries(${PROJECT_NAME}
+ PUBLIC
SystemC::systemc
DRAMSys::util
DRAMSys::config
@@ -61,4 +61,3 @@ endif ()
add_library(DRAMSys::libdramsys ALIAS ${PROJECT_NAME})
build_source_group()
-diagnostics_print(${PROJECT_NAME})
diff --git a/src/libdramsys/DRAMSys/common/TlmRecorder.cpp b/src/libdramsys/DRAMSys/common/TlmRecorder.cpp
index d2dbfe9a..a0b6410d 100644
--- a/src/libdramsys/DRAMSys/common/TlmRecorder.cpp
+++ b/src/libdramsys/DRAMSys/common/TlmRecorder.cpp
@@ -76,6 +76,9 @@ TlmRecorder::TlmRecorder(const std::string &name,
executeInitialSqlCommand();
prepareSqlStatements();
+ insertGeneralInfo();
+ insertCommandLengths();
+
PRINTDEBUGMESSAGE(name, "Starting new database transaction");
}
@@ -355,7 +358,7 @@ void TlmRecorder::prepareSqlStatements()
insertGeneralInfoString =
"INSERT INTO GeneralInfo VALUES"
- "(:numberOfTransactions, :end, :numberOfRanks, :numberOfBankGroups, :numberOfBanks, :clk, :unitOfTime, "
+ "(:numberOfRanks, :numberOfBankGroups, :numberOfBanks, :clk, :unitOfTime, "
":mcconfig, :memspec, :traces, :windowSize, :refreshMaxPostponed, :refreshMaxPulledin, :controllerThread, "
":maxBufferDepth, :per2BankOffset, :rowColumnCommandBus, :pseudoChannelMode)";
@@ -391,27 +394,25 @@ void TlmRecorder::insertDebugMessageInDB(const std::string &message, const sc_ti
void TlmRecorder::insertGeneralInfo()
{
- sqlite3_bind_int64(insertGeneralInfoStatement, 1, static_cast(totalNumTransactions));
- sqlite3_bind_int64(insertGeneralInfoStatement, 2, static_cast(simulationTimeCoveredByRecording.value()));
- sqlite3_bind_int(insertGeneralInfoStatement, 3, static_cast(config.memSpec->ranksPerChannel));
- sqlite3_bind_int(insertGeneralInfoStatement, 4, static_cast(config.memSpec->bankGroupsPerChannel));
- sqlite3_bind_int(insertGeneralInfoStatement, 5, static_cast(config.memSpec->banksPerChannel));
- sqlite3_bind_int64(insertGeneralInfoStatement, 6, static_cast(config.memSpec->tCK.value()));
- sqlite3_bind_text(insertGeneralInfoStatement, 7, "PS", 2, nullptr);
+ sqlite3_bind_int(insertGeneralInfoStatement, 1, static_cast(config.memSpec->ranksPerChannel));
+ sqlite3_bind_int(insertGeneralInfoStatement, 2, static_cast(config.memSpec->bankGroupsPerChannel));
+ sqlite3_bind_int(insertGeneralInfoStatement, 3, static_cast(config.memSpec->banksPerChannel));
+ sqlite3_bind_int64(insertGeneralInfoStatement, 4, static_cast(config.memSpec->tCK.value()));
+ sqlite3_bind_text(insertGeneralInfoStatement, 5, "PS", 2, nullptr);
- sqlite3_bind_text(insertGeneralInfoStatement, 8, mcconfig.c_str(), static_cast(mcconfig.length()), nullptr);
- sqlite3_bind_text(insertGeneralInfoStatement, 9, memspec.c_str(), static_cast(memspec.length()), nullptr);
- sqlite3_bind_text(insertGeneralInfoStatement, 10, traces.c_str(), static_cast(traces.length()), nullptr);
+ sqlite3_bind_text(insertGeneralInfoStatement, 6, mcconfig.c_str(), static_cast(mcconfig.length()), nullptr);
+ sqlite3_bind_text(insertGeneralInfoStatement, 7, memspec.c_str(), static_cast(memspec.length()), nullptr);
+ sqlite3_bind_text(insertGeneralInfoStatement, 8, traces.c_str(), static_cast(traces.length()), nullptr);
if (config.enableWindowing)
- sqlite3_bind_int64(insertGeneralInfoStatement, 11, static_cast((config.memSpec->tCK
+ sqlite3_bind_int64(insertGeneralInfoStatement, 9, static_cast((config.memSpec->tCK
* config.windowSize).value()));
else
- sqlite3_bind_int64(insertGeneralInfoStatement, 11, 0);
- sqlite3_bind_int(insertGeneralInfoStatement, 12, static_cast(config.refreshMaxPostponed));
- sqlite3_bind_int(insertGeneralInfoStatement, 13, static_cast(config.refreshMaxPulledin));
- sqlite3_bind_int(insertGeneralInfoStatement, 14, static_cast(UINT_MAX));
- sqlite3_bind_int(insertGeneralInfoStatement, 15, static_cast(config.requestBufferSize));
- sqlite3_bind_int(insertGeneralInfoStatement, 16, static_cast(config.memSpec->getPer2BankOffset()));
+ sqlite3_bind_int64(insertGeneralInfoStatement, 9, 0);
+ sqlite3_bind_int(insertGeneralInfoStatement, 10, static_cast(config.refreshMaxPostponed));
+ sqlite3_bind_int(insertGeneralInfoStatement, 11, static_cast(config.refreshMaxPulledin));
+ sqlite3_bind_int(insertGeneralInfoStatement, 12, static_cast(UINT_MAX));
+ sqlite3_bind_int(insertGeneralInfoStatement, 13, static_cast(config.requestBufferSize));
+ sqlite3_bind_int(insertGeneralInfoStatement, 14, static_cast(config.memSpec->getPer2BankOffset()));
const MemSpec& memSpec = *config.memSpec;
const auto memoryType = memSpec.memoryType;
@@ -425,8 +426,8 @@ void TlmRecorder::insertGeneralInfo()
return memSpec.pseudoChannelsPerChannel != 1;
}();
- sqlite3_bind_int(insertGeneralInfoStatement, 17, static_cast(rowColumnCommandBus));
- sqlite3_bind_int(insertGeneralInfoStatement, 18, static_cast(pseudoChannelMode));
+ sqlite3_bind_int(insertGeneralInfoStatement, 15, static_cast(rowColumnCommandBus));
+ sqlite3_bind_int(insertGeneralInfoStatement, 16, static_cast(pseudoChannelMode));
executeSqlStatement(insertGeneralInfoStatement);
}
@@ -453,9 +454,9 @@ void TlmRecorder::insertTransactionInDB(const Transaction &recordingData)
sqlite3_bind_int64(insertTransactionStatement, 3, static_cast(recordingData.address));
sqlite3_bind_int(insertTransactionStatement, 4, static_cast(recordingData.dataLength));
sqlite3_bind_int(insertTransactionStatement, 5,
- static_cast(recordingData.thread.ID()));
+ static_cast(recordingData.thread));
sqlite3_bind_int(insertTransactionStatement, 6,
- static_cast(recordingData.channel.ID()));
+ static_cast(recordingData.channel));
sqlite3_bind_int64(insertTransactionStatement, 7,
static_cast(recordingData.timeOfGeneration.value()));
sqlite3_bind_text(insertTransactionStatement, 8,
@@ -480,11 +481,11 @@ void TlmRecorder::insertPhaseInDB(const Transaction::Phase& phase, uint64_t tran
sqlite3_bind_int64(insertPhaseStatement, 3, static_cast(phase.interval.end.value()));
sqlite3_bind_int64(insertPhaseStatement, 4, static_cast(phase.intervalOnDataStrobe.start.value()));
sqlite3_bind_int64(insertPhaseStatement, 5, static_cast(phase.intervalOnDataStrobe.end.value()));
- sqlite3_bind_int(insertPhaseStatement, 6, static_cast(phase.rank.ID()));
- sqlite3_bind_int(insertPhaseStatement, 7, static_cast(phase.bankGroup.ID()));
- sqlite3_bind_int(insertPhaseStatement, 8, static_cast(phase.bank.ID()));
- sqlite3_bind_int(insertPhaseStatement, 9, static_cast(phase.row.ID()));
- sqlite3_bind_int(insertPhaseStatement, 10, static_cast(phase.column.ID()));
+ sqlite3_bind_int(insertPhaseStatement, 6, static_cast(phase.rank));
+ sqlite3_bind_int(insertPhaseStatement, 7, static_cast(phase.bankGroup));
+ sqlite3_bind_int(insertPhaseStatement, 8, static_cast(phase.bank));
+ sqlite3_bind_int(insertPhaseStatement, 9, static_cast(phase.row));
+ sqlite3_bind_int(insertPhaseStatement, 10, static_cast(phase.column));
sqlite3_bind_int(insertPhaseStatement, 11, static_cast(phase.burstLength));
sqlite3_bind_int64(insertPhaseStatement, 12, static_cast(transactionID));
executeSqlStatement(insertPhaseStatement);
@@ -522,8 +523,6 @@ void TlmRecorder::closeConnection()
storageThread.join();
std::swap(currentDataBuffer, storageDataBuffer);
commitRecordedDataToDB();
- insertGeneralInfo();
- insertCommandLengths();
PRINTDEBUGMESSAGE(name, "Number of transactions written to DB: "
+ std::to_string(totalNumTransactions));
PRINTDEBUGMESSAGE(name, "tlmPhaseRecorder:\tEnd Recording");
diff --git a/src/libdramsys/DRAMSys/common/TlmRecorder.h b/src/libdramsys/DRAMSys/common/TlmRecorder.h
index 4cbc705d..e5de03e4 100644
--- a/src/libdramsys/DRAMSys/common/TlmRecorder.h
+++ b/src/libdramsys/DRAMSys/common/TlmRecorder.h
@@ -206,8 +206,6 @@ private:
"); \n"
" \n"
"CREATE TABLE GeneralInfo( \n"
- " NumberOfTransactions INTEGER, \n"
- " TraceEnd INTEGER, \n"
" NumberOfRanks INTEGER, \n"
" NumberOfBankgroups INTEGER, \n"
" NumberOfBanks INTEGER, \n"
diff --git a/src/libdramsys/DRAMSys/common/dramExtensions.cpp b/src/libdramsys/DRAMSys/common/dramExtensions.cpp
index edbb1fb1..2e2bf907 100644
--- a/src/libdramsys/DRAMSys/common/dramExtensions.cpp
+++ b/src/libdramsys/DRAMSys/common/dramExtensions.cpp
@@ -272,99 +272,6 @@ unsigned ControllerExtension::getBurstLength(const tlm::tlm_generic_payload& tra
return trans.get_extension()->burstLength;
}
-//THREAD
-bool operator ==(const Thread &lhs, const Thread &rhs)
-{
- return lhs.ID() == rhs.ID();
-}
-
-bool operator !=(const Thread &lhs, const Thread &rhs)
-{
- return !(lhs == rhs);
-}
-
-bool operator <(const Thread &lhs, const Thread &rhs)
-{
- return lhs.ID() < rhs.ID();
-}
-
-//CHANNEL
-bool operator ==(const Channel &lhs, const Channel &rhs)
-{
- return lhs.ID() == rhs.ID();
-}
-
-bool operator !=(const Channel &lhs, const Channel &rhs)
-{
- return !(lhs == rhs);
-}
-
-//RANK
-bool operator ==(const Rank &lhs, const Rank &rhs)
-{
- return lhs.ID() == rhs.ID();
-}
-
-bool operator !=(const Rank &lhs, const Rank &rhs)
-{
- return !(lhs == rhs);
-}
-
-//BANKGROUP
-bool operator ==(const BankGroup &lhs, const BankGroup &rhs)
-{
- return lhs.ID() == rhs.ID();
-}
-
-bool operator !=(const BankGroup &lhs, const BankGroup &rhs)
-{
- return !(lhs == rhs);
-}
-
-//BANK
-bool operator ==(const Bank &lhs, const Bank &rhs)
-{
- return lhs.ID() == rhs.ID();
-}
-
-bool operator !=(const Bank &lhs, const Bank &rhs)
-{
- return !(lhs == rhs);
-}
-
-bool operator <(const Bank &lhs, const Bank &rhs)
-{
- return lhs.ID() < rhs.ID();
-}
-
-//ROW
-const Row Row::NO_ROW;
-
-bool operator ==(const Row &lhs, const Row &rhs)
-{
- if (lhs.isNoRow != rhs.isNoRow)
- return false;
- return lhs.ID() == rhs.ID();
-}
-
-bool operator !=(const Row &lhs, const Row &rhs)
-{
- return !(lhs == rhs);
-}
-
-
-//COLUMN
-bool operator ==(const Column &lhs, const Column &rhs)
-{
- return lhs.ID() == rhs.ID();
-}
-
-bool operator !=(const Column &lhs, const Column &rhs)
-{
- return !(lhs == rhs);
-}
-
-
tlm::tlm_extension_base* ChildExtension::clone() const
{
return new ChildExtension(*parentTrans);
diff --git a/src/libdramsys/DRAMSys/common/dramExtensions.h b/src/libdramsys/DRAMSys/common/dramExtensions.h
index 44745262..63765b8d 100644
--- a/src/libdramsys/DRAMSys/common/dramExtensions.h
+++ b/src/libdramsys/DRAMSys/common/dramExtensions.h
@@ -38,6 +38,7 @@
#define DRAMEXTENSIONS_H
#include
+#include
#include
#include
@@ -45,116 +46,36 @@
namespace DRAMSys
{
-class Thread
+enum class Thread : std::size_t;
+enum class Channel : std::size_t;
+enum class Rank : std::size_t;
+enum class LogicalRank : std::size_t;
+enum class PhysicalRank : std::size_t;
+enum class DimmRank : std::size_t;
+enum class BankGroup : std::size_t;
+enum class Bank : std::size_t;
+enum class Row : std::size_t;
+enum class Column : std::size_t;
+
+template
+class ControllerVector : private std::vector
{
public:
- explicit Thread(unsigned int id) : id(id) {}
+ using std::vector::vector;
+ using std::vector::push_back;
+ using std::vector::begin;
+ using std::vector::end;
+ using std::vector::front;
- [[nodiscard]] unsigned int ID() const
+ typename std::vector::const_reference operator[](IndexType index) const
{
- return id;
+ return std::vector::operator[](static_cast(index));
}
-private:
- unsigned int id;
-};
-
-class Channel
-{
-public:
- explicit Channel(unsigned int id) : id(id) {}
-
- [[nodiscard]] unsigned int ID() const
+ typename std::vector::reference operator[](IndexType index)
{
- return id;
+ return std::vector::operator[](static_cast(index));
}
-
-private:
- unsigned int id;
-};
-
-class Rank
-{
-public:
- explicit Rank(unsigned int id) : id(id) {}
-
- [[nodiscard]] unsigned int ID() const
- {
- return id;
- }
-
-private:
- unsigned int id;
-};
-
-class BankGroup
-{
-public:
- explicit BankGroup(unsigned int id) : id(id) {}
-
- [[nodiscard]] unsigned int ID() const
- {
- return id;
- }
-
-private:
- unsigned int id;
-};
-
-class Bank
-{
-public:
- explicit Bank(unsigned int id) : id(id) {}
-
- [[nodiscard]] unsigned int ID() const
- {
- return id;
- }
-
- [[nodiscard]] std::string toString() const
- {
- return std::to_string(id);
- }
-
-private:
- unsigned int id;
-};
-
-class Row
-{
-public:
- static const Row NO_ROW;
-
- Row() : id(0), isNoRow(true) {}
-
- explicit Row(unsigned int id) : id(id), isNoRow(false) {}
-
- [[nodiscard]] unsigned int ID() const
- {
- return id;
- }
-
- Row operator++();
-
-private:
- unsigned int id;
- bool isNoRow;
-
- friend bool operator==(const Row &lhs, const Row &rhs);
-};
-
-class Column
-{
-public:
- explicit Column(unsigned int id) : id(id) {}
-
- [[nodiscard]] unsigned int ID() const
- {
- return id;
- }
-
-private:
- unsigned int id;
};
class ArbiterExtension : public tlm::tlm_extension
@@ -231,30 +152,6 @@ private:
unsigned burstLength;
};
-
-bool operator==(const Thread &lhs, const Thread &rhs);
-bool operator!=(const Thread &lhs, const Thread &rhs);
-bool operator<(const Thread &lhs, const Thread &rhs);
-
-bool operator==(const Channel &lhs, const Channel &rhs);
-bool operator!=(const Channel &lhs, const Channel &rhs);
-
-bool operator==(const Rank &lhs, const Rank &rhs);
-bool operator!=(const Rank &lhs, const Rank &rhs);
-
-bool operator==(const BankGroup &lhs, const BankGroup &rhs);
-bool operator!=(const BankGroup &lhs, const BankGroup &rhs);
-
-bool operator==(const Bank &lhs, const Bank &rhs);
-bool operator!=(const Bank &lhs, const Bank &rhs);
-bool operator<(const Bank &lhs, const Bank &rhs);
-
-bool operator==(const Row &lhs, const Row &rhs);
-bool operator!=(const Row &lhs, const Row &rhs);
-
-bool operator==(const Column &lhs, const Column &rhs);
-bool operator!=(const Column &lhs, const Column &rhs);
-
class ChildExtension : public tlm::tlm_extension