diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2024-09-25 21:00:16 +0300 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2024-09-25 21:00:16 +0300 |
| commit | 6d0e7c5eba49efc171e63ff2631722a5c7f95460 (patch) | |
| tree | 9159d22c6ee1ee2949dcf8455998405b031cb351 /src/components/bus | |
| parent | fecb86f6093c1e8aed6ab05c29c5af9d0cb93157 (diff) | |
| download | gran-6d0e7c5eba49efc171e63ff2631722a5c7f95460.tar.gz gran-6d0e7c5eba49efc171e63ff2631722a5c7f95460.zip | |
technically speaking deadlock free, but starves
Diffstat (limited to 'src/components/bus')
| -rw-r--r-- | src/components/bus/simple_bus.c | 117 | ||||
| -rw-r--r-- | src/components/bus/source.mk | 1 |
2 files changed, 0 insertions, 118 deletions
diff --git a/src/components/bus/simple_bus.c b/src/components/bus/simple_bus.c deleted file mode 100644 index 1932419..0000000 --- a/src/components/bus/simple_bus.c +++ /dev/null @@ -1,117 +0,0 @@ -/* SPDX-License-Identifier: copyleft-next-0.3.1 */ -/* Copyright 2023 Kim Kuparinen < kimi.h.kuparinen@gmail.com > */ -#include <stdbool.h> - -#include <gran/bus/simple_bus.h> -#include <gran/vec.h> - -struct bus_region { - uint64_t addr; - uint64_t size; - struct component *component; -}; - -struct simple_bus { - struct component component; - struct vec regions; - - struct component *send; - struct packet pkt; - bool busy; -}; - -static struct bus_region *find_bus_region(struct simple_bus *bus, uint64_t addr) -{ - foreach_vec(i, bus->regions) { - struct bus_region *r = vec_at(&bus->regions, i); - if (addr >= r->addr && addr < (r->addr + r->size)) - return r; - } - - return NULL; -} - -static stat simple_bus_clock(struct simple_bus *bus) -{ - if (bus->busy) { - stat r = SEND(bus, bus->send, bus->pkt); - if (r == EBUSY) - return OK; - - bus->busy = false; - return r; - } - - return OK; -} - -static stat simple_bus_receive(struct simple_bus *bus, struct component *from, struct packet pkt) -{ - if (bus->busy) - return EBUSY; - - bus->busy = true; - - struct bus_region *region = find_bus_region(bus, pkt.to); - if (!region) { - warn("illegal address on bus %s at %" PRIuPTR, - bus->component.name, pkt.to); - - bus->send = from; - bus->pkt = response(pkt); - set_flags(&bus->pkt, PACKET_ERROR); - return OK; - } - - bus->send = region->component; - bus->pkt = pkt; - return OK; -} - -static void simple_bus_destroy(struct simple_bus *bus) -{ - vec_destroy(&bus->regions); - free(bus); -} - -struct component *create_simple_bus() -{ - struct simple_bus *bus = calloc(1, sizeof(struct simple_bus)); - if (!bus) - return NULL; - - bus->component.receive = (receive_callback)simple_bus_receive; - bus->component.clock = (clock_callback)simple_bus_clock; - - bus->component.destroy = (destroy_callback)simple_bus_destroy; - bus->regions = vec_create(sizeof(struct bus_region)); - - return (struct component *)bus; -} - -stat simple_bus_add(struct component *bus, struct component *component, - uint64_t addr, uint64_t size) -{ - struct simple_bus *b = (struct simple_bus *)bus; - struct bus_region *found = find_bus_region(b, addr); - if (!found) found = find_bus_region(b, addr + size); - - if (found) { - error("%s overlaps with %s at %" PRIuPTR, - found->component->name, - component->name, - found->addr - ); - - return EEXISTS; - } - - struct bus_region new = (struct bus_region){ - .component = component, - .addr = addr, - .size = size - }; - - vect_append(struct bus_region, b->regions, &new); - return OK; -} diff --git a/src/components/bus/source.mk b/src/components/bus/source.mk deleted file mode 100644 index 98a10b6..0000000 --- a/src/components/bus/source.mk +++ /dev/null @@ -1 +0,0 @@ -SOURCES += src/components/bus/simple_bus.c |
