#include "cnn1986_cache.h" #define DATA_STONE_SHIFT 6 #define DATA_COUNT_SHIFT (DATA_STONE_SHIFT+2) #define COLOUR_MASK 0x3F // 0b00111111 uint32_t cnn1986_num_cached, cnn1986_max_num_cached = 1000000; node_t *head = NULL, *tail = NULL; int cnn1986_cache_init(void) { return EXIT_SUCCESS; } void cnn1986_cache_free(void) { node_t *c = head, *n; while (c) { n = c->next; free(c); c = n; } head = NULL; tail = NULL; } int cnn1986_cache_seek(const uint64_t key[4], float *out_result) { node_t *c = head; while (c != NULL) { // Either seek next or move to front and return uint8_t fail = 0; for (int k=0; k<4; k++) { if (c->key[k] != key[k]) { fail = 1; break; } } if (fail == 1) { c = c->next; } else { *out_result = c->result; // Move to front if (c != head) { if (tail == c) tail=c->prev; if (c->next) c->next->prev = c->prev; c->prev->next = c->next; c->prev = NULL; c->next = head; head->prev = c; head = c; } return EXIT_SUCCESS; } } // Failed to find it return EXIT_FAILURE; } int cnn1986_cache_insert(const uint64_t key[4], float in_result) { node_t *new = malloc(sizeof(node_t)); if (new == NULL) return EXIT_FAILURE; // TODO: check errno new->prev = NULL; new->next = head; if (head) head->prev = new; head = new; for (int k=0; k<4; k++) new->key[k] = key[k]; new->result = in_result; if (cnn1986_num_cached == 0) tail = new; cnn1986_num_cached++; if (cnn1986_num_cached > cnn1986_max_num_cached) { tail = tail->prev; free(tail->next); tail->next = NULL; cnn1986_num_cached--; } return EXIT_SUCCESS; }