From db82579d3c023c441c895d26d32de3fa039eafa4 Mon Sep 17 00:00:00 2001 From: Julian Blake Kongslie Date: Fri, 11 Nov 2022 16:28:55 -0800 Subject: Starting to write a real memory subsystem for biggolf. --- infra/arbiter.h | 31 +++++++++---------------------- 1 file changed, 9 insertions(+), 22 deletions(-) (limited to 'infra/arbiter.h') diff --git a/infra/arbiter.h b/infra/arbiter.h index 79a9920..63ddbd6 100644 --- a/infra/arbiter.h +++ b/infra/arbiter.h @@ -3,53 +3,40 @@ #include #include +#include "infra/port.h" #include "infra/sim.h" namespace infra { template struct priority_arbiter : public sim { - std::array, peers> peerp; + std::array *, peers> peerp; port *outp = nullptr; void clock() { for (unsigned int i = 0; i < peers; ++i) { - if (outp->can_write() && peerp[i].can_read()) - outp->write(peerp[i].read()); + if (outp->can_write() && peerp[i]->can_read()) + outp->write(peerp[i]->read()); } } }; template struct round_robin_arbiter : public sim { - std::array, peers> peerp; + std::array *, peers> peerp; port *outp = nullptr; unsigned int initial = 0; void clock() { bool initially_empty = outp->can_write(); for (unsigned int i = initial; i < peers; ++i) { - if (outp->can_write() && peerp[i].can_read()) - outp->write(peerp[i].read()); + if (outp->can_write() && peerp[i]->can_read()) + outp->write(peerp[i]->read()); } for (unsigned int i = 0; i < initial; ++i) { - if (outp->can_write() && peerp[i].can_read()) - outp->write(peerp[i].read()); + if (outp->can_write() && peerp[i]->can_read()) + outp->write(peerp[i]->read()); } if (initially_empty && !outp->can_write()) if (++initial == peers) initial = 0; } }; - - template struct shared_bus : public sim { - std::array, peers> peerp; - port *outp = nullptr; - - void clock() { - for (unsigned int i = 0; i < peers; ++i) { - if (peerp[i].can_read()) { - assert(outp->can_write()); - outp->write(peerp[i].read()); - } - } - } - }; } -- cgit v1.2.3