summaryrefslogtreecommitdiff
path: root/aisa/aisa.h
diff options
context:
space:
mode:
authorJulian Blake Kongslie2022-06-26 16:24:13 -0700
committerJulian Blake Kongslie2022-06-26 16:24:13 -0700
commitbbaf58c9fd0f485266d86868dc35f1d2be3589cd (patch)
tree4ae2b78bad51e3aa10776707ed9048804f378487 /aisa/aisa.h
parentUse a separate EvalContext structure for holding some state. (diff)
downloadissim-bbaf58c9fd0f485266d86868dc35f1d2be3589cd.tar.xz
Significant changes, and a working "ISA" that just computes fib(n).
Diffstat (limited to '')
-rw-r--r--aisa/aisa.h52
1 files changed, 51 insertions, 1 deletions
diff --git a/aisa/aisa.h b/aisa/aisa.h
index 3c260c1..4488529 100644
--- a/aisa/aisa.h
+++ b/aisa/aisa.h
@@ -1,20 +1,67 @@
1#pragma once 1#pragma once
2 2
3#include <cstdint> 3#include <cstdint>
4#include <memory>
4#include <optional> 5#include <optional>
6#include <string>
5#include <utility> 7#include <utility>
6#include <vector> 8#include <vector>
7 9
8namespace aisa { 10namespace aisa {
9 11
12 using addr_t = std::uint64_t;
13 using byte_t = std::uint8_t;
10 using regnum_t = std::uint_fast64_t; 14 using regnum_t = std::uint_fast64_t;
11 using regval_t = std::uint64_t; 15 using regval_t = std::uint64_t;
12 16
17 struct Task;
18
19 struct ISA {
20 virtual ~ISA() { }
21
22 virtual std::pair<std::unique_ptr<const Task>, regval_t> initial_task() const = 0;
23 };
24
25 struct Step;
26
27 struct Task {
28 regnum_t environment;
29
30 virtual ~Task() { }
31
32 virtual std::string disasm() const = 0;
33
34 virtual std::optional<std::pair<std::unique_ptr<const Step>, regval_t>> step(regval_t environment_val) const { return {}; }
35 };
36
37 struct MemInfo {
38 addr_t physical_addr;
39 addr_t size;
40 };
41
42 struct Wires {
43 std::vector<regval_t> source_vals;
44 std::vector<byte_t> memory_val;
45 bool aborted = false;
46 std::vector<regval_t> destination_vals;
47 std::optional<std::pair<std::unique_ptr<const Task>, regval_t>> new_task;
48 };
49
50 enum class MOp {
51 NONE,
52 LOAD,
53 STORE,
54 };
55
13 struct Step { 56 struct Step {
14 std::optional<std::pair<regnum_t, regval_t>> predicate; 57 std::optional<std::pair<regnum_t, regval_t>> predicate;
15 std::vector<regnum_t> source_regs; 58 std::vector<regnum_t> source_regs;
16 std::vector<regnum_t> destination_regs; 59 std::vector<regnum_t> destination_regs;
17 60
61 virtual ~Step() { }
62
63 virtual std::string disasm(const Wires *w = nullptr) const = 0;
64
18 std::optional<regnum_t> predicate_reg() const 65 std::optional<regnum_t> predicate_reg() const
19 { 66 {
20 if (predicate.has_value()) 67 if (predicate.has_value())
@@ -29,7 +76,10 @@ namespace aisa {
29 return {}; 76 return {};
30 } 77 }
31 78
32 virtual std::vector<regval_t> compute_destinations(const std::vector<regval_t> &source_vals) const = 0; 79 MOp mop = MOp::NONE;
80
81 virtual MemInfo meminfo(const Wires &wires) const { return {}; }
82 virtual void evaluate(Wires &wires) const { };
33 }; 83 };
34 84
35} 85}