Merge branch 'new_commands' into 'develop'
Add new commands for LPDDR5. See merge request ems/astdm/modeling.dram/dram.sys!332
This commit is contained in:
@@ -131,9 +131,12 @@ void TlmRecorder::recordPhase(tlm_generic_payload &trans,
|
||||
|
||||
if (currentTransactionsInSystem[&trans].cmd == 'X')
|
||||
{
|
||||
if (phase == END_REFA
|
||||
if (phase == END_REFAB
|
||||
|| phase == END_RFMAB
|
||||
|| phase == END_REFB
|
||||
|| phase == END_REFPB
|
||||
|| phase == END_RFMPB
|
||||
|| phase == END_REFP2B
|
||||
|| phase == END_RFMP2B
|
||||
|| phase == END_REFSB
|
||||
|| phase == END_RFMSB
|
||||
|| phase == END_PDNA
|
||||
@@ -298,12 +301,14 @@ void TlmRecorder::prepareSqlStatements()
|
||||
|
||||
insertGeneralInfoString =
|
||||
"INSERT INTO GeneralInfo VALUES"
|
||||
"(:numberOfTransactions,:end,:numberOfRanks,:numberOfBankgroups,:numberOfBanks,:clk,:unitOfTime,:mcconfig,:memspec,"
|
||||
":traces,:windowSize, :flexibleRefresh, :maxRefBurst, :controllerThread, :maxBufferDepth)";
|
||||
"(:numberOfTransactions, :end, :numberOfRanks, :numberOfBankGroups, :numberOfBanks, :clk, :unitOfTime, "
|
||||
":mcconfig, :memspec, :traces, :windowSize, :refreshMaxPostponed, :refreshMaxPulledin, :controllerThread, "
|
||||
":maxBufferDepth, :per2BankOffset)";
|
||||
|
||||
insertCommandLengthsString =
|
||||
"INSERT INTO CommandLengths VALUES"
|
||||
"(:NOP, :RD, :WR, :RDA, :WRA, :ACT, :PRE, :REFB, :PRESB, :REFSB, :RFMSB, :PREA, :REFA, :RFMAB, :PDEA, :PDXA, :PDEP, :PDXP, :SREFEN, :SREFEX)";
|
||||
"(:NOP, :RD, :WR, :RDA, :WRA, :ACT, :PREPB, :REFPB, :RFMPB, :REFP2B, :RFMP2B, :PRESB, :REFSB, :RFMSB, "
|
||||
":PREAB, :REFAB, :RFMAB, :PDEA, :PDXA, :PDEP, :PDXP, :SREFEN, :SREFEX)";
|
||||
|
||||
insertDebugMessageString =
|
||||
"INSERT INTO DebugMessages (Time,Message) Values (:time,:message)";
|
||||
@@ -340,7 +345,7 @@ void TlmRecorder::insertGeneralInfo()
|
||||
sqlite3_bind_int(insertGeneralInfoStatement, 3, static_cast<int>(Configuration::getInstance().memSpec->numberOfRanks));
|
||||
sqlite3_bind_int(insertGeneralInfoStatement, 4, static_cast<int>(Configuration::getInstance().memSpec->numberOfBankGroups));
|
||||
sqlite3_bind_int(insertGeneralInfoStatement, 5, static_cast<int>(Configuration::getInstance().memSpec->numberOfBanks));
|
||||
sqlite3_bind_int(insertGeneralInfoStatement, 6, static_cast<int>(Configuration::getInstance().memSpec->tCK.value()));
|
||||
sqlite3_bind_int64(insertGeneralInfoStatement, 6, static_cast<int64_t>(Configuration::getInstance().memSpec->tCK.value()));
|
||||
sqlite3_bind_text(insertGeneralInfoStatement, 7, "PS", 2, nullptr);
|
||||
|
||||
std::fstream mcconfig_stream, memspec_stream;
|
||||
@@ -352,28 +357,17 @@ void TlmRecorder::insertGeneralInfo()
|
||||
sqlite3_bind_text(insertGeneralInfoStatement, 8, mcconfig_dump.c_str(), static_cast<int>(mcconfig_dump.length()), nullptr);
|
||||
sqlite3_bind_text(insertGeneralInfoStatement, 9, memspec_dump.c_str(), static_cast<int>(memspec_dump.length()), nullptr);
|
||||
sqlite3_bind_text(insertGeneralInfoStatement, 10, traces.c_str(), static_cast<int>(traces.length()), nullptr);
|
||||
if (!Configuration::getInstance().enableWindowing)
|
||||
if (Configuration::getInstance().enableWindowing)
|
||||
sqlite3_bind_int64(insertGeneralInfoStatement, 11, static_cast<int64_t>((Configuration::getInstance().memSpec->tCK
|
||||
* Configuration::getInstance().windowSize).value()));
|
||||
else
|
||||
sqlite3_bind_int64(insertGeneralInfoStatement, 11, 0);
|
||||
else
|
||||
sqlite3_bind_int64(insertGeneralInfoStatement, 11,
|
||||
static_cast<int64_t>((Configuration::getInstance().memSpec->tCK *
|
||||
Configuration::getInstance().windowSize).value()));
|
||||
|
||||
if ((Configuration::getInstance().refreshMaxPostponed > 0)
|
||||
|| (Configuration::getInstance().refreshMaxPulledin > 0))
|
||||
{
|
||||
sqlite3_bind_int(insertGeneralInfoStatement, 12, 1);
|
||||
sqlite3_bind_int(insertGeneralInfoStatement, 13,
|
||||
static_cast<int>(std::max(Configuration::getInstance().refreshMaxPostponed,
|
||||
Configuration::getInstance().refreshMaxPulledin)));
|
||||
}
|
||||
else
|
||||
{
|
||||
sqlite3_bind_int(insertGeneralInfoStatement, 12, 0);
|
||||
sqlite3_bind_int(insertGeneralInfoStatement, 13, 0);
|
||||
}
|
||||
sqlite3_bind_int(insertGeneralInfoStatement, 14, static_cast<int>(UINT_MAX));
|
||||
sqlite3_bind_int(insertGeneralInfoStatement, 12, static_cast<int>(Configuration::getInstance().refreshMaxPostponed));
|
||||
sqlite3_bind_int(insertGeneralInfoStatement, 13, static_cast<int>(Configuration::getInstance().refreshMaxPulledin));
|
||||
sqlite3_bind_int64(insertGeneralInfoStatement, 14, static_cast<int64_t>(UINT64_MAX));
|
||||
sqlite3_bind_int(insertGeneralInfoStatement, 15, static_cast<int>(Configuration::getInstance().requestBufferSize));
|
||||
sqlite3_bind_int(insertGeneralInfoStatement, 16,
|
||||
static_cast<int>(Configuration::getInstance().memSpec->getPer2BankOffset()));
|
||||
executeSqlStatement(insertGeneralInfoStatement);
|
||||
}
|
||||
|
||||
@@ -387,20 +381,23 @@ void TlmRecorder::insertCommandLengths()
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 4, static_cast<int>(lround(memSpec->getCommandLength(Command::RDA) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 5, static_cast<int>(lround(memSpec->getCommandLength(Command::WRA) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 6, static_cast<int>(lround(memSpec->getCommandLength(Command::ACT) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 7, static_cast<int>(lround(memSpec->getCommandLength(Command::PRE) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 8, static_cast<int>(lround(memSpec->getCommandLength(Command::REFB) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 9, static_cast<int>(lround(memSpec->getCommandLength(Command::PRESB) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 10, static_cast<int>(lround(memSpec->getCommandLength(Command::REFSB) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 11, static_cast<int>(lround(memSpec->getCommandLength(Command::RFMSB) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 12, static_cast<int>(lround(memSpec->getCommandLength(Command::PREA) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 13, static_cast<int>(lround(memSpec->getCommandLength(Command::REFA) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 14, static_cast<int>(lround(memSpec->getCommandLength(Command::RFMAB) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 15, static_cast<int>(lround(memSpec->getCommandLength(Command::PDEA) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 16, static_cast<int>(lround(memSpec->getCommandLength(Command::PDXA) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 17, static_cast<int>(lround(memSpec->getCommandLength(Command::PDEP) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 18, static_cast<int>(lround(memSpec->getCommandLength(Command::PDXP) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 19, static_cast<int>(lround(memSpec->getCommandLength(Command::SREFEN) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 20, static_cast<int>(lround(memSpec->getCommandLength(Command::SREFEX) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 7, static_cast<int>(lround(memSpec->getCommandLength(Command::PREPB) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 8, static_cast<int>(lround(memSpec->getCommandLength(Command::REFPB) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 9, static_cast<int>(lround(memSpec->getCommandLength(Command::RFMPB) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 10, static_cast<int>(lround(memSpec->getCommandLength(Command::REFP2B) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 11, static_cast<int>(lround(memSpec->getCommandLength(Command::RFMP2B) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 12, static_cast<int>(lround(memSpec->getCommandLength(Command::PRESB) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 13, static_cast<int>(lround(memSpec->getCommandLength(Command::REFSB) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 14, static_cast<int>(lround(memSpec->getCommandLength(Command::RFMSB) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 15, static_cast<int>(lround(memSpec->getCommandLength(Command::PREAB) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 16, static_cast<int>(lround(memSpec->getCommandLength(Command::REFAB) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 17, static_cast<int>(lround(memSpec->getCommandLength(Command::RFMAB) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 18, static_cast<int>(lround(memSpec->getCommandLength(Command::PDEA) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 19, static_cast<int>(lround(memSpec->getCommandLength(Command::PDXA) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 20, static_cast<int>(lround(memSpec->getCommandLength(Command::PDEP) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 21, static_cast<int>(lround(memSpec->getCommandLength(Command::PDXP) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 22, static_cast<int>(lround(memSpec->getCommandLength(Command::SREFEN) / memSpec->tCK)));
|
||||
sqlite3_bind_int(insertCommandLengthsStatement, 23, static_cast<int>(lround(memSpec->getCommandLength(Command::SREFEX) / memSpec->tCK)));
|
||||
|
||||
executeSqlStatement(insertCommandLengthsStatement);
|
||||
}
|
||||
|
||||
@@ -60,10 +60,12 @@ public:
|
||||
{
|
||||
mcconfig = std::move(_mcconfig);
|
||||
}
|
||||
|
||||
void recordMemspec(std::string _memspec)
|
||||
{
|
||||
memspec = std::move(_memspec);
|
||||
}
|
||||
|
||||
void recordTraceNames(std::string _traces)
|
||||
{
|
||||
traces = std::move(_traces);
|
||||
@@ -179,10 +181,11 @@ private:
|
||||
" Memspec TEXT, \n"
|
||||
" Traces TEXT, \n"
|
||||
" WindowSize INTEGER, \n"
|
||||
" FlexibleRefresh INTEGER, \n"
|
||||
" MaxRefBurst INTEGER, \n"
|
||||
" RefreshMaxPostponed INTEGER, \n"
|
||||
" RefreshMaxPulledin INTEGER, \n"
|
||||
" ControllerThread INTEGER, \n"
|
||||
" MaxBufferDepth INTEGER \n"
|
||||
" MaxBufferDepth INTEGER, \n"
|
||||
" Per2BankOffset INTEGER \n"
|
||||
"); \n"
|
||||
" \n"
|
||||
"CREATE TABLE CommandLengths( \n"
|
||||
@@ -192,13 +195,16 @@ private:
|
||||
" RDA INTEGER, \n"
|
||||
" WRA INTEGER, \n"
|
||||
" ACT INTEGER, \n"
|
||||
" PRE INTEGER, \n"
|
||||
" REFB INTEGER, \n"
|
||||
" PREPB INTEGER, \n"
|
||||
" REFPB INTEGER, \n"
|
||||
" RFMPB INTEGER, \n"
|
||||
" REFP2B INTEGER, \n"
|
||||
" RFMP2B INTEGER, \n"
|
||||
" PRESB INTEGER, \n"
|
||||
" REFSB INTEGER, \n"
|
||||
" RFMSB INTEGER, \n"
|
||||
" PREA INTEGER, \n"
|
||||
" REFA INTEGER, \n"
|
||||
" PREAB INTEGER, \n"
|
||||
" REFAB INTEGER, \n"
|
||||
" RFMAB INTEGER, \n"
|
||||
" PDEA INTEGER, \n"
|
||||
" PDXA INTEGER, \n"
|
||||
|
||||
@@ -82,22 +82,33 @@ uint64_t MemSpec::getSimMemSizeInBytes() const
|
||||
|
||||
sc_time MemSpec::getRefreshIntervalAB() const
|
||||
{
|
||||
SC_REPORT_FATAL("MemSpec", "All bank refresh not supported");
|
||||
SC_REPORT_FATAL("MemSpec", "All-bank refresh not supported");
|
||||
return SC_ZERO_TIME;
|
||||
}
|
||||
|
||||
sc_time MemSpec::getRefreshIntervalPB() const
|
||||
{
|
||||
SC_REPORT_FATAL("MemSpec", "Per bank refresh not supported");
|
||||
SC_REPORT_FATAL("MemSpec", "Per-bank refresh not supported");
|
||||
return SC_ZERO_TIME;
|
||||
}
|
||||
|
||||
sc_time MemSpec::getRefreshIntervalP2B() const
|
||||
{
|
||||
SC_REPORT_FATAL("MemSpec", "Per-2-bank refresh not supported");
|
||||
return SC_ZERO_TIME;
|
||||
}
|
||||
|
||||
sc_time MemSpec::getRefreshIntervalSB() const
|
||||
{
|
||||
SC_REPORT_FATAL("MemSpec", "Same bank refresh not supported");
|
||||
SC_REPORT_FATAL("MemSpec", "Same-bank refresh not supported");
|
||||
return SC_ZERO_TIME;
|
||||
}
|
||||
|
||||
unsigned MemSpec::getPer2BankOffset() const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned MemSpec::getRAACDR() const
|
||||
{
|
||||
SC_REPORT_FATAL("MemSpec", "Refresh Management not supported");
|
||||
|
||||
@@ -78,8 +78,11 @@ public:
|
||||
|
||||
virtual sc_core::sc_time getRefreshIntervalAB() const;
|
||||
virtual sc_core::sc_time getRefreshIntervalPB() const;
|
||||
virtual sc_core::sc_time getRefreshIntervalP2B() const;
|
||||
virtual sc_core::sc_time getRefreshIntervalSB() const;
|
||||
|
||||
virtual unsigned getPer2BankOffset() const;
|
||||
|
||||
virtual unsigned getRAAIMT() const;
|
||||
virtual unsigned getRAAMMT() const;
|
||||
virtual unsigned getRAACDR() const;
|
||||
|
||||
@@ -121,7 +121,7 @@ sc_time MemSpecDDR3::getRefreshIntervalAB() const
|
||||
// Returns the execution time for commands that have a fixed execution time
|
||||
sc_time MemSpecDDR3::getExecutionTime(Command command, const tlm_generic_payload &) const
|
||||
{
|
||||
if (command == Command::PRE || command == Command::PREA)
|
||||
if (command == Command::PREPB || command == Command::PREAB)
|
||||
return tRP;
|
||||
else if (command == Command::ACT)
|
||||
return tRCD;
|
||||
@@ -133,7 +133,7 @@ sc_time MemSpecDDR3::getExecutionTime(Command command, const tlm_generic_payload
|
||||
return tWL + burstDuration;
|
||||
else if (command == Command::WRA)
|
||||
return tWL + burstDuration + tWR + tRP;
|
||||
else if (command == Command::REFA)
|
||||
else if (command == Command::REFAB)
|
||||
return tRFC;
|
||||
else
|
||||
{
|
||||
|
||||
@@ -140,7 +140,7 @@ sc_time MemSpecDDR4::getRefreshIntervalAB() const
|
||||
// Returns the execution time for commands that have a fixed execution time
|
||||
sc_time MemSpecDDR4::getExecutionTime(Command command, const tlm_generic_payload &) const
|
||||
{
|
||||
if (command == Command::PRE || command == Command::PREA)
|
||||
if (command == Command::PREPB || command == Command::PREAB)
|
||||
return tRP;
|
||||
else if (command == Command::ACT)
|
||||
return tRCD;
|
||||
@@ -152,7 +152,7 @@ sc_time MemSpecDDR4::getExecutionTime(Command command, const tlm_generic_payload
|
||||
return tWL + burstDuration;
|
||||
else if (command == Command::WRA)
|
||||
return tWL + burstDuration + tWR + tRP;
|
||||
else if (command == Command::REFA)
|
||||
else if (command == Command::REFAB)
|
||||
return tRFC;
|
||||
else
|
||||
{
|
||||
|
||||
@@ -130,14 +130,14 @@ MemSpecDDR5::MemSpecDDR5(json &memspec)
|
||||
else if (cmdMode == 2)
|
||||
{
|
||||
commandLengthInCycles[Command::ACT] = 4;
|
||||
commandLengthInCycles[Command::PRE] = 2;
|
||||
commandLengthInCycles[Command::PREA] = 2;
|
||||
commandLengthInCycles[Command::PREPB] = 2;
|
||||
commandLengthInCycles[Command::PREAB] = 2;
|
||||
commandLengthInCycles[Command::PRESB] = 2;
|
||||
commandLengthInCycles[Command::RD] = 4;
|
||||
commandLengthInCycles[Command::RDA] = 4;
|
||||
commandLengthInCycles[Command::WR] = 4;
|
||||
commandLengthInCycles[Command::WRA] = 4;
|
||||
commandLengthInCycles[Command::REFA] = 2;
|
||||
commandLengthInCycles[Command::REFAB] = 2;
|
||||
commandLengthInCycles[Command::RFMAB] = 2;
|
||||
commandLengthInCycles[Command::REFSB] = 2;
|
||||
commandLengthInCycles[Command::RFMSB] = 2;
|
||||
@@ -209,7 +209,7 @@ unsigned MemSpecDDR5::getRAAMMT() const
|
||||
// Returns the execution time for commands that have a fixed execution time
|
||||
sc_time MemSpecDDR5::getExecutionTime(Command command, const tlm_generic_payload &payload) const
|
||||
{
|
||||
if (command == Command::PRE || command == Command::PREA || command == Command::PRESB)
|
||||
if (command == Command::PREPB || command == Command::PREAB || command == Command::PRESB)
|
||||
return tRP + shortCmdOffset;
|
||||
else if (command == Command::ACT)
|
||||
return tRCD + longCmdOffset;
|
||||
@@ -236,7 +236,7 @@ sc_time MemSpecDDR5::getExecutionTime(Command command, const tlm_generic_payload
|
||||
else
|
||||
return tWL + tBURST16 + tWR + tRP + longCmdOffset;
|
||||
}
|
||||
else if (command == Command::REFA || command == Command::RFMAB)
|
||||
else if (command == Command::REFAB || command == Command::RFMAB)
|
||||
return tRFC_slr + shortCmdOffset;
|
||||
else if (command == Command::REFSB || command == Command::RFMSB)
|
||||
return tRFCsb_slr + shortCmdOffset;
|
||||
|
||||
@@ -122,7 +122,7 @@ sc_time MemSpecGDDR5::getRefreshIntervalPB() const
|
||||
|
||||
sc_time MemSpecGDDR5::getExecutionTime(Command command, const tlm_generic_payload &payload) const
|
||||
{
|
||||
if (command == Command::PRE || command == Command::PREA)
|
||||
if (command == Command::PREPB || command == Command::PREAB)
|
||||
return tRP;
|
||||
else if (command == Command::ACT)
|
||||
{
|
||||
@@ -139,9 +139,9 @@ sc_time MemSpecGDDR5::getExecutionTime(Command command, const tlm_generic_payloa
|
||||
return tWL + tWCK2CKPIN + tWCK2CK + tWCK2DQI + burstDuration;
|
||||
else if (command == Command::WRA)
|
||||
return tWL + burstDuration + tWR + tRP;
|
||||
else if (command == Command::REFA)
|
||||
else if (command == Command::REFAB)
|
||||
return tRFC;
|
||||
else if (command == Command::REFB)
|
||||
else if (command == Command::REFPB)
|
||||
return tRFCPB;
|
||||
else
|
||||
{
|
||||
|
||||
@@ -121,7 +121,7 @@ sc_time MemSpecGDDR5X::getRefreshIntervalPB() const
|
||||
|
||||
sc_time MemSpecGDDR5X::getExecutionTime(Command command, const tlm_generic_payload &payload) const
|
||||
{
|
||||
if (command == Command::PRE || command == Command::PREA)
|
||||
if (command == Command::PREPB || command == Command::PREAB)
|
||||
return tRP;
|
||||
else if (command == Command::ACT)
|
||||
{
|
||||
@@ -138,9 +138,9 @@ sc_time MemSpecGDDR5X::getExecutionTime(Command command, const tlm_generic_paylo
|
||||
return tWL + tWCK2CKPIN + tWCK2CK + tWCK2DQI + burstDuration;
|
||||
else if (command == Command::WRA)
|
||||
return tWL + burstDuration + tWR + tRP;
|
||||
else if (command == Command::REFA)
|
||||
else if (command == Command::REFAB)
|
||||
return tRFC;
|
||||
else if (command == Command::REFB)
|
||||
else if (command == Command::REFPB)
|
||||
return tRFCPB;
|
||||
else
|
||||
{
|
||||
|
||||
@@ -55,6 +55,7 @@ MemSpecGDDR6::MemSpecGDDR6(json &memspec)
|
||||
parseUint(memspec["memarchitecturespec"], "nbrOfBankGroups")
|
||||
* parseUint(memspec["memarchitecturespec"],"nbrOfRanks"),
|
||||
1),
|
||||
per2BankOffset(parseUint(memspec["memarchitecturespec"], "per2BankOffset")),
|
||||
tRP (tCK * parseUint(memspec["memtimingspec"], "RP")),
|
||||
tRAS (tCK * parseUint(memspec["memtimingspec"], "RAS")),
|
||||
tRC (tCK * parseUint(memspec["memtimingspec"], "RC")),
|
||||
@@ -79,9 +80,9 @@ MemSpecGDDR6::MemSpecGDDR6(json &memspec)
|
||||
tCKESR (tCK * parseUint(memspec["memtimingspec"], "CKESR")),
|
||||
tXP (tCK * parseUint(memspec["memtimingspec"], "XP")),
|
||||
tREFI (tCK * parseUint(memspec["memtimingspec"], "REFI")),
|
||||
tREFIPB (tCK * parseUint(memspec["memtimingspec"], "REFIPB")),
|
||||
tRFC (tCK * parseUint(memspec["memtimingspec"], "RFC")),
|
||||
tRFCPB (tCK * parseUint(memspec["memtimingspec"], "RFCPB")),
|
||||
tREFIpb (tCK * parseUint(memspec["memtimingspec"], "REFIpb")),
|
||||
tRFCab (tCK * parseUint(memspec["memtimingspec"], "RFCab")),
|
||||
tRFCpb (tCK * parseUint(memspec["memtimingspec"], "RFCpb")),
|
||||
tRREFD (tCK * parseUint(memspec["memtimingspec"], "RREFD")),
|
||||
tXS (tCK * parseUint(memspec["memtimingspec"], "XS")),
|
||||
tFAW (tCK * parseUint(memspec["memtimingspec"], "FAW")),
|
||||
@@ -119,12 +120,22 @@ sc_time MemSpecGDDR6::getRefreshIntervalAB() const
|
||||
|
||||
sc_time MemSpecGDDR6::getRefreshIntervalPB() const
|
||||
{
|
||||
return tREFIPB;
|
||||
return tREFIpb;
|
||||
}
|
||||
|
||||
sc_time MemSpecGDDR6::getRefreshIntervalP2B() const
|
||||
{
|
||||
return tREFIpb;
|
||||
}
|
||||
|
||||
unsigned MemSpecGDDR6::getPer2BankOffset() const
|
||||
{
|
||||
return per2BankOffset;
|
||||
}
|
||||
|
||||
sc_time MemSpecGDDR6::getExecutionTime(Command command, const tlm_generic_payload &payload) const
|
||||
{
|
||||
if (command == Command::PRE || command == Command::PREA)
|
||||
if (command == Command::PREPB || command == Command::PREAB)
|
||||
return tRP;
|
||||
else if (command == Command::ACT)
|
||||
{
|
||||
@@ -141,10 +152,10 @@ sc_time MemSpecGDDR6::getExecutionTime(Command command, const tlm_generic_payloa
|
||||
return tWL + tWCK2CKPIN + tWCK2CK + tWCK2DQI + burstDuration;
|
||||
else if (command == Command::WRA)
|
||||
return tWL + burstDuration + tWR + tRP;
|
||||
else if (command == Command::REFA)
|
||||
return tRFC;
|
||||
else if (command == Command::REFB)
|
||||
return tRFCPB;
|
||||
else if (command == Command::REFAB)
|
||||
return tRFCab;
|
||||
else if (command == Command::REFPB || command == Command::REFP2B)
|
||||
return tRFCpb;
|
||||
else
|
||||
{
|
||||
SC_REPORT_FATAL("getExecutionTime",
|
||||
|
||||
@@ -70,9 +70,9 @@ public:
|
||||
const sc_core::sc_time tCKESR;
|
||||
const sc_core::sc_time tXP;
|
||||
const sc_core::sc_time tREFI;
|
||||
const sc_core::sc_time tREFIPB;
|
||||
const sc_core::sc_time tRFC;
|
||||
const sc_core::sc_time tRFCPB;
|
||||
const sc_core::sc_time tREFIpb;
|
||||
const sc_core::sc_time tRFCab;
|
||||
const sc_core::sc_time tRFCpb;
|
||||
const sc_core::sc_time tRREFD;
|
||||
const sc_core::sc_time tXS;
|
||||
const sc_core::sc_time tFAW;
|
||||
@@ -90,9 +90,14 @@ public:
|
||||
|
||||
sc_core::sc_time getRefreshIntervalAB() const override;
|
||||
sc_core::sc_time getRefreshIntervalPB() const override;
|
||||
sc_core::sc_time getRefreshIntervalP2B() const override;
|
||||
unsigned getPer2BankOffset() const override;
|
||||
|
||||
sc_core::sc_time getExecutionTime(Command command, const tlm::tlm_generic_payload &payload) const override;
|
||||
TimeInterval getIntervalOnDataStrobe(Command command, const tlm::tlm_generic_payload &payload) const override;
|
||||
|
||||
private:
|
||||
unsigned per2BankOffset;
|
||||
};
|
||||
|
||||
#endif // MEMSPECGDDR6_H
|
||||
|
||||
@@ -124,7 +124,7 @@ bool MemSpecHBM2::hasRasAndCasBus() const
|
||||
|
||||
sc_time MemSpecHBM2::getExecutionTime(Command command, const tlm_generic_payload &payload) const
|
||||
{
|
||||
if (command == Command::PRE || command == Command::PREA)
|
||||
if (command == Command::PREPB || command == Command::PREAB)
|
||||
return tRP;
|
||||
else if (command == Command::ACT)
|
||||
{
|
||||
@@ -141,9 +141,9 @@ sc_time MemSpecHBM2::getExecutionTime(Command command, const tlm_generic_payload
|
||||
return tWL + burstDuration;
|
||||
else if (command == Command::WRA)
|
||||
return tWL + burstDuration + tWR + tRP;
|
||||
else if (command == Command::REFA)
|
||||
else if (command == Command::REFAB)
|
||||
return tRFC;
|
||||
else if (command == Command::REFB)
|
||||
else if (command == Command::REFPB)
|
||||
return tRFCSB;
|
||||
else
|
||||
{
|
||||
|
||||
@@ -86,14 +86,14 @@ MemSpecLPDDR4::MemSpecLPDDR4(json &memspec)
|
||||
tRTRS (tCK * parseUint(memspec["memtimingspec"], "RTRS"))
|
||||
{
|
||||
commandLengthInCycles[Command::ACT] = 4;
|
||||
commandLengthInCycles[Command::PRE] = 2;
|
||||
commandLengthInCycles[Command::PREA] = 2;
|
||||
commandLengthInCycles[Command::PREPB] = 2;
|
||||
commandLengthInCycles[Command::PREAB] = 2;
|
||||
commandLengthInCycles[Command::RD] = 4;
|
||||
commandLengthInCycles[Command::RDA] = 4;
|
||||
commandLengthInCycles[Command::WR] = 4;
|
||||
commandLengthInCycles[Command::WRA] = 4;
|
||||
commandLengthInCycles[Command::REFA] = 2;
|
||||
commandLengthInCycles[Command::REFB] = 2;
|
||||
commandLengthInCycles[Command::REFAB] = 2;
|
||||
commandLengthInCycles[Command::REFPB] = 2;
|
||||
commandLengthInCycles[Command::SREFEN] = 2;
|
||||
commandLengthInCycles[Command::SREFEX] = 2;
|
||||
|
||||
@@ -128,9 +128,9 @@ sc_time MemSpecLPDDR4::getRefreshIntervalPB() const
|
||||
|
||||
sc_time MemSpecLPDDR4::getExecutionTime(Command command, const tlm_generic_payload &) const
|
||||
{
|
||||
if (command == Command::PRE)
|
||||
if (command == Command::PREPB)
|
||||
return tRPpb + tCK;
|
||||
else if (command == Command::PREA)
|
||||
else if (command == Command::PREAB)
|
||||
return tRPab + tCK;
|
||||
else if (command == Command::ACT)
|
||||
return tRCD + 3 * tCK;
|
||||
@@ -142,9 +142,9 @@ sc_time MemSpecLPDDR4::getExecutionTime(Command command, const tlm_generic_paylo
|
||||
return tWL + tDQSS + tDQS2DQ + burstDuration + 3 * tCK;
|
||||
else if (command == Command::WRA)
|
||||
return tWL + 4 * tCK + burstDuration + tWR + tRPpb;
|
||||
else if (command == Command::REFA)
|
||||
else if (command == Command::REFAB)
|
||||
return tRFCab + tCK;
|
||||
else if (command == Command::REFB)
|
||||
else if (command == Command::REFPB)
|
||||
return tRFCpb + tCK;
|
||||
else
|
||||
{
|
||||
|
||||
@@ -101,7 +101,7 @@ MemSpecSTTMRAM::MemSpecSTTMRAM(json &memspec)
|
||||
// Returns the execution time for commands that have a fixed execution time
|
||||
sc_time MemSpecSTTMRAM::getExecutionTime(Command command, const tlm_generic_payload &) const
|
||||
{
|
||||
if (command == Command::PRE || command == Command::PREA)
|
||||
if (command == Command::PREPB || command == Command::PREAB)
|
||||
return tRP;
|
||||
else if (command == Command::ACT)
|
||||
return tRCD;
|
||||
|
||||
@@ -126,7 +126,7 @@ sc_time MemSpecWideIO::getRefreshIntervalAB() const
|
||||
// Returns the execution time for commands that have a fixed execution time
|
||||
sc_time MemSpecWideIO::getExecutionTime(Command command, const tlm_generic_payload &) const
|
||||
{
|
||||
if (command == Command::PRE || command == Command::PREA)
|
||||
if (command == Command::PREPB || command == Command::PREAB)
|
||||
return tRP;
|
||||
else if (command == Command::ACT)
|
||||
return tRCD;
|
||||
@@ -138,7 +138,7 @@ sc_time MemSpecWideIO::getExecutionTime(Command command, const tlm_generic_paylo
|
||||
return tWL + burstDuration;
|
||||
else if (command == Command::WRA)
|
||||
return tWL + burstDuration - tCK + tWR + tRP;
|
||||
else if (command == Command::REFA)
|
||||
else if (command == Command::REFAB)
|
||||
return tRFC;
|
||||
else
|
||||
{
|
||||
|
||||
@@ -113,9 +113,9 @@ sc_time MemSpecWideIO2::getRefreshIntervalPB() const
|
||||
// Returns the execution time for commands that have a fixed execution time
|
||||
sc_time MemSpecWideIO2::getExecutionTime(Command command, const tlm_generic_payload &) const
|
||||
{
|
||||
if (command == Command::PRE)
|
||||
if (command == Command::PREPB)
|
||||
return tRPpb;
|
||||
else if (command == Command::PREA)
|
||||
else if (command == Command::PREAB)
|
||||
return tRPab;
|
||||
else if (command == Command::ACT)
|
||||
return tRCD;
|
||||
@@ -127,9 +127,9 @@ sc_time MemSpecWideIO2::getExecutionTime(Command command, const tlm_generic_payl
|
||||
return tWL + tDQSS + burstDuration;
|
||||
else if (command == Command::WRA)
|
||||
return tWL + burstDuration + tCK + tWR + tRPpb;
|
||||
else if (command == Command::REFA)
|
||||
else if (command == Command::REFAB)
|
||||
return tRFCab;
|
||||
else if (command == Command::REFB)
|
||||
else if (command == Command::REFPB)
|
||||
return tRFCpb;
|
||||
else
|
||||
{
|
||||
|
||||
@@ -63,7 +63,7 @@ void BankMachine::updateState(Command command)
|
||||
openRow = DramExtension::getRow(currentPayload);
|
||||
refreshManagementCounter++;
|
||||
break;
|
||||
case Command::PRE: case Command::PREA: case Command::PRESB:
|
||||
case Command::PREPB: case Command::PRESB: case Command::PREAB:
|
||||
state = State::Precharged;
|
||||
break;
|
||||
case Command::RD: case Command::WR:
|
||||
@@ -76,7 +76,7 @@ void BankMachine::updateState(Command command)
|
||||
case Command::PDEA: case Command::PDEP: case Command::SREFEN:
|
||||
sleeping = true;
|
||||
break;
|
||||
case Command::REFA: case Command::REFB: case Command::REFSB:
|
||||
case Command::REFPB: case Command::REFP2B: case Command::REFSB: case Command::REFAB:
|
||||
sleeping = false;
|
||||
blocked = false;
|
||||
|
||||
@@ -88,7 +88,7 @@ void BankMachine::updateState(Command command)
|
||||
refreshManagementCounter = 0;
|
||||
}
|
||||
break;
|
||||
case Command::RFMAB: case Command::RFMSB:
|
||||
case Command::RFMPB: case Command::RFMP2B: case Command::RFMSB: case Command::RFMAB:
|
||||
sleeping = false;
|
||||
blocked = false;
|
||||
|
||||
@@ -182,7 +182,7 @@ sc_time BankMachineOpen::start()
|
||||
SC_REPORT_FATAL("BankMachine", "Wrong TLM command");
|
||||
}
|
||||
else // row miss
|
||||
nextCommand = Command::PRE;
|
||||
nextCommand = Command::PREPB;
|
||||
}
|
||||
timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, currentPayload);
|
||||
}
|
||||
@@ -259,7 +259,7 @@ sc_time BankMachineOpenAdaptive::start()
|
||||
}
|
||||
}
|
||||
else // row miss
|
||||
nextCommand = Command::PRE;
|
||||
nextCommand = Command::PREPB;
|
||||
}
|
||||
timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, currentPayload);
|
||||
}
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
* Janik Schlemminger
|
||||
* Robert Gernhardt
|
||||
* Matthias Jung
|
||||
* Lukas Steiner
|
||||
*/
|
||||
|
||||
#include <array>
|
||||
@@ -45,58 +46,65 @@ Command::Command(Command::Type type) : type(type) {}
|
||||
|
||||
Command::Command(tlm_phase phase)
|
||||
{
|
||||
assert(phase >= BEGIN_RD && phase <= END_SREF);
|
||||
assert(phase >= BEGIN_NOP && phase <= END_SREF);
|
||||
static constexpr std::array<Command::Type, Command::Type::END_ENUM> commandOfPhase =
|
||||
{
|
||||
Command::RD, // 1
|
||||
Command::WR, // 2
|
||||
Command::RDA, // 3
|
||||
Command::WRA, // 4
|
||||
Command::ACT, // 5
|
||||
Command::PRE, // 6
|
||||
Command::REFB, // 7
|
||||
Command::PRESB, // 8
|
||||
Command::REFSB, // 9
|
||||
Command::RFMSB, // 10
|
||||
Command::PREA, // 11
|
||||
Command::REFA, // 12
|
||||
Command::RFMAB, // 13
|
||||
Command::PDEA, // 14
|
||||
Command::PDEP, // 15
|
||||
Command::SREFEN,// 16
|
||||
Command::PDXA, // 17
|
||||
Command::PDXP, // 18
|
||||
Command::SREFEX // 19
|
||||
};
|
||||
type = commandOfPhase[phase - BEGIN_RD];
|
||||
{
|
||||
Command::NOP, // 0
|
||||
Command::RD, // 1
|
||||
Command::WR, // 2
|
||||
Command::RDA, // 3
|
||||
Command::WRA, // 4
|
||||
Command::ACT, // 5
|
||||
Command::PREPB, // 6
|
||||
Command::REFPB, // 7
|
||||
Command::RFMPB, // 8
|
||||
Command::REFP2B, // 9
|
||||
Command::RFMP2B, // 10
|
||||
Command::PRESB, // 11
|
||||
Command::REFSB, // 12
|
||||
Command::RFMSB, // 13
|
||||
Command::PREAB, // 14
|
||||
Command::REFAB, // 15
|
||||
Command::RFMAB, // 16
|
||||
Command::PDEA, // 17
|
||||
Command::PDEP, // 18
|
||||
Command::SREFEN, // 19
|
||||
Command::PDXA, // 20
|
||||
Command::PDXP, // 21
|
||||
Command::SREFEX // 22
|
||||
};
|
||||
type = commandOfPhase[phase - BEGIN_NOP];
|
||||
}
|
||||
|
||||
std::string Command::toString() const
|
||||
{
|
||||
assert(type >= Command::NOP && type <= Command::SREFEX);
|
||||
static std::array<std::string, Command::Type::END_ENUM> stringOfCommand =
|
||||
{
|
||||
"NOP", // 0
|
||||
"RD", // 1
|
||||
"WR", // 2
|
||||
"RDA", // 3
|
||||
"WRA", // 4
|
||||
"ACT", // 5
|
||||
"PRE", // 6
|
||||
"REFB", // 7
|
||||
"PRESB", // 8
|
||||
"REFSB", // 9
|
||||
"RFMSB", // 10
|
||||
"PREA", // 11
|
||||
"REFA", // 12
|
||||
"RFMAB", // 13
|
||||
"PDEA", // 14
|
||||
"PDEP", // 15
|
||||
"SREFEN", // 16
|
||||
"PDXA", // 17
|
||||
"PDXP", // 18
|
||||
"SREFEX" // 19
|
||||
};
|
||||
{
|
||||
"NOP", // 0
|
||||
"RD", // 1
|
||||
"WR", // 2
|
||||
"RDA", // 3
|
||||
"WRA", // 4
|
||||
"ACT", // 5
|
||||
"PREPB", // 6
|
||||
"REFPB", // 7
|
||||
"RFMPB", // 8
|
||||
"REFP2B", // 9
|
||||
"RFMP2B", // 10
|
||||
"PRESB", // 11
|
||||
"REFSB", // 12
|
||||
"RFMSB", // 13
|
||||
"PREAB", // 14
|
||||
"REFAB", // 15
|
||||
"RFMAB", // 16
|
||||
"PDEA", // 17
|
||||
"PDEP", // 18
|
||||
"SREFEN", // 19
|
||||
"PDXA", // 20
|
||||
"PDXP", // 21
|
||||
"SREFEX" // 22
|
||||
};
|
||||
return stringOfCommand[type];
|
||||
}
|
||||
|
||||
@@ -109,75 +117,88 @@ tlm_phase Command::toPhase() const
|
||||
{
|
||||
assert(type >= Command::NOP && type <= Command::SREFEX);
|
||||
static std::array<tlm_phase, Command::Type::END_ENUM> phaseOfCommand =
|
||||
{
|
||||
UNINITIALIZED_PHASE, // 0
|
||||
BEGIN_RD, // 1
|
||||
BEGIN_WR, // 2
|
||||
BEGIN_RDA, // 3
|
||||
BEGIN_WRA, // 4
|
||||
BEGIN_ACT, // 5
|
||||
BEGIN_PRE, // 6
|
||||
BEGIN_REFB, // 7
|
||||
BEGIN_PRESB, // 8
|
||||
BEGIN_REFSB, // 9
|
||||
BEGIN_RFMSB, // 10
|
||||
BEGIN_PREA, // 11
|
||||
BEGIN_REFA, // 12
|
||||
BEGIN_RFMAB, // 13
|
||||
BEGIN_PDNA, // 14
|
||||
BEGIN_PDNP, // 15
|
||||
BEGIN_SREF, // 16
|
||||
END_PDNA, // 17
|
||||
END_PDNP, // 18
|
||||
END_SREF // 19
|
||||
};
|
||||
{
|
||||
BEGIN_NOP, // 0
|
||||
BEGIN_RD, // 1
|
||||
BEGIN_WR, // 2
|
||||
BEGIN_RDA, // 3
|
||||
BEGIN_WRA, // 4
|
||||
BEGIN_ACT, // 5
|
||||
BEGIN_PREPB, // 6
|
||||
BEGIN_REFPB, // 7
|
||||
BEGIN_RFMPB, // 8
|
||||
BEGIN_REFP2B, // 9
|
||||
BEGIN_RFMP2B, // 10
|
||||
BEGIN_PRESB, // 11
|
||||
BEGIN_REFSB, // 12
|
||||
BEGIN_RFMSB, // 13
|
||||
BEGIN_PREAB, // 14
|
||||
BEGIN_REFAB, // 15
|
||||
BEGIN_RFMAB, // 16
|
||||
BEGIN_PDNA, // 17
|
||||
BEGIN_PDNP, // 18
|
||||
BEGIN_SREF, // 19
|
||||
END_PDNA, // 20
|
||||
END_PDNP, // 21
|
||||
END_SREF // 22
|
||||
};
|
||||
return phaseOfCommand[type];
|
||||
}
|
||||
|
||||
MemCommand::cmds phaseToDRAMPowerCommand(tlm_phase phase)
|
||||
{
|
||||
// TODO: add correct phases when DRAMPower supports DDR5 same bank refresh
|
||||
assert(phase >= BEGIN_RD && phase <= END_SREF);
|
||||
assert(phase >= BEGIN_NOP && phase <= END_SREF);
|
||||
static std::array<MemCommand::cmds, Command::Type::END_ENUM> phaseOfCommand =
|
||||
{
|
||||
MemCommand::RD, // 1
|
||||
MemCommand::WR, // 2
|
||||
MemCommand::RDA, // 3
|
||||
MemCommand::WRA, // 4
|
||||
MemCommand::ACT, // 5
|
||||
MemCommand::PRE, // 6
|
||||
MemCommand::REFB, // 7
|
||||
MemCommand::NOP, // 8
|
||||
MemCommand::NOP, // 9
|
||||
MemCommand::NOP, // 10
|
||||
MemCommand::PREA, // 11
|
||||
MemCommand::REF, // 12
|
||||
MemCommand::NOP, // 13
|
||||
MemCommand::PDN_S_ACT, // 14
|
||||
MemCommand::PDN_S_PRE, // 15
|
||||
MemCommand::SREN, // 16
|
||||
MemCommand::PUP_ACT, // 17
|
||||
MemCommand::PUP_PRE, // 18
|
||||
MemCommand::SREX // 19
|
||||
};
|
||||
return phaseOfCommand[phase - BEGIN_RD];
|
||||
{
|
||||
MemCommand::NOP, // 0
|
||||
MemCommand::RD, // 1
|
||||
MemCommand::WR, // 2
|
||||
MemCommand::RDA, // 3
|
||||
MemCommand::WRA, // 4
|
||||
MemCommand::ACT, // 5
|
||||
MemCommand::PRE, // 6, PREPB
|
||||
MemCommand::REFB, // 7, REFPB
|
||||
MemCommand::NOP, // 8, RFMPB
|
||||
MemCommand::NOP, // 9, REFP2B
|
||||
MemCommand::NOP, // 10, RFMP2B
|
||||
MemCommand::NOP, // 11, PRESB
|
||||
MemCommand::NOP, // 12, REFSB
|
||||
MemCommand::NOP, // 13, RFMSB
|
||||
MemCommand::PREA, // 14, PREAB
|
||||
MemCommand::REF, // 15, REFAB
|
||||
MemCommand::NOP, // 16, RFMAB
|
||||
MemCommand::PDN_S_ACT, // 17
|
||||
MemCommand::PDN_S_PRE, // 18
|
||||
MemCommand::SREN, // 19
|
||||
MemCommand::PUP_ACT, // 20
|
||||
MemCommand::PUP_PRE, // 21
|
||||
MemCommand::SREX // 22
|
||||
};
|
||||
return phaseOfCommand[phase - BEGIN_NOP];
|
||||
}
|
||||
|
||||
bool phaseNeedsEnd(tlm_phase phase)
|
||||
{
|
||||
return (phase >= BEGIN_RD && phase <= BEGIN_RFMAB);
|
||||
return (phase >= BEGIN_NOP && phase <= BEGIN_RFMAB);
|
||||
}
|
||||
|
||||
tlm_phase getEndPhase(tlm_phase phase)
|
||||
{
|
||||
assert(phase >= BEGIN_RD && phase <= BEGIN_RFMAB);
|
||||
return (phase + Command::Type::END_ENUM - 1);
|
||||
assert(phase >= BEGIN_NOP && phase <= BEGIN_RFMAB);
|
||||
return (phase + Command::Type::END_ENUM);
|
||||
}
|
||||
|
||||
bool Command::isBankCommand() const
|
||||
{
|
||||
assert(type >= Command::NOP && type <= Command::SREFEX);
|
||||
return (type <= Command::REFB);
|
||||
return (type <= Command::RFMPB);
|
||||
}
|
||||
|
||||
bool Command::is2BankCommand() const
|
||||
{
|
||||
assert(type >= Command::NOP && type <= Command::SREFEX);
|
||||
return (type >= Command::REFP2B && type <= Command::RFMP2B);
|
||||
}
|
||||
|
||||
bool Command::isGroupCommand() const
|
||||
@@ -189,7 +210,7 @@ bool Command::isGroupCommand() const
|
||||
bool Command::isRankCommand() const
|
||||
{
|
||||
assert(type >= Command::NOP && type <= Command::SREFEX);
|
||||
return (type >= Command::PREA);
|
||||
return (type >= Command::PREAB);
|
||||
}
|
||||
|
||||
bool Command::isCasCommand() const
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
* Authors:
|
||||
* Janik Schlemminger
|
||||
* Matthias Jung
|
||||
* Lukas Steiner
|
||||
*/
|
||||
#ifndef COMMAND_H
|
||||
#define COMMAND_H
|
||||
@@ -46,72 +47,83 @@
|
||||
|
||||
// DO NOT CHANGE THE ORDER!
|
||||
|
||||
// BEGIN_REQ // 1
|
||||
// END_REQ // 2
|
||||
// BEGIN_RESP // 3
|
||||
// END_RESP // 4
|
||||
// BEGIN_REQ // 1
|
||||
// END_REQ // 2
|
||||
// BEGIN_RESP // 3
|
||||
// END_RESP // 4
|
||||
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_RD); // 5
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_WR); // 6
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_RDA); // 7
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_WRA); // 8
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_ACT); // 9
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_PRE); // 10
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_REFB); // 11
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_PRESB); // 12
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_REFSB); // 13
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_RFMSB); // 14
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_PREA); // 15
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_REFA); // 16
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_RFMAB); // 17
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_PDNA); // 18
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_PDNP); // 19
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_SREF); // 20
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_NOP); // 5
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_RD); // 6
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_WR); // 7
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_RDA); // 8
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_WRA); // 9
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_ACT); // 10
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_PREPB); // 11
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_REFPB); // 12
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_RFMPB); // 13
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_REFP2B); // 14
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_RFMP2B); // 15
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_PRESB); // 16
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_REFSB); // 17
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_RFMSB); // 18
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_PREAB); // 19
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_REFAB); // 20
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_RFMAB); // 21
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_PDNA); // 22
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_PDNP); // 23
|
||||
DECLARE_EXTENDED_PHASE(BEGIN_SREF); // 24
|
||||
|
||||
DECLARE_EXTENDED_PHASE(END_PDNA); // 21
|
||||
DECLARE_EXTENDED_PHASE(END_PDNP); // 22
|
||||
DECLARE_EXTENDED_PHASE(END_SREF); // 23
|
||||
DECLARE_EXTENDED_PHASE(END_PDNA); // 25
|
||||
DECLARE_EXTENDED_PHASE(END_PDNP); // 26
|
||||
DECLARE_EXTENDED_PHASE(END_SREF); // 27
|
||||
|
||||
DECLARE_EXTENDED_PHASE(END_RD); // 24
|
||||
DECLARE_EXTENDED_PHASE(END_WR); // 25
|
||||
DECLARE_EXTENDED_PHASE(END_RDA); // 26
|
||||
DECLARE_EXTENDED_PHASE(END_WRA); // 27
|
||||
DECLARE_EXTENDED_PHASE(END_ACT); // 28
|
||||
DECLARE_EXTENDED_PHASE(END_PRE); // 29
|
||||
DECLARE_EXTENDED_PHASE(END_REFB); // 30
|
||||
DECLARE_EXTENDED_PHASE(END_PRESB); // 31
|
||||
DECLARE_EXTENDED_PHASE(END_REFSB); // 32
|
||||
DECLARE_EXTENDED_PHASE(END_RFMSB); // 33
|
||||
DECLARE_EXTENDED_PHASE(END_PREA); // 34
|
||||
DECLARE_EXTENDED_PHASE(END_REFA); // 35
|
||||
DECLARE_EXTENDED_PHASE(END_RFMAB); // 36
|
||||
DECLARE_EXTENDED_PHASE(END_NOP); // 28
|
||||
DECLARE_EXTENDED_PHASE(END_RD); // 29
|
||||
DECLARE_EXTENDED_PHASE(END_WR); // 30
|
||||
DECLARE_EXTENDED_PHASE(END_RDA); // 31
|
||||
DECLARE_EXTENDED_PHASE(END_WRA); // 32
|
||||
DECLARE_EXTENDED_PHASE(END_ACT); // 33
|
||||
DECLARE_EXTENDED_PHASE(END_PREPB); // 34
|
||||
DECLARE_EXTENDED_PHASE(END_REFPB); // 35
|
||||
DECLARE_EXTENDED_PHASE(END_RFMPB); // 36
|
||||
DECLARE_EXTENDED_PHASE(END_REFP2B); // 37
|
||||
DECLARE_EXTENDED_PHASE(END_RFMP2B); // 38
|
||||
DECLARE_EXTENDED_PHASE(END_PRESB); // 39
|
||||
DECLARE_EXTENDED_PHASE(END_REFSB); // 40
|
||||
DECLARE_EXTENDED_PHASE(END_RFMSB); // 41
|
||||
DECLARE_EXTENDED_PHASE(END_PREAB); // 42
|
||||
DECLARE_EXTENDED_PHASE(END_REFAB); // 43
|
||||
DECLARE_EXTENDED_PHASE(END_RFMAB); // 44
|
||||
|
||||
class Command
|
||||
{
|
||||
public:
|
||||
enum Type : uint8_t
|
||||
{
|
||||
NOP, // 0
|
||||
NOP = 0, // 0
|
||||
RD, // 1
|
||||
WR, // 2
|
||||
RDA, // 3
|
||||
WRA, // 4
|
||||
ACT, // 5
|
||||
PRE, // 6
|
||||
REFB, // 7
|
||||
PRESB, // 8
|
||||
REFSB, // 9
|
||||
RFMSB, // 10
|
||||
PREA, // 11
|
||||
REFA, // 12
|
||||
RFMAB, // 13
|
||||
PDEA, // 14
|
||||
PDEP, // 15
|
||||
SREFEN, // 16
|
||||
PDXA, // 17
|
||||
PDXP, // 18
|
||||
SREFEX, // 19
|
||||
END_ENUM // To mark the end of this enumeration
|
||||
PREPB, // 6
|
||||
REFPB, // 7
|
||||
RFMPB, // 8
|
||||
REFP2B, // 9
|
||||
RFMP2B, // 10
|
||||
PRESB, // 11
|
||||
REFSB, // 12
|
||||
RFMSB, // 13
|
||||
PREAB, // 14
|
||||
REFAB, // 15
|
||||
RFMAB, // 16
|
||||
PDEA, // 17
|
||||
PDEP, // 18
|
||||
SREFEN, // 19
|
||||
PDXA, // 20
|
||||
PDXP, // 21
|
||||
SREFEX, // 22
|
||||
END_ENUM // 23, To mark the end of this enumeration
|
||||
};
|
||||
|
||||
private:
|
||||
@@ -126,6 +138,7 @@ public:
|
||||
tlm::tlm_phase toPhase() const;
|
||||
static unsigned numberOfCommands();
|
||||
bool isBankCommand() const;
|
||||
bool is2BankCommand() const;
|
||||
bool isGroupCommand() const;
|
||||
bool isRankCommand() const;
|
||||
bool isCasCommand() const;
|
||||
|
||||
@@ -265,12 +265,12 @@ void Controller::controllerMethod()
|
||||
readyCommands.emplace_back(commandTuple);
|
||||
else
|
||||
{
|
||||
// (4.2) Check for refresh commands (PREA/PRE or REFA/REFB/...)
|
||||
// (4.2) Check for refresh commands (PREXX or REFXX)
|
||||
commandTuple = refreshManagers[rankID]->getNextCommand();
|
||||
if (std::get<CommandTuple::Command>(commandTuple) != Command::NOP)
|
||||
readyCommands.emplace_back(commandTuple);
|
||||
|
||||
// (4.3) Check for bank commands (PRE, ACT, RD/RDA or WR/WRA)
|
||||
// (4.3) Check for bank commands (PREPB, ACT, RD/RDA or WR/WRA)
|
||||
for (auto it : bankMachinesOnRank[rankID])
|
||||
{
|
||||
commandTuple = it->getNextCommand();
|
||||
|
||||
@@ -190,11 +190,11 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
@@ -206,7 +206,7 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
|
||||
|
||||
@@ -217,7 +217,7 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (last4Activates[rank.ID()].size() >= 4)
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW);
|
||||
}
|
||||
else if (command == Command::PRE)
|
||||
else if (command == Command::PREPB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -235,7 +235,7 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
}
|
||||
else if (command == Command::PREA)
|
||||
else if (command == Command::PREAB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -261,7 +261,7 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
}
|
||||
else if (command == Command::REFA)
|
||||
else if (command == Command::REFAB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -275,11 +275,11 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
@@ -287,7 +287,7 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
|
||||
|
||||
@@ -317,7 +317,7 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN);
|
||||
|
||||
@@ -345,11 +345,11 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN);
|
||||
|
||||
@@ -357,7 +357,7 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFPDEN);
|
||||
|
||||
@@ -385,11 +385,11 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tWRAPDEN, tWRPRE + memSpec->tRP));
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
@@ -397,7 +397,7 @@ sc_time CheckerDDR3::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
|
||||
|
||||
|
||||
@@ -222,11 +222,11 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
@@ -238,7 +238,7 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
|
||||
|
||||
@@ -249,7 +249,7 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (last4Activates[rank.ID()].size() >= 4)
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW);
|
||||
}
|
||||
else if (command == Command::PRE)
|
||||
else if (command == Command::PREPB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -267,7 +267,7 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
}
|
||||
else if (command == Command::PREA)
|
||||
else if (command == Command::PREAB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -293,7 +293,7 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
}
|
||||
else if (command == Command::REFA)
|
||||
else if (command == Command::REFAB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -307,11 +307,11 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
@@ -319,7 +319,7 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
|
||||
|
||||
@@ -349,7 +349,7 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN);
|
||||
|
||||
@@ -377,11 +377,11 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN);
|
||||
|
||||
@@ -389,7 +389,7 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tCKE);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFPDEN);
|
||||
|
||||
@@ -417,11 +417,11 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tWRAPDEN, tWRPRE + memSpec->tRP));
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
@@ -429,7 +429,7 @@ sc_time CheckerDDR4::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
|
||||
|
||||
|
||||
@@ -125,6 +125,7 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
Bank bank = DramExtension::getBank(payload);
|
||||
Bank bankInGroup = Bank(logicalRank.ID() * memSpec->banksPerGroup + bank.ID() % memSpec->banksPerGroup);
|
||||
unsigned burstLength = DramExtension::getBurstLength(payload);
|
||||
assert(!(burstLength == 32) || (memSpec->bitWidth == 4));
|
||||
|
||||
sc_time lastCommandStart;
|
||||
sc_time earliestTimeToStart = sc_time_stamp();
|
||||
@@ -542,11 +543,11 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAACT);
|
||||
}
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - cmdLengthDiff);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PREA][logicalRank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PREAB][logicalRank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - cmdLengthDiff);
|
||||
|
||||
@@ -554,7 +555,7 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - cmdLengthDiff);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFA][logicalRank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFAB][logicalRank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_slr - cmdLengthDiff);
|
||||
|
||||
@@ -562,7 +563,7 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_slr - cmdLengthDiff);
|
||||
|
||||
// TODO: No tRFC_dlr and tRFC_dpr between REFA and ACT?
|
||||
// TODO: No tRFC_dlr and tRFC_dpr between REFAB and ACT?
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::REFSB][bankInGroup.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -598,7 +599,7 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, last4ActivatesPhysical[physicalRank.ID()].front()
|
||||
+ memSpec->tFAW_dlr - memSpec->longCmdOffset);
|
||||
}
|
||||
else if (command == Command::PRE)
|
||||
else if (command == Command::PREPB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -617,11 +618,11 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + cmdLengthDiff);
|
||||
}
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PRE][physicalRank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREPB][physicalRank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREA][physicalRank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREAB][physicalRank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD);
|
||||
|
||||
@@ -629,7 +630,7 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD);
|
||||
}
|
||||
else if (command == Command::PREA)
|
||||
else if (command == Command::PREAB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::ACT][logicalRank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -661,11 +662,11 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + cmdLengthDiff);
|
||||
}
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PRE][physicalRank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREPB][physicalRank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREA][physicalRank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREAB][physicalRank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD);
|
||||
|
||||
@@ -703,7 +704,7 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + cmdLengthDiff);
|
||||
}
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PRE][physicalRank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::PREPB][physicalRank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD);
|
||||
|
||||
@@ -713,7 +714,7 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD);
|
||||
}
|
||||
else if (command == Command::REFA || command == Command::RFMAB)
|
||||
else if (command == Command::REFAB || command == Command::RFMAB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::ACT][logicalRank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -732,23 +733,23 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP + cmdLengthDiff);
|
||||
}
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PRE][logicalRank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PREPB][logicalRank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PREA][logicalRank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::PREAB][logicalRank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFA][logicalRank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFAB][logicalRank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_slr);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFA][physicalRank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFAB][physicalRank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dlr);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndDimmRank[Command::REFA][dimmRank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndDimmRank[Command::REFAB][dimmRank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dpr);
|
||||
|
||||
@@ -790,7 +791,7 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAACT + cmdLengthDiff);
|
||||
}
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::PRE][bankInGroup.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndBankInGroup[Command::PREPB][bankInGroup.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
@@ -800,17 +801,17 @@ sc_time CheckerDDR5::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFA][logicalRank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndLogicalRank[Command::REFAB][logicalRank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_slr);
|
||||
|
||||
// TODO: check this
|
||||
lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFA][physicalRank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndPhysicalRank[Command::REFAB][physicalRank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dlr);
|
||||
|
||||
// TODO: check this
|
||||
lastCommandStart = lastScheduledByCommandAndDimmRank[Command::REFA][dimmRank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndDimmRank[Command::REFAB][dimmRank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC_dpr);
|
||||
|
||||
|
||||
@@ -223,11 +223,11 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
@@ -239,15 +239,15 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXPN);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::REFB][bank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD);
|
||||
|
||||
@@ -261,7 +261,7 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (last32Activates[rank.ID()].size() >= 32)
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, last32Activates[rank.ID()].front() + memSpec->t32AW);
|
||||
}
|
||||
else if (command == Command::PRE)
|
||||
else if (command == Command::PREPB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -275,7 +275,7 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD);
|
||||
|
||||
@@ -283,7 +283,7 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXPN);
|
||||
}
|
||||
else if (command == Command::PREA)
|
||||
else if (command == Command::PREAB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -305,7 +305,7 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD);
|
||||
|
||||
@@ -313,11 +313,11 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXPN);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB);
|
||||
}
|
||||
else if (command == Command::REFA)
|
||||
else if (command == Command::REFAB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -331,11 +331,11 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
@@ -343,11 +343,11 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXPN);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB);
|
||||
|
||||
@@ -355,7 +355,7 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS);
|
||||
}
|
||||
else if (command == Command::REFB)
|
||||
else if (command == Command::REFPB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -377,11 +377,11 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
@@ -393,15 +393,15 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXPN);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::REFB][bank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
{
|
||||
if (bankwiseRefreshCounter[rank.ID()] == 0)
|
||||
@@ -494,11 +494,11 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
@@ -506,11 +506,11 @@ sc_time CheckerGDDR5::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXPN);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB);
|
||||
|
||||
@@ -549,7 +549,7 @@ void CheckerGDDR5::insert(Command command, tlm_generic_payload *payload)
|
||||
lastScheduledByCommand[command] = sc_time_stamp();
|
||||
lastCommandOnBus = sc_time_stamp();
|
||||
|
||||
if (command == Command::ACT || command == Command::REFB)
|
||||
if (command == Command::ACT || command == Command::REFPB)
|
||||
{
|
||||
if (last4Activates[rank.ID()].size() == 4)
|
||||
last4Activates[rank.ID()].pop();
|
||||
@@ -560,6 +560,6 @@ void CheckerGDDR5::insert(Command command, tlm_generic_payload *payload)
|
||||
last32Activates[rank.ID()].push(lastCommandOnBus);
|
||||
}
|
||||
|
||||
if (command == Command::REFB)
|
||||
if (command == Command::REFPB)
|
||||
bankwiseRefreshCounter[rank.ID()] = (bankwiseRefreshCounter[rank.ID()] + 1) % memSpec->banksPerRank;
|
||||
}
|
||||
|
||||
@@ -223,11 +223,11 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
@@ -239,15 +239,15 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::REFB][bank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD);
|
||||
|
||||
@@ -261,7 +261,7 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (last32Activates[rank.ID()].size() >= 32)
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, last32Activates[rank.ID()].front() + memSpec->t32AW);
|
||||
}
|
||||
else if (command == Command::PRE)
|
||||
else if (command == Command::PREPB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -275,7 +275,7 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD);
|
||||
|
||||
@@ -283,7 +283,7 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
}
|
||||
else if (command == Command::PREA)
|
||||
else if (command == Command::PREAB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -305,7 +305,7 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD);
|
||||
|
||||
@@ -313,11 +313,11 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB);
|
||||
}
|
||||
else if (command == Command::REFA)
|
||||
else if (command == Command::REFAB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -331,11 +331,11 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
@@ -343,11 +343,11 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB);
|
||||
|
||||
@@ -355,7 +355,7 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS);
|
||||
}
|
||||
else if (command == Command::REFB)
|
||||
else if (command == Command::REFPB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -377,11 +377,11 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
@@ -393,15 +393,15 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::REFB][bank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
{
|
||||
if (bankwiseRefreshCounter[rank.ID()] == 0)
|
||||
@@ -494,11 +494,11 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
@@ -506,11 +506,11 @@ sc_time CheckerGDDR5X::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB);
|
||||
|
||||
@@ -549,7 +549,7 @@ void CheckerGDDR5X::insert(Command command, tlm_generic_payload *payload)
|
||||
lastScheduledByCommand[command] = sc_time_stamp();
|
||||
lastCommandOnBus = sc_time_stamp();
|
||||
|
||||
if (command == Command::ACT || command == Command::REFB)
|
||||
if (command == Command::ACT || command == Command::REFPB)
|
||||
{
|
||||
if (last4Activates[rank.ID()].size() == 4)
|
||||
last4Activates[rank.ID()].pop();
|
||||
@@ -560,6 +560,6 @@ void CheckerGDDR5X::insert(Command command, tlm_generic_payload *payload)
|
||||
last32Activates[rank.ID()].push(lastCommandOnBus);
|
||||
}
|
||||
|
||||
if (command == Command::REFB)
|
||||
if (command == Command::REFPB)
|
||||
bankwiseRefreshCounter[rank.ID()] = (bankwiseRefreshCounter[rank.ID()] + 1) % memSpec->banksPerRank;
|
||||
}
|
||||
|
||||
@@ -222,11 +222,11 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
@@ -238,15 +238,15 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::REFB][bank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB);
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD);
|
||||
|
||||
@@ -257,7 +257,7 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (last4Activates[rank.ID()].size() >= 4)
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW);
|
||||
}
|
||||
else if (command == Command::PRE)
|
||||
else if (command == Command::PREPB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -271,7 +271,7 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD);
|
||||
|
||||
@@ -279,7 +279,7 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
}
|
||||
else if (command == Command::PREA)
|
||||
else if (command == Command::PREAB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -301,7 +301,7 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD);
|
||||
|
||||
@@ -309,11 +309,11 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB);
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb);
|
||||
}
|
||||
else if (command == Command::REFA)
|
||||
else if (command == Command::REFAB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -327,11 +327,11 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
@@ -339,19 +339,19 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB);
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXS);
|
||||
}
|
||||
else if (command == Command::REFB)
|
||||
else if (command == Command::REFPB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -373,11 +373,11 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
@@ -389,19 +389,19 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::REFB][bank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB);
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
{
|
||||
if (bankwiseRefreshCounter[rank.ID()] == 0)
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB);
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb);
|
||||
else
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD);
|
||||
}
|
||||
@@ -435,11 +435,11 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRSRE);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPREPDE);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFPDE);
|
||||
|
||||
@@ -467,19 +467,19 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRSRE);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPREPDE);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPREPDE);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFPDE);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tREFPDE);
|
||||
|
||||
@@ -515,11 +515,11 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
@@ -527,13 +527,13 @@ sc_time CheckerGDDR6::timeToSatisfyConstraints(Command command, tlm_generic_payl
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCPB);
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::SREFEX][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -570,13 +570,13 @@ void CheckerGDDR6::insert(Command command, tlm_generic_payload *payload)
|
||||
lastScheduledByCommand[command] = sc_time_stamp();
|
||||
lastCommandOnBus = sc_time_stamp();
|
||||
|
||||
if (command == Command::ACT || command == Command::REFB)
|
||||
if (command == Command::ACT || command == Command::REFPB)
|
||||
{
|
||||
if (last4Activates[rank.ID()].size() == 4)
|
||||
last4Activates[rank.ID()].pop();
|
||||
last4Activates[rank.ID()].push(lastCommandOnBus);
|
||||
}
|
||||
|
||||
if (command == Command::REFB)
|
||||
if (command == Command::REFPB)
|
||||
bankwiseRefreshCounter[rank.ID()] = (bankwiseRefreshCounter[rank.ID()] + 1) % memSpec->banksPerRank;
|
||||
}
|
||||
|
||||
@@ -187,11 +187,11 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP - memSpec->tCK);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - memSpec->tCK);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP - memSpec->tCK);
|
||||
|
||||
@@ -203,15 +203,15 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP - memSpec->tCK);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC - memSpec->tCK);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::REFB][bank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCSB - memSpec->tCK);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRREFD - memSpec->tCK);
|
||||
|
||||
@@ -224,7 +224,7 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK);
|
||||
}
|
||||
else if (command == Command::PRE)
|
||||
else if (command == Command::PREPB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -244,7 +244,7 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK);
|
||||
}
|
||||
else if (command == Command::PREA)
|
||||
else if (command == Command::PREAB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -270,13 +270,13 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCSB);
|
||||
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK);
|
||||
}
|
||||
else if (command == Command::REFA)
|
||||
else if (command == Command::REFAB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -290,11 +290,11 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
@@ -302,11 +302,11 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCSB);
|
||||
|
||||
@@ -316,7 +316,7 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandOnRasBus + memSpec->tCK);
|
||||
}
|
||||
else if (command == Command::REFB)
|
||||
else if (command == Command::REFPB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -338,11 +338,11 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
@@ -354,15 +354,15 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::REFB][bank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCSB);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
{
|
||||
if (bankwiseRefreshCounter[rank.ID()] == 0)
|
||||
@@ -458,11 +458,11 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommand[Command::PRE];
|
||||
lastCommandStart = lastScheduledByCommand[Command::PREPB];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommand[Command::PREA];
|
||||
lastCommandStart = lastScheduledByCommand[Command::PREAB];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
@@ -470,11 +470,11 @@ sc_time CheckerHBM2::timeToSatisfyConstraints(Command command, tlm_generic_paylo
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommand[Command::REFA];
|
||||
lastCommandStart = lastScheduledByCommand[Command::REFAB];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
|
||||
|
||||
lastCommandStart = lastScheduledByCommand[Command::REFB];
|
||||
lastCommandStart = lastScheduledByCommand[Command::REFPB];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCSB);
|
||||
|
||||
@@ -530,13 +530,13 @@ void CheckerHBM2::insert(Command command, tlm_generic_payload *payload)
|
||||
else
|
||||
lastCommandOnRasBus = sc_time_stamp();
|
||||
|
||||
if (command == Command::ACT || command == Command::REFB)
|
||||
if (command == Command::ACT || command == Command::REFPB)
|
||||
{
|
||||
if (last4Activates[rank.ID()].size() == 4)
|
||||
last4Activates[rank.ID()].pop();
|
||||
last4Activates[rank.ID()].push(lastCommandOnRasBus);
|
||||
}
|
||||
|
||||
if (command == Command::REFB)
|
||||
if (command == Command::REFPB)
|
||||
bankwiseRefreshCounter[rank.ID()] = (bankwiseRefreshCounter[rank.ID()] + 1) % memSpec->banksPerRank;
|
||||
}
|
||||
|
||||
@@ -188,11 +188,11 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAACT);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb - 2 * memSpec->tCK);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab - 2 * memSpec->tCK);
|
||||
|
||||
@@ -204,15 +204,15 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab - 2 * memSpec->tCK);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::REFB][bank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb - 2 * memSpec->tCK);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD - 2 * memSpec->tCK);
|
||||
|
||||
@@ -223,7 +223,7 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (last4Activates[rank.ID()].size() >= 4)
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW - 3 * memSpec->tCK);
|
||||
}
|
||||
else if (command == Command::PRE)
|
||||
else if (command == Command::PREPB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -237,7 +237,7 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD);
|
||||
|
||||
@@ -245,7 +245,7 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
}
|
||||
else if (command == Command::PREA)
|
||||
else if (command == Command::PREAB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -267,7 +267,7 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPPD);
|
||||
|
||||
@@ -275,11 +275,11 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb);
|
||||
}
|
||||
else if (command == Command::REFA)
|
||||
else if (command == Command::REFAB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -293,11 +293,11 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRPpb);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab);
|
||||
|
||||
@@ -305,11 +305,11 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb);
|
||||
|
||||
@@ -317,7 +317,7 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR);
|
||||
}
|
||||
else if (command == Command::REFB)
|
||||
else if (command == Command::REFPB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -335,11 +335,11 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRPpb);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab);
|
||||
|
||||
@@ -351,11 +351,11 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb);
|
||||
|
||||
@@ -388,11 +388,11 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tPRPDEN);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tREFPDEN);
|
||||
|
||||
@@ -420,19 +420,19 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tPRPDEN);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tPRPDEN);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tREFPDEN);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tREFPDEN);
|
||||
|
||||
@@ -464,11 +464,11 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tWRAPDEN, tWRPRE + memSpec->tRPpb));
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab);
|
||||
|
||||
@@ -476,11 +476,11 @@ sc_time CheckerLPDDR4::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb);
|
||||
|
||||
@@ -518,7 +518,7 @@ void CheckerLPDDR4::insert(Command command, tlm_generic_payload *payload)
|
||||
|
||||
lastCommandOnBus = sc_time_stamp() + memSpec->getCommandLength(command) - memSpec->tCK;
|
||||
|
||||
if (command == Command::ACT || command == Command::REFB)
|
||||
if (command == Command::ACT || command == Command::REFPB)
|
||||
{
|
||||
if (last4Activates[rank.ID()].size() == 4)
|
||||
last4Activates[rank.ID()].pop();
|
||||
|
||||
@@ -192,11 +192,11 @@ sc_time CheckerSTTMRAM::timeToSatisfyConstraints(Command command, tlm_generic_pa
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
@@ -215,7 +215,7 @@ sc_time CheckerSTTMRAM::timeToSatisfyConstraints(Command command, tlm_generic_pa
|
||||
if (last4Activates[rank.ID()].size() >= 4)
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW);
|
||||
}
|
||||
else if (command == Command::PRE)
|
||||
else if (command == Command::PREPB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -233,7 +233,7 @@ sc_time CheckerSTTMRAM::timeToSatisfyConstraints(Command command, tlm_generic_pa
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
}
|
||||
else if (command == Command::PREA)
|
||||
else if (command == Command::PREAB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -281,7 +281,7 @@ sc_time CheckerSTTMRAM::timeToSatisfyConstraints(Command command, tlm_generic_pa
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN);
|
||||
|
||||
@@ -309,11 +309,11 @@ sc_time CheckerSTTMRAM::timeToSatisfyConstraints(Command command, tlm_generic_pa
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRAPDEN);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tPRPDEN);
|
||||
|
||||
@@ -345,11 +345,11 @@ sc_time CheckerSTTMRAM::timeToSatisfyConstraints(Command command, tlm_generic_pa
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tWRAPDEN, tWRPRE + memSpec->tRP));
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
|
||||
@@ -182,15 +182,15 @@ sc_time CheckerWideIO::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
|
||||
|
||||
@@ -209,7 +209,7 @@ sc_time CheckerWideIO::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (last2Activates[rank.ID()].size() >= 2)
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, last2Activates[rank.ID()].front() + memSpec->tTAW);
|
||||
}
|
||||
else if (command == Command::PRE)
|
||||
else if (command == Command::PREPB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -227,7 +227,7 @@ sc_time CheckerWideIO::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
}
|
||||
else if (command == Command::PREA)
|
||||
else if (command == Command::PREAB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -253,7 +253,7 @@ sc_time CheckerWideIO::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
}
|
||||
else if (command == Command::REFA)
|
||||
else if (command == Command::REFAB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -267,15 +267,15 @@ sc_time CheckerWideIO::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
|
||||
|
||||
@@ -357,11 +357,11 @@ sc_time CheckerWideIO::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tWRAPDEN, tWRPRE + memSpec->tRP));
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRP);
|
||||
|
||||
@@ -369,7 +369,7 @@ sc_time CheckerWideIO::timeToSatisfyConstraints(Command command, tlm_generic_pay
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFC);
|
||||
|
||||
|
||||
@@ -183,11 +183,11 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, tlm_generic_pa
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRPpb);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab);
|
||||
|
||||
@@ -199,15 +199,15 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, tlm_generic_pa
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::REFB][bank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::REFPB][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRRD);
|
||||
|
||||
@@ -218,7 +218,7 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, tlm_generic_pa
|
||||
if (last4Activates[rank.ID()].size() >= 4)
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, last4Activates[rank.ID()].front() + memSpec->tFAW);
|
||||
}
|
||||
else if (command == Command::PRE)
|
||||
else if (command == Command::PREPB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -232,7 +232,7 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, tlm_generic_pa
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + 2 * memSpec->tCK);
|
||||
|
||||
@@ -240,7 +240,7 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, tlm_generic_pa
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
}
|
||||
else if (command == Command::PREA)
|
||||
else if (command == Command::PREAB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -262,7 +262,7 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, tlm_generic_pa
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + 2 * memSpec->tCK);
|
||||
|
||||
@@ -270,11 +270,11 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, tlm_generic_pa
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb);
|
||||
}
|
||||
else if(command == Command::REFA)
|
||||
else if(command == Command::REFAB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::ACT][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -288,11 +288,11 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, tlm_generic_pa
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRPpb);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab);
|
||||
|
||||
@@ -300,11 +300,11 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, tlm_generic_pa
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb);
|
||||
|
||||
@@ -312,7 +312,7 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, tlm_generic_pa
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXSR);
|
||||
}
|
||||
else if(command == Command::REFB)
|
||||
else if(command == Command::REFPB)
|
||||
{
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::ACT][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
@@ -330,11 +330,11 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, tlm_generic_pa
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + tWRPRE + memSpec->tRPpb);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PRE][bank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndBank[Command::PREPB][bank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab);
|
||||
|
||||
@@ -346,11 +346,11 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, tlm_generic_pa
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb);
|
||||
|
||||
@@ -431,11 +431,11 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, tlm_generic_pa
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + std::max(tWRAPDEN, tWRPRE + memSpec->tRPpb));
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PRE][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPpb);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::PREAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRPab);
|
||||
|
||||
@@ -443,11 +443,11 @@ sc_time CheckerWideIO2::timeToSatisfyConstraints(Command command, tlm_generic_pa
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tXP);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFA][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFAB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCab);
|
||||
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFB][rank.ID()];
|
||||
lastCommandStart = lastScheduledByCommandAndRank[Command::REFPB][rank.ID()];
|
||||
if (lastCommandStart != sc_max_time())
|
||||
earliestTimeToStart = std::max(earliestTimeToStart, lastCommandStart + memSpec->tRFCpb);
|
||||
|
||||
@@ -484,7 +484,7 @@ void CheckerWideIO2::insert(Command command, tlm_generic_payload *payload)
|
||||
lastScheduledByCommand[command] = sc_time_stamp();
|
||||
lastCommandOnBus = sc_time_stamp();
|
||||
|
||||
if (command == Command::ACT || command == Command::REFB)
|
||||
if (command == Command::ACT || command == Command::REFPB)
|
||||
{
|
||||
if (last4Activates[rank.ID()].size() == 4)
|
||||
last4Activates[rank.ID()].pop();
|
||||
|
||||
@@ -90,7 +90,7 @@ sc_time PowerDownManagerStaggered::start()
|
||||
else if (state == State::SelfRefresh)
|
||||
nextCommand = Command::SREFEX;
|
||||
else if (state == State::ExtraRefresh)
|
||||
nextCommand = Command::REFA;
|
||||
nextCommand = Command::REFAB;
|
||||
|
||||
timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, &powerDownPayload);
|
||||
}
|
||||
@@ -147,7 +147,7 @@ void PowerDownManagerStaggered::updateState(Command command)
|
||||
case Command::SREFEX:
|
||||
state = State::ExtraRefresh;
|
||||
break;
|
||||
case Command::REFA:
|
||||
case Command::REFAB:
|
||||
if (state == State::ExtraRefresh)
|
||||
{
|
||||
state = State::Idle;
|
||||
@@ -156,7 +156,7 @@ void PowerDownManagerStaggered::updateState(Command command)
|
||||
else if (controllerIdle)
|
||||
entryTriggered = true;
|
||||
break;
|
||||
case Command::REFB:
|
||||
case Command::REFPB: case Command::REFP2B: case Command::REFSB:
|
||||
if (controllerIdle)
|
||||
entryTriggered = true;
|
||||
break;
|
||||
|
||||
@@ -105,9 +105,9 @@ sc_time RefreshManagerAllBank::start()
|
||||
if (doRefresh)
|
||||
{
|
||||
if (activatedBanks > 0)
|
||||
nextCommand = Command::PREA;
|
||||
nextCommand = Command::PREAB;
|
||||
else
|
||||
nextCommand = Command::REFA;
|
||||
nextCommand = Command::REFAB;
|
||||
|
||||
timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, &refreshPayload);
|
||||
return timeToSchedule;
|
||||
@@ -129,7 +129,7 @@ sc_time RefreshManagerAllBank::start()
|
||||
|
||||
if (doRefresh)
|
||||
{
|
||||
nextCommand = Command::REFA;
|
||||
nextCommand = Command::REFAB;
|
||||
timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, &refreshPayload);
|
||||
return timeToSchedule;
|
||||
}
|
||||
@@ -168,7 +168,7 @@ sc_time RefreshManagerAllBank::start()
|
||||
if (refreshManagementRequired)
|
||||
{
|
||||
if (activatedBanks > 0)
|
||||
nextCommand = Command::PREA;
|
||||
nextCommand = Command::PREAB;
|
||||
else
|
||||
nextCommand = Command::RFMAB;
|
||||
|
||||
@@ -187,13 +187,13 @@ void RefreshManagerAllBank::updateState(Command command)
|
||||
case Command::ACT:
|
||||
activatedBanks++;
|
||||
break;
|
||||
case Command::PRE: case Command::RDA: case Command::WRA:
|
||||
case Command::PREPB: case Command::RDA: case Command::WRA:
|
||||
activatedBanks--;
|
||||
break;
|
||||
case Command::PREA:
|
||||
case Command::PREAB:
|
||||
activatedBanks = 0;
|
||||
break;
|
||||
case Command::REFA:
|
||||
case Command::REFAB:
|
||||
if (sleeping)
|
||||
{
|
||||
// Refresh command after SREFEX
|
||||
|
||||
@@ -48,16 +48,14 @@ RefreshManagerPerBank::RefreshManagerPerBank(std::vector<BankMachine *> &bankMac
|
||||
memSpec = config.memSpec;
|
||||
timeForNextTrigger = getTimeForFirstTrigger(memSpec->getRefreshIntervalPB(),
|
||||
rank, memSpec->numberOfRanks);
|
||||
|
||||
refreshPayloads = std::vector<tlm_generic_payload>(memSpec->banksPerRank);
|
||||
for (unsigned bankID = 0; bankID < memSpec->banksPerRank; bankID++)
|
||||
for (auto it : bankMachinesOnRank)
|
||||
{
|
||||
setUpDummy(refreshPayloads[bankID], 0, rank, bankMachinesOnRank[bankID]->getBankGroup(),
|
||||
bankMachinesOnRank[bankID]->getBank());
|
||||
allBankMachines.push_back(bankMachinesOnRank[bankID]);
|
||||
setUpDummy(refreshPayloads[it], 0, rank, it->getBankGroup(), it->getBank());
|
||||
allBankMachines.push_back(it);
|
||||
}
|
||||
|
||||
remainingBankMachines = allBankMachines;
|
||||
currentBankMachine = *remainingBankMachines.begin();
|
||||
currentIterator = remainingBankMachines.begin();
|
||||
|
||||
maxPostponed = static_cast<int>(config.refreshMaxPostponed * memSpec->banksPerRank);
|
||||
maxPulledin = -static_cast<int>(config.refreshMaxPulledin * memSpec->banksPerRank);
|
||||
@@ -65,9 +63,7 @@ RefreshManagerPerBank::RefreshManagerPerBank(std::vector<BankMachine *> &bankMac
|
||||
|
||||
CommandTuple::Type RefreshManagerPerBank::getNextCommand()
|
||||
{
|
||||
return {nextCommand,
|
||||
&refreshPayloads[currentBankMachine->getBank().ID() % memSpec->banksPerRank],
|
||||
std::max(timeToSchedule, sc_time_stamp())};
|
||||
return {nextCommand, &refreshPayloads[*currentIterator], std::max(timeToSchedule, sc_time_stamp())};
|
||||
}
|
||||
|
||||
sc_time RefreshManagerPerBank::start()
|
||||
@@ -95,14 +91,12 @@ sc_time RefreshManagerPerBank::start()
|
||||
if (!skipSelection)
|
||||
{
|
||||
currentIterator = remainingBankMachines.begin();
|
||||
currentBankMachine = *remainingBankMachines.begin();
|
||||
|
||||
for (auto it = remainingBankMachines.begin(); it != remainingBankMachines.end(); it++)
|
||||
{
|
||||
if ((*it)->isIdle())
|
||||
{
|
||||
currentIterator = it;
|
||||
currentBankMachine = *it;
|
||||
allBanksBusy = false;
|
||||
break;
|
||||
}
|
||||
@@ -117,21 +111,21 @@ sc_time RefreshManagerPerBank::start()
|
||||
}
|
||||
else
|
||||
{
|
||||
if (currentBankMachine->isActivated())
|
||||
nextCommand = Command::PRE;
|
||||
// TODO: bank should already be blocked for precharge and selection should be skipped
|
||||
if ((*currentIterator)->isActivated())
|
||||
nextCommand = Command::PREPB;
|
||||
else
|
||||
{
|
||||
nextCommand = Command::REFB;
|
||||
nextCommand = Command::REFPB;
|
||||
|
||||
if (forcedRefresh)
|
||||
{
|
||||
currentBankMachine->block();
|
||||
(*currentIterator)->block();
|
||||
skipSelection = true;
|
||||
}
|
||||
}
|
||||
|
||||
timeToSchedule = checker->timeToSatisfyConstraints(nextCommand,
|
||||
&refreshPayloads[currentBankMachine->getBank().ID()]);
|
||||
timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, &refreshPayloads[*currentIterator]);
|
||||
return timeToSchedule;
|
||||
}
|
||||
}
|
||||
@@ -144,7 +138,6 @@ sc_time RefreshManagerPerBank::start()
|
||||
if ((*it)->isIdle())
|
||||
{
|
||||
currentIterator = it;
|
||||
currentBankMachine = *it;
|
||||
allBanksBusy = false;
|
||||
break;
|
||||
}
|
||||
@@ -158,13 +151,12 @@ sc_time RefreshManagerPerBank::start()
|
||||
}
|
||||
else
|
||||
{
|
||||
if (currentBankMachine->isActivated())
|
||||
nextCommand = Command::PRE;
|
||||
if ((*currentIterator)->isActivated())
|
||||
nextCommand = Command::PREPB;
|
||||
else
|
||||
nextCommand = Command::REFB;
|
||||
nextCommand = Command::REFPB;
|
||||
|
||||
timeToSchedule = checker->timeToSatisfyConstraints(nextCommand,
|
||||
&refreshPayloads[currentBankMachine->getBank().ID()]);
|
||||
timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, &refreshPayloads[*currentIterator]);
|
||||
return timeToSchedule;
|
||||
}
|
||||
}
|
||||
@@ -177,7 +169,7 @@ void RefreshManagerPerBank::updateState(Command command)
|
||||
{
|
||||
switch (command)
|
||||
{
|
||||
case Command::REFB:
|
||||
case Command::REFPB:
|
||||
skipSelection = false;
|
||||
remainingBankMachines.erase(currentIterator);
|
||||
if (remainingBankMachines.empty())
|
||||
@@ -194,11 +186,14 @@ void RefreshManagerPerBank::updateState(Command command)
|
||||
timeForNextTrigger += memSpec->getRefreshIntervalPB();
|
||||
}
|
||||
break;
|
||||
case Command::REFA:
|
||||
case Command::REFAB:
|
||||
// Refresh command after SREFEX
|
||||
state = State::Regular; // TODO: check if this assignment is necessary
|
||||
timeForNextTrigger = sc_time_stamp() + memSpec->getRefreshIntervalPB();
|
||||
sleeping = false;
|
||||
remainingBankMachines = allBankMachines;
|
||||
currentIterator = remainingBankMachines.begin();
|
||||
skipSelection = false;
|
||||
break;
|
||||
case Command::PDEA: case Command::PDEP:
|
||||
sleeping = true;
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
|
||||
#include <vector>
|
||||
#include <list>
|
||||
#include <unordered_map>
|
||||
|
||||
#include <systemc>
|
||||
#include <tlm>
|
||||
@@ -58,7 +59,7 @@ private:
|
||||
enum class State {Regular, Pulledin} state = State::Regular;
|
||||
const MemSpec *memSpec;
|
||||
PowerDownManagerIF *powerDownManager;
|
||||
std::vector<tlm::tlm_generic_payload> refreshPayloads;
|
||||
std::unordered_map<BankMachine*, tlm::tlm_generic_payload> refreshPayloads;
|
||||
sc_core::sc_time timeForNextTrigger = sc_core::sc_max_time();
|
||||
sc_core::sc_time timeToSchedule = sc_core::sc_max_time();
|
||||
CheckerIF *checker;
|
||||
@@ -67,7 +68,6 @@ private:
|
||||
std::list<BankMachine *> remainingBankMachines;
|
||||
std::list<BankMachine *> allBankMachines;
|
||||
std::list<BankMachine *>::iterator currentIterator;
|
||||
BankMachine *currentBankMachine;
|
||||
|
||||
int flexibilityCounter = 0;
|
||||
int maxPostponed = 0;
|
||||
|
||||
@@ -146,6 +146,7 @@ sc_time RefreshManagerSameBank::start()
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: banks should already be blocked for precharge and selection should be skipped
|
||||
// only check for forced refresh, also block for PRESB
|
||||
if (nextCommand == Command::REFSB && forcedRefresh)
|
||||
{
|
||||
@@ -307,11 +308,14 @@ void RefreshManagerSameBank::updateState(Command command)
|
||||
timeForNextTrigger += memSpec->getRefreshIntervalSB();
|
||||
}
|
||||
break;
|
||||
case Command::REFA:
|
||||
case Command::REFAB:
|
||||
// Refresh command after SREFEX
|
||||
state = State::Regular; // TODO: check if this assignment is necessary
|
||||
timeForNextTrigger = sc_time_stamp() + memSpec->getRefreshIntervalSB();
|
||||
sleeping = false;
|
||||
remainingBankMachines = allBankMachines;
|
||||
currentIterator = remainingBankMachines.begin();
|
||||
skipSelection = false;
|
||||
break;
|
||||
case Command::PDEA: case Command::PDEP:
|
||||
sleeping = true;
|
||||
|
||||
@@ -64,7 +64,7 @@ protected:
|
||||
|
||||
unsigned char *memory;
|
||||
|
||||
libDRAMPower *DRAMPower;
|
||||
libDRAMPower *DRAMPower = nullptr;
|
||||
|
||||
virtual tlm::tlm_sync_enum nb_transport_fw(tlm::tlm_generic_payload &payload,
|
||||
tlm::tlm_phase &phase, sc_core::sc_time &delay);
|
||||
|
||||
@@ -211,7 +211,7 @@ tlm_sync_enum DramWideIO::nb_transport_fw(tlm_generic_payload &payload,
|
||||
ememory[bank]->load(payload);
|
||||
else if (phase == BEGIN_WR || phase == BEGIN_WRA)
|
||||
ememory[bank]->store(payload);
|
||||
else if (phase == BEGIN_REFA)
|
||||
else if (phase == BEGIN_REFAB)
|
||||
ememory[bank]->refresh(DramExtension::getExtension(payload).getRow().ID());
|
||||
}
|
||||
|
||||
|
||||
@@ -38,40 +38,48 @@
|
||||
|
||||
struct CommandLengths
|
||||
{
|
||||
unsigned NOP;
|
||||
unsigned RD;
|
||||
unsigned WR;
|
||||
unsigned RDA;
|
||||
unsigned WRA;
|
||||
unsigned ACT;
|
||||
unsigned PRE;
|
||||
unsigned REFB;
|
||||
unsigned PRESB;
|
||||
unsigned REFSB;
|
||||
unsigned RFMSB;
|
||||
unsigned PREA;
|
||||
unsigned REFA;
|
||||
unsigned RFMAB;
|
||||
unsigned PDEA;
|
||||
unsigned PDXA;
|
||||
unsigned PDEP;
|
||||
unsigned PDXP;
|
||||
unsigned SREFEN;
|
||||
unsigned SREFEX;
|
||||
unsigned NOP = 1;
|
||||
unsigned RD = 1;
|
||||
unsigned WR = 1;
|
||||
unsigned RDA = 1;
|
||||
unsigned WRA = 1;
|
||||
unsigned ACT = 1;
|
||||
unsigned PREPB = 1;
|
||||
unsigned REFPB = 1;
|
||||
unsigned RFMPB = 1;
|
||||
unsigned REFP2B = 1;
|
||||
unsigned RFMP2B = 1;
|
||||
unsigned PRESB = 1;
|
||||
unsigned REFSB = 1;
|
||||
unsigned RFMSB = 1;
|
||||
unsigned PREAB = 1;
|
||||
unsigned REFAB = 1;
|
||||
unsigned RFMAB = 1;
|
||||
unsigned PDEA = 1;
|
||||
unsigned PDXA = 1;
|
||||
unsigned PDEP = 1;
|
||||
unsigned PDXP = 1;
|
||||
unsigned SREFEN = 1;
|
||||
unsigned SREFEX = 1;
|
||||
|
||||
CommandLengths(unsigned NOP, unsigned RD, unsigned WR,
|
||||
unsigned RDA, unsigned WRA, unsigned ACT,
|
||||
unsigned PRE, unsigned REFB, unsigned PRESB,
|
||||
unsigned REFSB, unsigned RFMSB, unsigned PREA,
|
||||
unsigned REFA, unsigned RFMAB, unsigned PDEA,
|
||||
unsigned PDXA, unsigned PDEP, unsigned PDXP,
|
||||
unsigned PREPB, unsigned REFPB, unsigned RFMPB,
|
||||
unsigned REFP2B, unsigned RFMP2B,
|
||||
unsigned PRESB, unsigned REFSB, unsigned RFMSB,
|
||||
unsigned PREAB, unsigned REFAB, unsigned RFMAB,
|
||||
unsigned PDEA, unsigned PDXA, unsigned PDEP, unsigned PDXP,
|
||||
unsigned SREFEN, unsigned SREFEX) :
|
||||
NOP(NOP), RD(RD), WR(WR), RDA(RDA), WRA(WRA), ACT(ACT), PRE(PRE),
|
||||
REFB(REFB), PRESB(PRESB), REFSB(REFSB), RFMSB(RFMSB), PREA(PREA),
|
||||
REFA(REFA), RFMAB(RFMAB), PDEA(PDEA), PDXA(PDXA), PDEP(PDEP),
|
||||
PDXP(PDXP), SREFEN(SREFEN), SREFEX(SREFEX) {}
|
||||
NOP(NOP), RD(RD), WR(WR),
|
||||
RDA(RDA), WRA(WRA), ACT(ACT),
|
||||
PREPB(PREPB), REFPB(REFPB), RFMPB(RFMPB),
|
||||
REFP2B(REFP2B), RFMP2B(RFMP2B),
|
||||
PRESB(PRESB), REFSB(REFSB), RFMSB(RFMSB),
|
||||
PREAB(PREAB), REFAB(REFAB), RFMAB(RFMAB),
|
||||
PDEA(PDEA), PDXA(PDXA), PDEP(PDEP), PDXP(PDXP),
|
||||
SREFEN(SREFEN), SREFEX(SREFEX) {}
|
||||
|
||||
CommandLengths() {}
|
||||
CommandLengths() = default;
|
||||
};
|
||||
|
||||
#endif // COMMANDLENGTHS_H
|
||||
|
||||
@@ -38,36 +38,44 @@
|
||||
|
||||
#ifndef GENERALINFO_H
|
||||
#define GENERALINFO_H
|
||||
|
||||
#include "timespan.h"
|
||||
#include <QString>
|
||||
|
||||
struct GeneralInfo
|
||||
{
|
||||
public:
|
||||
unsigned int numberOfTransactions;
|
||||
unsigned int numberOfPhases;
|
||||
Timespan span;
|
||||
unsigned int numberOfRanks;
|
||||
unsigned int numberOfBankgroups;
|
||||
unsigned int numberOfBanks;
|
||||
unsigned int banksPerRank;
|
||||
unsigned int groupsPerRank;
|
||||
unsigned int banksPerGroup;
|
||||
QString unitOfTime;
|
||||
unsigned int clkPeriod;
|
||||
unsigned int windowSize;
|
||||
unsigned int controllerThread;
|
||||
uint64_t numberOfTransactions = 0;
|
||||
uint64_t numberOfPhases = 0;
|
||||
Timespan span = 0;
|
||||
unsigned int numberOfRanks = 1;
|
||||
unsigned int numberOfBankGroups = 1;
|
||||
unsigned int numberOfBanks = 1;
|
||||
unsigned int banksPerRank = 1;
|
||||
unsigned int groupsPerRank = 1;
|
||||
unsigned int banksPerGroup = 1;
|
||||
QString description = "empty";
|
||||
QString unitOfTime = "PS";
|
||||
uint64_t clkPeriod = 1000;
|
||||
uint64_t windowSize = 0;
|
||||
unsigned int refreshMaxPostponed = 0;
|
||||
unsigned int refreshMaxPulledin = 0;
|
||||
uint64_t controllerThread = UINT64_MAX;
|
||||
unsigned int maxBufferDepth = 8;
|
||||
unsigned int per2BankOffset = 1;
|
||||
|
||||
GeneralInfo(unsigned int numberOfTransactions, unsigned int numberOfPhases, Timespan span,
|
||||
GeneralInfo() = default;
|
||||
GeneralInfo(uint64_t numberOfTransactions, uint64_t numberOfPhases, Timespan span,
|
||||
unsigned int numberOfRanks, unsigned int numberOfBankgroups, unsigned int numberOfBanks,
|
||||
QString unitOfTime, unsigned int clkPeriod, unsigned int windowSize, unsigned int controllerThread)
|
||||
: numberOfTransactions(numberOfTransactions), numberOfPhases(numberOfPhases), span(span),
|
||||
numberOfRanks(numberOfRanks), numberOfBankgroups(numberOfBankgroups), numberOfBanks(numberOfBanks),
|
||||
banksPerRank(numberOfBanks / numberOfRanks), groupsPerRank(numberOfBankgroups / numberOfRanks),
|
||||
banksPerGroup(numberOfBanks / numberOfBankgroups), unitOfTime(unitOfTime), clkPeriod(clkPeriod),
|
||||
windowSize(windowSize), controllerThread(controllerThread)
|
||||
{
|
||||
}
|
||||
QString description, QString unitOfTime, uint64_t clkPeriod, uint64_t windowSize,
|
||||
unsigned int refreshMaxPostponed, unsigned int refreshMaxPulledin,
|
||||
uint64_t controllerThread, unsigned int maxBufferDepth, unsigned int per2BankOffset) :
|
||||
numberOfTransactions(numberOfTransactions) , numberOfPhases(numberOfPhases), span(span),
|
||||
numberOfRanks(numberOfRanks), numberOfBankGroups(numberOfBankgroups), numberOfBanks(numberOfBanks),
|
||||
banksPerRank(numberOfBanks / numberOfRanks), groupsPerRank(numberOfBankgroups / numberOfRanks),
|
||||
banksPerGroup(numberOfBanks / numberOfBankgroups), description(std::move(description)),
|
||||
unitOfTime(std::move(unitOfTime)), clkPeriod(clkPeriod), windowSize(windowSize),
|
||||
refreshMaxPostponed(refreshMaxPostponed), refreshMaxPulledin(refreshMaxPulledin),
|
||||
controllerThread(controllerThread), maxBufferDepth(maxBufferDepth), per2BankOffset(per2BankOffset) {}
|
||||
};
|
||||
|
||||
#endif // GENERALINFO_H
|
||||
|
||||
@@ -43,8 +43,6 @@
|
||||
#include "businessObjects/transaction.h"
|
||||
#include <cmath>
|
||||
|
||||
using namespace std;
|
||||
|
||||
void Phase::draw(QPainter *painter, const QwtScaleMap &xMap,
|
||||
const QwtScaleMap &yMap, const QRectF &canvasRect, bool highlight,
|
||||
const TraceDrawingProperties &drawingProperties) const
|
||||
@@ -179,20 +177,16 @@ void Phase::drawPhaseDependencies(traceTime begin, traceTime end, double y,
|
||||
|
||||
QColor Phase::getColor(const TraceDrawingProperties &drawingProperties) const
|
||||
{
|
||||
switch (drawingProperties.colorGrouping) {
|
||||
case ColorGrouping::PhaseType:
|
||||
return getPhaseColor();
|
||||
break;
|
||||
case ColorGrouping::Thread:
|
||||
return ColorGenerator::getColor(static_cast<unsigned int>(transaction.lock()->thread));
|
||||
break;
|
||||
case ColorGrouping::AlphaTransaction:
|
||||
return ColorGenerator::getAlphaColored(transaction.lock()->id);
|
||||
|
||||
break;
|
||||
case ColorGrouping::Transaction:
|
||||
default:
|
||||
return ColorGenerator::getColor(transaction.lock()->id);
|
||||
switch (drawingProperties.colorGrouping)
|
||||
{
|
||||
case ColorGrouping::PhaseType:
|
||||
return getPhaseColor();
|
||||
case ColorGrouping::Thread:
|
||||
return ColorGenerator::getColor(static_cast<unsigned int>(transaction.lock()->thread));
|
||||
case ColorGrouping::AlphaTransaction:
|
||||
return ColorGenerator::getAlphaColored(transaction.lock()->id);
|
||||
case ColorGrouping::Transaction: default:
|
||||
return ColorGenerator::getColor(transaction.lock()->id);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -252,13 +246,22 @@ std::vector<std::shared_ptr<TracePlotLine>> Phase::getTracePlotLines(const Trace
|
||||
return drawingProperties.getBankLinesGroupwise(transaction.lock()->rank,
|
||||
transaction.lock()->bank % drawingProperties.banksPerGroup);
|
||||
}
|
||||
else if (getGranularity() == Granularity::TwoBankwise)
|
||||
{
|
||||
unsigned int firstGroup = transaction.lock()->bank / drawingProperties.banksPerGroup;
|
||||
unsigned int firstBank = transaction.lock()->bank % drawingProperties.banksPerGroup;
|
||||
unsigned int secondGroup = (transaction.lock()->bank + drawingProperties.per2BankOffset)
|
||||
/ drawingProperties.banksPerGroup;
|
||||
unsigned int secondBank = (transaction.lock()->bank + drawingProperties.per2BankOffset)
|
||||
% drawingProperties.banksPerGroup;
|
||||
return drawingProperties.getBankLinesTwoBankwise(transaction.lock()->rank, firstGroup, firstBank, secondGroup,
|
||||
secondBank);
|
||||
}
|
||||
else // if (getGranularity() == Granularity::Bankwise)
|
||||
{
|
||||
return drawingProperties.getBankLines(transaction.lock()->rank,
|
||||
transaction.lock()->bankgroup % drawingProperties.groupsPerRank,
|
||||
transaction.lock()->bank
|
||||
% drawingProperties.banksPerRank
|
||||
% drawingProperties.banksPerGroup);
|
||||
transaction.lock()->bank % drawingProperties.banksPerGroup);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -106,7 +106,7 @@ protected:
|
||||
|
||||
virtual std::vector<std::shared_ptr<TracePlotLine>> getTracePlotLines(const TraceDrawingProperties &drawingProperties) const;
|
||||
|
||||
enum class Granularity {Bankwise, Groupwise, Rankwise};
|
||||
enum class Granularity {Bankwise, TwoBankwise, Groupwise, Rankwise};
|
||||
|
||||
virtual Granularity getGranularity() const
|
||||
{
|
||||
@@ -121,15 +121,15 @@ class REQ : public Phase
|
||||
public:
|
||||
using Phase::Phase;
|
||||
protected:
|
||||
virtual QColor getPhaseColor() const override
|
||||
QColor getPhaseColor() const override
|
||||
{
|
||||
return ColorGenerator::getColor(1);
|
||||
}
|
||||
virtual QString Name() const final
|
||||
QString Name() const final
|
||||
{
|
||||
return "REQ";
|
||||
}
|
||||
virtual std::vector<std::shared_ptr<TracePlotLine>> getTracePlotLines(const TraceDrawingProperties &drawingProperties) const
|
||||
std::vector<std::shared_ptr<TracePlotLine>> getTracePlotLines(const TraceDrawingProperties &drawingProperties) const
|
||||
override
|
||||
{
|
||||
return drawingProperties.getRequestLines();
|
||||
@@ -142,22 +142,22 @@ class RESP : public Phase
|
||||
public:
|
||||
using Phase::Phase;
|
||||
protected:
|
||||
virtual QColor getPhaseColor() const override
|
||||
QColor getPhaseColor() const override
|
||||
{
|
||||
return ColorGenerator::getColor(1);
|
||||
}
|
||||
virtual QString Name() const override
|
||||
QString Name() const override
|
||||
{
|
||||
return "RESP";
|
||||
}
|
||||
virtual std::vector<std::shared_ptr<TracePlotLine>> getTracePlotLines(const TraceDrawingProperties &drawingProperties) const
|
||||
std::vector<std::shared_ptr<TracePlotLine>> getTracePlotLines(const TraceDrawingProperties &drawingProperties) const
|
||||
override
|
||||
{
|
||||
return drawingProperties.getResponseLines();
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
class PREB: public Phase
|
||||
{
|
||||
public:
|
||||
@@ -172,19 +172,19 @@ protected:
|
||||
return "PREB";
|
||||
}
|
||||
};
|
||||
|
||||
class PRE : public Phase
|
||||
*/
|
||||
class PREPB : public Phase
|
||||
{
|
||||
public:
|
||||
using Phase::Phase;
|
||||
protected:
|
||||
virtual QColor getPhaseColor() const override
|
||||
QColor getPhaseColor() const override
|
||||
{
|
||||
return ColorGenerator::getColor(1);
|
||||
}
|
||||
virtual QString Name() const override
|
||||
QString Name() const override
|
||||
{
|
||||
return "PRE";
|
||||
return "PREPB";
|
||||
}
|
||||
};
|
||||
|
||||
@@ -193,7 +193,7 @@ class PRESB : public Phase
|
||||
public:
|
||||
using Phase::Phase;
|
||||
protected:
|
||||
virtual QString Name() const override
|
||||
QString Name() const override
|
||||
{
|
||||
return "PRESB";
|
||||
}
|
||||
@@ -201,49 +201,49 @@ protected:
|
||||
{
|
||||
return {span.Begin()};
|
||||
}
|
||||
virtual QColor getColor(const TraceDrawingProperties &drawingProperties) const
|
||||
QColor getColor(const TraceDrawingProperties &drawingProperties) const
|
||||
override
|
||||
{
|
||||
Q_UNUSED(drawingProperties) return getPhaseColor();
|
||||
}
|
||||
virtual QColor getPhaseColor() const override
|
||||
QColor getPhaseColor() const override
|
||||
{
|
||||
return ColorGenerator::getColor(1);
|
||||
}
|
||||
virtual Granularity getGranularity() const override
|
||||
Granularity getGranularity() const override
|
||||
{
|
||||
return Granularity::Groupwise;
|
||||
}
|
||||
};
|
||||
|
||||
class PREA : public Phase
|
||||
class PREAB : public Phase
|
||||
{
|
||||
public:
|
||||
using Phase::Phase;
|
||||
protected:
|
||||
virtual QString Name() const override
|
||||
QString Name() const override
|
||||
{
|
||||
return "PREA";
|
||||
return "PREAB";
|
||||
}
|
||||
virtual std::vector<traceTime> getTimesOnCommandBus() const
|
||||
{
|
||||
return {span.Begin()};
|
||||
}
|
||||
virtual QColor getColor(const TraceDrawingProperties &drawingProperties) const
|
||||
QColor getColor(const TraceDrawingProperties &drawingProperties) const
|
||||
override
|
||||
{
|
||||
Q_UNUSED(drawingProperties) return getPhaseColor();
|
||||
}
|
||||
virtual QColor getPhaseColor() const override
|
||||
QColor getPhaseColor() const override
|
||||
{
|
||||
return ColorGenerator::getColor(10);
|
||||
}
|
||||
virtual Granularity getGranularity() const override
|
||||
Granularity getGranularity() const override
|
||||
{
|
||||
return Granularity::Rankwise;
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
class ACTB : public Phase
|
||||
{
|
||||
public:
|
||||
@@ -258,17 +258,17 @@ protected:
|
||||
return "ACTB";
|
||||
}
|
||||
};
|
||||
|
||||
*/
|
||||
class ACT : public Phase
|
||||
{
|
||||
public:
|
||||
using Phase::Phase;
|
||||
protected:
|
||||
virtual QColor getPhaseColor() const override
|
||||
QColor getPhaseColor() const override
|
||||
{
|
||||
return ColorGenerator::getColor(3);
|
||||
}
|
||||
virtual QString Name() const override
|
||||
QString Name() const override
|
||||
{
|
||||
return "ACT";
|
||||
}
|
||||
@@ -279,11 +279,11 @@ class RD : public Phase
|
||||
public:
|
||||
using Phase::Phase;
|
||||
protected:
|
||||
virtual QColor getPhaseColor() const override
|
||||
QColor getPhaseColor() const override
|
||||
{
|
||||
return ColorGenerator::getColor(4);
|
||||
}
|
||||
virtual QString Name() const override
|
||||
QString Name() const override
|
||||
{
|
||||
return "RD";
|
||||
}
|
||||
@@ -294,11 +294,11 @@ class RDA : public Phase
|
||||
public:
|
||||
using Phase::Phase;
|
||||
protected:
|
||||
virtual QColor getPhaseColor() const override
|
||||
QColor getPhaseColor() const override
|
||||
{
|
||||
return ColorGenerator::getColor(5);
|
||||
}
|
||||
virtual QString Name() const override
|
||||
QString Name() const override
|
||||
{
|
||||
return "RDA";
|
||||
}
|
||||
@@ -309,11 +309,11 @@ class WR : public Phase
|
||||
public:
|
||||
using Phase::Phase;
|
||||
protected:
|
||||
virtual QColor getPhaseColor() const override
|
||||
QColor getPhaseColor() const override
|
||||
{
|
||||
return ColorGenerator::getColor(6);
|
||||
}
|
||||
virtual QString Name() const override
|
||||
QString Name() const override
|
||||
{
|
||||
return "WR";
|
||||
}
|
||||
@@ -324,11 +324,11 @@ class WRA : public Phase
|
||||
public:
|
||||
using Phase::Phase;
|
||||
protected:
|
||||
virtual QColor getPhaseColor() const override
|
||||
QColor getPhaseColor() const override
|
||||
{
|
||||
return ColorGenerator::getColor(7);
|
||||
}
|
||||
virtual QString Name() const override
|
||||
QString Name() const override
|
||||
{
|
||||
return "WRA";
|
||||
}
|
||||
@@ -339,7 +339,7 @@ class AUTO_REFRESH : public Phase
|
||||
public:
|
||||
using Phase::Phase;
|
||||
protected:
|
||||
virtual QString Name() const override
|
||||
QString Name() const override
|
||||
{
|
||||
return "REF";
|
||||
}
|
||||
@@ -347,12 +347,12 @@ protected:
|
||||
{
|
||||
return {span.Begin()};
|
||||
}
|
||||
virtual QColor getColor(const TraceDrawingProperties &drawingProperties) const
|
||||
QColor getColor(const TraceDrawingProperties &drawingProperties) const
|
||||
override
|
||||
{
|
||||
Q_UNUSED(drawingProperties) return getPhaseColor();
|
||||
}
|
||||
virtual QColor getPhaseColor() const override
|
||||
QColor getPhaseColor() const override
|
||||
{
|
||||
QColor phaseColor = QColor(Qt::darkCyan);
|
||||
phaseColor.setAlpha(130);
|
||||
@@ -360,16 +360,16 @@ protected:
|
||||
}
|
||||
};
|
||||
|
||||
class REFA : public AUTO_REFRESH
|
||||
class REFAB : public AUTO_REFRESH
|
||||
{
|
||||
public:
|
||||
using AUTO_REFRESH::AUTO_REFRESH;
|
||||
protected:
|
||||
virtual QString Name() const override
|
||||
QString Name() const override
|
||||
{
|
||||
return "REFA";
|
||||
return "REFAB";
|
||||
}
|
||||
virtual Granularity getGranularity() const override
|
||||
Granularity getGranularity() const override
|
||||
{
|
||||
return Granularity::Rankwise;
|
||||
}
|
||||
@@ -380,15 +380,15 @@ class RFMAB : public AUTO_REFRESH
|
||||
public:
|
||||
using AUTO_REFRESH::AUTO_REFRESH;
|
||||
protected:
|
||||
virtual QString Name() const override
|
||||
QString Name() const override
|
||||
{
|
||||
return "RFMAB";
|
||||
}
|
||||
virtual Granularity getGranularity() const override
|
||||
Granularity getGranularity() const override
|
||||
{
|
||||
return Granularity::Rankwise;
|
||||
}
|
||||
virtual QColor getPhaseColor() const override
|
||||
QColor getPhaseColor() const override
|
||||
{
|
||||
QColor phaseColor = QColor(Qt::darkRed);
|
||||
phaseColor.setAlpha(130);
|
||||
@@ -397,14 +397,50 @@ protected:
|
||||
};
|
||||
|
||||
|
||||
class REFB : public AUTO_REFRESH
|
||||
class REFPB : public AUTO_REFRESH
|
||||
{
|
||||
public:
|
||||
using AUTO_REFRESH::AUTO_REFRESH;
|
||||
protected:
|
||||
virtual QString Name() const override
|
||||
QString Name() const override
|
||||
{
|
||||
return "REFB";
|
||||
return "REFPB";
|
||||
}
|
||||
};
|
||||
|
||||
class REFP2B : public AUTO_REFRESH
|
||||
{
|
||||
public:
|
||||
using AUTO_REFRESH::AUTO_REFRESH;
|
||||
protected:
|
||||
QString Name() const override
|
||||
{
|
||||
return "REFP2B";
|
||||
}
|
||||
Granularity getGranularity() const override
|
||||
{
|
||||
return Granularity::TwoBankwise;
|
||||
}
|
||||
};
|
||||
|
||||
class RFMP2B : public AUTO_REFRESH
|
||||
{
|
||||
public:
|
||||
using AUTO_REFRESH::AUTO_REFRESH;
|
||||
protected:
|
||||
QString Name() const override
|
||||
{
|
||||
return "RFMP2B";
|
||||
}
|
||||
Granularity getGranularity() const override
|
||||
{
|
||||
return Granularity::TwoBankwise;
|
||||
}
|
||||
QColor getPhaseColor() const override
|
||||
{
|
||||
QColor phaseColor = QColor(Qt::darkRed);
|
||||
phaseColor.setAlpha(130);
|
||||
return phaseColor;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -413,11 +449,11 @@ class REFSB : public AUTO_REFRESH
|
||||
public:
|
||||
using AUTO_REFRESH::AUTO_REFRESH;
|
||||
protected:
|
||||
virtual QString Name() const override
|
||||
QString Name() const override
|
||||
{
|
||||
return "REFSB";
|
||||
}
|
||||
virtual Granularity getGranularity() const override
|
||||
Granularity getGranularity() const override
|
||||
{
|
||||
return Granularity::Groupwise;
|
||||
}
|
||||
@@ -428,15 +464,15 @@ class RFMSB : public AUTO_REFRESH
|
||||
public:
|
||||
using AUTO_REFRESH::AUTO_REFRESH;
|
||||
protected:
|
||||
virtual QString Name() const override
|
||||
QString Name() const override
|
||||
{
|
||||
return "RFMSB";
|
||||
}
|
||||
virtual Granularity getGranularity() const override
|
||||
Granularity getGranularity() const override
|
||||
{
|
||||
return Granularity::Groupwise;
|
||||
}
|
||||
virtual QColor getPhaseColor() const override
|
||||
QColor getPhaseColor() const override
|
||||
{
|
||||
QColor phaseColor = QColor(Qt::darkRed);
|
||||
phaseColor.setAlpha(130);
|
||||
@@ -449,24 +485,24 @@ class PDNAB : public Phase
|
||||
public:
|
||||
using Phase::Phase;
|
||||
protected:
|
||||
virtual QString Name() const override
|
||||
QString Name() const override
|
||||
{
|
||||
return "PDNAB";
|
||||
}
|
||||
virtual Qt::BrushStyle getBrushStyle() const override
|
||||
Qt::BrushStyle getBrushStyle() const override
|
||||
{
|
||||
return Qt::Dense6Pattern;
|
||||
}
|
||||
virtual QColor getColor(const TraceDrawingProperties &drawingProperties) const
|
||||
QColor getColor(const TraceDrawingProperties &drawingProperties) const
|
||||
override
|
||||
{
|
||||
Q_UNUSED(drawingProperties) return getPhaseColor();
|
||||
}
|
||||
virtual QColor getPhaseColor() const override
|
||||
QColor getPhaseColor() const override
|
||||
{
|
||||
return QColor(Qt::black);
|
||||
return {Qt::black};
|
||||
}
|
||||
virtual Phase::PhaseSymbol getPhaseSymbol() const override
|
||||
Phase::PhaseSymbol getPhaseSymbol() const override
|
||||
{
|
||||
return PhaseSymbol::Rect;
|
||||
}
|
||||
@@ -477,11 +513,11 @@ class PDNA : public PDNAB
|
||||
public:
|
||||
using PDNAB::PDNAB;
|
||||
protected:
|
||||
virtual QString Name() const override
|
||||
QString Name() const override
|
||||
{
|
||||
return "PDNA";
|
||||
}
|
||||
virtual Granularity getGranularity() const override
|
||||
Granularity getGranularity() const override
|
||||
{
|
||||
return Granularity::Rankwise;
|
||||
}
|
||||
@@ -492,24 +528,24 @@ class PDNPB : public Phase
|
||||
public:
|
||||
using Phase::Phase;
|
||||
protected:
|
||||
virtual QString Name() const override
|
||||
QString Name() const override
|
||||
{
|
||||
return "PDNPB";
|
||||
}
|
||||
virtual Qt::BrushStyle getBrushStyle() const override
|
||||
Qt::BrushStyle getBrushStyle() const override
|
||||
{
|
||||
return Qt::Dense4Pattern;
|
||||
}
|
||||
virtual QColor getColor(const TraceDrawingProperties &drawingProperties) const
|
||||
QColor getColor(const TraceDrawingProperties &drawingProperties) const
|
||||
override
|
||||
{
|
||||
Q_UNUSED(drawingProperties) return getPhaseColor();
|
||||
}
|
||||
virtual QColor getPhaseColor() const override
|
||||
QColor getPhaseColor() const override
|
||||
{
|
||||
return QColor(Qt::black);
|
||||
return {Qt::black};
|
||||
}
|
||||
virtual Phase::PhaseSymbol getPhaseSymbol() const override
|
||||
Phase::PhaseSymbol getPhaseSymbol() const override
|
||||
{
|
||||
return PhaseSymbol::Rect;
|
||||
}
|
||||
@@ -520,11 +556,11 @@ class PDNP : public PDNPB
|
||||
public:
|
||||
using PDNPB::PDNPB;
|
||||
protected:
|
||||
virtual QString Name() const override
|
||||
QString Name() const override
|
||||
{
|
||||
return "PDNP";
|
||||
}
|
||||
virtual Granularity getGranularity() const override
|
||||
Granularity getGranularity() const override
|
||||
{
|
||||
return Granularity::Rankwise;
|
||||
}
|
||||
@@ -535,24 +571,24 @@ class SREFB : public Phase
|
||||
public:
|
||||
using Phase::Phase;
|
||||
protected:
|
||||
virtual QString Name() const override
|
||||
QString Name() const override
|
||||
{
|
||||
return "SREFB";
|
||||
}
|
||||
virtual Qt::BrushStyle getBrushStyle() const override
|
||||
Qt::BrushStyle getBrushStyle() const override
|
||||
{
|
||||
return Qt::Dense1Pattern;
|
||||
}
|
||||
virtual QColor getColor(const TraceDrawingProperties &drawingProperties) const
|
||||
QColor getColor(const TraceDrawingProperties &drawingProperties) const
|
||||
override
|
||||
{
|
||||
Q_UNUSED(drawingProperties) return getPhaseColor();
|
||||
}
|
||||
virtual QColor getPhaseColor() const override
|
||||
QColor getPhaseColor() const override
|
||||
{
|
||||
return QColor(Qt::black);
|
||||
return {Qt::black};
|
||||
}
|
||||
virtual Phase::PhaseSymbol getPhaseSymbol() const override
|
||||
Phase::PhaseSymbol getPhaseSymbol() const override
|
||||
{
|
||||
return PhaseSymbol::Rect;
|
||||
}
|
||||
@@ -563,11 +599,11 @@ class SREF : public SREFB
|
||||
public:
|
||||
using SREFB::SREFB;
|
||||
protected:
|
||||
virtual QString Name() const override
|
||||
QString Name() const override
|
||||
{
|
||||
return "SREF";
|
||||
}
|
||||
virtual Granularity getGranularity() const override
|
||||
Granularity getGranularity() const override
|
||||
{
|
||||
return Granularity::Rankwise;
|
||||
}
|
||||
|
||||
@@ -42,81 +42,88 @@
|
||||
#include "data/tracedb.h"
|
||||
#include "businessObjects/timespan.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
shared_ptr<Phase> PhaseFactory::CreatePhase(ID id, const QString &dbPhaseName,
|
||||
const Timespan &span, const shared_ptr<Transaction> &trans, TraceDB &database)
|
||||
std::shared_ptr<Phase> PhaseFactory::CreatePhase(ID id, const QString &dbPhaseName,
|
||||
const Timespan &span, const std::shared_ptr<Transaction> &trans,
|
||||
TraceDB &database)
|
||||
{
|
||||
traceTime clk = database.getGeneralInfo().clkPeriod;
|
||||
const CommandLengths &cl = database.getCommandLengths();
|
||||
|
||||
if (dbPhaseName == "REQ")
|
||||
return shared_ptr<Phase>(new REQ(id, span, clk, trans, {}, std::shared_ptr<Timespan>()));
|
||||
return std::shared_ptr<Phase>(new REQ(id, span, clk, trans, {}, std::shared_ptr<Timespan>()));
|
||||
else if (dbPhaseName == "RESP")
|
||||
return shared_ptr<Phase>(new RESP(id, span, clk, trans, {}, std::shared_ptr<Timespan>()));
|
||||
|
||||
else if (dbPhaseName == "PREB")
|
||||
return std::shared_ptr<Phase>(new RESP(id, span, clk, trans, {}, std::shared_ptr<Timespan>()));
|
||||
/*else if (dbPhaseName == "PREB")
|
||||
return shared_ptr<Phase>(new PREB(id, span, clk, trans,
|
||||
{Timespan(span.Begin(), span.Begin() + clk)}, std::shared_ptr<Timespan>()));
|
||||
else if (dbPhaseName == "PRE")
|
||||
return shared_ptr<Phase>(new PRE(id, span, clk, trans,
|
||||
{Timespan(span.Begin(), span.Begin() + clk * cl.PRE)}, std::shared_ptr<Timespan>()));
|
||||
else if (dbPhaseName == "ACTB")
|
||||
return shared_ptr<Phase>(new ACTB(id, span, clk, trans,
|
||||
{Timespan(span.Begin(), span.Begin() + clk)}, std::shared_ptr<Timespan>()));
|
||||
{Timespan(span.Begin(), span.Begin() + clk)}, std::shared_ptr<Timespan>()));*/
|
||||
else if (dbPhaseName == "PREPB" || dbPhaseName == "PRE") // for backwards compatibility
|
||||
return std::shared_ptr<Phase>(new PREPB(id, span, clk, trans,
|
||||
{Timespan(span.Begin(), span.Begin() + clk * cl.PREPB)}, std::shared_ptr<Timespan>()));
|
||||
/*else if (dbPhaseName == "ACTB")
|
||||
return std::shared_ptr<Phase>(new ACTB(id, span, clk, trans,
|
||||
{Timespan(span.Begin(), span.Begin() + clk)}, std::shared_ptr<Timespan>()));*/
|
||||
else if (dbPhaseName == "ACT")
|
||||
return shared_ptr<Phase>(new ACT(id, span, clk, trans,
|
||||
return std::shared_ptr<Phase>(new ACT(id, span, clk, trans,
|
||||
{Timespan(span.Begin(), span.Begin() + clk * cl.ACT)}, std::shared_ptr<Timespan>()));
|
||||
else if (dbPhaseName == "PREA")
|
||||
return shared_ptr<Phase>(new PREA(id, span, clk, trans,
|
||||
{Timespan(span.Begin(), span.Begin() + clk * cl.PREA)}, std::shared_ptr<Timespan>()));
|
||||
else if (dbPhaseName == "REFA")
|
||||
return shared_ptr<Phase>(new REFA(id, span, clk, trans,
|
||||
{Timespan(span.Begin(), span.Begin() + clk * cl.REFA)}, std::shared_ptr<Timespan>()));
|
||||
else if (dbPhaseName == "PREAB" || dbPhaseName == "PREA") // for backwards compatibility
|
||||
return std::shared_ptr<Phase>(new PREAB(id, span, clk, trans,
|
||||
{Timespan(span.Begin(), span.Begin() + clk * cl.PREAB)}, std::shared_ptr<Timespan>()));
|
||||
else if (dbPhaseName == "REFAB" || dbPhaseName == "REFA") // for backwards compatibility
|
||||
return std::shared_ptr<Phase>(new REFAB(id, span, clk, trans,
|
||||
{Timespan(span.Begin(), span.Begin() + clk * cl.REFAB)}, std::shared_ptr<Timespan>()));
|
||||
else if (dbPhaseName == "RFMAB")
|
||||
return shared_ptr<Phase>(new RFMAB(id, span, clk, trans,
|
||||
return std::shared_ptr<Phase>(new RFMAB(id, span, clk, trans,
|
||||
{Timespan(span.Begin(), span.Begin() + clk * cl.RFMAB)}, std::shared_ptr<Timespan>()));
|
||||
else if (dbPhaseName == "REFB")
|
||||
return shared_ptr<Phase>(new REFB(id, span, clk, trans,
|
||||
{Timespan(span.Begin(), span.Begin() + clk * cl.REFB)}, std::shared_ptr<Timespan>()));
|
||||
else if (dbPhaseName == "REFPB" || dbPhaseName == "REFB") // for backwards compatibility
|
||||
return std::shared_ptr<Phase>(new REFPB(id, span, clk, trans,
|
||||
{Timespan(span.Begin(), span.Begin() + clk * cl.REFPB)}, std::shared_ptr<Timespan>()));
|
||||
else if (dbPhaseName == "RFMPB")
|
||||
return std::shared_ptr<Phase>(new REFPB(id, span, clk, trans,
|
||||
{Timespan(span.Begin(), span.Begin() + clk * cl.RFMPB)}, std::shared_ptr<Timespan>()));
|
||||
else if (dbPhaseName == "REFP2B")
|
||||
return std::shared_ptr<Phase>(new REFP2B(id, span, clk, trans,
|
||||
{Timespan(span.Begin(), span.Begin() + clk * cl.REFP2B)}, std::shared_ptr<Timespan>()));
|
||||
else if (dbPhaseName == "RFMP2B")
|
||||
return std::shared_ptr<Phase>(new REFP2B(id, span, clk, trans,
|
||||
{Timespan(span.Begin(), span.Begin() + clk * cl.RFMP2B)}, std::shared_ptr<Timespan>()));
|
||||
else if (dbPhaseName == "PRESB")
|
||||
return shared_ptr<Phase>(new PRESB(id, span, clk, trans,
|
||||
return std::shared_ptr<Phase>(new PRESB(id, span, clk, trans,
|
||||
{Timespan(span.Begin(), span.Begin() + clk * cl.PRESB)}, std::shared_ptr<Timespan>()));
|
||||
else if (dbPhaseName == "REFSB")
|
||||
return shared_ptr<Phase>(new REFSB(id, span, clk, trans,
|
||||
return std::shared_ptr<Phase>(new REFSB(id, span, clk, trans,
|
||||
{Timespan(span.Begin(), span.Begin() + clk * cl.REFSB)}, std::shared_ptr<Timespan>()));
|
||||
else if (dbPhaseName == "RFMSB")
|
||||
return shared_ptr<Phase>(new RFMSB(id, span, clk, trans,
|
||||
return std::shared_ptr<Phase>(new RFMSB(id, span, clk, trans,
|
||||
{Timespan(span.Begin(), span.Begin() + clk * cl.RFMSB)}, std::shared_ptr<Timespan>()));
|
||||
else if (dbPhaseName == "RD")
|
||||
return shared_ptr<Phase>(new RD(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RD)},
|
||||
return std::shared_ptr<Phase>(new RD(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RD)},
|
||||
std::shared_ptr<Timespan>(new Timespan(trans->spanOnDataStrobe))));
|
||||
else if (dbPhaseName == "RDA")
|
||||
return shared_ptr<Phase>(new RDA(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RDA)},
|
||||
return std::shared_ptr<Phase>(new RDA(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.RDA)},
|
||||
std::shared_ptr<Timespan>(new Timespan(trans->spanOnDataStrobe))));
|
||||
else if (dbPhaseName == "WR")
|
||||
return shared_ptr<Phase>(new WR(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.WR)},
|
||||
return std::shared_ptr<Phase>(new WR(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.WR)},
|
||||
std::shared_ptr<Timespan>(new Timespan(trans->spanOnDataStrobe))));
|
||||
else if (dbPhaseName == "WRA")
|
||||
return shared_ptr<Phase>(new WRA(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.WRA)},
|
||||
return std::shared_ptr<Phase>(new WRA(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.WRA)},
|
||||
std::shared_ptr<Timespan>(new Timespan(trans->spanOnDataStrobe))));
|
||||
else if (dbPhaseName == "PDNA")
|
||||
return shared_ptr<Phase>(new PDNA(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.PDEA),
|
||||
return std::shared_ptr<Phase>(new PDNA(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.PDEA),
|
||||
Timespan(span.End() - clk * cl.PDXA, span.End())}, std::shared_ptr<Timespan>()));
|
||||
else if (dbPhaseName == "PDNAB")
|
||||
return shared_ptr<Phase>(new PDNAB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk),
|
||||
return std::shared_ptr<Phase>(new PDNAB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk),
|
||||
Timespan(span.End() - clk, span.End())}, std::shared_ptr<Timespan>()));
|
||||
else if (dbPhaseName == "PDNP")
|
||||
return shared_ptr<Phase>(new PDNP(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.PDEP),
|
||||
return std::shared_ptr<Phase>(new PDNP(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.PDEP),
|
||||
Timespan(span.End() - clk * cl.PDXP, span.End())}, std::shared_ptr<Timespan>()));
|
||||
else if (dbPhaseName == "PDNPB")
|
||||
return shared_ptr<Phase>(new PDNPB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk),
|
||||
return std::shared_ptr<Phase>(new PDNPB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk),
|
||||
Timespan(span.End() - clk, span.End())}, std::shared_ptr<Timespan>()));
|
||||
else if (dbPhaseName == "SREF")
|
||||
return shared_ptr<Phase>(new SREF(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.SREFEN),
|
||||
return std::shared_ptr<Phase>(new SREF(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk * cl.SREFEN),
|
||||
Timespan(span.End() - clk * cl.SREFEX, span.End())}, std::shared_ptr<Timespan>()));
|
||||
else if (dbPhaseName == "SREFB")
|
||||
return shared_ptr<Phase>(new SREFB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk),
|
||||
return std::shared_ptr<Phase>(new SREFB(id, span, clk, trans, {Timespan(span.Begin(), span.Begin() + clk),
|
||||
Timespan(span.End() - clk, span.End())}, std::shared_ptr<Timespan>()));
|
||||
else
|
||||
throw std::runtime_error("DB phasename " + dbPhaseName.toStdString() + " unkown to phasefactory");
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
|
||||
#ifndef PHASEFACTORY_H
|
||||
#define PHASEFACTORY_H
|
||||
|
||||
#include "phase.h"
|
||||
#include <QStringList>
|
||||
#include <memory>
|
||||
@@ -46,9 +47,8 @@ class TraceDB;
|
||||
|
||||
class PhaseFactory
|
||||
{
|
||||
private:
|
||||
PhaseFactory();
|
||||
public:
|
||||
PhaseFactory() = delete;
|
||||
static std::shared_ptr<Phase> CreatePhase(ID id, const QString &dbPhaseName,
|
||||
const Timespan &span, const std::shared_ptr<Transaction> &trans,
|
||||
TraceDB &database);
|
||||
|
||||
@@ -52,14 +52,13 @@
|
||||
//define symbol printqueries if all queries should be printed to the console
|
||||
//#define printqueries
|
||||
|
||||
using namespace std;
|
||||
|
||||
TraceDB::TraceDB(QString path, bool openExisting)
|
||||
{
|
||||
this->pathToDB = path;
|
||||
|
||||
database = QSqlDatabase::database(path);
|
||||
if (database.isValid() && database.isOpen()) {
|
||||
if (database.isValid() && database.isOpen())
|
||||
{
|
||||
// Close the database connection if it exists and was not closed yet.
|
||||
database.removeDatabase(path);
|
||||
database.close();
|
||||
@@ -132,7 +131,7 @@ void TraceDB::refreshData()
|
||||
|
||||
//QueryText must select the fields
|
||||
//TransactionID, Ranges.begin, Ranges.end, Address, TThread, TChannel, TBank, TRow, TColumn, Phases.ID AS PhaseID, PhaseName, PhaseBegin, PhaseEnd
|
||||
vector<shared_ptr<Transaction>> TraceDB::getTransactionsWithCustomQuery(
|
||||
std::vector<std::shared_ptr<Transaction>> TraceDB::getTransactionsWithCustomQuery(
|
||||
QString queryText)
|
||||
{
|
||||
QSqlQuery query(database);
|
||||
@@ -141,7 +140,7 @@ vector<shared_ptr<Transaction>> TraceDB::getTransactionsWithCustomQuery(
|
||||
return parseTransactionsFromQuery(query);
|
||||
}
|
||||
|
||||
vector<shared_ptr<Transaction>> TraceDB::getTransactionsInTimespan(const Timespan &span, bool updateVisiblePhases)
|
||||
std::vector<std::shared_ptr<Transaction>> TraceDB::getTransactionsInTimespan(const Timespan &span, bool updateVisiblePhases)
|
||||
{
|
||||
selectTransactionsByTimespan.bindValue(":begin", span.Begin());
|
||||
selectTransactionsByTimespan.bindValue(":end", span.End());
|
||||
@@ -170,7 +169,7 @@ void TraceDB::updateDependenciesInTimespan(const Timespan &span)
|
||||
}
|
||||
|
||||
//TODO Remove exception
|
||||
shared_ptr<Transaction> TraceDB::getTransactionByID(ID id)
|
||||
std::shared_ptr<Transaction> TraceDB::getTransactionByID(ID id)
|
||||
{
|
||||
selectTransactionById.bindValue(":id", id);
|
||||
executeQuery(selectTransactionById);
|
||||
@@ -183,12 +182,11 @@ shared_ptr<Transaction> TraceDB::getTransactionByID(ID id)
|
||||
}
|
||||
|
||||
|
||||
shared_ptr<Transaction> TraceDB::getNextActivate(traceTime time)
|
||||
std::shared_ptr<Transaction> TraceDB::getNextActivate(traceTime time)
|
||||
{
|
||||
QSqlQuery query(database);
|
||||
QString queryText = queryTexts.queryHead +
|
||||
"WHERE PhaseBegin > :traceTime AND PhaseName "
|
||||
"IN ('ACT','ACTB') ORDER BY PhaseBegin ASC LIMIT 1";
|
||||
"WHERE PhaseBegin > :traceTime AND PhaseName = 'ACT' ORDER BY PhaseBegin ASC LIMIT 1";
|
||||
|
||||
query.prepare(queryText);
|
||||
query.bindValue(":traceTime", time);
|
||||
@@ -196,12 +194,12 @@ shared_ptr<Transaction> TraceDB::getNextActivate(traceTime time)
|
||||
return parseTransactionFromQuery(query);
|
||||
}
|
||||
|
||||
shared_ptr<Transaction> TraceDB::getNextPrecharge(traceTime time)
|
||||
std::shared_ptr<Transaction> TraceDB::getNextPrecharge(traceTime time)
|
||||
{
|
||||
QSqlQuery query(database);
|
||||
QString queryText = queryTexts.queryHead +
|
||||
"WHERE PhaseBegin > :traceTime AND PhaseName "
|
||||
"IN ('PRE','PREA','PREB','PRESB') ORDER BY PhaseBegin ASC LIMIT 1";
|
||||
"IN ('PRE','PREPB','PREA','PREAB','PRESB') ORDER BY PhaseBegin ASC LIMIT 1";
|
||||
|
||||
query.prepare(queryText);
|
||||
query.bindValue(":traceTime", time);
|
||||
@@ -233,12 +231,12 @@ shared_ptr<Transaction> TraceDB::getNextPrecharge(traceTime time)
|
||||
// return parseTransactionFromQuery(query);
|
||||
// }
|
||||
|
||||
shared_ptr<Transaction> TraceDB::getNextRefresh(traceTime time)
|
||||
std::shared_ptr<Transaction> TraceDB::getNextRefresh(traceTime time)
|
||||
{
|
||||
QSqlQuery query(database);
|
||||
QString queryText = queryTexts.queryHead +
|
||||
"WHERE PhaseBegin > :traceTime AND PhaseName "
|
||||
"IN ('REFA','REFB','REFSB','SREF','SREFB') ORDER BY PhaseBegin ASC LIMIT 1";
|
||||
"IN ('REFAB','REFA','REFB','REFPB','REFP2B','REFSB','SREF','SREFB') ORDER BY PhaseBegin ASC LIMIT 1";
|
||||
query.prepare(queryText);
|
||||
query.bindValue(":traceTime", time);
|
||||
executeQuery(query);
|
||||
@@ -278,92 +276,187 @@ ID TraceDB::getTransactionIDFromPhaseID(ID phaseID)
|
||||
if (query.next()) {
|
||||
return query.value(0).toInt();
|
||||
} else {
|
||||
throw sqlException("Phase with ID " + to_string(phaseID) + " not in db",
|
||||
throw sqlException("Phase with ID " + std::to_string(phaseID) + " not in db",
|
||||
this->pathToDB.toStdString());
|
||||
}
|
||||
}
|
||||
|
||||
GeneralInfo *TraceDB::getGeneralInfoFromDB()
|
||||
GeneralInfo TraceDB::getGeneralInfoFromDB()
|
||||
{
|
||||
QSqlQuery query(database);
|
||||
query.prepare("SELECT NumberOfTransactions, TraceEnd, NumberOfRanks, NumberOfBankgroups, NumberOfBanks, Clk, "
|
||||
"UnitOfTime, Traces, Memspec, MCconfig, WindowSize, ControllerThread FROM GeneralInfo");
|
||||
executeQuery(query);
|
||||
QVariant parameter;
|
||||
parameter = getParameterFromTable("NumberOfTransactions", "GeneralInfo");
|
||||
uint64_t numberOfTransactions = parameter.isValid() ? parameter.toULongLong() : 0;
|
||||
parameter = getParameterFromTable("TraceEnd", "GeneralInfo");
|
||||
traceTime traceEnd = parameter.isValid() ? 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;
|
||||
parameter = getParameterFromTable("NumberOfBanks", "GeneralInfo");
|
||||
unsigned numberOfBanks = parameter.isValid() ? parameter.toUInt() : numberOfBankGroups;
|
||||
parameter = getParameterFromTable("Clk", "GeneralInfo");
|
||||
uint64_t clkPeriod = parameter.isValid() ? parameter.toULongLong() : 1000;
|
||||
parameter = getParameterFromTable("UnitOfTime", "GeneralInfo");
|
||||
QString unitOfTime = parameter.isValid() ? parameter.toString() : "PS";
|
||||
parameter = getParameterFromTable("Traces", "GeneralInfo");
|
||||
QString traces = parameter.isValid() ? "Traces: " + parameter.toString() : "Traces: empty";
|
||||
parameter = getParameterFromTable("Memspec", "GeneralInfo");
|
||||
QString memspec = parameter.isValid() ? "Memspec: " + parameter.toString() : "Memspec: empty";
|
||||
parameter = getParameterFromTable("MCconfig", "GeneralInfo");
|
||||
QString mcconfig = parameter.isValid() ? "MCconfig: " + parameter.toString() : "MCconfig: empty";
|
||||
parameter = getParameterFromTable("WindowSize", "GeneralInfo");
|
||||
uint64_t windowSize = parameter.isValid() ? parameter.toULongLong() : 0;
|
||||
parameter = getParameterFromTable("RefreshMaxPostponed", "GeneralInfo");
|
||||
unsigned refreshMaxPostponed = parameter.isValid() ? parameter.toUInt() : 0;
|
||||
parameter = getParameterFromTable("RefreshMaxPulledin", "GeneralInfo");
|
||||
unsigned refreshMaxPulledin = parameter.isValid() ? parameter.toUInt() : 0;
|
||||
parameter = getParameterFromTable("ControllerThread", "GeneralInfo");
|
||||
uint64_t controllerThread = parameter.isValid() ? parameter.toULongLong() : UINT64_MAX;
|
||||
parameter = getParameterFromTable("MaxBufferDepth", "GeneralInfo");
|
||||
unsigned maxBufferDepth = parameter.isValid() ? parameter.toUInt() : 8;
|
||||
parameter = getParameterFromTable("Per2BankOffset", "GeneralInfo");
|
||||
unsigned per2BankOffset = parameter.isValid() ? parameter.toUInt() : 1;
|
||||
|
||||
if (query.next()) {
|
||||
unsigned int numberOfTransactions = query.value(0).toInt();
|
||||
traceTime traceEnd = query.value(1).toLongLong();
|
||||
unsigned int numberOfRanks = query.value(2).toInt();
|
||||
unsigned int numberOfBankgroups = query.value(3).toInt();
|
||||
unsigned int numberOfBanks = query.value(4).toInt();
|
||||
unsigned int clkPeriod = query.value(5).toInt();
|
||||
QString unitOfTime = query.value(6).toString();
|
||||
unsigned int numberOfPhases = getNumberOfPhases();
|
||||
uint64_t numberOfPhases = getNumberOfPhases();
|
||||
|
||||
QString traces = "Traces: " + query.value(7).toString();
|
||||
QString memspec = "Memspec: " + query.value(8).toString();
|
||||
QString mcconfig = "MCconfig: " + query.value(9).toString();
|
||||
unsigned int windowSize = query.value(10).toInt();
|
||||
unsigned int controllerThread = query.value(11).toUInt();
|
||||
QString description = (traces + "\n");
|
||||
description += mcconfig + "\n";
|
||||
description += memspec + "\n";
|
||||
description += "Number of Transactions: " + QString::number(numberOfTransactions) + "\n";
|
||||
description += "Clock period: " + QString::number(clkPeriod) + " " + unitOfTime + "\n";
|
||||
description += "Length of trace: " + prettyFormatTime(traceEnd) + "\n";
|
||||
description += "Window size: " + QString::number(windowSize) + "\n";
|
||||
|
||||
return new GeneralInfo(numberOfTransactions, numberOfPhases, Timespan(0, traceEnd), numberOfRanks,
|
||||
numberOfBankgroups, numberOfBanks, unitOfTime, clkPeriod, windowSize, controllerThread);
|
||||
} else {
|
||||
throw sqlException("Tracefile corrupted. No general info table",
|
||||
this->pathToDB.toStdString());
|
||||
}
|
||||
return {numberOfTransactions, numberOfPhases, Timespan(0, traceEnd), numberOfRanks,
|
||||
numberOfBankGroups, numberOfBanks, description, unitOfTime, clkPeriod, windowSize,
|
||||
refreshMaxPostponed, refreshMaxPulledin, controllerThread, maxBufferDepth, per2BankOffset};
|
||||
}
|
||||
|
||||
CommandLengths TraceDB::getCommandLengthsFromDB()
|
||||
{
|
||||
unsigned NOP = getLengthOfCommandFromDB("NOP");
|
||||
unsigned RD = getLengthOfCommandFromDB("RD");
|
||||
unsigned WR = getLengthOfCommandFromDB("WR");
|
||||
unsigned RDA = getLengthOfCommandFromDB("RDA");
|
||||
unsigned WRA = getLengthOfCommandFromDB("WRA");
|
||||
unsigned ACT = getLengthOfCommandFromDB("ACT");
|
||||
unsigned PRE = getLengthOfCommandFromDB("PRE");
|
||||
unsigned REFB = getLengthOfCommandFromDB("REFB");
|
||||
unsigned PRESB = getLengthOfCommandFromDB("PRESB");
|
||||
unsigned REFSB = getLengthOfCommandFromDB("REFSB");
|
||||
unsigned RFMSB = getLengthOfCommandFromDB("RFMSB");
|
||||
unsigned PREA = getLengthOfCommandFromDB("PREA");
|
||||
unsigned REFA = getLengthOfCommandFromDB("REFA");
|
||||
unsigned RFMAB = getLengthOfCommandFromDB("RFMAB");
|
||||
unsigned PDEA = getLengthOfCommandFromDB("PDEA");
|
||||
unsigned PDXA = getLengthOfCommandFromDB("PDXA");
|
||||
unsigned PDEP = getLengthOfCommandFromDB("PDEP");
|
||||
unsigned PDXP = getLengthOfCommandFromDB("PDXP");
|
||||
unsigned SREFEN = getLengthOfCommandFromDB("SREFEN");
|
||||
unsigned SREFEX = getLengthOfCommandFromDB("SREFEX");
|
||||
|
||||
return {NOP, RD, WR, RDA, WRA, ACT, PRE, REFB, PRESB, REFSB, RFMSB,
|
||||
PREA, REFA, RFMAB, PDEA, PDXA, PDEP, PDXP, SREFEN, SREFEX};
|
||||
}
|
||||
|
||||
unsigned int TraceDB::getLengthOfCommandFromDB(const std::string& command)
|
||||
{
|
||||
QSqlQuery query(("SELECT " + command + " FROM CommandLengths").c_str(), database);
|
||||
if (query.first())
|
||||
return query.value(0).toUInt();
|
||||
QVariant parameter;
|
||||
parameter = getParameterFromTable("NOP", "CommandLengths");
|
||||
unsigned NOP = parameter.isValid() ? parameter.toUInt() : 1;
|
||||
parameter = getParameterFromTable("RD", "CommandLengths");
|
||||
unsigned RD = parameter.isValid() ? parameter.toUInt() : 1;
|
||||
parameter = getParameterFromTable("WR", "CommandLengths");
|
||||
unsigned WR = parameter.isValid() ? parameter.toUInt() : 1;
|
||||
parameter = getParameterFromTable("RDA", "CommandLengths");
|
||||
unsigned RDA = parameter.isValid() ? parameter.toUInt() : 1;
|
||||
parameter = getParameterFromTable("WRA", "CommandLengths");
|
||||
unsigned WRA = parameter.isValid() ? parameter.toUInt() : 1;
|
||||
parameter = getParameterFromTable("ACT", "CommandLengths");
|
||||
unsigned ACT = parameter.isValid() ? parameter.toUInt() : 1;
|
||||
parameter = getParameterFromTable("PREPB", "CommandLengths");
|
||||
unsigned PREPB;
|
||||
if (parameter.isValid())
|
||||
{
|
||||
PREPB = parameter.toUInt();
|
||||
}
|
||||
else
|
||||
{
|
||||
qDebug() << "Warning: Length of command " << command.c_str() << " not present in DB, setting 1 as default.";
|
||||
return 1;
|
||||
parameter = getParameterFromTable("PRE", "CommandLengths");
|
||||
if (parameter.isValid())
|
||||
PREPB = parameter.toUInt();
|
||||
else
|
||||
PREPB = 1;
|
||||
}
|
||||
parameter = getParameterFromTable("REFPB", "CommandLengths");
|
||||
unsigned REFPB;
|
||||
if (parameter.isValid())
|
||||
{
|
||||
REFPB = parameter.toUInt();
|
||||
}
|
||||
else
|
||||
{
|
||||
parameter = getParameterFromTable("REFB", "CommandLengths");
|
||||
if (parameter.isValid())
|
||||
REFPB = parameter.toUInt();
|
||||
else
|
||||
REFPB = 1;
|
||||
}
|
||||
parameter = getParameterFromTable("RFMPB", "CommandLengths");
|
||||
unsigned RFMPB = parameter.isValid() ? parameter.toUInt() : 1;
|
||||
parameter = getParameterFromTable("REFP2B", "CommandLengths");
|
||||
unsigned REFP2B = parameter.isValid() ? parameter.toUInt() : 1;
|
||||
parameter = getParameterFromTable("RFMP2B", "CommandLengths");
|
||||
unsigned RFMP2B = parameter.isValid() ? parameter.toUInt() : 1;
|
||||
parameter = getParameterFromTable("PRESB", "CommandLengths");
|
||||
unsigned PRESB = parameter.isValid() ? parameter.toUInt() : 1;
|
||||
parameter = getParameterFromTable("REFSB", "CommandLengths");
|
||||
unsigned REFSB = parameter.isValid() ? parameter.toUInt() : 1;
|
||||
parameter = getParameterFromTable("RFMSB", "CommandLengths");
|
||||
unsigned RFMSB = parameter.isValid() ? parameter.toUInt() : 1;
|
||||
parameter = getParameterFromTable("PREAB", "CommandLengths");
|
||||
unsigned PREAB;
|
||||
if (parameter.isValid())
|
||||
{
|
||||
PREAB = parameter.toUInt();
|
||||
}
|
||||
else
|
||||
{
|
||||
parameter = getParameterFromTable("PREA", "CommandLengths");
|
||||
if (parameter.isValid())
|
||||
PREAB = parameter.toUInt();
|
||||
else
|
||||
PREAB = 1;
|
||||
}
|
||||
parameter = getParameterFromTable("REFAB", "CommandLengths");
|
||||
unsigned REFAB;
|
||||
if (parameter.isValid())
|
||||
{
|
||||
REFAB = parameter.toUInt();
|
||||
}
|
||||
else
|
||||
{
|
||||
parameter = getParameterFromTable("REFA", "CommandLengths");
|
||||
if (parameter.isValid())
|
||||
REFAB = parameter.toUInt();
|
||||
else
|
||||
REFAB = 1;
|
||||
}
|
||||
parameter = getParameterFromTable("RFMAB", "CommandLengths");
|
||||
unsigned RFMAB = parameter.isValid() ? parameter.toUInt() : 1;
|
||||
parameter = getParameterFromTable("PDEA", "CommandLengths");
|
||||
unsigned PDEA = parameter.isValid() ? parameter.toUInt() : 1;
|
||||
parameter = getParameterFromTable("PDXA", "CommandLengths");
|
||||
unsigned PDXA = parameter.isValid() ? parameter.toUInt() : 1;
|
||||
parameter = getParameterFromTable("PDEP", "CommandLengths");
|
||||
unsigned PDEP = parameter.isValid() ? parameter.toUInt() : 1;
|
||||
parameter = getParameterFromTable("PDXP", "CommandLengths");
|
||||
unsigned PDXP = parameter.isValid() ? parameter.toUInt() : 1;
|
||||
parameter = getParameterFromTable("SREFEN", "CommandLengths");
|
||||
unsigned SREFEN = parameter.isValid() ? parameter.toUInt() : 1;
|
||||
parameter = getParameterFromTable("SREFEX", "CommandLengths");
|
||||
unsigned SREFEX = parameter.isValid() ? parameter.toUInt() : 1;
|
||||
|
||||
return {NOP, RD, WR, RDA, WRA, ACT, PREPB, REFPB, RFMPB, REFP2B, RFMP2B, PRESB, REFSB, RFMSB,
|
||||
PREAB, REFAB, RFMAB, PDEA, PDXA, PDEP, PDXP, SREFEN, SREFEX};
|
||||
}
|
||||
|
||||
QVariant TraceDB::getParameterFromTable(const std::string& parameter, const std::string& table)
|
||||
{
|
||||
QSqlQuery query(("SELECT " + parameter + " FROM " + table).c_str(), database);
|
||||
if (query.first())
|
||||
return query.value(0);
|
||||
else
|
||||
{
|
||||
qDebug() << "Parameter " << parameter.c_str() << " not present in table " << table.c_str();
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int TraceDB::getNumberOfPhases()
|
||||
uint64_t TraceDB::getNumberOfPhases()
|
||||
{
|
||||
QSqlQuery query(database);
|
||||
query.prepare("SELECT COUNT(ID) FROM Phases");
|
||||
executeQuery(query);
|
||||
|
||||
query.next();
|
||||
return query.value(0).toInt();
|
||||
return query.value(0).toULongLong();
|
||||
}
|
||||
|
||||
vector<CommentModel::Comment> TraceDB::getComments()
|
||||
std::vector<CommentModel::Comment> TraceDB::getComments()
|
||||
{
|
||||
QSqlQuery query(database);
|
||||
query.prepare("SELECT Time,Text From Comments");
|
||||
@@ -372,7 +465,7 @@ vector<CommentModel::Comment> TraceDB::getComments()
|
||||
}
|
||||
|
||||
|
||||
vector<CommentModel::Comment> TraceDB::getDebugMessagesInTimespan(const Timespan &span)
|
||||
std::vector<CommentModel::Comment> TraceDB::getDebugMessagesInTimespan(const Timespan &span)
|
||||
{
|
||||
selectDebugMessagesByTimespan.bindValue(":begin", span.Begin());
|
||||
selectDebugMessagesByTimespan.bindValue(":end", span.End());
|
||||
@@ -381,7 +474,7 @@ vector<CommentModel::Comment> TraceDB::getDebugMessagesInTimespan(const Timespan
|
||||
return parseCommentsFromQuery(selectDebugMessagesByTimespan);
|
||||
}
|
||||
|
||||
vector<CommentModel::Comment> TraceDB::getDebugMessagesInTimespan(const Timespan &span,
|
||||
std::vector<CommentModel::Comment> TraceDB::getDebugMessagesInTimespan(const Timespan &span,
|
||||
unsigned int limit = 50)
|
||||
{
|
||||
selectDebugMessagesByTimespanWithLimit.bindValue(":begin", span.Begin());
|
||||
@@ -434,23 +527,23 @@ QSqlDatabase TraceDB::getDatabase() const
|
||||
*/
|
||||
|
||||
|
||||
shared_ptr<Transaction> TraceDB::parseTransactionFromQuery(QSqlQuery &query)
|
||||
std::shared_ptr<Transaction> TraceDB::parseTransactionFromQuery(QSqlQuery &query)
|
||||
{
|
||||
auto result = parseTransactionsFromQuery(query);
|
||||
if (!result.empty())
|
||||
return result[0];
|
||||
else
|
||||
return shared_ptr<Transaction>();
|
||||
return {};
|
||||
}
|
||||
|
||||
vector<shared_ptr<Transaction>> TraceDB::parseTransactionsFromQuery(QSqlQuery &query, bool updateVisiblePhases)
|
||||
std::vector<std::shared_ptr<Transaction>> TraceDB::parseTransactionsFromQuery(QSqlQuery &query, bool updateVisiblePhases)
|
||||
{
|
||||
if (updateVisiblePhases)
|
||||
{
|
||||
_visiblePhases.clear();
|
||||
}
|
||||
|
||||
vector<shared_ptr<Transaction>> result;
|
||||
std::vector<std::shared_ptr<Transaction>> result;
|
||||
|
||||
bool firstIteration = true;
|
||||
ID currentID = 0;
|
||||
@@ -475,9 +568,9 @@ vector<shared_ptr<Transaction>> TraceDB::parseTransactionsFromQuery(QSqlQuery &q
|
||||
unsigned int bank = query.value(11).toInt();
|
||||
unsigned int row = query.value(12).toInt();
|
||||
unsigned int column = query.value(13).toInt();
|
||||
result.push_back(shared_ptr<Transaction>(new Transaction(id, address, burstlength,
|
||||
result.push_back(std::make_shared<Transaction>(id, address, burstlength,
|
||||
thread, channel, rank, bankgroup, bank, row, column,
|
||||
span, spanOnStrobe, generalInfo->clkPeriod)));
|
||||
span, spanOnStrobe, generalInfo.clkPeriod));
|
||||
}
|
||||
|
||||
unsigned int phaseID = query.value(14).toInt();
|
||||
@@ -524,14 +617,14 @@ void TraceDB::mUpdateDependenciesFromQuery(QSqlQuery &query)
|
||||
if (_visiblePhases.count(dependencyID) > 0)
|
||||
{
|
||||
|
||||
_visiblePhases[delayedID]->addDependency(std::shared_ptr<PhaseDependency>(
|
||||
new PhaseDependency(type, timeDependencyStr, _visiblePhases[dependencyID])));
|
||||
_visiblePhases[delayedID]->addDependency(std::make_shared<PhaseDependency>(
|
||||
PhaseDependency(type, timeDependencyStr, _visiblePhases[dependencyID])));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
_visiblePhases[delayedID]->addDependency(
|
||||
std::shared_ptr<PhaseDependency>(new PhaseDependency(type, timeDependencyStr)));
|
||||
std::make_shared<PhaseDependency>(PhaseDependency(type, timeDependencyStr)));
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -541,10 +634,11 @@ void TraceDB::mUpdateDependenciesFromQuery(QSqlQuery &query)
|
||||
}
|
||||
}
|
||||
|
||||
vector<CommentModel::Comment> TraceDB::parseCommentsFromQuery(QSqlQuery &query)
|
||||
std::vector<CommentModel::Comment> TraceDB::parseCommentsFromQuery(QSqlQuery &query)
|
||||
{
|
||||
vector<CommentModel::Comment> result;
|
||||
while (query.next()) {
|
||||
std::vector<CommentModel::Comment> result;
|
||||
while (query.next())
|
||||
{
|
||||
result.push_back(CommentModel::Comment{query.value(0).toLongLong(),
|
||||
query.value(1).toString()});
|
||||
}
|
||||
|
||||
@@ -77,7 +77,7 @@ public:
|
||||
|
||||
const GeneralInfo &getGeneralInfo() const
|
||||
{
|
||||
return *generalInfo;
|
||||
return generalInfo;
|
||||
}
|
||||
|
||||
const CommandLengths &getCommandLengths() const
|
||||
@@ -114,8 +114,8 @@ public:
|
||||
private:
|
||||
QString pathToDB;
|
||||
QSqlDatabase database;
|
||||
GeneralInfo *generalInfo;
|
||||
CommandLengths commandLengths;
|
||||
GeneralInfo generalInfo;
|
||||
CommandLengths commandLengths{};
|
||||
|
||||
QSqlQuery insertPhaseQuery;
|
||||
QSqlQuery insertTransactionQuery;
|
||||
@@ -133,22 +133,22 @@ private:
|
||||
TransactionQueryTexts queryTexts;
|
||||
void prepareQueries();
|
||||
void executeQuery(QSqlQuery query);
|
||||
QString queryToString(QSqlQuery query);
|
||||
static QString queryToString(QSqlQuery query);
|
||||
std::shared_ptr<Transaction> parseTransactionFromQuery(QSqlQuery &query);
|
||||
std::vector<std::shared_ptr<Transaction>> parseTransactionsFromQuery(QSqlQuery &query,
|
||||
bool updateVisiblePhases = false);
|
||||
std::vector<CommentModel::Comment> parseCommentsFromQuery(QSqlQuery &query);
|
||||
static std::vector<CommentModel::Comment> parseCommentsFromQuery(QSqlQuery &query);
|
||||
|
||||
void mUpdateDependenciesFromQuery(QSqlQuery &query);
|
||||
DependencyInfos parseDependencyInfos(QSqlQuery &query, const DependencyInfos::Type infoType);
|
||||
static DependencyInfos parseDependencyInfos(QSqlQuery &query, const DependencyInfos::Type infoType);
|
||||
|
||||
void executeScriptFile(QString fileName);
|
||||
void dropAndCreateTables();
|
||||
|
||||
unsigned int getNumberOfPhases();
|
||||
GeneralInfo *getGeneralInfoFromDB();
|
||||
uint64_t getNumberOfPhases();
|
||||
GeneralInfo getGeneralInfoFromDB();
|
||||
CommandLengths getCommandLengthsFromDB();
|
||||
unsigned int getLengthOfCommandFromDB(const std::string& command);
|
||||
QVariant getParameterFromTable(const std::string& parameter, const std::string& table);
|
||||
|
||||
std::map<unsigned int, std::shared_ptr<Phase>> _visiblePhases; // Updated at parseTransactionsFromQuery
|
||||
};
|
||||
@@ -165,7 +165,7 @@ public:
|
||||
this->message = std::string("Error in file ") + filename + std::string(" ") +
|
||||
message;
|
||||
}
|
||||
const char *what() const noexcept
|
||||
const char *what() const noexcept override
|
||||
{
|
||||
return message.c_str();
|
||||
}
|
||||
|
||||
@@ -192,7 +192,7 @@ void TraceDrawingProperties::collapseOrExpandAllRanks(ToggleCollapsedAction::Col
|
||||
}
|
||||
}
|
||||
|
||||
const std::shared_ptr<QHash<int, QString>> TraceDrawingProperties::getLabels() const
|
||||
std::shared_ptr<QHash<int, QString>> TraceDrawingProperties::getLabels() const
|
||||
{
|
||||
return labels;
|
||||
}
|
||||
@@ -289,3 +289,14 @@ TracePlotLineVector TraceDrawingProperties::getBankLinesFromRank(unsigned int ra
|
||||
{
|
||||
return tracePlotLineCache->getBankLinesFromRank(rank);
|
||||
}
|
||||
|
||||
TracePlotLineVector TraceDrawingProperties::getBankLinesTwoBankwise(unsigned int rank, unsigned int firstGroup,
|
||||
unsigned int firstBank, unsigned int secondGroup,
|
||||
unsigned int secondBank) const
|
||||
{
|
||||
TracePlotLineVector firstBankLines = tracePlotLineCache->getBankLines(rank, firstGroup, firstBank);
|
||||
TracePlotLineVector secondBankLines = tracePlotLineCache->getBankLines(rank, secondGroup, secondBank);
|
||||
firstBankLines.insert(firstBankLines.end(), secondBankLines.begin(), secondBankLines.end());
|
||||
|
||||
return firstBankLines;
|
||||
}
|
||||
|
||||
@@ -93,12 +93,13 @@ public:
|
||||
DependencyOptions drawDependenciesOption;
|
||||
ColorGrouping colorGrouping;
|
||||
|
||||
unsigned int numberOfRanks;
|
||||
unsigned int numberOfBankgroups;
|
||||
unsigned int numberOfBanks;
|
||||
unsigned int banksPerRank;
|
||||
unsigned int groupsPerRank;
|
||||
unsigned int banksPerGroup;
|
||||
unsigned int numberOfRanks = 1;
|
||||
unsigned int numberOfBankGroups = 1;
|
||||
unsigned int numberOfBanks = 1;
|
||||
unsigned int banksPerRank = 1;
|
||||
unsigned int groupsPerRank = 1;
|
||||
unsigned int banksPerGroup = 1;
|
||||
unsigned int per2BankOffset = 0;
|
||||
|
||||
TraceDrawingProperties(bool drawText = true, bool drawBorder = true,
|
||||
DependencyOptions drawDependenciesOption = {DependencyOption::Disabled,
|
||||
@@ -123,9 +124,12 @@ public:
|
||||
TracePlotLineVector getBankLines(unsigned int rank, unsigned int group, unsigned int bank) const;
|
||||
TracePlotLineVector getBankLinesFromGroup(unsigned int rank, unsigned int group) const;
|
||||
TracePlotLineVector getBankLinesGroupwise(unsigned int rank, unsigned int bank) const;
|
||||
TracePlotLineVector getBankLinesTwoBankwise(unsigned int rank, unsigned int firstGroup,
|
||||
unsigned int firstBank, unsigned int secondGroup,
|
||||
unsigned int secondBank) const;
|
||||
TracePlotLineVector getBankLinesFromRank(unsigned int rank) const;
|
||||
|
||||
const std::shared_ptr<QHash<int, QString>> getLabels() const;
|
||||
std::shared_ptr<QHash<int, QString>> getLabels() const;
|
||||
|
||||
void updateTracePlotLines(QTreeWidget *treeWidget);
|
||||
void collapseOrExpandAllRanks(ToggleCollapsedAction::CollapseAction collapseAction);
|
||||
@@ -142,7 +146,7 @@ private:
|
||||
std::shared_ptr<TracePlotLineVector> tracePlotLines;
|
||||
std::shared_ptr<TracePlotLineCache> tracePlotLineCache;
|
||||
|
||||
TracePlot *tracePlot;
|
||||
TracePlot *tracePlot = nullptr;
|
||||
};
|
||||
|
||||
#endif // TRACECOLLECTIONDRAWINGPROPERTIES_H
|
||||
|
||||
@@ -303,11 +303,12 @@ void TracePlot::setUpDrawingProperties()
|
||||
drawingProperties.init(navigator->getTracePlotLines(), navigator->getTracePlotLineCache(), this);
|
||||
|
||||
drawingProperties.numberOfRanks = navigator->GeneralTraceInfo().numberOfRanks;
|
||||
drawingProperties.numberOfBankgroups = navigator->GeneralTraceInfo().numberOfBankgroups;
|
||||
drawingProperties.numberOfBankGroups = navigator->GeneralTraceInfo().numberOfBankGroups;
|
||||
drawingProperties.numberOfBanks = navigator->GeneralTraceInfo().numberOfBanks;
|
||||
drawingProperties.banksPerRank = drawingProperties.numberOfBanks / drawingProperties.numberOfRanks;
|
||||
drawingProperties.groupsPerRank = drawingProperties.numberOfBankgroups / drawingProperties.numberOfRanks;
|
||||
drawingProperties.banksPerGroup = drawingProperties.numberOfBanks / drawingProperties.numberOfBankgroups;
|
||||
drawingProperties.groupsPerRank = drawingProperties.numberOfBankGroups / drawingProperties.numberOfRanks;
|
||||
drawingProperties.banksPerGroup = drawingProperties.numberOfBanks / drawingProperties.numberOfBankGroups;
|
||||
drawingProperties.per2BankOffset = navigator->GeneralTraceInfo().per2BankOffset;
|
||||
}
|
||||
|
||||
void TracePlot::setUpQueryEditor()
|
||||
|
||||
@@ -107,11 +107,12 @@ void TraceScroller::setUpDrawingProperties()
|
||||
drawingProperties.init(navigator->getTracePlotLines(), navigator->getTracePlotLineCache());
|
||||
|
||||
drawingProperties.numberOfRanks = navigator->GeneralTraceInfo().numberOfRanks;
|
||||
drawingProperties.numberOfBankgroups = navigator->GeneralTraceInfo().numberOfBankgroups;
|
||||
drawingProperties.numberOfBankGroups = navigator->GeneralTraceInfo().numberOfBankGroups;
|
||||
drawingProperties.numberOfBanks = navigator->GeneralTraceInfo().numberOfBanks;
|
||||
drawingProperties.banksPerRank = drawingProperties.numberOfBanks / drawingProperties.numberOfRanks;
|
||||
drawingProperties.groupsPerRank = drawingProperties.numberOfBankgroups / drawingProperties.numberOfRanks;
|
||||
drawingProperties.banksPerGroup = drawingProperties.numberOfBanks / drawingProperties.numberOfBankgroups;
|
||||
drawingProperties.groupsPerRank = drawingProperties.numberOfBankGroups / drawingProperties.numberOfRanks;
|
||||
drawingProperties.banksPerGroup = drawingProperties.numberOfBanks / drawingProperties.numberOfBankGroups;
|
||||
drawingProperties.per2BankOffset = navigator->GeneralTraceInfo().per2BankOffset;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -72,6 +72,12 @@ def getNumberOfBankGroups(dbconnection):
|
||||
result = cursor.fetchone()
|
||||
return result[0]
|
||||
|
||||
def getPer2BankOffset(dbconnection):
|
||||
cursor = dbconnection.cursor()
|
||||
cursor.execute("SELECT Per2BankOffset FROM generalInfo")
|
||||
result = cursor.fetchone()
|
||||
return result[0]
|
||||
|
||||
def getWindowSize(connection):
|
||||
cursor = connection.cursor()
|
||||
cursor.execute(" SELECT WindowSize FROM GeneralInfo ")
|
||||
|
||||
@@ -39,7 +39,8 @@ def trace_length_in_ns(connection):
|
||||
@metric
|
||||
def average_response_latency_in_ns(connection):
|
||||
cursor = connection.cursor()
|
||||
cursor.execute("""SELECT AVG(RESP.PHASEBEGIN - REQ.PHASEBEGIN)/1000 FROM PHASES REQ, PHASES RESP WHERE REQ.PHASENAME = 'REQ' AND RESP.PHASENAME='RESP' AND REQ.TRANSACT = RESP.TRANSACT """)
|
||||
cursor.execute("""SELECT AVG(RESP.PHASEBEGIN - REQ.PHASEBEGIN)/1000 FROM PHASES REQ, PHASES RESP
|
||||
WHERE REQ.PHASENAME = 'REQ' AND RESP.PHASENAME='RESP' AND REQ.TRANSACT = RESP.TRANSACT """)
|
||||
result = cursor.fetchone()
|
||||
return round(result[0], 1)
|
||||
|
||||
@@ -47,7 +48,8 @@ def average_response_latency_in_ns(connection):
|
||||
@metric
|
||||
def max_response_latency_in_ns(connection):
|
||||
cursor = connection.cursor()
|
||||
cursor.execute(""" SELECT max(RESP.PHASEBEGIN - REQ.PHASEBEGIN)/1000 FROM PHASES REQ, PHASES RESP WHERE REQ.PHASENAME = 'REQ' AND RESP.PHASENAME='RESP' AND REQ.TRANSACT = RESP.TRANSACT """)
|
||||
cursor.execute(""" SELECT max(RESP.PHASEBEGIN - REQ.PHASEBEGIN)/1000 FROM PHASES REQ, PHASES RESP
|
||||
WHERE REQ.PHASENAME = 'REQ' AND RESP.PHASENAME='RESP' AND REQ.TRANSACT = RESP.TRANSACT """)
|
||||
result = cursor.fetchone()
|
||||
return result[0]
|
||||
|
||||
@@ -55,7 +57,8 @@ def max_response_latency_in_ns(connection):
|
||||
@metric
|
||||
def trans_with_max_response_latency(connection):
|
||||
cursor = connection.cursor()
|
||||
cursor.execute(""" SELECT REQ.TRANSACT, max(RESP.PHASEBEGIN - REQ.PHASEBEGIN)/1000 FROM PHASES REQ, PHASES RESP WHERE REQ.PHASENAME = 'REQ' AND RESP.PHASENAME='RESP' AND REQ.TRANSACT = RESP.TRANSACT """)
|
||||
cursor.execute(""" SELECT REQ.TRANSACT, max(RESP.PHASEBEGIN - REQ.PHASEBEGIN)/1000 FROM PHASES REQ, PHASES RESP
|
||||
WHERE REQ.PHASENAME = 'REQ' AND RESP.PHASENAME='RESP' AND REQ.TRANSACT = RESP.TRANSACT """)
|
||||
result = cursor.fetchone()
|
||||
return result[0]
|
||||
|
||||
@@ -383,7 +386,8 @@ def memory_utilisation_percent_including_idle(connection):
|
||||
|
||||
def refreshMissDecision(connection, calculatedMetrics):
|
||||
cursor = connection.cursor()
|
||||
cursor.execute("""SELECT phases.ID,PhaseBegin,PhaseEnd,TBank FROM Phases INNER JOIN transactions on transactions.id = phases.transact WHERE PhaseName IN ('REFA')' """)
|
||||
cursor.execute("""SELECT phases.ID,PhaseBegin,PhaseEnd,TBank FROM Phases INNER JOIN transactions
|
||||
on transactions.id = phases.transact WHERE PhaseName IN ('REFAB')' """)
|
||||
queryMinREQ = """SELECT id,min(PhaseBegin) FROM (SELECT transactions.id, PhaseBegin FROM transactions
|
||||
inner join ranges on ranges.id = transactions.range inner join phases on phases.transact = transactions.id
|
||||
where tthread != 0 and tbank = :bank and PhaseName = "REQ" and ranges.begin<:begin and ranges.end>:end)"""
|
||||
@@ -482,19 +486,9 @@ def RESP_count(connection):
|
||||
return get_phase_occurrences(connection, 'RESP')
|
||||
|
||||
|
||||
@metric
|
||||
def PREB_count(connection):
|
||||
return get_phase_occurrences(connection, 'PREB')
|
||||
|
||||
|
||||
@metric
|
||||
def PRE_count(connection):
|
||||
return get_phase_occurrences(connection, 'PRE')
|
||||
|
||||
|
||||
@metric
|
||||
def ACTB_count(connection):
|
||||
return get_phase_occurrences(connection, 'ACTB')
|
||||
#@metric
|
||||
#def ACTB_count(connection):
|
||||
# return get_phase_occurrences(connection, 'ACTB')
|
||||
|
||||
|
||||
@metric
|
||||
@@ -502,19 +496,64 @@ def ACT_count(connection):
|
||||
return get_phase_occurrences(connection, 'ACT')
|
||||
|
||||
|
||||
@metric
|
||||
def PREA_count(connection):
|
||||
return get_phase_occurrences(connection, 'PREA')
|
||||
#@metric
|
||||
#def PREB_count(connection):
|
||||
# return get_phase_occurrences(connection, 'PREB')
|
||||
|
||||
|
||||
@metric
|
||||
def REFA_count(connection):
|
||||
return get_phase_occurrences(connection, 'REFA')
|
||||
def PREPB_count(connection):
|
||||
return get_phase_occurrences(connection, 'PREPB') + get_phase_occurrences(connection, 'PRE')
|
||||
|
||||
|
||||
@metric
|
||||
def REFB_count(connection):
|
||||
return get_phase_occurrences(connection, 'REFB')
|
||||
def PRESB_count(connection):
|
||||
return get_phase_occurrences(connection, 'PRESB')
|
||||
|
||||
|
||||
@metric
|
||||
def PREAB_count(connection):
|
||||
return get_phase_occurrences(connection, 'PREAB') + get_phase_occurrences(connection, 'PREA')
|
||||
|
||||
|
||||
@metric
|
||||
def REFPB_count(connection):
|
||||
return get_phase_occurrences(connection, 'REFPB') + get_phase_occurrences(connection, 'REFB')
|
||||
|
||||
|
||||
@metric
|
||||
def REFP2B_count(connection):
|
||||
return get_phase_occurrences(connection, 'REFP2B')
|
||||
|
||||
|
||||
@metric
|
||||
def REFSB_count(connection):
|
||||
return get_phase_occurrences(connection, 'REFSB')
|
||||
|
||||
|
||||
@metric
|
||||
def REFAB_count(connection):
|
||||
return get_phase_occurrences(connection, 'REFAB') + get_phase_occurrences(connection, 'REFA')
|
||||
|
||||
|
||||
@metric
|
||||
def RFMPB_count(connection):
|
||||
return get_phase_occurrences(connection, 'RFMPB')
|
||||
|
||||
|
||||
@metric
|
||||
def RFMP2B_count(connection):
|
||||
return get_phase_occurrences(connection, 'RFMP2B')
|
||||
|
||||
|
||||
@metric
|
||||
def RFMSB_count(connection):
|
||||
return get_phase_occurrences(connection, 'RFMSB')
|
||||
|
||||
|
||||
@metric
|
||||
def RFMAB_count(connection):
|
||||
return get_phase_occurrences(connection, 'RFMAB')
|
||||
|
||||
|
||||
@metric
|
||||
@@ -591,17 +630,18 @@ def bank_overlap_ratio(connection):
|
||||
cursor.execute("""
|
||||
select p1.PhaseBegin, p1.PhaseName from Phases p1
|
||||
where
|
||||
(p1.PhaseName = "ACT" or p1.PhaseName = "PREA" or p1.PhaseName = "PRE" or p1.PhaseName = "RDA" or p1.PhaseName = "WRA" or p1.PhaseName = "PREB" or p1.PhaseName = "ACTB")
|
||||
(p1.PhaseName = "ACT" or p1.PhaseName = "PREPB" or p1.PhaseName = "PRE" or p1.PhaseName = "PRESB"
|
||||
or p1.PhaseName = "PREAB" or p1.PhaseName = "PREA" or p1.PhaseName = "RDA" or p1.PhaseName = "WRA")
|
||||
order by PhaseBegin
|
||||
""")
|
||||
prevPhase = "PREA"
|
||||
prevPhase = "PREAB"
|
||||
prevTime = 0
|
||||
|
||||
for c in cursor:
|
||||
trace.append([(int(c[0]/clk)), c[1]])
|
||||
|
||||
# Insert a pseudo precharge all to mark the end of the trace
|
||||
trace.append([traceEnd, "PREA"])
|
||||
trace.append([traceEnd, "PREAB"])
|
||||
|
||||
bankCounter = 0
|
||||
bankTime = []
|
||||
@@ -626,13 +666,13 @@ def bank_overlap_ratio(connection):
|
||||
print("Unexpected ACT. bankCounter was {0} valid range is python range {1}".format(bankCounter, validBankRange))
|
||||
elif t[1] == "ACTB":
|
||||
actbCnt += 1
|
||||
elif(t[1] == "PREA"):
|
||||
elif(t[1] == "PREAB" or t[1] == "PREA"):
|
||||
bankCounter = 0
|
||||
elif(t[1] == "PRE"):
|
||||
elif(t[1] == "PREPB" or t[1] == "PRE"):
|
||||
if (bankCounter > 0):
|
||||
bankCounter -= 1
|
||||
else:
|
||||
print("Unexpected PRE. bankCounter was {0} valid range is python range {1}".format(bankCounter, validBankRange))
|
||||
print("Unexpected PREPB. bankCounter was {0} valid range is python range {1}".format(bankCounter, validBankRange))
|
||||
elif(t[1] == "PREB"):
|
||||
# RGR first PREB closes the row ACT follows, then PREB again.
|
||||
if actbCnt > 0:
|
||||
|
||||
@@ -236,9 +236,9 @@ def commandbus_slots_are_used_once(connection):
|
||||
cursor = connection.cursor()
|
||||
|
||||
if (dramconfig.bankwiseLogic == "1"):
|
||||
excludedPhases = "('REQ','RESP','PREA')"
|
||||
excludedPhases = "('REQ','RESP','PREAB')"
|
||||
else:
|
||||
excludedPhases = "('REQ','RESP','PREA','PDNA','PDNP','SREF','REFA')"
|
||||
excludedPhases = "('REQ','RESP','PREAB','PDNA','PDNP','SREF','REFAB')"
|
||||
|
||||
query = """SELECT PhaseBegin,count FROM (SELECT phaseBegin,count(phasebegin) AS count
|
||||
FROM Phases WHERE PhaseName NOT IN """ + excludedPhases + """ AND phasebegin>0 GROUP BY phaseBegin) WHERE count>1"""
|
||||
@@ -260,34 +260,34 @@ def phase_transitions_are_valid(connection):
|
||||
# validTransitions tells you which phases are allowed to follow the last transaction.
|
||||
|
||||
if (dramconfig.bankwiseLogic == "1"):
|
||||
validTransitions['PRE'] = set(['ACT', 'REFB', 'SREFB'])
|
||||
validTransitions['ACT'] = set(['RD', 'RDA', 'WR', 'WRA', 'PRE', 'PREA'])
|
||||
validTransitions['PREPB'] = set(['ACT', 'REFPB', 'SREFB'])
|
||||
validTransitions['ACT'] = set(['RD', 'RDA', 'WR', 'WRA', 'PREPB', 'PREAB'])
|
||||
|
||||
validTransitions['RD'] = set(['PRE', 'RD', 'RDA', 'WR', 'WRA', 'PDNAB'])
|
||||
validTransitions['WR'] = set(['PRE', 'RD', 'RDA', 'WR', 'WRA', 'PDNAB'])
|
||||
validTransitions['RDA'] = set(['ACT', 'REFB', 'PDNPB'])
|
||||
validTransitions['WRA'] = set(['ACT', 'REFB', 'PDNPB'])
|
||||
validTransitions['RD'] = set(['PREPB', 'RD', 'RDA', 'WR', 'WRA', 'PDNAB'])
|
||||
validTransitions['WR'] = set(['PREPB', 'RD', 'RDA', 'WR', 'WRA', 'PDNAB'])
|
||||
validTransitions['RDA'] = set(['ACT', 'REFPB', 'PDNPB'])
|
||||
validTransitions['WRA'] = set(['ACT', 'REFPB', 'PDNPB'])
|
||||
|
||||
validTransitions['REFB'] = set(['ACT', 'REFB', 'PDNPB', 'SREFB'])
|
||||
validTransitions['REFPB'] = set(['ACT', 'REFPB', 'PDNPB', 'SREFB'])
|
||||
|
||||
validTransitions['PDNAB'] = set(['PRE', 'RD', 'RDA', 'WR', 'WRA', 'REFB'])
|
||||
validTransitions['PDNPB'] = set(['ACT', 'REFB', 'SREFB'])
|
||||
validTransitions['SREFB'] = set(['ACT', 'REFB'])
|
||||
validTransitions['PDNAB'] = set(['PREPB', 'RD', 'RDA', 'WR', 'WRA', 'REFPB'])
|
||||
validTransitions['PDNPB'] = set(['ACT', 'REFPB', 'SREFB'])
|
||||
validTransitions['SREFB'] = set(['ACT', 'REFPB'])
|
||||
else:
|
||||
validTransitions['PRE'] = set(['ACT', 'PREA', 'REFA'])
|
||||
validTransitions['PREA'] = set(['REFA', 'SREF'])
|
||||
validTransitions['ACT'] = set(['RD', 'RDA', 'WR', 'WRA', 'PREA'])
|
||||
validTransitions['PREPB'] = set(['ACT', 'PREAB', 'REFAB'])
|
||||
validTransitions['PREAB'] = set(['REFAB', 'SREF'])
|
||||
validTransitions['ACT'] = set(['RD', 'RDA', 'WR', 'WRA', 'PREAB'])
|
||||
|
||||
validTransitions['RD'] = set(['PRE', 'PREA', 'RD', 'RDA', 'WR', 'WRA', 'PDNA'])
|
||||
validTransitions['WR'] = set(['PRE', 'PREA', 'RD', 'RDA', 'WR', 'WRA', 'PDNA'])
|
||||
validTransitions['RDA'] = set(['PREA', 'ACT', 'REFA', 'PDNA', 'PDNP'])
|
||||
validTransitions['WRA'] = set(['PREA', 'ACT', 'REFA', 'PDNA', 'PDNP'])
|
||||
validTransitions['RD'] = set(['PREPB', 'PREAB', 'RD', 'RDA', 'WR', 'WRA', 'PDNA'])
|
||||
validTransitions['WR'] = set(['PREPB', 'PREAB', 'RD', 'RDA', 'WR', 'WRA', 'PDNA'])
|
||||
validTransitions['RDA'] = set(['PREAB', 'ACT', 'REFAB', 'PDNA', 'PDNP'])
|
||||
validTransitions['WRA'] = set(['PREAB', 'ACT', 'REFAB', 'PDNA', 'PDNP'])
|
||||
|
||||
validTransitions['REFA'] = set(['PREA', 'ACT', 'REFA', 'PDNA', 'PDNP', 'SREF'])
|
||||
validTransitions['REFAB'] = set(['PREAB', 'ACT', 'REFAB', 'PDNA', 'PDNP', 'SREF'])
|
||||
|
||||
validTransitions['PDNA'] = set(['PRE', 'PREA', 'ACT', 'RD', 'RDA', 'WR', 'WRA', 'REFA', 'PDNA', 'PDNP'])
|
||||
validTransitions['PDNP'] = set(['PREA', 'ACT', 'REFA', 'PDNA', 'PDNP', 'SREF'])
|
||||
validTransitions['SREF'] = set(['PREA', 'ACT', 'REFA', 'PDNA', 'PDNP'])
|
||||
validTransitions['PDNA'] = set(['PREPB', 'PREAB', 'ACT', 'RD', 'RDA', 'WR', 'WRA', 'REFAB', 'PDNA', 'PDNP'])
|
||||
validTransitions['PDNP'] = set(['PREAB', 'ACT', 'REFAB', 'PDNA', 'PDNP', 'SREF'])
|
||||
validTransitions['SREF'] = set(['PREAB', 'ACT', 'REFAB', 'PDNA', 'PDNP'])
|
||||
|
||||
if (dramconfig.bankwiseLogic == "1"):
|
||||
query = """SELECT
|
||||
@@ -297,13 +297,13 @@ def phase_transitions_are_valid(connection):
|
||||
WHERE
|
||||
(TBank=:bank) AND PhaseName NOT IN ('REQ','RESP') ORDER BY PhaseBegin"""
|
||||
else:
|
||||
# REFA, PREA, PDNA, PDNP and SREF are attributed to Bank 0 therefore this must be added to the order evaluation:
|
||||
# REFAB, PREAB, PDNA, PDNP and SREF are attributed to Bank 0 therefore this must be added to the order evaluation:
|
||||
query = """SELECT
|
||||
PhaseName, phases.ID
|
||||
FROM
|
||||
phases INNER JOIN transactions ON phases.transact=transactions.ID
|
||||
WHERE
|
||||
((TBank=:bank) OR PhaseName IN ('PREA', 'SREF', 'PDNP', 'PDNA', 'REFA'))
|
||||
((TBank=:bank) OR PhaseName IN ('PREAB', 'SREF', 'PDNP', 'PDNA', 'REFAB'))
|
||||
AND PhaseName NOT IN ('REQ','RESP') ORDER BY PhaseBegin"""
|
||||
|
||||
for bankNumber in range(dramconfig.numberOfBanks):
|
||||
@@ -324,14 +324,14 @@ def timing_constraint(FirstPhase, SecondPhase):
|
||||
FirstPhaseName = FirstPhase[0]
|
||||
SecondPhaseName = SecondPhase[0]
|
||||
|
||||
if ((FirstPhaseName == "PRE" or FirstPhaseName == "PREA") and SecondPhaseName != "PREA"):
|
||||
if ((FirstPhaseName == "PREPB" or FirstPhaseName == "PREAB") and SecondPhaseName != "PREAB"):
|
||||
return dramconfig.tRP
|
||||
|
||||
elif (FirstPhaseName == "ACT"):
|
||||
return dramconfig.tRCD
|
||||
|
||||
elif (FirstPhaseName == "RD"):
|
||||
if (SecondPhaseName in ["PRE, PREA"]):
|
||||
if (SecondPhaseName in ["PREPB, PREAB"]):
|
||||
return dramconfig.tRTP
|
||||
elif (SecondPhaseName in ["RD, RDA"]):
|
||||
return max(dramconfig.tCCD_L, dramconfig.getReadAccessTime())
|
||||
@@ -341,7 +341,7 @@ def timing_constraint(FirstPhase, SecondPhase):
|
||||
return dramconfig.tRL + dramconfig.getReadAccessTime() + dramconfig.clk
|
||||
|
||||
elif (FirstPhaseName == "WR"):
|
||||
if (SecondPhaseName in ["PRE, PREA", "PDNA"]):
|
||||
if (SecondPhaseName in ["PREPB, PREAB", "PDNA"]):
|
||||
return dramconfig.tWL + dramconfig.getWriteAccessTime() + dramconfig.tWR
|
||||
elif (SecondPhaseName in ["RD, RDA"]):
|
||||
return dramconfig.tWL + dramconfig.getWriteAccessTime() + dramconfig.tWTR_L
|
||||
@@ -349,22 +349,22 @@ def timing_constraint(FirstPhase, SecondPhase):
|
||||
return max(dramconfig.tCCD_L, burstlength/dramconfig.dataRate)
|
||||
|
||||
elif (FirstPhaseName == "RDA"):
|
||||
if (SecondPhaseName in ["ACT", "REFA"]):
|
||||
if (SecondPhaseName in ["ACT", "REFAB"]):
|
||||
return dramconfig.tRTP + dramconfig.tRP
|
||||
elif (SecondPhaseName == "PREA"):
|
||||
elif (SecondPhaseName == "PREAB"):
|
||||
return dramconfig.tRTP
|
||||
elif (SecondPhaseName in ["PDNA", "PDNP"]):
|
||||
return dramconfig.tRL + dramconfig.getReadAccessTime() + dramconfig.clk
|
||||
|
||||
elif (FirstPhaseName == "WRA"):
|
||||
if (SecondPhaseName in ["ACT", "REFA"]):
|
||||
if (SecondPhaseName in ["ACT", "REFAB"]):
|
||||
return dramconfig.tWL + dramconfig.getWriteAccessTime() + dramconfig.tWR + dramconfig.tRP
|
||||
elif (SecondPhaseName == "PREA"):
|
||||
elif (SecondPhaseName == "PREAB"):
|
||||
return dramconfig.tWL + dramconfig.getWriteAccessTime() + dramconfig.tWR
|
||||
elif (SecondPhaseName in ["PDNA", "PDNP"]):
|
||||
return dramconfig.tWL + dramconfig.getWriteAccessTime() + dramconfig.tWR + dramconfig.clk
|
||||
|
||||
elif (FirstPhaseName == "REFA"):
|
||||
elif (FirstPhaseName == "REFAB"):
|
||||
return dramconfig.tRFC
|
||||
|
||||
elif (FirstPhaseName in ["PDNA", "PDNP"]):
|
||||
@@ -392,7 +392,7 @@ def timing_constraits_on_the_same_bank_hold(connection):
|
||||
AND PhaseName NOT IN ('REQ','RESP') ORDER BY PhaseBegin"""
|
||||
else:
|
||||
query = """SELECT PhaseName, phases.ID, PhaseBegin, PhaseEnd FROM phases INNER JOIN transactions ON phases.transact=transactions.ID
|
||||
WHERE ((TBank=:bank) OR PhaseName IN ('PREA', 'SREF', 'PDNP', 'PDNA', 'REFA')) AND PhaseName NOT IN ('REQ','RESP') ORDER BY PhaseBegin"""
|
||||
WHERE ((TBank=:bank) OR PhaseName IN ('PREAB', 'SREF', 'PDNP', 'PDNA', 'REFAB')) AND PhaseName NOT IN ('REQ','RESP') ORDER BY PhaseBegin"""
|
||||
for bankNumber in range(dramconfig.numberOfBanks):
|
||||
cursor.execute(query, {"bank": bankNumber})
|
||||
lastRow = cursor.fetchone()
|
||||
@@ -418,27 +418,27 @@ def row_buffer_is_used_correctly(connection):
|
||||
FROM
|
||||
phases INNER JOIN transactions ON phases.transact=transactions.ID
|
||||
WHERE
|
||||
((TBank=:bank) OR (PhaseNAME = "REFA" AND TBank=0) OR (PhaseNAME = "PREA" AND TBank=0))
|
||||
((TBank=:bank) OR (PhaseNAME = "REFAB" AND TBank=0) OR (PhaseNAME = "PREAB" AND TBank=0))
|
||||
AND PhaseName NOT IN ('REQ','RESP') ORDER BY PhaseBegin"""
|
||||
else:
|
||||
# REFA, PREA, PDNA, PDNP and SREF are stored to bank0 for all the other banks we have also to grep this command:
|
||||
# PhaseName IN ('PREA', 'SREF', 'PDNP', 'PDNA', 'REFA')
|
||||
# REFAB, PREAB, PDNA, PDNP and SREF are stored to bank0 for all the other banks we have also to grep this command:
|
||||
# PhaseName IN ('PREAB', 'SREF', 'PDNP', 'PDNA', 'REFAB')
|
||||
query = """SELECT
|
||||
PhaseName, phases.ID
|
||||
FROM
|
||||
phases INNER JOIN transactions ON phases.transact=transactions.ID
|
||||
WHERE
|
||||
((TBank=:bank) OR PhaseName IN ('PREA', 'SREF', 'PDNP', 'PDNA', 'REFA'))
|
||||
((TBank=:bank) OR PhaseName IN ('PREAB', 'SREF', 'PDNP', 'PDNA', 'REFAB'))
|
||||
AND PhaseName NOT IN ('REQ','RESP') ORDER BY PhaseBegin"""
|
||||
|
||||
# phases that precharge the bank and close the rowbuffer
|
||||
prechargingPhases = set(['PRE', 'PREA', 'RDA', 'WRA'])
|
||||
prechargingPhases = set(['PREPB', 'PREAB', 'RDA', 'WRA'])
|
||||
|
||||
# phases that require the bank to be in active state and the rowbuffer to be opened
|
||||
accessingPhases = set(['RD', 'RDA', 'WR', 'WRA', 'PRE'])
|
||||
accessingPhases = set(['RD', 'RDA', 'WR', 'WRA', 'PREPB'])
|
||||
|
||||
# phases that require the bank to be in precharged state and the robuffer to be closed
|
||||
idlePhases = set(['ACT', 'PDNP', 'REFA', 'SREF'])
|
||||
idlePhases = set(['ACT', 'PDNP', 'REFAB', 'SREF'])
|
||||
|
||||
for bankNumber in range(dramconfig.numberOfBanks):
|
||||
cursor.execute(query, {"bank": bankNumber})
|
||||
@@ -466,11 +466,11 @@ def no_commands_during_refresh(connection):
|
||||
"""Checks that no command was scheduled during refresh period"""
|
||||
cursor = connection.cursor()
|
||||
if (dramconfig.bankwiseLogic == "1"):
|
||||
query = """SELECT PhaseBegin, PhaseEnd, TBank FROM phases INNER JOIN transactions ON phases.transact=transactions.ID WHERE PhaseName = 'REFB' """
|
||||
test_query = """SELECT PhaseName FROM phases INNER JOIN transactions ON phases.transact=transactions.ID WHERE ((PhaseBegin >= ? and PhaseEnd <= ?) or (PhaseBegin <= ? and PhaseEnd > ?) or (PhaseBegin < ? and PhaseEnd >= ?)) and PhaseName NOT IN ('REQ','RESP','REFB') and TBank = ?"""
|
||||
query = """SELECT PhaseBegin, PhaseEnd, TBank FROM phases INNER JOIN transactions ON phases.transact=transactions.ID WHERE PhaseName = 'REFPB' """
|
||||
test_query = """SELECT PhaseName FROM phases INNER JOIN transactions ON phases.transact=transactions.ID WHERE ((PhaseBegin >= ? and PhaseEnd <= ?) or (PhaseBegin <= ? and PhaseEnd > ?) or (PhaseBegin < ? and PhaseEnd >= ?)) and PhaseName NOT IN ('REQ','RESP','REFPB') and TBank = ?"""
|
||||
else:
|
||||
query = """SELECT PhaseBegin, PhaseEnd FROM phases WHERE PhaseName = 'REFA' """
|
||||
test_query = """SELECT PhaseName FROM phases WHERE ((PhaseBegin >= ? and PhaseEnd <= ?) or (PhaseBegin <= ? and PhaseEnd > ?) or (PhaseBegin < ? and PhaseEnd >= ?)) and PhaseName NOT IN ('REQ','RESP','REFA')"""
|
||||
query = """SELECT PhaseBegin, PhaseEnd FROM phases WHERE PhaseName = 'REFAB' """
|
||||
test_query = """SELECT PhaseName FROM phases WHERE ((PhaseBegin >= ? and PhaseEnd <= ?) or (PhaseBegin <= ? and PhaseEnd > ?) or (PhaseBegin < ? and PhaseEnd >= ?)) and PhaseName NOT IN ('REQ','RESP','REFAB')"""
|
||||
|
||||
cursor.execute(query)
|
||||
result = cursor.fetchall()
|
||||
@@ -488,9 +488,9 @@ def no_commands_during_refresh(connection):
|
||||
|
||||
@test
|
||||
def max_number_ref_burst(connection):
|
||||
"""Checks that the maximum number of REFA commands in a burst is not exceeded"""
|
||||
"""Checks that the maximum number of REFAB commands in a burst is not exceeded"""
|
||||
cursor = connection.cursor()
|
||||
query = """SELECT PhaseBegin, PhaseEnd FROM phases WHERE PhaseName = 'REFA' """
|
||||
query = """SELECT PhaseBegin, PhaseEnd FROM phases WHERE PhaseName = 'REFAB' """
|
||||
prevrow = [0] * 2
|
||||
cnt = 0
|
||||
flexibleRef = getFlexibleRef(connection)
|
||||
@@ -509,7 +509,7 @@ def max_number_ref_burst(connection):
|
||||
cnt = 0 # Reset the counter every time a burst ends
|
||||
prevrow = row
|
||||
if(cnt > maxRefBurst):
|
||||
return TestFailed("Maximum number of REFA in a burst was exceeded at {0} with {1} REFA in sequence. Maximum allowed is {2}.".format(formatTime(row[0]), cnt, maxRefBurst))
|
||||
return TestFailed("Maximum number of REFAB in a burst was exceeded at {0} with {1} REFAB in sequence. Maximum allowed is {2}.".format(formatTime(row[0]), cnt, maxRefBurst))
|
||||
|
||||
return TestSuceeded()
|
||||
|
||||
@@ -517,9 +517,9 @@ def max_number_ref_burst(connection):
|
||||
@test
|
||||
@test
|
||||
def max_time_without_ref(connection):
|
||||
"""Checks that the maximum time allowed between REFA/SREF commands is not exceeded"""
|
||||
"""Checks that the maximum time allowed between REFAB/SREF commands is not exceeded"""
|
||||
cursor = connection.cursor()
|
||||
query = """SELECT PhaseBegin, PhaseEnd FROM phases WHERE PhaseName = 'REFA' OR PhaseName = 'SREF' """
|
||||
query = """SELECT PhaseBegin, PhaseEnd FROM phases WHERE PhaseName = 'REFAB' OR PhaseName = 'SREF' """
|
||||
prevrow = [0] * 2
|
||||
flexibleRef = getFlexibleRef(connection)
|
||||
maxRefBurst = getMaxRefBurst(connection)
|
||||
|
||||
@@ -89,8 +89,9 @@ class Transaction():
|
||||
|
||||
class Granularity(enum.Enum):
|
||||
Bankwise = 0
|
||||
Groupwise = 1
|
||||
Rankwise = 2
|
||||
TwoBankwise = 1
|
||||
Groupwise = 2
|
||||
Rankwise = 3
|
||||
|
||||
class TimeWindow():
|
||||
def __init__(self, windowSize, lastTimestamp):
|
||||
@@ -113,30 +114,38 @@ class TimeWindow():
|
||||
def numberOfIterations(self):
|
||||
return int(self.lastTimestamp / self.windowSize)
|
||||
|
||||
|
||||
def getGranularity(phase):
|
||||
if phase == "PRESB" or phase == "REFSB" or phase == "RFMSB":
|
||||
return Granularity.Groupwise
|
||||
elif phase == "PREA" or phase == "REFA" or phase=="RFMAB" or phase == "PDNA" or phase == "PDNP" or phase == "SREF":
|
||||
elif phase == "REFP2B" or phase == "RFMP2B":
|
||||
return Granularity.TwoBankwise
|
||||
elif phase == "PREAB" or phase == "PREA" or phase == "REFAB" or phase == "REFA" or phase == "RFMAB" \
|
||||
or phase == "PDNA" or phase == "PDNP" or phase == "SREF":
|
||||
return Granularity.Rankwise
|
||||
else:
|
||||
return Granularity.Bankwise
|
||||
|
||||
|
||||
def getAmountOfCommandBusSpans(phase):
|
||||
if phase == "PDNA" or phase == "PDNAB" or phase == "PDNP" or phase == "PDNPB" or phase == "SREF" or phase == "SREFB":
|
||||
return 2
|
||||
else:
|
||||
return 1
|
||||
|
||||
|
||||
def getUnitOfTime(connection):
|
||||
_, unit = getClock(connection)
|
||||
return unit.lower()
|
||||
|
||||
|
||||
def getLastTimestamp(connection):
|
||||
cursor = connection.cursor()
|
||||
cursor.execute("SELECT DataStrobeEnd FROM Transactions ORDER BY DataStrobeEnd DESC LIMIT 1")
|
||||
|
||||
return cursor.fetchone()[0]
|
||||
|
||||
|
||||
def getRanksBankgroupsBanks(connection):
|
||||
ranks = getNumberOfRanks(connection)
|
||||
bankgroups = int(getNumberOfBankGroups(connection) / ranks)
|
||||
@@ -144,9 +153,11 @@ def getRanksBankgroupsBanks(connection):
|
||||
|
||||
return (ranks, bankgroups, banks)
|
||||
|
||||
|
||||
def getBankName(rank, bankgroup, bank):
|
||||
return "RA" + str(rank) + "_BG" + str(bankgroup) + "_BA" + str(bank)
|
||||
|
||||
|
||||
def getBankNames(ranks, bankgroups, banks):
|
||||
names = []
|
||||
for rank in range(ranks):
|
||||
@@ -156,6 +167,7 @@ def getBankNames(ranks, bankgroups, banks):
|
||||
|
||||
return names
|
||||
|
||||
|
||||
def getOccurringSignals(connection):
|
||||
setOfSignals = set()
|
||||
|
||||
@@ -172,6 +184,7 @@ def getOccurringSignals(connection):
|
||||
|
||||
return setOfSignals
|
||||
|
||||
|
||||
def getDataBusEvents(connection, eventDict, windowRange):
|
||||
beginWindow, endWindow = windowRange
|
||||
|
||||
@@ -190,6 +203,7 @@ def getDataBusEvents(connection, eventDict, windowRange):
|
||||
eventDict[begin].append(Event("Data_Bus", command + " " + str(transactionId)))
|
||||
eventDict[end].append(Event("Data_Bus", ""))
|
||||
|
||||
|
||||
def getCommandBusEvents(connection, eventDict, transactionDict, windowRange):
|
||||
beginWindow, endWindow = windowRange
|
||||
|
||||
@@ -236,11 +250,15 @@ def getCommandBusEvents(connection, eventDict, transactionDict, windowRange):
|
||||
for _bankgroup in range(bankgroups):
|
||||
for _bank in range(banks):
|
||||
currentBanks.append((rank, _bankgroup, _bank))
|
||||
|
||||
elif getGranularity(phase) == Granularity.Groupwise:
|
||||
for _bankgroup in range(bankgroups):
|
||||
currentBanks.append((rank, _bankgroup, bank))
|
||||
|
||||
elif getGranularity(phase) == Granularity.TwoBankwise:
|
||||
currentBanks.append((rank, bankgroup, bank))
|
||||
per2BankOffset = getPer2BankOffset(connection)
|
||||
bankgroupOffset = per2BankOffset // banks
|
||||
bankOffset = per2BankOffset % banks
|
||||
currentBanks.append((rank, bankgroup + bankgroupOffset, bank + bankOffset))
|
||||
else:
|
||||
currentBanks.append((rank, bankgroup, bank))
|
||||
|
||||
@@ -250,6 +268,7 @@ def getCommandBusEvents(connection, eventDict, transactionDict, windowRange):
|
||||
eventDict[begin].append(Event(currentBankName, phase + " " + str(transactionId)))
|
||||
eventDict[end].append(Event(currentBankName, ""))
|
||||
|
||||
|
||||
def getTransactionRange(connection, transactionRange, windowRange):
|
||||
beginWindow, endWindow = windowRange
|
||||
|
||||
@@ -270,6 +289,7 @@ def getTransactionRange(connection, transactionRange, windowRange):
|
||||
transactionRange.append(minTransaction)
|
||||
transactionRange.append(maxTransaction)
|
||||
|
||||
|
||||
def getReqAndRespPhases(connection, eventDict, transactionDict, windowRange):
|
||||
beginWindow, endWindow = windowRange
|
||||
|
||||
@@ -294,6 +314,7 @@ def getReqAndRespPhases(connection, eventDict, transactionDict, windowRange):
|
||||
eventDict[begin].append(Event(phase, command + " " + str(transactionId)))
|
||||
eventDict[end].append(Event(phase, ""))
|
||||
|
||||
|
||||
def getTransactions(connection, transactionDict, transactionRange):
|
||||
minTransaction, maxTransaction = transactionRange
|
||||
|
||||
@@ -353,6 +374,7 @@ def dumpVcd(pathToTrace):
|
||||
f.seek(0)
|
||||
return f.read()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if len(sys.argv) == 2:
|
||||
dump = dumpVcd(sys.argv[1])
|
||||
|
||||
Reference in New Issue
Block a user