summaryrefslogtreecommitdiff
path: root/infra/port.h
diff options
context:
space:
mode:
authorJulian Blake Kongslie2022-10-15 15:01:25 -0700
committerJulian Blake Kongslie2022-10-15 15:01:25 -0700
commitbcf2314f15d68d7a0b94445f99962342b9d4130d (patch)
tree89302b2669e6141ebfc86afc4bd9e19eac0c80bf /infra/port.h
parentStop cycle after accepting restart in fetch. (diff)
downloadprocmodel-bcf2314f15d68d7a0b94445f99962342b9d4130d.tar.xz
Switch to external nanosim dependency.HEADmain
Diffstat (limited to '')
-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}