diff options
-rw-r--r-- | src/systemc/tlm_bridge/gem5_to_tlm.cc | 19 | ||||
-rw-r--r-- | src/systemc/tlm_bridge/gem5_to_tlm.hh | 4 | ||||
-rw-r--r-- | src/systemc/tlm_bridge/sc_peq.hh | 101 |
3 files changed, 7 insertions, 117 deletions
diff --git a/src/systemc/tlm_bridge/gem5_to_tlm.cc b/src/systemc/tlm_bridge/gem5_to_tlm.cc index 03cce22a2..f6ea811bd 100644 --- a/src/systemc/tlm_bridge/gem5_to_tlm.cc +++ b/src/systemc/tlm_bridge/gem5_to_tlm.cc @@ -124,7 +124,6 @@ packet2payload(PacketPtr packet) template <unsigned int BITWIDTH> void Gem5ToTlmBridge<BITWIDTH>::pec( - Gem5SystemC::PayloadEvent<Gem5ToTlmBridge<BITWIDTH>> *pe, tlm::tlm_generic_payload &trans, const tlm::tlm_phase &phase) { sc_core::sc_time delay; @@ -176,7 +175,6 @@ Gem5ToTlmBridge<BITWIDTH>::pec( } } } - delete pe; } template <unsigned int BITWIDTH> @@ -354,12 +352,9 @@ Gem5ToTlmBridge<BITWIDTH>::recvTimingReq(PacketPtr packet) } else if (status == tlm::TLM_UPDATED) { // The Timing annotation must be honored: sc_assert(phase == tlm::END_REQ || phase == tlm::BEGIN_RESP); - - auto *pe = new Gem5SystemC::PayloadEvent<Gem5ToTlmBridge>( - *this, &Gem5ToTlmBridge::pec, "PEQ"); - Tick nextEventTick = curTick() + delay.value(); - system->wakeupEventQueue(nextEventTick); - system->schedule(pe, nextEventTick); + auto cb = [this, trans, phase]() { pec(*trans, phase); }; + system->schedule(new EventFunctionWrapper(cb, "pec", true), + curTick() + delay.value()); } else if (status == tlm::TLM_COMPLETED) { // Transaction is over nothing has do be done. sc_assert(phase == tlm::END_RESP); @@ -432,11 +427,9 @@ tlm::tlm_sync_enum Gem5ToTlmBridge<BITWIDTH>::nb_transport_bw(tlm::tlm_generic_payload &trans, tlm::tlm_phase &phase, sc_core::sc_time &delay) { - auto *pe = new Gem5SystemC::PayloadEvent<Gem5ToTlmBridge>( - *this, &Gem5ToTlmBridge::pec, "PE"); - Tick nextEventTick = curTick() + delay.value(); - system->wakeupEventQueue(nextEventTick); - system->schedule(pe, nextEventTick); + auto cb = [this, &trans, phase]() { pec(trans, phase); }; + system->schedule(new EventFunctionWrapper(cb, "pec", true), + curTick() + delay.value()); return tlm::TLM_ACCEPTED; } diff --git a/src/systemc/tlm_bridge/gem5_to_tlm.hh b/src/systemc/tlm_bridge/gem5_to_tlm.hh index e9ec93569..cb1a9b770 100644 --- a/src/systemc/tlm_bridge/gem5_to_tlm.hh +++ b/src/systemc/tlm_bridge/gem5_to_tlm.hh @@ -72,7 +72,6 @@ #include "systemc/ext/core/sc_module_name.hh" #include "systemc/ext/tlm_core/2/generic_payload/gp.hh" #include "systemc/ext/tlm_utils/simple_initiator_socket.h" -#include "systemc/tlm_bridge/sc_peq.hh" #include "systemc/tlm_port_wrapper.hh" namespace sc_gem5 @@ -167,8 +166,7 @@ class Gem5ToTlmBridge : public Gem5ToTlmBridgeBase AddrRangeList addrRanges; protected: - void pec(Gem5SystemC::PayloadEvent<Gem5ToTlmBridge<BITWIDTH>> *pe, - tlm::tlm_generic_payload &trans, const tlm::tlm_phase &phase); + void pec(tlm::tlm_generic_payload &trans, const tlm::tlm_phase &phase); MemBackdoorPtr getBackdoor(tlm::tlm_generic_payload &trans); AddrRangeMap<MemBackdoorPtr> backdoorMap; diff --git a/src/systemc/tlm_bridge/sc_peq.hh b/src/systemc/tlm_bridge/sc_peq.hh deleted file mode 100644 index dc0b92b9b..000000000 --- a/src/systemc/tlm_bridge/sc_peq.hh +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (c) 2015, University of Kaiserslautern - * Copyright (c) 2016, Dresden University of Technology (TU Dresden) - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Authors: Matthias Jung - * Christian Menard - */ - -#ifndef PAYLOAD_EVENT_H_ -#define PAYLOAD_EVENT_H_ - -#include "systemc/ext/core/sc_main.hh" - -// gem5 includes -#include <sim/eventq.hh> - -namespace Gem5SystemC { -/** - * A 'Fake Payload Event Queue', similar to the TLM PEQs. This helps the - * transactors to schedule events in gem5. - */ -template <typename OWNER> -class PayloadEvent : public Event -{ - public: - OWNER& port; - const std::string eventName; - void (OWNER::*handler)(PayloadEvent<OWNER>* pe, - tlm::tlm_generic_payload& trans, - const tlm::tlm_phase& phase); - - protected: - tlm::tlm_generic_payload* t; - tlm::tlm_phase p; - - void process() { (port.*handler)(this, *t, p); } - - public: - const std::string name() const { return eventName; } - - PayloadEvent(OWNER& port_, - void (OWNER::*handler_)(PayloadEvent<OWNER>* pe, - tlm::tlm_generic_payload& trans, - const tlm::tlm_phase& phase), - const std::string& event_name) - : port(port_) - , eventName(event_name) - , handler(handler_) - { - } - - /// Schedule an event into gem5 - void notify(tlm::tlm_generic_payload& trans, const tlm::tlm_phase& phase, - const sc_core::sc_time& delay) - { - assert(!scheduled()); - - t = &trans; - p = phase; - - /** - * Get time from SystemC as this will always be more up to date - * than gem5's - */ - Tick nextEventTick = sc_core::sc_time_stamp().value() + delay.value(); - - port.owner.wakeupEventQueue(nextEventTick); - port.owner.schedule(this, nextEventTick); - } -}; -} - -#endif |