diff --git a/DRAMSys/library/src/controller/Controller.cpp b/DRAMSys/library/src/controller/Controller.cpp index ce9e5426..2d727780 100644 --- a/DRAMSys/library/src/controller/Controller.cpp +++ b/DRAMSys/library/src/controller/Controller.cpp @@ -175,7 +175,8 @@ Controller::Controller(const sc_module_name &name) : { for (unsigned rankID = 0; rankID < memSpec->numberOfRanks; rankID++) { - PowerDownManagerIF *manager = new PowerDownManagerStaggered(Rank(rankID), checker); + PowerDownManagerIF *manager = new PowerDownManagerStaggered(bankMachinesOnRank[rankID], + Rank(rankID), checker); powerDownManagers.push_back(manager); } } diff --git a/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.cpp b/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.cpp index 17f8ea4e..7fb1fac9 100644 --- a/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.cpp +++ b/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.cpp @@ -37,8 +37,9 @@ using namespace tlm; -PowerDownManagerStaggered::PowerDownManagerStaggered(Rank rank, CheckerIF *checker) - : rank(rank), checker(checker) +PowerDownManagerStaggered::PowerDownManagerStaggered(std::vector &bankMachinesOnRank, + Rank rank, CheckerIF *checker) + : bankMachinesOnRank(bankMachinesOnRank), checker(checker) { setUpDummy(powerDownPayload, UINT64_MAX - 1, rank); } @@ -94,10 +95,15 @@ sc_time PowerDownManagerStaggered::start() } else if (entryTriggered) { - if (activatedBanks != 0) - nextCommand = Command::PDEA; - else - nextCommand = Command::PDEP; + nextCommand = Command::PDEP; + for (auto it : bankMachinesOnRank) + { + if (it->getState() == BankMachine::State::Activated) + { + nextCommand = Command::PDEA; + break; + } + } timeToSchedule = checker->timeToSatisfyConstraints(nextCommand, &powerDownPayload); } @@ -114,15 +120,6 @@ void PowerDownManagerStaggered::updateState(Command command) { switch (command) { - case Command::ACT: - activatedBanks++; - break; - case Command::PRE: - activatedBanks--; - break; - case Command::PREA: - activatedBanks = 0; - break; case Command::PDEA: state = State::ActivePdn; entryTriggered = false; diff --git a/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.h b/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.h index f9d88bc7..f79004a9 100644 --- a/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.h +++ b/DRAMSys/library/src/controller/powerdown/PowerDownManagerStaggered.h @@ -42,7 +42,7 @@ class PowerDownManagerStaggered final : public PowerDownManagerIF { public: - PowerDownManagerStaggered(Rank, CheckerIF *); + PowerDownManagerStaggered(std::vector &, Rank, CheckerIF *); void triggerEntry() override; void triggerExit() override; @@ -55,7 +55,7 @@ public: private: enum class State {Idle, ActivePdn, PrechargePdn, SelfRefresh, ExtraRefresh} state = State::Idle; tlm::tlm_generic_payload powerDownPayload; - Rank rank; + std::vector &bankMachinesOnRank; CheckerIF *checker; sc_time timeToSchedule = sc_max_time(); @@ -65,7 +65,6 @@ private: bool entryTriggered = true; bool exitTriggered = false; bool enterSelfRefresh = false; - unsigned activatedBanks = 0; }; #endif // POWERDOWNMANAGERSTAGGERED_H