20 #ifndef __SYSTEMC_EXT_TLM_UTILS_PEQ_WITH_CB_AND_PHASE_H__ 21 #define __SYSTEMC_EXT_TLM_UTILS_PEQ_WITH_CB_AND_PHASE_H__ 25 #include "../core/sc_main.hh" 26 #include "../core/sc_object.hh" 27 #include "../core/sc_spawn.hh" 28 #include "../core/sc_time.hh" 29 #include "../dt/int/sc_nbdefs.hh" 30 #include "../tlm_core/2/interfaces/fw_bw_ifs.hh" 35 template <
typename PAYLOAD>
88 empties = empties->
next;
95 while (iterator != nill && iterator->t <= t) {
97 iterator = iterator->
next;
99 if (ancestor == nill) {
122 PAYLOAD &
top() {
return list->p; }
134 template<
typename OWNER,
typename TYPES=tlm::tlm_base_protocol_types>
140 typedef void (OWNER::*cb)(tlm_payload_type &,
const tlm_phase_type &);
154 if (
size==entries.size()) {
155 entries.resize(entries.size() * 2);
160 inline PAYLOAD &
get() {
return entries[out++]; }
180 "peq_with_cb_and_phase")),
181 m_owner(_owner), m_cb(_cb)
192 sc_core::sc_object(_name), m_owner(_owner), m_cb(_cb)
205 notify(tlm_payload_type &
t,
const tlm_phase_type &
p,
211 m_even_delta.insert(PAYLOAD(&t,p));
214 m_uneven_delta.insert(PAYLOAD(&t, p));
225 notify(tlm_payload_type &
t,
const tlm_phase_type &
p)
227 m_immediate_yield.insert(PAYLOAD(&t, p));
236 m_uneven_delta.reset();
237 m_even_delta.reset();
238 m_immediate_yield.reset();
247 while (m_immediate_yield.next()) {
248 PAYLOAD &tmp = m_immediate_yield.get();
249 (m_owner->*m_cb)(*tmp.first, tmp.second);
251 m_immediate_yield.reset();
256 while (m_uneven_delta.next()) {
257 PAYLOAD &tmp = m_uneven_delta.get();
258 (m_owner->*m_cb)(*tmp.first, tmp.second);
260 m_uneven_delta.reset();
261 if (m_even_delta.size)
264 while (m_even_delta.next()) {
265 PAYLOAD &tmp = m_even_delta.get();
266 (m_owner->*m_cb)(*tmp.first, tmp.second);
268 m_even_delta.reset();
269 if (m_uneven_delta.size)
272 if (!m_ppq.get_size())
279 while (m_ppq.get_size() && top == now) {
281 PAYLOAD &tmp = m_ppq.
top();
282 (m_owner->*m_cb)(*tmp.first, tmp.second);
284 top = m_ppq.top_time();
286 if (m_ppq.get_size()) {
287 m_e.notify(top - now);
delta_list m_uneven_delta
element(PAYLOAD &p, sc_core::sc_time t, sc_dt::uint64 d)
std::pair< tlm_payload_type *, tlm_phase_type > PAYLOAD
TYPES::tlm_payload_type tlm_payload_type
void insert(const PAYLOAD &p, sc_core::sc_time t)
void insert(const PAYLOAD &p)
sc_dt::uint64 & top_delta()
const char * sc_gen_unique_name(const char *seed)
void notify(tlm_payload_type &t, const tlm_phase_type &p, const sc_core::sc_time &when)
sc_process_handle sc_spawn(T object, const char *name_p=nullptr, const sc_spawn_options *opt_p=nullptr)
time_ordered_list< PAYLOAD > m_ppq
peq_with_cb_and_phase(OWNER *_owner, cb _cb)
peq_with_cb_and_phase(const char *_name, OWNER *_owner, cb _cb)
sc_core::sc_time next_time()
An event queue that can contain any number of pending notifications.
TYPES::tlm_phase_type tlm_phase_type
void set_sensitivity(const sc_event *)
const sc_time & sc_time_stamp()
const sc_time SC_ZERO_TIME
auto sc_bind(F &&f, Args &&...args) -> decltype(std::bind(std::forward< F >(f), std::forward< Args >(args)...))
void notify(tlm_payload_type &t, const tlm_phase_type &p)
delta_list m_immediate_yield
sc_core::sc_time top_time()
sc_dt::uint64 sc_delta_count()
std::vector< PAYLOAD > entries