dol: initial dol commit
[jump.git] / dol / src / dol / visitor / hdsd / scd / scd_rem_fifo_in.cpp
1 #include "scd_rem_fifo_in.h"
2
3 #include <cassert>
4
5 #include "scd_logging.h"
6
7
8 scd_rem_fifo_in::scd_rem_fifo_in(sc_module_name name, int size):
9     sc_prim_channel(name), _num_elements(0), _first(0), _size(size)
10 {
11     assert(size > 0);
12     _data = new char[size];
13 }
14
15
16 scd_rem_fifo_in::~scd_rem_fifo_in()
17 {
18     delete _data;
19 }
20
21
22 void scd_rem_fifo_in::read(char &c)
23 {
24     while (_num_elements == 0)
25         wait(_write_event);
26
27     c = _data[_first];
28     _num_elements--;
29     _first = (_first + 1) % _size;
30 }
31
32
33 int scd_rem_fifo_in::rtest(int size)
34 {
35     return (size <= _num_elements) ? 1 : 0;
36 }
37
38
39 void scd_rem_fifo_in::reset() { _num_elements = _first = 0; }
40
41
42 int scd_rem_fifo_in::num_available() { return _num_elements ;}
43
44
45 size_t scd_rem_fifo_in::free() const { return _size - _num_elements; }
46
47
48 void scd_rem_fifo_in::receive(const void* buf, size_t len)
49 {
50     if (len == 0)
51         return;
52
53     assert(_num_elements + len <= _size);
54
55     for (int i=0; i<len; i++)
56     {
57         _data[(_first + _num_elements) % _size] = *((char*)buf+i);
58         _num_elements++;
59     }
60
61     _write_event.notify();
62 }