24 #ifndef __PEQ_WITH_CB_AND_PHASE_H__ 25 #define __PEQ_WITH_CB_AND_PHASE_H__ 27 #ifndef SC_INCLUDE_DYNAMIC_PROCESSES // needed for sc_spawn 28 # define SC_INCLUDE_DYNAMIC_PROCESSES 37 template <
typename PAYLOAD>
87 empties=empties->
next;
94 while (iterator!=nill && iterator->
t<=t){
96 iterator=iterator->
next;
140 return list->
next->
t;
150 template<
typename OWNER,
typename TYPES=tlm::tlm_base_protocol_types>
155 typedef typename TYPES::tlm_payload_type tlm_payload_type;
156 typedef typename TYPES::tlm_phase_type tlm_phase_type;
157 typedef std::pair<tlm_payload_type*, tlm_phase_type> PAYLOAD;
158 typedef void (OWNER::*cb)(tlm_payload_type&,
const tlm_phase_type&);
167 inline void insert(
const PAYLOAD&
p){
168 if (
size==entries.size()){
169 entries.resize(entries.size()*2);
174 inline PAYLOAD&
get(){
175 return entries[out++];
189 std::vector<PAYLOAD> entries;
227 m_even_delta.insert(PAYLOAD(&t,p));
229 m_uneven_delta.insert(PAYLOAD(&t,p));
238 void notify (tlm_payload_type&
t,
const tlm_phase_type&
p){
239 m_immediate_yield.insert(PAYLOAD(&t,p));
246 m_uneven_delta.reset();
247 m_even_delta.reset();
248 m_immediate_yield.reset();
256 while(m_immediate_yield.next()) {PAYLOAD& tmp=m_immediate_yield.get(); (m_owner->*m_cb)(*tmp.first, tmp.second);}
257 m_immediate_yield.reset();
261 while (m_uneven_delta.next()) {PAYLOAD& tmp=m_uneven_delta.get(); (m_owner->*m_cb)(*tmp.first, tmp.second);}
262 m_uneven_delta.reset();
266 while (m_even_delta.next()) {PAYLOAD& tmp=m_even_delta.get(); (m_owner->*m_cb)(*tmp.first, tmp.second);}
267 m_even_delta.reset();
270 if (!m_ppq.get_size())
return;
276 while(m_ppq.get_size() && top==now) {
277 PAYLOAD& tmp=m_ppq.top();
278 (m_owner->*m_cb)(*tmp.first, tmp.second);
280 top=m_ppq.top_time();
282 if ( m_ppq.get_size()) {
283 m_e.notify( top - now) ;
292 delta_list m_uneven_delta;
293 delta_list m_even_delta;
294 delta_list m_immediate_yield;
301 #endif // __PEQ_WITH_CB_AND_PHASE_H__ sc_core::sc_time top_time()
SC_API const sc_time SC_ZERO_TIME
SC_API sc_dt::uint64 sc_delta_count()
SC_API const sc_time & sc_time_stamp()
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)
element(PAYLOAD &p, sc_core::sc_time t, sc_dt::uint64 d)
void notify(tlm_payload_type &t, const tlm_phase_type &p, const sc_core::sc_time &when)
SC_API 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_core::sc_time next_time()
void set_sensitivity(const sc_event *event)
void notify(tlm_payload_type &t, const tlm_phase_type &p)
peq_with_cb_and_phase(OWNER *_owner, cb _cb)