22 #ifndef __PEQ_WITH_CB_AND_PHASE_H__
23 #define __PEQ_WITH_CB_AND_PHASE_H__
25 #ifndef SC_INCLUDE_DYNAMIC_PROCESSES // needed for sc_spawn
26 # define SC_INCLUDE_DYNAMIC_PROCESSES
35 template <
typename PAYLOAD>
92 while (iterator!=
nill && iterator->
t<=t){
94 iterator=iterator->
next;
148 template<
typename OWNER,
typename TYPES=tlm::tlm_base_protocol_types>
153 typedef typename TYPES::tlm_payload_type tlm_payload_type;
154 typedef typename TYPES::tlm_phase_type tlm_phase_type;
155 typedef std::pair<tlm_payload_type*, tlm_phase_type> PAYLOAD;
156 typedef void (OWNER::*cb)(tlm_payload_type&,
const tlm_phase_type&);
165 inline void insert(
const PAYLOAD& p){
166 if (size==entries.size()){
167 entries.resize(entries.size()*2);
172 inline PAYLOAD&
get(){
173 return entries[out++];
187 std::vector<PAYLOAD> entries;
207 : sc_core::sc_object( _name )
225 m_even_delta.insert(PAYLOAD(&t,p));
227 m_uneven_delta.insert(PAYLOAD(&t,p));
236 void notify (tlm_payload_type& t,
const tlm_phase_type& p){
237 m_immediate_yield.insert(PAYLOAD(&t,p));
244 m_uneven_delta.reset();
245 m_even_delta.reset();
246 m_immediate_yield.reset();
254 while(m_immediate_yield.next()) {PAYLOAD& tmp=m_immediate_yield.get(); (m_owner->*m_cb)(*tmp.first, tmp.second);}
255 m_immediate_yield.reset();
259 while (m_uneven_delta.next()) {PAYLOAD& tmp=m_uneven_delta.get(); (m_owner->*m_cb)(*tmp.first, tmp.second);}
260 m_uneven_delta.reset();
264 while (m_even_delta.next()) {PAYLOAD& tmp=m_even_delta.get(); (m_owner->*m_cb)(*tmp.first, tmp.second);}
265 m_even_delta.reset();
268 if (!m_ppq.get_size())
return;
274 while(m_ppq.get_size() && top==now) {
275 PAYLOAD& tmp=m_ppq.top();
276 (m_owner->*m_cb)(*tmp.first, tmp.second);
278 top=m_ppq.top_time();
280 if ( m_ppq.get_size()) {
289 time_ordered_list<PAYLOAD> m_ppq;
290 delta_list m_uneven_delta;
291 delta_list m_even_delta;
292 delta_list m_immediate_yield;
299 #endif // __PEQ_WITH_CB_AND_PHASE_H__
void set_sensitivity(const sc_event *event)
peq_with_cb_and_phase(const char *_name, OWNER *_owner, cb _cb)
sc_process_handle sc_spawn(T object, const char *name_p=0, const sc_spawn_options *opt_p=0)
const char * sc_gen_unique_name(const char *, bool preserve_first)
sc_dt::uint64 & top_delta()
void insert(const PAYLOAD &p, sc_core::sc_time t)
sc_dt::uint64 sc_delta_count()
const sc_time SC_ZERO_TIME
sc_core::sc_time next_time()
void notify(tlm_payload_type &t, const tlm_phase_type &p)
void notify(tlm_payload_type &t, const tlm_phase_type &p, const sc_core::sc_time &when)
const sc_time & sc_time_stamp()
peq_with_cb_and_phase(OWNER *_owner, cb _cb)
element(PAYLOAD &p, sc_core::sc_time t, sc_dt::uint64 d)
sc_core::sc_time top_time()