21 #include <sysc/communication/sc_prim_channel.h> 
   38 template <
typename T> 
class fifo_w_cb : 
public sc_core::sc_prim_channel {
 
   41     : sc_core::sc_prim_channel(sc_core::sc_gen_unique_name(
"fifo_w_cb")) {}
 
   44     : sc_core::sc_prim_channel(name) {}
 
   48     void push_back(T& t) {
 
   49         in_queue.push_back(t);
 
   52     void push_back(
const T& t) {
 
   53         in_queue.push_back(t);
 
   57     void push_back(T&& t) {
 
   58         in_queue.emplace_back(std::move(t));
 
   62     T& back() { 
return in_queue.back(); }
 
   63     const T& back()
 const { 
return in_queue.back(); }
 
   66         out_queue.pop_front();
 
   68         if(empty_cb && !out_queue.size())
 
   72     T& front() { 
return out_queue.front(); }
 
   73     const T& front()
 const { 
return out_queue.front(); }
 
   76         wait(data_written_evt);
 
   82     size_t avail()
 const { 
return out_queue.size(); }
 
   83     bool empty()
 const { 
return out_queue.empty(); }
 
   85     void set_avail_cb(std::function<
void(
void)> f) { avail_cb = f; }
 
   86     void set_empty_cb(std::function<
void(
void)> f) { empty_cb = f; }
 
   88     inline sc_core::sc_event 
const& data_written_event()
 const { 
return data_written_evt; }
 
   90     inline unsigned num_avail() { 
return available; }
 
   91     inline unsigned num_written() { 
return written; }
 
   95     virtual void update() {
 
   97         available = out_queue.size();
 
  100         written = in_queue.size();
 
  101         out_queue.insert(out_queue.end(), in_queue.begin(), in_queue.end());
 
  103         available = out_queue.size();
 
  106         data_written_evt.notify(sc_core::SC_ZERO_TIME);
 
  109     std::deque<T> in_queue{};
 
  110     std::deque<T> out_queue{};
 
  111     std::function<void(
void)> avail_cb{};
 
  112     std::function<void(
void)> empty_cb{};
 
  113     unsigned available = 0;
 
  114     unsigned written = 0;
 
  115     sc_core::sc_event data_written_evt{};