Files
DRAMSys/DRAMSys/library/src/controller/scheduler/SchedulerFrFcfs.cpp

44 lines
1.4 KiB
C++

#include "SchedulerFrFcfs.h"
#include <systemc.h>
void SchedulerFrFcfs::storeRequest(tlm_generic_payload *payload)
{
Bank bank = DramExtension::getBank(payload);
buffer[bank].push_back(payload);
}
tlm_generic_payload *SchedulerFrFcfs::getNextRequest(Bank bank, BankMachine *bankMachine)
{
if (!buffer[bank].empty())
{
BmState currentState = bankMachine->getState();
if (currentState == BmState::Precharged)
{
tlm_generic_payload *result = buffer[bank].front();
buffer[bank].erase(buffer[bank].begin());
return result;
}
else if (currentState == BmState::Activated)
{
// Search for row hit
Row openRow = bankMachine->getOpenRow();
for (auto it = buffer[bank].begin(); it != buffer[bank].end(); it++)
{
if (DramExtension::getRow(*it) == openRow)
{
tlm_generic_payload *result = *it;
buffer[bank].erase(it);
return result;
}
}
// No row hit found
tlm_generic_payload *result = buffer[bank].front();
buffer[bank].erase(buffer[bank].begin());
return result;
}
else
SC_REPORT_FATAL("SchedulerFrFcfs", "Wrong BM state!");
}
return nullptr;
}