e6cb762d2522fabd8ee164fc585b7eba31b8f532
[jump.git] / dol / src / dol / visitor / hdsd / scd / scd_rem_fifo_out.cpp
1 #include "scd_rem_fifo_out.h"
2
3 #include <cassert>
4
5 #include "scd_logging.h"
6
7
8 scd_rem_fifo_out::scd_rem_fifo_out(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_out::~scd_rem_fifo_out()
17 {
18     delete _data;
19 }
20
21
22 void scd_rem_fifo_out::write(char c)
23 {
24     while (_num_elements == _size)
25         wait(_read_event);
26
27     _data[ (_first + _num_elements) % _size ] = c;
28     _num_elements++;
29 }
30
31
32 int scd_rem_fifo_out::wtest(int size)
33 {
34     return (size <= _size - _num_elements) ? 1 : 0;
35 }
36
37
38 void scd_rem_fifo_out::reset() { _num_elements = _first = 0; }
39
40
41 size_t scd_rem_fifo_out::available() const
42 {
43     size_t avail;
44
45     if (_num_elements <= _size - _first)
46         avail = _num_elements;
47     else
48         avail = _size - _first;
49
50     return avail;
51 }
52
53
54 const void* scd_rem_fifo_out::send() const { return _data + _first; }
55
56
57 void scd_rem_fifo_out::remove(size_t len)
58 {
59     if (len == 0)
60         return;
61
62     assert(_num_elements >= len);
63
64     _first = (_first + len) % _size;
65
66     _num_elements -= len;
67
68     _read_event.notify();
69 }