#pragma once #include #include #include "infra/port.h" #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; } }; }