Improvements on readability and debugging
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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<Bank, tlm::tlm_generic_payload> powerDownPayloads;
|
||||
std::map<Bank, PowerDownState> 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_ */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user