diff --git a/DRAMSys/library/src/common/TlmRecorder.cpp b/DRAMSys/library/src/common/TlmRecorder.cpp index 390aacf5..81b2f1d3 100644 --- a/DRAMSys/library/src/common/TlmRecorder.cpp +++ b/DRAMSys/library/src/common/TlmRecorder.cpp @@ -145,7 +145,7 @@ void TlmRecorder::recordPhase(tlm_generic_payload& trans, const tlm_phase& phase tlm_generic_payload* keyTrans; if (ChildExtension::isChildTrans(trans)) { - keyTrans = &trans.get_extension()->getParentTrans(); + keyTrans = &ChildExtension::getParentTrans(trans); } else { @@ -230,7 +230,7 @@ void TlmRecorder::removeTransactionFromSystem(tlm_generic_payload &trans) PRINTDEBUGMESSAGE(name, "Removing transaction #" + std::to_string(currentTransactionsInSystem.at(&trans).id)); - Transaction &recordingData = currentTransactionsInSystem.at(&trans); + Transaction& recordingData = currentTransactionsInSystem.at(&trans); currentDataBuffer->push_back(recordingData); currentTransactionsInSystem.erase(&trans); diff --git a/DRAMSys/library/src/common/TlmRecorder.h b/DRAMSys/library/src/common/TlmRecorder.h index c11985a6..7e0cc505 100644 --- a/DRAMSys/library/src/common/TlmRecorder.h +++ b/DRAMSys/library/src/common/TlmRecorder.h @@ -89,6 +89,7 @@ private: struct Transaction { + Transaction(const Transaction& other) = default; Transaction(uint64_t id, uint64_t address, unsigned int dataLength, char cmd, const sc_core::sc_time& timeOfGeneration, Thread thread, Channel channel) : id(id), address(address), dataLength(dataLength), cmd(cmd), timeOfGeneration(timeOfGeneration), @@ -154,7 +155,7 @@ private: std::vector *storageDataBuffer; std::thread storageThread; - std::unordered_map currentTransactionsInSystem; + std::unordered_map currentTransactionsInSystem; uint64_t totalNumTransactions; sc_core::sc_time simulationTimeCoveredByRecording; diff --git a/DRAMSys/library/src/common/dramExtensions.cpp b/DRAMSys/library/src/common/dramExtensions.cpp index 9bb02758..b77a57ba 100644 --- a/DRAMSys/library/src/common/dramExtensions.cpp +++ b/DRAMSys/library/src/common/dramExtensions.cpp @@ -378,6 +378,11 @@ tlm::tlm_generic_payload& ChildExtension::getParentTrans() return *parentTrans; } +tlm::tlm_generic_payload& ChildExtension::getParentTrans(tlm::tlm_generic_payload& childTrans) +{ + return childTrans.get_extension()->getParentTrans(); +} + void ChildExtension::setExtension(tlm::tlm_generic_payload& childTrans, tlm::tlm_generic_payload& parentTrans) { auto* extension = childTrans.get_extension(); @@ -401,11 +406,6 @@ bool ChildExtension::isChildTrans(const tlm::tlm_generic_payload& trans) return false; } -bool ChildExtension::notifyChildTransCompletion() -{ - return parentTrans->get_extension()->notifyChildTransCompletion(); -} - tlm_extension_base* ParentExtension::clone() const { return new ParentExtension(childTranses); @@ -417,15 +417,6 @@ void ParentExtension::copy_from(const tlm_extension_base& ext) childTranses = cpyFrom.childTranses; } -bool ParentExtension::isParentTrans(const tlm::tlm_generic_payload& trans) -{ - auto* extension = trans.get_extension(); - if (extension != nullptr) - return !extension->childTranses.empty(); - else - return false; -} - void ParentExtension::setExtension(tlm::tlm_generic_payload& parentTrans, std::vector childTranses) { auto* extension = parentTrans.get_extension(); @@ -433,7 +424,6 @@ void ParentExtension::setExtension(tlm::tlm_generic_payload& parentTrans, std::v if (extension != nullptr) { extension->childTranses = std::move(childTranses); - extension->nextEndReqChildId = 0; extension->completedChildTranses = 0; } else @@ -451,12 +441,20 @@ const std::vector& ParentExtension::getChildTranses() bool ParentExtension::notifyChildTransCompletion() { completedChildTranses++; - return completedChildTranses == childTranses.size(); + if (completedChildTranses == childTranses.size()) + { + std::for_each(childTranses.begin(), childTranses.end(), + [](tlm::tlm_generic_payload* childTrans){childTrans->release();}); + childTranses.clear(); + return true; + } + else + { + return false; + } } -void ParentExtension::releaseChildTranses() +bool ParentExtension::notifyChildTransCompletion(tlm::tlm_generic_payload& trans) { - std::for_each(childTranses.begin(), childTranses.end(), - [](tlm::tlm_generic_payload* childTrans){childTrans->release();}); - childTranses.clear(); -} \ No newline at end of file + return trans.get_extension()->notifyChildTransCompletion(); +} diff --git a/DRAMSys/library/src/common/dramExtensions.h b/DRAMSys/library/src/common/dramExtensions.h index 76e61e8c..7a8a80c1 100644 --- a/DRAMSys/library/src/common/dramExtensions.h +++ b/DRAMSys/library/src/common/dramExtensions.h @@ -264,16 +264,15 @@ public: tlm::tlm_extension_base* clone() const override; void copy_from(const tlm::tlm_extension_base& ext) override; tlm::tlm_generic_payload& getParentTrans(); + static tlm::tlm_generic_payload& getParentTrans(tlm::tlm_generic_payload& childTrans); static void setExtension(tlm::tlm_generic_payload& childTrans, tlm::tlm_generic_payload& parentTrans); static bool isChildTrans(const tlm::tlm_generic_payload& trans); - bool notifyChildTransCompletion(); }; class ParentExtension : public tlm::tlm_extension { private: std::vector childTranses; - unsigned nextEndReqChildId = 0; unsigned completedChildTranses = 0; explicit ParentExtension(std::vector _childTranses) : childTranses(std::move(_childTranses)) {} @@ -283,11 +282,10 @@ public: tlm_extension_base* clone() const override; void copy_from(const tlm_extension_base& ext) override; - static bool isParentTrans(const tlm::tlm_generic_payload& trans); static void setExtension(tlm::tlm_generic_payload& parentTrans, std::vector childTranses); const std::vector& getChildTranses(); bool notifyChildTransCompletion(); - void releaseChildTranses(); + static bool notifyChildTransCompletion(tlm::tlm_generic_payload& trans); }; #endif // DRAMEXTENSIONS_H diff --git a/DRAMSys/library/src/controller/Controller.cpp b/DRAMSys/library/src/controller/Controller.cpp index b735d97f..248efc6f 100644 --- a/DRAMSys/library/src/controller/Controller.cpp +++ b/DRAMSys/library/src/controller/Controller.cpp @@ -477,104 +477,30 @@ void Controller::manageResponses() if (transToRelease.payload != nullptr) { assert(transToRelease.time >= sc_time_stamp()); - if (transToRelease.time == sc_time_stamp()) + if (transToRelease.time == sc_time_stamp()) // END_RESP completed { - NDEBUG_UNUSED(uint64_t id) = ControllerExtension::getChannelPayloadID(*transToRelease.payload); - PRINTDEBUGMESSAGE(name(), "Payload " + std::to_string(id) + " left system."); - - numberOfBeatsServed += ControllerExtension::getBurstLength(*transToRelease.payload); transToRelease.payload->release(); transToRelease.payload = nullptr; - totalNumberOfPayloads--; // Important!! has to be done once for parent transaction + totalNumberOfPayloads--; if (totalNumberOfPayloads == 0) { idleTimeCollector.start(); } - else - { - // TODO: hier fehlt noch was - tlm_generic_payload* nextPayloadInQueue = respQueue->nextPayload(); - //transToRelease.payload = respQueue->nextPayload(); - - if (nextPayloadInQueue != nullptr) - { - if (ChildExtension::isChildTrans(*nextPayloadInQueue)) - { - tlm_generic_payload& parentTrans = nextPayloadInQueue->get_extension()->getParentTrans(); - bool allChildTransesCompleted = parentTrans.get_extension()->notifyChildTransCompletion(); - if (allChildTransesCompleted) - { - parentTrans.get_extension()->releaseChildTranses(); - transToRelease.payload = &parentTrans; - // last payload was released in this cycle - tlm_phase bwPhase = BEGIN_RESP; - sc_time bwDelay = memSpec.tCK; - sendToFrontend(*transToRelease.payload, bwPhase, bwDelay); - transToRelease.time = sc_max_time(); - } - else - { - sc_time triggerTime = respQueue->getTriggerTime(); - if (triggerTime != sc_max_time()) - dataResponseEvent.notify(triggerTime - sc_time_stamp()); - } - } - else - { - transToRelease.payload = nextPayloadInQueue; - // last payload was released in this cycle - tlm_phase bwPhase = BEGIN_RESP; - sc_time bwDelay = memSpec.tCK; - sendToFrontend(*transToRelease.payload, bwPhase, bwDelay); - transToRelease.time = sc_max_time(); - } - } - else - { - sc_time triggerTime = respQueue->getTriggerTime(); - if (triggerTime != sc_max_time()) - dataResponseEvent.notify(triggerTime - sc_time_stamp()); - } - } } } - else + + tlm_generic_payload* nextPayloadInRespQueue = respQueue->nextPayload(); + + if (nextPayloadInRespQueue != nullptr) { - tlm_generic_payload* nextPayloadInQueue = respQueue->nextPayload(); - - if (nextPayloadInQueue != nullptr) + numberOfBeatsServed += ControllerExtension::getBurstLength(*nextPayloadInRespQueue); + if (ChildExtension::isChildTrans(*nextPayloadInRespQueue)) { - if (ChildExtension::isChildTrans(*nextPayloadInQueue)) + tlm_generic_payload& parentTrans = ChildExtension::getParentTrans(*nextPayloadInRespQueue); + if (ParentExtension::notifyChildTransCompletion(parentTrans)) { - tlm_generic_payload& parentTrans = nextPayloadInQueue->get_extension()->getParentTrans(); - bool allChildTransesCompleted = parentTrans.get_extension()->notifyChildTransCompletion(); - if (allChildTransesCompleted) - { - parentTrans.get_extension()->releaseChildTranses(); - transToRelease.payload = &parentTrans; - // last payload was released in this cycle - tlm_phase bwPhase = BEGIN_RESP; - sc_time bwDelay; - if (transToRelease.time == sc_time_stamp()) // last payload was released in this cycle - bwDelay = memSpec.tCK; - else - bwDelay = SC_ZERO_TIME; - - sendToFrontend(*transToRelease.payload, bwPhase, bwDelay); - transToRelease.time = sc_max_time(); - } - else - { - sc_time triggerTime = respQueue->getTriggerTime(); - if (triggerTime != sc_max_time()) - dataResponseEvent.notify(triggerTime - sc_time_stamp()); - } - } - else - { - transToRelease.payload = nextPayloadInQueue; - // last payload was released in this cycle + transToRelease.payload = &parentTrans; tlm_phase bwPhase = BEGIN_RESP; sc_time bwDelay; if (transToRelease.time == sc_time_stamp()) // last payload was released in this cycle @@ -585,14 +511,33 @@ void Controller::manageResponses() sendToFrontend(*transToRelease.payload, bwPhase, bwDelay); transToRelease.time = sc_max_time(); } + else + { + sc_time triggerTime = respQueue->getTriggerTime(); + if (triggerTime != sc_max_time()) + dataResponseEvent.notify(triggerTime - sc_time_stamp()); + } } else { - sc_time triggerTime = respQueue->getTriggerTime(); - if (triggerTime != sc_max_time()) - dataResponseEvent.notify(triggerTime - sc_time_stamp()); + transToRelease.payload = nextPayloadInRespQueue; + tlm_phase bwPhase = BEGIN_RESP; + sc_time bwDelay; + if (transToRelease.time == sc_time_stamp()) // last payload was released in this cycle + bwDelay = memSpec.tCK; + else + bwDelay = SC_ZERO_TIME; + + sendToFrontend(*transToRelease.payload, bwPhase, bwDelay); + transToRelease.time = sc_max_time(); } } + else + { + sc_time triggerTime = respQueue->getTriggerTime(); + if (triggerTime != sc_max_time()) + dataResponseEvent.notify(triggerTime - sc_time_stamp()); + } } void Controller::sendToFrontend(tlm_generic_payload& payload, tlm_phase& phase, sc_time& delay)