aboutsummaryrefslogtreecommitdiff
path: root/src/components/bus/simple_bus.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2024-09-25 21:00:16 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2024-09-25 21:00:16 +0300
commit6d0e7c5eba49efc171e63ff2631722a5c7f95460 (patch)
tree9159d22c6ee1ee2949dcf8455998405b031cb351 /src/components/bus/simple_bus.c
parentfecb86f6093c1e8aed6ab05c29c5af9d0cb93157 (diff)
downloadgran-6d0e7c5eba49efc171e63ff2631722a5c7f95460.tar.gz
gran-6d0e7c5eba49efc171e63ff2631722a5c7f95460.zip
technically speaking deadlock free, but starves
Diffstat (limited to 'src/components/bus/simple_bus.c')
-rw-r--r--src/components/bus/simple_bus.c117
1 files changed, 0 insertions, 117 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;
-}