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 T& back() {
return in_queue.back(); }
58 const T& back()
const {
return in_queue.back(); }
61 out_queue.pop_front();
62 if(empty_cb && !out_queue.size())
66 T& front() {
return out_queue.front(); }
67 const T& front()
const {
return out_queue.front(); }
69 size_t avail()
const {
return out_queue.size(); }
70 bool empty()
const {
return out_queue.empty(); }
72 void set_avail_cb(std::function<
void(
void)> f) { avail_cb = f; }
73 void set_empty_cb(std::function<
void(
void)> f) { empty_cb = f; }
75 inline sc_core::sc_event
const& data_written_event()
const {
return data_written_evt; }
79 virtual void update() {
82 out_queue.insert(out_queue.end(), in_queue.begin(), in_queue.end());
86 data_written_evt.notify(sc_core::SC_ZERO_TIME);
89 std::deque<T> in_queue{};
90 std::deque<T> out_queue{};
91 std::function<void(
void)> avail_cb{};
92 std::function<void(
void)> empty_cb{};
93 sc_core::sc_event data_written_evt{};