X-Git-Url: http://sraa.de/git/?a=blobdiff_plain;f=dol%2Fsrc%2Fdol%2Fvisitor%2Fhdsd%2Fscd%2Fscd_rem_fifo_in.cpp;fp=dol%2Fsrc%2Fdol%2Fvisitor%2Fhdsd%2Fscd%2Fscd_rem_fifo_in.cpp;h=62346fcb4b055919f4848a018df1033d15b82c52;hb=8c411cf24ed0eb889191aaeafd8fa1e69081df42;hp=0000000000000000000000000000000000000000;hpb=dea7a4fb1ed110d3ce6e6d9255103d724bd66c0e;p=jump.git 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 index 0000000..62346fc --- /dev/null +++ b/dol/src/dol/visitor/hdsd/scd/scd_rem_fifo_in.cpp @@ -0,0 +1,62 @@ +#include "scd_rem_fifo_in.h" + +#include + +#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