32a33,34
> #include <list>
>
53c55,56
< sc_prim_channel(sc_gen_unique_name("fifo"))
---
> sc_prim_channel(sc_gen_unique_name("fifo")),
> _size(size), _readsHappened(false)
57c60
< sc_prim_channel(name)
---
> sc_prim_channel(name), _size(size), _readsHappened(false)
68c71
< read(T &)
---
> read(T &t)
70c73,78
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
---
> while (num_available() == 0)
> sc_core::wait(_dataWriteEvent);
> _readsHappened = true;
> t = _entries.front();
> _entries.pop_front();
> request_update();
75,76c83,85
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< return *(T *)nullptr;
---
> T t;
> read(t);
> return t;
79c88
< nb_read(T &)
---
> nb_read(T &t)
81,82c90,95
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< return false;
---
> if (num_available()) {
> read(t);
> return true;
> } else {
> return false;
> }
84,88c97
< operator T()
< {
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< return *(T *)nullptr;
< }
---
> operator T() { return read(); }
91c100
< write(const T &)
---
> write(const T &t)
93c102,105
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
---
> while (num_free() == 0)
> sc_core::wait(_dataReadEvent);
> _pending.emplace_back(t);
> request_update();
96c108
< nb_write(const T&)
---
> nb_write(const T &t)
98,99c110,115
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< return false;
---
> if (num_free()) {
> write(t);
> return true;
> } else {
> return false;
> }
102c118
< operator = (const T &)
---
> operator = (const T &t)
104c120
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
---
> write(t);
111,112c127
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< return *(const sc_event *)nullptr;
---
> return _dataWriteEvent;
117,118c132
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< return *(const sc_event *)nullptr;
---
> return _dataReadEvent;
120a135
> virtual int num_available() const { return _entries.size(); }
122,127d136
< num_available() const
< {
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< return 0;
< }
< virtual int
130,131c139
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< return 0;
---
> return _size - _entries.size() - _pending.size();
135c143
< print(std::ostream & =std::cout) const
---
> print(std::ostream &os=std::cout) const
137c145,148
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
---
> for (typename ::std::list<T>::iterator pos = _entries.begin();
> pos != _entries.end(); pos++) {
> os << *pos << ::std::endl;
> }
150c161,169
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
---
> if (!_pending.empty()) {
> _dataWriteEvent.notify(SC_ZERO_TIME);
> _entries.insert(_entries.end(), _pending.begin(), _pending.end());
> _pending.clear();
> }
> if (_readsHappened) {
> _readsHappened = false;
> _dataReadEvent.notify(SC_ZERO_TIME);
> }
158a178,185
>
> sc_event _dataReadEvent;
> sc_event _dataWriteEvent;
>
> int _size;
> mutable std::list<T> _entries;
> mutable std::list<T> _pending;
> bool _readsHappened;