dol: initial dol commit
[jump.git] / dol / src / dol / visitor / hdsd / scd / scd_rem_fifo_in.cpp
diff --git a/dol/src/dol/visitor/hdsd/scd/scd_rem_fifo_in.cpp b/dol/src/dol/visitor/hdsd/scd/scd_rem_fifo_in.cpp
new file mode 100644 (file)
index 0000000..62346fc
--- /dev/null
@@ -0,0 +1,62 @@
+#include "scd_rem_fifo_in.h"
+
+#include <cassert>
+
+#include "scd_logging.h"
+
+
+scd_rem_fifo_in::scd_rem_fifo_in(sc_module_name name, int size):
+    sc_prim_channel(name), _num_elements(0), _first(0), _size(size)
+{
+    assert(size > 0);
+    _data = new char[size];
+}
+
+
+scd_rem_fifo_in::~scd_rem_fifo_in()
+{
+    delete _data;
+}
+
+
+void scd_rem_fifo_in::read(char &c)
+{
+    while (_num_elements == 0)
+        wait(_write_event);
+
+    c = _data[_first];
+    _num_elements--;
+    _first = (_first + 1) % _size;
+}
+
+
+int scd_rem_fifo_in::rtest(int size)
+{
+    return (size <= _num_elements) ? 1 : 0;
+}
+
+
+void scd_rem_fifo_in::reset() { _num_elements = _first = 0; }
+
+
+int scd_rem_fifo_in::num_available() { return _num_elements ;}
+
+
+size_t scd_rem_fifo_in::free() const { return _size - _num_elements; }
+
+
+void scd_rem_fifo_in::receive(const void* buf, size_t len)
+{
+    if (len == 0)
+        return;
+
+    assert(_num_elements + len <= _size);
+
+    for (int i=0; i<len; i++)
+    {
+        _data[(_first + _num_elements) % _size] = *((char*)buf+i);
+        _num_elements++;
+    }
+
+    _write_event.notify();
+}