summaryrefslogtreecommitdiff
path: root/infra/port.h
diff options
context:
space:
mode:
authorJulian Blake Kongslie2022-10-15 14:12:31 -0700
committerJulian Blake Kongslie2022-10-15 14:12:31 -0700
commitecf940e34b42f78f9651a73e8bcd0c6dc3c75cb5 (patch)
tree36a290bf7a6ed585cf040964c8e7481f4df1d631 /infra/port.h
parentMove shared_bus into arbiter (diff)
downloadbiggolf-ecf940e34b42f78f9651a73e8bcd0c6dc3c75cb5.tar.xz
Depend on external nanosim dependency.
Diffstat (limited to 'infra/port.h')
-rw-r--r--infra/port.h45
1 files changed, 0 insertions, 45 deletions
diff --git a/infra/port.h b/infra/port.h
deleted file mode 100644
index 06a3aa5..0000000
--- a/infra/port.h
+++ /dev/null
@@ -1,45 +0,0 @@
1#pragma once
2
3#include <cassert>
4#include <optional>
5#include <utility>
6
7#include "infra/sim.h"
8
9namespace infra {
10 template<typename T> struct port : public sim {
11 std::optional<T> consumer_side;
12 std::optional<T> producer_side;
13
14 bool can_read() { return consumer_side.has_value(); }
15 bool can_write() { return !producer_side.has_value(); }
16
17 T read() {
18 assert(can_read());
19 auto x = std::move(*consumer_side);
20 consumer_side.reset();
21 return x;
22 }
23
24 const T & peek() {
25 assert(can_read());
26 return *consumer_side;
27 }
28
29 void discard() {
30 consumer_side.reset();
31 }
32
33 void write(T &&x) {
34 assert(can_write());
35 producer_side = std::move(x);
36 }
37
38 void unclock() {
39 if (!consumer_side && producer_side) {
40 consumer_side = std::move(*producer_side);
41 producer_side.reset();
42 }
43 }
44 };
45}