aboutsummaryrefslogtreecommitdiff
path: root/src/components/cpu
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2023-04-30 17:47:00 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2023-04-30 17:47:00 +0300
commitd133cc70b125efc1d6c992cb49ce1bca41cf580e (patch)
tree0f7c2352f6a83b6603304a877f9c02de21ba5fab /src/components/cpu
parent3e74b081dba17f12a1661e9e4db6b41a02a78861 (diff)
downloadgran-d133cc70b125efc1d6c992cb49ce1bca41cf580e.tar.gz
gran-d133cc70b125efc1d6c992cb49ce1bca41cf580e.zip
refactor component tree
Diffstat (limited to 'src/components/cpu')
-rw-r--r--src/components/cpu/riscv/simple_riscv32.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/components/cpu/riscv/simple_riscv32.c b/src/components/cpu/riscv/simple_riscv32.c
new file mode 100644
index 0000000..1f19b1f
--- /dev/null
+++ b/src/components/cpu/riscv/simple_riscv32.c
@@ -0,0 +1,58 @@
+#include <gran/cpu/riscv/simple_riscv32.h>
+
+struct simple_riscv32 {
+ struct component component;
+
+ struct component *imem;
+ struct component *dmem;
+
+ /* have to be careful with x0 */
+ uint32_t regs[32];
+ uint32_t pc;
+};
+
+static uint32_t get_reg(struct simple_riscv32 *cpu, size_t i)
+{
+ assert(i < 32);
+
+ if (i == 0)
+ return 0;
+
+ return cpu->regs[i];
+}
+
+static void set_reg(struct simple_riscv32 *cpu, size_t i, uint32_t v)
+{
+ assert(i < 32);
+
+ if (i == 0)
+ return;
+
+ cpu->regs[i] = v;
+}
+
+static stat simple_riscv32_clock(struct simple_riscv32 *cpu)
+{
+ uint32_t insn = 0;
+ stat ret = read(cpu->imem, cpu->pc, sizeof(insn), &insn);
+ if (ret)
+ return ret;
+
+ /* @todo instruction decode and execution, not sure if this is too early
+ * to start thinking about how to modularise stuff */
+ return OK;
+}
+
+struct componen *create_simple_riscv32(uint32_t start_pc, struct component *imem, struct component *dmem)
+{
+ struct component *new = calloc(1, sizeof(simple_riscv32));
+ if (!new)
+ return NULL;
+
+ new->component.clock = (clock_callback)simple_riscv32_clock;
+
+ new->pc = start_pc;
+ new->imem = imem;
+ new->dmem = dmem;
+ return new;
+}