summaryrefslogtreecommitdiff
path: root/infra/queue.h
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();
            }
        }
    };
}