-
Notifications
You must be signed in to change notification settings - Fork 0
/
buffer.ceu
67 lines (64 loc) · 2.04 KB
/
buffer.ceu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
native/pre do
#include "buff_fifo.c"
end
native/plain
_BuffQueue,
_buff_make_queue,
_buff_queue_read,
_buff_queue_write,
_buff_queue_peek,
_BittideFrame,
_create_empty_bittide_frame,
_get_buffer_occupancy_pcnt,
;
code/call ReadQueue(var& _BuffQueue bq)->_BittideFrame do
var _BuffQueue&& qPtr = &&bq;
var _BittideFrame l;
do
l = _buff_queue_read(qPtr);
finalize (qPtr) with
end
escape l;
end
code/call WriteQueue(var& _BuffQueue bq, var _BittideFrame bf)->int do
var _BuffQueue&& qPtr = &&bq;
var int status;
do
status = _buff_queue_write(qPtr,bf);
finalize (qPtr) with
end
escape status;
end
code/call GetOccupancyPcnt(var& _BuffQueue bq)->_double do
var _BuffQueue&& qPtr = &&bq;
var _double pcnt;
do
pcnt = _get_buffer_occupancy_pcnt(qPtr);
finalize (qPtr) with
end
escape pcnt;
end
//synchronous logic
code/await Buffer(var int size, event& none clk, var int sourceId, var int destId)
->(event none send, var _BittideFrame sendData, event none receive, var _BittideFrame receiveData,var _BuffQueue buff)
-> NEVER do
buff = _buff_make_queue(size); //defaults to 50% occupancy
sendData = _create_empty_bittide_frame();
receiveData = _create_empty_bittide_frame();
par/and do
every clk do
sendData = call ReadQueue(&buff);
_printf("Buffer %d->%d send event!\n", sourceId, destId);
_printf("Buffer %d->%d occupancy: %.4lf\n", sourceId, destId, call GetOccupancyPcnt(&buff));
emit send;
end
with
loop do
await receive; //receive data should be placed in var before this is emitted (unfortunately abstract types can not be values in signals)
_printf("Buffer %d->%d detected receive event!\n",sourceId, destId);
call WriteQueue(&buff, receiveData);
_printf("Buffer %d->%d occupancy: %.4lf\n", sourceId, destId, call GetOccupancyPcnt(&buff));
end
end
await FOREVER;
end