#pragma once #include #include #include "infra/sim.h" namespace infra { template struct priority_arbiter : public sim { 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()); } } }; template struct round_robin_arbiter : public sim { 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()); } for (unsigned int i = 0; i < initial; ++i) { 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()); } } } }; }