summaryrefslogtreecommitdiff
path: root/port.h
diff options
context:
space:
mode:
authorJulian Blake Kongslie2022-10-15 14:03:28 -0700
committerJulian Blake Kongslie2022-10-15 14:03:28 -0700
commiteaef9348431ea331ecf118aefc21246dbcf2c998 (patch)
treed12a2f3c8d86b47a12ef2ef78a02be552cf59475 /port.h
parentInitial commit (copied from biggolf) (diff)
downloadnanosim-eaef9348431ea331ecf118aefc21246dbcf2c998.tar.xz
Add memory implementation as well; reorg.
Diffstat (limited to 'port.h')
-rw-r--r--port.h45
1 files changed, 0 insertions, 45 deletions
diff --git a/port.h b/port.h
deleted file mode 100644
index 06a3aa5..0000000
--- a/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}