blob: 1e490bc87ca96d8769e54b53bad02406f6fd724d (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
#pragma once
#include <cassert>
#include <deque>
#include <optional>
#include <utility>
#include "infra/port.h"
#include "infra/sim.h"
namespace infra {
template<typename T, unsigned int size> struct queue : public sim {
port<T> input;
port<T> *output = nullptr;
std::deque<T> elements;
void clock() {
if (input.can_read() && elements.size() < size) {
auto x = input.read();
elements.emplace_back(std::move(x));
}
if (output->can_write() && !elements.empty()) {
auto &x = elements.front();
output->write(std::move(x));
elements.pop_front();
}
}
};
}
|