summaryrefslogtreecommitdiff
path: root/main.cpp
diff options
context:
space:
mode:
authorJulian Blake Kongslie2022-06-25 10:16:12 -0700
committerJulian Blake Kongslie2022-06-25 10:16:12 -0700
commitd80e0dbd20bb8597afe92f770e39d20440557d1f (patch)
tree3a2a89d3e8b0a7dd8f9a26f166825cef7c62795d /main.cpp
parentMove get-git-tag to a tools subdirectory. (diff)
downloadissim-d80e0dbd20bb8597afe92f770e39d20440557d1f.tar.xz
Demo for a coroutine-based step evaluator.
Diffstat (limited to 'main.cpp')
-rw-r--r--main.cpp52
1 files changed, 51 insertions, 1 deletions
diff --git a/main.cpp b/main.cpp
index 6b7b0f4..0240bb5 100644
--- a/main.cpp
+++ b/main.cpp
@@ -1,4 +1,6 @@
1#include <iostream> 1#include <iostream>
2#include <map>
3#include <optional>
2 4
3#include "aisa/aisa.h" 5#include "aisa/aisa.h"
4#include "git-tag.h" 6#include "git-tag.h"
@@ -6,6 +8,54 @@
6int main(int argc, const char *argv[]) 8int main(int argc, const char *argv[])
7{ 9{
8 std::cout << "Version " << GIT_TAG << "\n"; 10 std::cout << "Version " << GIT_TAG << "\n";
9 aisa::do_something(); 11
12 aisa::Step step;
13 const_cast<std::optional<std::pair<aisa::regnum_t, aisa::regval_t>> &>(step.predicate) = std::optional(std::make_pair(123, 456));
14 const_cast<std::vector<aisa::regnum_t> &>(step.source_regs).emplace_back(12);
15 const_cast<std::vector<aisa::regnum_t> &>(step.source_regs).emplace_back(34);
16 const_cast<std::vector<aisa::regnum_t> &>(step.source_regs).emplace_back(56);
17
18 struct State : public aisa::EvalState<State> {
19 std::map<aisa::regnum_t, aisa::regval_t> regs;
20
21 std::optional<aisa::regval_t> load_reg(aisa::regnum_t rn)
22 {
23 std::cout << "state.load_reg(" << rn << ") = ";
24 if (auto x = regs.find(rn); x != regs.end()) {
25 std::cout << x->second << "\n";
26 return x->second;
27 }
28 std::cout << "(not available)\n";
29 return {};
30 }
31 } state;
32
33 auto t = state.async_load_reg(999);
34 t();
35 t();
36 t();
37 std::cout << "set regs[999] = 54321\n"; state.regs[999] = 54321;
38 std::optional<aisa::regval_t> result;
39 while (!result.has_value())
40 result = t();
41 std::cout << "result = " << *result << "\n";
42
43 std::cout << "\n\n\n";
44
45 auto w = step.evaluate(state);
46 w();
47 w();
48 w();
49 std::cout << "set predicate (valid)\n"; state.regs[step.predicate->first] = step.predicate->second;
50 w();
51 w();
52 w();
53 std::cout << "set regs (all)\n";
54 for (int i = 10; i < 100; ++i)
55 state.regs[i] = 1000 + i;
56 for (bool done = false; !done; done = w())
57 ;
58 std::cout << "huzzah!\n";
59
10 return 0; 60 return 0;
11} 61}