From 7c1642bc58a2699231c8f3f80d15e4731c7fbb0d Mon Sep 17 00:00:00 2001 From: Lukas Steiner Date: Tue, 26 Apr 2022 11:10:30 +0200 Subject: [PATCH] Add new dram extensions. --- DRAMSys/library/src/common/dramExtensions.cpp | 147 ++++++++++++++++++ DRAMSys/library/src/common/dramExtensions.h | 54 +++++++ 2 files changed, 201 insertions(+) diff --git a/DRAMSys/library/src/common/dramExtensions.cpp b/DRAMSys/library/src/common/dramExtensions.cpp index 4843ec67..bc4e45b2 100644 --- a/DRAMSys/library/src/common/dramExtensions.cpp +++ b/DRAMSys/library/src/common/dramExtensions.cpp @@ -41,6 +41,153 @@ using namespace sc_core; using namespace tlm; +ArbiterExtension::ArbiterExtension(Thread thread, Channel channel, uint64_t threadPayloadID, + const sc_core::sc_time& timeOfGeneration) : + thread(thread), channel(channel), threadPayloadID(threadPayloadID), timeOfGeneration(timeOfGeneration) +{} + +void ArbiterExtension::setExtension(tlm::tlm_generic_payload& trans, Thread thread, Channel channel) +{ + auto* extension = trans.get_extension(); + + if (extension != nullptr) + { + extension->thread = thread; + extension->channel = channel; + extension->threadPayloadID = 0; + extension->timeOfGeneration = SC_ZERO_TIME; + } + else + { + extension = new ArbiterExtension(thread, channel, 0, SC_ZERO_TIME); + trans.set_auto_extension(extension); + } +} + +void ArbiterExtension::setIDAndTimeOfGeneration(tlm::tlm_generic_payload& trans, uint64_t threadPayloadID, + const sc_core::sc_time& timeOfGeneration) +{ + assert(trans.get_extension() != nullptr); + + auto* extension = trans.get_extension(); + extension->threadPayloadID = threadPayloadID; + extension->timeOfGeneration = timeOfGeneration; +} + +tlm_extension_base* ArbiterExtension::clone() const +{ + return new ArbiterExtension(thread, channel, threadPayloadID, timeOfGeneration); +} + +void ArbiterExtension::copy_from(const tlm_extension_base& ext) +{ + const auto& cpyFrom = dynamic_cast(ext); + thread = cpyFrom.thread; + channel = cpyFrom.channel; + threadPayloadID = cpyFrom.threadPayloadID; + timeOfGeneration = cpyFrom.timeOfGeneration; +} + +Thread ArbiterExtension::getThread(const tlm::tlm_generic_payload& trans) +{ + return trans.get_extension()->thread; +} + +Channel ArbiterExtension::getChannel(const tlm::tlm_generic_payload& trans) +{ + return trans.get_extension()->channel; +} + +uint64_t ArbiterExtension::getThreadPayloadID(const tlm::tlm_generic_payload& trans) +{ + return trans.get_extension()->threadPayloadID; +} + +sc_time ArbiterExtension::getTimeOfGeneration(const tlm::tlm_generic_payload& trans) +{ + return trans.get_extension()->timeOfGeneration; +} + +ControllerExtension::ControllerExtension(uint64_t channelPayloadID, Rank rank, BankGroup bankGroup, Bank bank, Row row, + Column column, unsigned int burstLength) : + channelPayloadID(channelPayloadID), rank(rank), bankGroup(bankGroup), bank(bank), row(row), column(column), + burstLength(burstLength) +{} + +void ControllerExtension::setExtension(tlm::tlm_generic_payload& trans, uint64_t channelPayloadID, Rank rank, + BankGroup bankGroup, Bank bank, Row row, Column column, unsigned int burstLength) +{ + auto* extension = trans.get_extension(); + + if (extension != nullptr) + { + extension->channelPayloadID = channelPayloadID; + extension->rank = rank; + extension->bankGroup = bankGroup; + extension->bank = bank; + extension->row = row; + extension->column = column; + extension->burstLength = burstLength; + } + else + { + extension = new ControllerExtension(channelPayloadID, rank, bankGroup, bank, row, column, burstLength); + trans.set_auto_extension(extension); + } +} + +tlm_extension_base* ControllerExtension::clone() const +{ + return new ControllerExtension(channelPayloadID, rank, bankGroup, bank, row, column, burstLength); +} + +void ControllerExtension::copy_from(const tlm_extension_base& ext) +{ + const auto& cpyFrom = dynamic_cast(ext); + channelPayloadID = cpyFrom.channelPayloadID; + rank = cpyFrom.rank; + bankGroup = cpyFrom.bankGroup; + bank = cpyFrom.bank; + row = cpyFrom.row; + column = cpyFrom.column; + burstLength = cpyFrom.burstLength; +} + +uint64_t ControllerExtension::getChannelPayloadID(const tlm::tlm_generic_payload& trans) +{ + return trans.get_extension()->channelPayloadID; +} + +Rank ControllerExtension::getRank(const tlm::tlm_generic_payload& trans) +{ + return trans.get_extension()->rank; +} + +BankGroup ControllerExtension::getBankGroup(const tlm::tlm_generic_payload& trans) +{ + return trans.get_extension()->bankGroup; +} + +Bank ControllerExtension::getBank(const tlm::tlm_generic_payload& trans) +{ + return trans.get_extension()->bank; +} + +Row ControllerExtension::getRow(const tlm::tlm_generic_payload& trans) +{ + return trans.get_extension()->row; +} + +Column ControllerExtension::getColumn(const tlm::tlm_generic_payload& trans) +{ + return trans.get_extension()->column; +} + +unsigned ControllerExtension::getBurstLength(const tlm::tlm_generic_payload& trans) +{ + return trans.get_extension()->burstLength; +} + DramExtension::DramExtension() : thread(0), channel(0), rank(0), bankGroup(0), bank(0), row(0), column(0), burstLength(0), diff --git a/DRAMSys/library/src/common/dramExtensions.h b/DRAMSys/library/src/common/dramExtensions.h index cfd9cb9a..27726bb7 100644 --- a/DRAMSys/library/src/common/dramExtensions.h +++ b/DRAMSys/library/src/common/dramExtensions.h @@ -154,6 +154,60 @@ private: unsigned int id; }; +class ArbiterExtension : public tlm::tlm_extension +{ +public: + static void setExtension(tlm::tlm_generic_payload& trans, Thread thread, Channel channel); + static void setIDAndTimeOfGeneration(tlm::tlm_generic_payload& trans, uint64_t threadPayloadID, + const sc_core::sc_time& timeOfGeneration); + + tlm::tlm_extension_base* clone() const override; + void copy_from(const tlm::tlm_extension_base& ext) override; + + static Thread getThread(const tlm::tlm_generic_payload& trans); + static Channel getChannel(const tlm::tlm_generic_payload& trans); + static uint64_t getThreadPayloadID(const tlm::tlm_generic_payload& trans); + static sc_core::sc_time getTimeOfGeneration(const tlm::tlm_generic_payload& trans); + +private: + ArbiterExtension(Thread thread, Channel channel, uint64_t threadPayloadID, const sc_core::sc_time& timeOfGeneration); + Thread thread; + Channel channel; + uint64_t threadPayloadID; + sc_core::sc_time timeOfGeneration; +}; + +class ControllerExtension : public tlm::tlm_extension +{ +public: + static void setExtension(tlm::tlm_generic_payload& trans, uint64_t channelPayloadID, Rank rank, BankGroup bankGroup, + Bank bank, Row row, Column column, unsigned burstLength); + + //static ControllerExtension& getExtension(const tlm::tlm_generic_payload& trans); + + tlm::tlm_extension_base* clone() const override; + void copy_from(const tlm::tlm_extension_base& ext) override; + + static uint64_t getChannelPayloadID(const tlm::tlm_generic_payload& trans); + static Rank getRank(const tlm::tlm_generic_payload& trans); + static BankGroup getBankGroup(const tlm::tlm_generic_payload& trans); + static Bank getBank(const tlm::tlm_generic_payload& trans); + static Row getRow(const tlm::tlm_generic_payload& trans); + static Column getColumn(const tlm::tlm_generic_payload& trans); + static unsigned getBurstLength(const tlm::tlm_generic_payload& trans); + +private: + ControllerExtension(uint64_t channelPayloadID, Rank rank, BankGroup bankGroup, Bank bank, Row row, Column column, + unsigned burstLength); + uint64_t channelPayloadID; + Rank rank; + BankGroup bankGroup; + Bank bank; + Row row; + Column column; + unsigned burstLength; +}; + class DramExtension : public tlm::tlm_extension {