diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2023-04-30 17:47:00 +0300 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2023-04-30 17:47:00 +0300 |
| commit | d133cc70b125efc1d6c992cb49ce1bca41cf580e (patch) | |
| tree | 0f7c2352f6a83b6603304a877f9c02de21ba5fab /src/components/cpu | |
| parent | 3e74b081dba17f12a1661e9e4db6b41a02a78861 (diff) | |
| download | gran-d133cc70b125efc1d6c992cb49ce1bca41cf580e.tar.gz gran-d133cc70b125efc1d6c992cb49ce1bca41cf580e.zip | |
refactor component tree
Diffstat (limited to 'src/components/cpu')
| -rw-r--r-- | src/components/cpu/riscv/simple_riscv32.c | 58 |
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; +} |
