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{};