Statistics
| Branch: | Revision:

root / hw / fifo.c @ a1bc20df

History | View | Annotate | Download (1.7 kB)

1 a3578d4a Peter A. G. Crosthwaite
/*
2 a3578d4a Peter A. G. Crosthwaite
 * Generic FIFO component, implemented as a circular buffer.
3 a3578d4a Peter A. G. Crosthwaite
 *
4 a3578d4a Peter A. G. Crosthwaite
 * Copyright (c) 2012 Peter A. G. Crosthwaite
5 a3578d4a Peter A. G. Crosthwaite
 *
6 a3578d4a Peter A. G. Crosthwaite
 * This program is free software; you can redistribute it and/or
7 a3578d4a Peter A. G. Crosthwaite
 * modify it under the terms of the GNU General Public License
8 a3578d4a Peter A. G. Crosthwaite
 * as published by the Free Software Foundation; either version
9 a3578d4a Peter A. G. Crosthwaite
 * 2 of the License, or (at your option) any later version.
10 a3578d4a Peter A. G. Crosthwaite
 *
11 a3578d4a Peter A. G. Crosthwaite
 * You should have received a copy of the GNU General Public License along
12 a3578d4a Peter A. G. Crosthwaite
 * with this program; if not, see <http://www.gnu.org/licenses/>.
13 a3578d4a Peter A. G. Crosthwaite
 */
14 a3578d4a Peter A. G. Crosthwaite
15 a3578d4a Peter A. G. Crosthwaite
#include "fifo.h"
16 a3578d4a Peter A. G. Crosthwaite
17 a3578d4a Peter A. G. Crosthwaite
void fifo8_create(Fifo8 *fifo, uint32_t capacity)
18 a3578d4a Peter A. G. Crosthwaite
{
19 a3578d4a Peter A. G. Crosthwaite
    fifo->data = g_new(uint8_t, capacity);
20 a3578d4a Peter A. G. Crosthwaite
    fifo->capacity = capacity;
21 a3578d4a Peter A. G. Crosthwaite
    fifo->head = 0;
22 a3578d4a Peter A. G. Crosthwaite
    fifo->num = 0;
23 a3578d4a Peter A. G. Crosthwaite
}
24 a3578d4a Peter A. G. Crosthwaite
25 a3578d4a Peter A. G. Crosthwaite
void fifo8_destroy(Fifo8 *fifo)
26 a3578d4a Peter A. G. Crosthwaite
{
27 a3578d4a Peter A. G. Crosthwaite
    g_free(fifo->data);
28 a3578d4a Peter A. G. Crosthwaite
}
29 a3578d4a Peter A. G. Crosthwaite
30 a3578d4a Peter A. G. Crosthwaite
void fifo8_push(Fifo8 *fifo, uint8_t data)
31 a3578d4a Peter A. G. Crosthwaite
{
32 a3578d4a Peter A. G. Crosthwaite
    if (fifo->num == fifo->capacity) {
33 a3578d4a Peter A. G. Crosthwaite
        abort();
34 a3578d4a Peter A. G. Crosthwaite
    }
35 a3578d4a Peter A. G. Crosthwaite
    fifo->data[(fifo->head + fifo->num) % fifo->capacity] = data;
36 a3578d4a Peter A. G. Crosthwaite
    fifo->num++;
37 a3578d4a Peter A. G. Crosthwaite
}
38 a3578d4a Peter A. G. Crosthwaite
39 a3578d4a Peter A. G. Crosthwaite
uint8_t fifo8_pop(Fifo8 *fifo)
40 a3578d4a Peter A. G. Crosthwaite
{
41 a3578d4a Peter A. G. Crosthwaite
    uint8_t ret;
42 a3578d4a Peter A. G. Crosthwaite
43 a3578d4a Peter A. G. Crosthwaite
    if (fifo->num == 0) {
44 a3578d4a Peter A. G. Crosthwaite
        abort();
45 a3578d4a Peter A. G. Crosthwaite
    }
46 a3578d4a Peter A. G. Crosthwaite
    ret = fifo->data[fifo->head++];
47 a3578d4a Peter A. G. Crosthwaite
    fifo->head %= fifo->capacity;
48 a3578d4a Peter A. G. Crosthwaite
    fifo->num--;
49 a3578d4a Peter A. G. Crosthwaite
    return ret;
50 a3578d4a Peter A. G. Crosthwaite
}
51 a3578d4a Peter A. G. Crosthwaite
52 a3578d4a Peter A. G. Crosthwaite
void fifo8_reset(Fifo8 *fifo)
53 a3578d4a Peter A. G. Crosthwaite
{
54 a3578d4a Peter A. G. Crosthwaite
    fifo->num = 0;
55 a3578d4a Peter A. G. Crosthwaite
}
56 a3578d4a Peter A. G. Crosthwaite
57 a3578d4a Peter A. G. Crosthwaite
bool fifo8_is_empty(Fifo8 *fifo)
58 a3578d4a Peter A. G. Crosthwaite
{
59 a3578d4a Peter A. G. Crosthwaite
    return (fifo->num == 0);
60 a3578d4a Peter A. G. Crosthwaite
}
61 a3578d4a Peter A. G. Crosthwaite
62 a3578d4a Peter A. G. Crosthwaite
bool fifo8_is_full(Fifo8 *fifo)
63 a3578d4a Peter A. G. Crosthwaite
{
64 a3578d4a Peter A. G. Crosthwaite
    return (fifo->num == fifo->capacity);
65 a3578d4a Peter A. G. Crosthwaite
}
66 a3578d4a Peter A. G. Crosthwaite
67 a3578d4a Peter A. G. Crosthwaite
const VMStateDescription vmstate_fifo8 = {
68 a3578d4a Peter A. G. Crosthwaite
    .name = "Fifo8",
69 a3578d4a Peter A. G. Crosthwaite
    .version_id = 1,
70 a3578d4a Peter A. G. Crosthwaite
    .minimum_version_id = 1,
71 a3578d4a Peter A. G. Crosthwaite
    .minimum_version_id_old = 1,
72 a3578d4a Peter A. G. Crosthwaite
    .fields      = (VMStateField[]) {
73 a3578d4a Peter A. G. Crosthwaite
        VMSTATE_VBUFFER_UINT32(data, Fifo8, 1, NULL, 0, capacity),
74 a3578d4a Peter A. G. Crosthwaite
        VMSTATE_UINT32(head, Fifo8),
75 a3578d4a Peter A. G. Crosthwaite
        VMSTATE_UINT32(num, Fifo8),
76 a3578d4a Peter A. G. Crosthwaite
        VMSTATE_END_OF_LIST()
77 a3578d4a Peter A. G. Crosthwaite
    }
78 a3578d4a Peter A. G. Crosthwaite
};