#ifndef RV32CPU_H #define RV32CPU_H #include /* * This is a structure encoding for the registers of * the rv32 cpu. * It allows access of register x0 using : * structname.x0, structname.zero, structname.x[0] * This way, access can be really flexible */ typedef struct RV32_CPU_REGS { union { struct { union { uint32_t x0; uint32_t zero; }; union { uint32_t x1; uint32_t ra; }; union { uint32_t x2; uint32_t sp; }; union { uint32_t x3; uint32_t gp; }; union { uint32_t x4; uint32_t tp; }; union { uint32_t x5; uint32_t t0; }; union { uint32_t x6; uint32_t t1; }; union { uint32_t x7; uint32_t t2; }; union { uint32_t x8; uint32_t s0; }; union { uint32_t x9; uint32_t s1; }; union { uint32_t x10; uint32_t a0; }; union { uint32_t x11; uint32_t a1; }; union { uint32_t x12; uint32_t a2; }; union { uint32_t x13; uint32_t a3; }; union { uint32_t x14; uint32_t a4; }; union { uint32_t x15; uint32_t a5; }; union { uint32_t x16; uint32_t a6; }; union { uint32_t x17; uint32_t a7; }; union { uint32_t x18; uint32_t s2; }; union { uint32_t x19; uint32_t s3; }; union { uint32_t x20; uint32_t s4; }; union { uint32_t x21; uint32_t s5; }; union { uint32_t x22; uint32_t s6; }; union { uint32_t x23; uint32_t s7; }; union { uint32_t x24; uint32_t s8; }; union { uint32_t x25; uint32_t s9; }; union { uint32_t x26; uint32_t s10; }; union { uint32_t x27; uint32_t s11; }; union { uint32_t x28; uint32_t t3; }; union { uint32_t x29; uint32_t t4; }; union { uint32_t x30; uint32_t t5; }; union { uint32_t x31; uint32_t t6; }; }; uint32_t x[32]; }; } rv32_cpu_regs_t; typedef struct RV32_CPU { rv32_cpu_regs_t regs; uint32_t pc; } rv32_cpu_t; extern rv32_cpu_t* cpu0; void cpu_init(); void cpu_loop(rv32_cpu_t* cpu); #endif