diff --git a/DRAMSys/library/CMakeLists.txt b/DRAMSys/library/CMakeLists.txt index fac67d98..1725607b 100644 --- a/DRAMSys/library/CMakeLists.txt +++ b/DRAMSys/library/CMakeLists.txt @@ -129,6 +129,7 @@ add_library(DRAMSysLibrary src/controller/scheduler/SchedulerIF.h src/controller/scheduler/SchedulerFifo.cpp src/controller/scheduler/SchedulerFrFcfs.cpp + src/controller/scheduler/SchedulerFrFcfsGrp.cpp src/error/eccbaseclass.cpp src/error/ecchamming.cpp diff --git a/DRAMSys/library/resources/configs/mcconfigs/.gitignore b/DRAMSys/library/resources/configs/mcconfigs/.gitignore deleted file mode 100644 index c5a87587..00000000 --- a/DRAMSys/library/resources/configs/mcconfigs/.gitignore +++ /dev/null @@ -1 +0,0 @@ -memconfig.xml \ No newline at end of file diff --git a/DRAMSys/library/resources/configs/mcconfigs/fifo.xml b/DRAMSys/library/resources/configs/mcconfigs/fifo.xml index fc05a577..24dc2490 100644 --- a/DRAMSys/library/resources/configs/mcconfigs/fifo.xml +++ b/DRAMSys/library/resources/configs/mcconfigs/fifo.xml @@ -1,7 +1,13 @@ - + + + + + + + diff --git a/DRAMSys/library/resources/configs/mcconfigs/fifoStrict.xml b/DRAMSys/library/resources/configs/mcconfigs/fifoStrict.xml deleted file mode 100644 index 1226d09a..00000000 --- a/DRAMSys/library/resources/configs/mcconfigs/fifoStrict.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/DRAMSys/library/resources/configs/mcconfigs/fifo_ecc.xml b/DRAMSys/library/resources/configs/mcconfigs/fifo_ecc.xml deleted file mode 100644 index fc05a577..00000000 --- a/DRAMSys/library/resources/configs/mcconfigs/fifo_ecc.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/DRAMSys/library/resources/configs/mcconfigs/fr_fcfs.xml b/DRAMSys/library/resources/configs/mcconfigs/fr_fcfs.xml index 35e118dc..a91a9092 100644 --- a/DRAMSys/library/resources/configs/mcconfigs/fr_fcfs.xml +++ b/DRAMSys/library/resources/configs/mcconfigs/fr_fcfs.xml @@ -1,8 +1,13 @@ - - + + + + + + + diff --git a/DRAMSys/library/resources/configs/mcconfigs/fr_fcfs_bw_buffer16.xml b/DRAMSys/library/resources/configs/mcconfigs/fr_fcfs_bw_buffer16.xml deleted file mode 100644 index d92d32da..00000000 --- a/DRAMSys/library/resources/configs/mcconfigs/fr_fcfs_bw_buffer16.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/DRAMSys/library/resources/configs/mcconfigs/fr_fcfs_bw_buffer16_close_page.xml b/DRAMSys/library/resources/configs/mcconfigs/fr_fcfs_bw_buffer16_close_page.xml deleted file mode 100644 index d4aa4a4c..00000000 --- a/DRAMSys/library/resources/configs/mcconfigs/fr_fcfs_bw_buffer16_close_page.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/DRAMSys/library/resources/configs/mcconfigs/fr_fcfs_grp.xml b/DRAMSys/library/resources/configs/mcconfigs/fr_fcfs_grp.xml index 042cc5fb..00a190a7 100644 --- a/DRAMSys/library/resources/configs/mcconfigs/fr_fcfs_grp.xml +++ b/DRAMSys/library/resources/configs/mcconfigs/fr_fcfs_grp.xml @@ -1,7 +1,13 @@ - - + + + + + + + + diff --git a/DRAMSys/library/resources/configs/mcconfigs/fr_fcfs_nbw_buffer16.xml b/DRAMSys/library/resources/configs/mcconfigs/fr_fcfs_nbw_buffer16.xml deleted file mode 100644 index 7cb5befd..00000000 --- a/DRAMSys/library/resources/configs/mcconfigs/fr_fcfs_nbw_buffer16.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/DRAMSys/library/resources/configs/mcconfigs/fr_fcfs_nbw_buffer16_close_page.xml b/DRAMSys/library/resources/configs/mcconfigs/fr_fcfs_nbw_buffer16_close_page.xml deleted file mode 100644 index aa65b3ff..00000000 --- a/DRAMSys/library/resources/configs/mcconfigs/fr_fcfs_nbw_buffer16_close_page.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/DRAMSys/library/resources/configs/mcconfigs/fr_fcfs_rp.xml b/DRAMSys/library/resources/configs/mcconfigs/fr_fcfs_rp.xml deleted file mode 100644 index 4c0b43c6..00000000 --- a/DRAMSys/library/resources/configs/mcconfigs/fr_fcfs_rp.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/DRAMSys/library/resources/configs/mcconfigs/grp.xml b/DRAMSys/library/resources/configs/mcconfigs/grp.xml deleted file mode 100644 index 8b34759d..00000000 --- a/DRAMSys/library/resources/configs/mcconfigs/grp.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/DRAMSys/library/resources/configs/mcconfigs/par_bs.xml b/DRAMSys/library/resources/configs/mcconfigs/par_bs.xml deleted file mode 100644 index aaec39ca..00000000 --- a/DRAMSys/library/resources/configs/mcconfigs/par_bs.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/DRAMSys/library/resources/configs/mcconfigs/rgrmccfg.xml b/DRAMSys/library/resources/configs/mcconfigs/rgrmccfg.xml deleted file mode 100644 index 2f8fb337..00000000 --- a/DRAMSys/library/resources/configs/mcconfigs/rgrmccfg.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/DRAMSys/library/resources/configs/mcconfigs/sms.xml b/DRAMSys/library/resources/configs/mcconfigs/sms.xml deleted file mode 100644 index 3d9433da..00000000 --- a/DRAMSys/library/resources/configs/mcconfigs/sms.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/DRAMSys/library/resources/simulations/ddr3-example.xml b/DRAMSys/library/resources/simulations/ddr3-example.xml index c6140385..2c948758 100644 --- a/DRAMSys/library/resources/simulations/ddr3-example.xml +++ b/DRAMSys/library/resources/simulations/ddr3-example.xml @@ -8,9 +8,9 @@ - + - + - ddr3_example.stl + ddr3_example.stl diff --git a/DRAMSys/library/src/configuration/Configuration.cpp b/DRAMSys/library/src/configuration/Configuration.cpp index 826343d6..0c2fb4f2 100644 --- a/DRAMSys/library/src/configuration/Configuration.cpp +++ b/DRAMSys/library/src/configuration/Configuration.cpp @@ -136,14 +136,16 @@ void Configuration::setParameter(std::string name, std::string value) { if (name == "BankwiseLogic") BankwiseLogic = string2bool(value); - else if (name == "OpenPagePolicy") - OpenPagePolicy = string2bool(value); - else if (name == "AdaptivePagePolicy") - AdaptivePagePolicy = string2bool(value); + else if (name == "PagePolicy") + pagePolicy = value; else if (name == "MaxNrOfTransactions") MaxNrOfTransactions = string2int(value); else if (name == "Scheduler") - Scheduler = value; + scheduler = value; + else if (name == "CmdMux") + cmdMux = value; + else if (name == "RespQueue") + respQueue = value; else if (name == "SJFProbability") { if (string2int(value) > 100 || string2int(value) < 0) diff --git a/DRAMSys/library/src/configuration/Configuration.h b/DRAMSys/library/src/configuration/Configuration.h index e8fb6bc6..af4c8a28 100644 --- a/DRAMSys/library/src/configuration/Configuration.h +++ b/DRAMSys/library/src/configuration/Configuration.h @@ -64,10 +64,9 @@ struct Configuration // MCConfig: bool BankwiseLogic = false; - bool OpenPagePolicy = true; - bool AdaptivePagePolicy = false; unsigned int MaxNrOfTransactions = 8; - std::string Scheduler; + std::string pagePolicy; + std::string scheduler, cmdMux, respQueue; unsigned int SJFProbability; unsigned int RequestBufferSize; unsigned int Capsize = 5; diff --git a/DRAMSys/library/src/configuration/memspec/MemSpec.cpp b/DRAMSys/library/src/configuration/memspec/MemSpec.cpp index 6e96ff4a..3632316b 100644 --- a/DRAMSys/library/src/configuration/memspec/MemSpec.cpp +++ b/DRAMSys/library/src/configuration/memspec/MemSpec.cpp @@ -71,17 +71,3 @@ unsigned MemSpec::getCommandLength(Command command) const { return commandLength[command]; } - -//sc_time MemSpec::getMinExecutionTimeForPowerDownCmd(Command command) const -//{ -// if (command == Command::PDEA || command == Command::PDEP) -// return tCKE; -// else if (command == Command::SREFEN) -// return tCKESR; -// else -// { -// SC_REPORT_FATAL("getMinimalExecutionTime", -// "command is not know or command has a fixed execution time"); -// return SC_ZERO_TIME; -// } -//} diff --git a/DRAMSys/library/src/configuration/memspec/MemSpec.h b/DRAMSys/library/src/configuration/memspec/MemSpec.h index 0e95ed05..2dc5d628 100644 --- a/DRAMSys/library/src/configuration/memspec/MemSpec.h +++ b/DRAMSys/library/src/configuration/memspec/MemSpec.h @@ -64,9 +64,6 @@ struct MemSpec unsigned getCommandLength(Command) const; - // Returns the minimum execution time for commands that have a variable execution time - //virtual sc_time getMinExecutionTimeForPowerDownCmd(Command command) const = 0; - std::string MemoryId = "not defined."; std::string MemoryType = "not defined."; @@ -87,7 +84,7 @@ struct MemSpec double clkMHz; sc_time clk; - // Command lengths on bus, standardly one clock cycle + // Command lengths on bus, usually one clock cycle std::vector commandLength; }; diff --git a/DRAMSys/library/src/controller/Controller.cpp b/DRAMSys/library/src/controller/Controller.cpp index d1e078c7..9585157b 100644 --- a/DRAMSys/library/src/controller/Controller.cpp +++ b/DRAMSys/library/src/controller/Controller.cpp @@ -35,10 +35,6 @@ #include "Controller.h" #include "../configuration/Configuration.h" -#include "scheduler/SchedulerFifo.h" -#include "scheduler/SchedulerFrFcfs.h" -#include "cmdmux/CmdMuxStrict.h" -#include "cmdmux/CmdMuxOldest.h" #include "../common/dramExtensions.h" #include "../common/protocol.h" #include "checker/CheckerDDR3.h" @@ -50,13 +46,18 @@ #include "checker/CheckerGDDR5.h" #include "checker/CheckerGDDR5X.h" #include "checker/CheckerGDDR6.h" +#include "scheduler/SchedulerFifo.h" +#include "scheduler/SchedulerFrFcfs.h" +#include "scheduler/SchedulerFrFcfsGrp.h" +#include "cmdmux/CmdMuxStrict.h" +#include "cmdmux/CmdMuxOldest.h" +#include "respqueue/RespQueueFifo.h" +#include "respqueue/RespQueueReorder.h" #include "refresh/RefreshManager.h" #include "refresh/RefreshManagerDummy.h" #include "refresh/RefreshManagerBankwise.h" #include "powerdown/PowerDownManagerStaggered.h" #include "powerdown/PowerDownManagerDummy.h" -#include "respqueue/RespQueueFifo.h" -#include "respqueue/RespQueueReorder.h" Controller::Controller(sc_module_name name) : GenericController(name) @@ -92,46 +93,52 @@ Controller::Controller(sc_module_name name) : SC_REPORT_FATAL("Controller", "Unsupported DRAM type!"); // instantiate scheduler and command mux - if (config.Scheduler == "FifoStrict") - { + if (config.scheduler == "Fifo") scheduler = new SchedulerFifo(); - commandMux = new CmdMuxStrict(); - } - else if (config.Scheduler == "FrFcfs") - { + else if (config.scheduler == "FrFcfs") scheduler = new SchedulerFrFcfs(); - commandMux = new CmdMuxOldest(); - } + else if (config.scheduler == "FrFcfsGrp") + scheduler = new SchedulerFrFcfsGrp(); else SC_REPORT_FATAL("Controller", "Selected scheduler not supported!"); + if (config.cmdMux == "Oldest") + commandMux = new CmdMuxOldest(); + else if (config.cmdMux == "Strict") + commandMux = new CmdMuxStrict(); + else + SC_REPORT_FATAL("Controller", "Selected cmdmux not supported!"); + + if (config.respQueue == "Fifo") + respQueue = new RespQueueFifo(); + else if (config.respQueue == "Reorder") + respQueue = new RespQueueReorder(); + else + SC_REPORT_FATAL("Controller", "Selected respqueue not supported!"); + // instantiate bank machines (one per bank) - if (config.OpenPagePolicy) + if (config.pagePolicy == "Open") { - if (config.AdaptivePagePolicy) - { - for (unsigned bankID = 0; bankID < memSpec->NumberOfBanks; bankID++) - bankMachines.push_back(new BankMachineOpenAdaptive(scheduler, checker, Bank(bankID))); - } - else - { - for (unsigned bankID = 0; bankID < memSpec->NumberOfBanks; bankID++) - bankMachines.push_back(new BankMachineOpen(scheduler, checker, Bank(bankID))); - } + for (unsigned bankID = 0; bankID < memSpec->NumberOfBanks; bankID++) + bankMachines.push_back(new BankMachineOpen(scheduler, checker, Bank(bankID))); + } + else if (config.pagePolicy == "OpenAdaptive") + { + for (unsigned bankID = 0; bankID < memSpec->NumberOfBanks; bankID++) + bankMachines.push_back(new BankMachineOpenAdaptive(scheduler, checker, Bank(bankID))); + } + else if (config.pagePolicy == "Closed") + { + for (unsigned bankID = 0; bankID < memSpec->NumberOfBanks; bankID++) + bankMachines.push_back(new BankMachineClosed(scheduler, checker, Bank(bankID))); + } + else if (config.pagePolicy == "ClosedAdaptive") + { + for (unsigned bankID = 0; bankID < memSpec->NumberOfBanks; bankID++) + bankMachines.push_back(new BankMachineClosedAdaptive(scheduler, checker, Bank(bankID))); } else - { - if (config.AdaptivePagePolicy) - { - for (unsigned bankID = 0; bankID < memSpec->NumberOfBanks; bankID++) - bankMachines.push_back(new BankMachineClosedAdaptive(scheduler, checker, Bank(bankID))); - } - else - { - for (unsigned bankID = 0; bankID < memSpec->NumberOfBanks; bankID++) - bankMachines.push_back(new BankMachineClosed(scheduler, checker, Bank(bankID))); - } - } + SC_REPORT_FATAL("Controller", "Selected page policy not supported!"); for (unsigned rankID = 0; rankID < memSpec->NumberOfRanks; rankID++) { @@ -189,8 +196,6 @@ Controller::Controller(sc_module_name name) : } } - respQueue = new RespQueueFifo(); - startBandwidthIdleCollector(); } diff --git a/DRAMSys/library/src/controller/scheduler/SchedulerFrFcfs.cpp b/DRAMSys/library/src/controller/scheduler/SchedulerFrFcfs.cpp index 457b6306..3003f967 100644 --- a/DRAMSys/library/src/controller/scheduler/SchedulerFrFcfs.cpp +++ b/DRAMSys/library/src/controller/scheduler/SchedulerFrFcfs.cpp @@ -75,8 +75,7 @@ tlm_generic_payload *SchedulerFrFcfs::getNextRequest(BankMachine *bankMachine) unsigned bankID = bankMachine->getBank().ID(); if (!buffer[bankID].empty()) { - BmState currentState = bankMachine->getState(); - if (currentState == BmState::Activated) + if (bankMachine->getState() == BmState::Activated) { // Search for row hit Row openRow = bankMachine->getOpenRow(); diff --git a/DRAMSys/library/src/controller/scheduler/SchedulerFrFcfsGrp.cpp b/DRAMSys/library/src/controller/scheduler/SchedulerFrFcfsGrp.cpp new file mode 100644 index 00000000..67f7f77e --- /dev/null +++ b/DRAMSys/library/src/controller/scheduler/SchedulerFrFcfsGrp.cpp @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2020, University of Kaiserslautern + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Author: Lukas Steiner + */ + +#include "SchedulerFrFcfsGrp.h" + +SchedulerFrFcfsGrp::SchedulerFrFcfsGrp() +{ + buffer = std::vector> + (Configuration::getInstance().memSpec->NumberOfBanks); + maxNumberOfRequests = Configuration::getInstance().MaxNrOfTransactions; +} + +bool SchedulerFrFcfsGrp::hasBufferSpace(tlm_generic_payload *payload) +{ + if (buffer[DramExtension::getBank(payload).ID()].size() < maxNumberOfRequests) + return true; + else + return false; +} + +void SchedulerFrFcfsGrp::storeRequest(tlm_generic_payload *payload) +{ + buffer[DramExtension::getBank(payload).ID()].push_back(payload); +} + +void SchedulerFrFcfsGrp::removeRequest(tlm_generic_payload *payload) +{ + lastCommand = payload->get_command(); + unsigned bankID = DramExtension::getBank(payload).ID(); + for (auto it = buffer[bankID].begin(); it != buffer[bankID].end(); it++) + { + if (*it == payload) + { + buffer[bankID].erase(it); + return; + } + } + SC_REPORT_FATAL("SchedulerFrFcfs", "removeRequest failed!"); +} + +tlm_generic_payload *SchedulerFrFcfsGrp::getNextRequest(BankMachine *bankMachine) +{ + unsigned bankID = bankMachine->getBank().ID(); + if (!buffer[bankID].empty()) + { + if (bankMachine->getState() == BmState::Activated) + { + // Filter all row hits + Row openRow = bankMachine->getOpenRow(); + std::list rowHits; + for (auto it = buffer[bankID].begin(); it != buffer[bankID].end(); it++) + { + if (DramExtension::getRow(*it) == openRow) + rowHits.push_back(*it); + } + + if (!rowHits.empty()) + { + for (auto outerIt = rowHits.begin(); outerIt != rowHits.end(); outerIt++) + { + if ((*outerIt)->get_command() == lastCommand) + { + bool hazardDetected = false; + for (auto innerIt = rowHits.begin(); *innerIt != *outerIt; innerIt++) + { + if ((*outerIt)->get_address() == (*innerIt)->get_address()) + { + hazardDetected = true; + break; + } + } + if (!hazardDetected) + return *outerIt; + } + } + // no rd/wr hit found -> take first row hit + return *rowHits.begin(); + } + } + // No row hit found or bank precharged + return buffer[bankID].front(); + } + return nullptr; +} + +bool SchedulerFrFcfsGrp::hasFurtherRowHit(Bank bank, Row row) +{ + unsigned rowHitCounter = 0; + for (auto it = buffer[bank.ID()].begin(); it != buffer[bank.ID()].end(); it++) + { + if (DramExtension::getRow(*it) == row) + { + rowHitCounter++; + if (rowHitCounter == 2) + return true; + } + } + return false; +} + +bool SchedulerFrFcfsGrp::hasFurtherRequest(Bank bank) +{ + if (buffer[bank.ID()].size() >= 2) + return true; + else + return false; +} diff --git a/DRAMSys/library/src/controller/scheduler/SchedulerFrFcfsGrp.h b/DRAMSys/library/src/controller/scheduler/SchedulerFrFcfsGrp.h new file mode 100644 index 00000000..50537fc6 --- /dev/null +++ b/DRAMSys/library/src/controller/scheduler/SchedulerFrFcfsGrp.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2020, University of Kaiserslautern + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Author: Lukas Steiner + */ + +#ifndef SCHEDULERFRFCFSGRP_H +#define SCHEDULERFRFCFSGRP_H + +#include +#include +#include + +#include "SchedulerIF.h" +#include "../../common/dramExtensions.h" +#include "../BankMachine.h" + +using namespace tlm; + +class SchedulerFrFcfsGrp : public SchedulerIF +{ +public: + SchedulerFrFcfsGrp(); + virtual bool hasBufferSpace(tlm_generic_payload *) override; + virtual void storeRequest(tlm_generic_payload *) override; + virtual void removeRequest(tlm_generic_payload *) override; + virtual tlm_generic_payload *getNextRequest(BankMachine *) override; + virtual bool hasFurtherRowHit(Bank, Row) override; + virtual bool hasFurtherRequest(Bank) override; +private: + std::vector> buffer; + unsigned maxNumberOfRequests; + tlm_command lastCommand = TLM_READ_COMMAND; +}; + +#endif // SCHEDULERFRFCFSGRP_H