Improvements on readability and debugging

This commit is contained in:
Éder F. Zulian
2016-01-14 14:58:03 -02:00
parent 62057c041f
commit d7b8e7c8f6
2 changed files with 61 additions and 43 deletions

View File

@@ -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);
}

View File

@@ -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_ */