diff --git a/DRAMSys/simulator/src/controller/core/powerdown/PowerDownManagerBankwise.cpp b/DRAMSys/simulator/src/controller/core/powerdown/PowerDownManagerBankwise.cpp index 6237fe6d..c6a22800 100644 --- a/DRAMSys/simulator/src/controller/core/powerdown/PowerDownManagerBankwise.cpp +++ b/DRAMSys/simulator/src/controller/core/powerdown/PowerDownManagerBankwise.cpp @@ -97,43 +97,59 @@ void PowerDownManagerBankwise::sleep(Bank bank, sc_time time) void PowerDownManagerBankwise::wakeUp(Bank bank, sc_time time) { - if (isAwakeForRefresh(bank)) - { - setState(PowerDownState::Awake, bank); - } - else if (isInPowerDown(bank)) - { - //Request wakes up power down - Command cmd = IPowerDownManager::getWakeUpCommand(powerDownStates[bank]); - ScheduledCommand pdn(cmd, time, getExecutionTime(cmd, powerDownPayloads[bank]), - DramExtension::getExtension(powerDownPayloads[bank])); - controllerCore.getCommandChecker(cmd).delayToSatisfyConstraints(pdn); + printDebugMessage("Waking up on bank " + to_string(bank.ID()) + " at " + time.to_string() + " current power down state is " + powerDownStateToString(powerDownStates[bank])); - if (cmd == Command::SREFX) - controllerCore.refreshManager->reInitialize(bank, pdn.getEnd()); + if (isAwakeForRefresh(bank)) { + printDebugMessage("It was already awake for refresh on bank " + to_string(bank.ID()) + " at " + time.to_string()); + setState(PowerDownState::Awake, bank); + } else if (isInPowerDown(bank)) { + // Request wake up from power down. A Power Down Exit request will be generated (PDNAX, PDNPX, SREFX). + Command pdnExitCmd = IPowerDownManager::getWakeUpCommand(powerDownStates[bank]); + // Mount the command to be scheduled + ScheduledCommand pdnExit(pdnExitCmd, time, getExecutionTime(pdnExitCmd, powerDownPayloads[bank]), DramExtension::getExtension(powerDownPayloads[bank])); + // Ensure that time constraints are respected + controllerCore.getCommandChecker(pdnExitCmd).delayToSatisfyConstraints(pdnExit); - setState(PowerDownState::Awake, bank); - sendPowerDownPayload(pdn); - } + if (pdnExitCmd == Command::SREFX) { + // Leaving Self Refresh. Plan the next refresh. + controllerCore.refreshManager->reInitialize(bank, pdnExit.getEnd()); + printDebugMessage("Waking up. Leaving Self Refresh on Bank " + to_string(bank.ID()) + " at " + time.to_string() + " next refresh planned to " + pdnExit.getEnd().to_string()); + + } + + setState(PowerDownState::Awake, bank); + + printDebugMessage("Sending power down exit command " + commandToString(pdnExitCmd) + " on bank " + to_string(bank.ID()) + " at " + time.to_string() + " start time " + pdnExit.getStart().to_string() + " end time " + pdnExit.getEnd().to_string()); + sendPowerDownPayload(pdnExit); + } + + printDebugMessage("Awaken on bank " + to_string(bank.ID()) + " at " + time.to_string() + " current power down state is " + powerDownStateToString(powerDownStates[bank])); } void PowerDownManagerBankwise::wakeUpForRefresh(Bank bank, sc_time time) { - if (isInPowerDown(bank)) - { - Command cmd = IPowerDownManager::getWakeUpCommand(powerDownStates[bank]); - ScheduledCommand pdn(cmd, time, getExecutionTime(cmd, powerDownPayloads[bank]), - DramExtension::getExtension(powerDownPayloads[bank])); + printDebugMessage("Waking up for refresh on bank " + to_string(bank.ID()) + " at " + time.to_string() + " current power down state is " + powerDownStateToString(powerDownStates[bank])); - setState(PowerDownState::AwakeForRefresh, bank); - sendPowerDownPayload(pdn); - } + if (isInPowerDown(bank)) { + // A Power Down Exit request will be generated (PDNAX, PDNPX, SREFX). + Command pdnExitCmd = IPowerDownManager::getWakeUpCommand(powerDownStates[bank]); + // Get the execution time for this request + sc_time executionTime = getExecutionTime(pdnExitCmd, powerDownPayloads[bank]); + // Mount the command to be scheduled + ScheduledCommand pdnExit(pdnExitCmd, time, executionTime, DramExtension::getExtension(powerDownPayloads[bank])); + + setState(PowerDownState::AwakeForRefresh, bank); + + printDebugMessage("Sending power down exit command " + commandToString(pdnExitCmd) + " on bank " + to_string(bank.ID()) + " at " + time.to_string() + " start time " + pdnExit.getStart().to_string() + " end time " + pdnExit.getEnd().to_string()); + sendPowerDownPayload(pdnExit); + } + + printDebugMessage("Awaken for refresh on bank " + to_string(bank.ID()) + " at " + time.to_string() + " current power down state is " + powerDownStateToString(powerDownStates[bank])); } bool PowerDownManagerBankwise::isInPowerDown(Bank bank) { - return isIn(powerDownStates[bank], - { PowerDownState::PDNActive, PowerDownState::PDNPrecharge, PowerDownState::PDNSelfRefresh }); + return isIn(powerDownStates[bank], { PowerDownState::PDNActive, PowerDownState::PDNPrecharge, PowerDownState::PDNSelfRefresh }); } bool PowerDownManagerBankwise::isInSelfRefresh(Bank bank) @@ -153,18 +169,17 @@ bool PowerDownManagerBankwise::isAwake(Bank bank) void PowerDownManagerBankwise::setState(PowerDownState state, Bank bank) { - PowerDownState& bankstate = powerDownStates[bank]; - bankstate = state; - - DebugManager::getInstance().printDebugMessage(PowerDownManagerBankwise::senderName, - "Is now in state " + powerDownStateToString(state) + " on Bank " + to_string(bank.ID())); + PowerDownState& bankstate = powerDownStates[bank]; + bankstate = state; + printDebugMessage("Is now in state " + powerDownStateToString(state) + " on Bank " + to_string(bank.ID())); } -void PowerDownManagerBankwise::sendPowerDownPayload(ScheduledCommand& pdn) +void PowerDownManagerBankwise::sendPowerDownPayload(ScheduledCommand &pdn) { - controllerCore.state.bus.moveCommandToNextFreeSlot(pdn); - controllerCore.state.change(pdn); - controllerCore.controller.send(pdn, powerDownPayloads[pdn.getBank()]); + controllerCore.state.bus.moveCommandToNextFreeSlot(pdn); + controllerCore.state.change(pdn); + printDebugMessage("Sending power down command " + commandToString(pdn.getCommand()) + " on bank " + to_string(pdn.getBank().ID()) + " start time " + pdn.getStart().to_string() + " end time " + pdn.getEnd().to_string()); + controllerCore.controller.send(pdn, powerDownPayloads[pdn.getBank()]); } bool PowerDownManagerBankwise::canSleep(Bank bank) @@ -177,5 +192,8 @@ void PowerDownManagerBankwise::triggerSleep(Bank bank, sc_time time) sleep(bank, time); } - +void PowerDownManagerBankwise::printDebugMessage(std::string message) +{ + DebugManager::getInstance().printDebugMessage(PowerDownManagerBankwise::senderName, message); +} diff --git a/DRAMSys/simulator/src/controller/core/powerdown/PowerDownManagerBankwise.h b/DRAMSys/simulator/src/controller/core/powerdown/PowerDownManagerBankwise.h index 44e8e5e7..1e7340c9 100644 --- a/DRAMSys/simulator/src/controller/core/powerdown/PowerDownManagerBankwise.h +++ b/DRAMSys/simulator/src/controller/core/powerdown/PowerDownManagerBankwise.h @@ -52,10 +52,8 @@ class ControllerCore; class PowerDownManagerBankwise: public IPowerDownManager { public: - PowerDownManagerBankwise(ControllerCore& controllerCore); - virtual ~PowerDownManagerBankwise() - { - } + PowerDownManagerBankwise(ControllerCore& controllerCore); + virtual ~PowerDownManagerBankwise(){} virtual void triggerSleep(Bank bank, sc_time time) override; virtual void sleep(Bank bank, sc_time time) override; virtual void wakeUp(Bank bank, sc_time time) override; @@ -69,7 +67,7 @@ private: virtual bool isAwake(Bank bank); virtual bool isAwakeForRefresh(Bank bank); - ControllerCore& controllerCore; + ControllerCore &controllerCore; std::map powerDownPayloads; std::map powerDownStates; @@ -80,8 +78,10 @@ private: Command getWakeUpCommand(PowerDownState state); Command getSleepCommand(PowerDownState state); - void sendPowerDownPayload(ScheduledCommand& pdn); + void sendPowerDownPayload(ScheduledCommand &pdn); + + void printDebugMessage(std::string message); }; - #endif /* POWERDOWNMANAGERBANKWISE_H_ */ +