1pub const REG_COUNT: usize = 13;
9
10#[derive(Clone, Debug, PartialEq, Eq)]
12pub struct Regs {
13 pub gpr: [u64; REG_COUNT],
15 pub pc: u64,
17}
18
19impl Regs {
20 pub fn new() -> Self {
22 Self::default()
23 }
24
25 pub fn read(&self, i: usize) -> u64 {
28 self.gpr.get(i).copied().unwrap_or(0)
29 }
30
31 pub fn write(&mut self, i: usize, v: u64) {
33 if let Some(slot) = self.gpr.get_mut(i) {
34 *slot = v;
35 }
36 }
37}
38
39impl Default for Regs {
40 fn default() -> Self {
41 Self {
42 gpr: [0u64; REG_COUNT],
43 pc: 0,
44 }
45 }
46}
47
48#[cfg(test)]
49mod tests {
50 use super::*;
51
52 #[test]
53 fn new_is_zero() {
54 let r = Regs::new();
55 assert_eq!(r.pc, 0);
56 for i in 0..REG_COUNT {
57 assert_eq!(r.read(i), 0);
58 }
59 }
60
61 #[test]
62 fn read_write_round_trip() {
63 let mut r = Regs::new();
64 r.write(7, 0xDEAD_BEEF);
65 assert_eq!(r.read(7), 0xDEAD_BEEF);
66 }
67
68 #[test]
69 fn out_of_range_read_returns_zero() {
70 let r = Regs::new();
71 assert_eq!(r.read(99), 0);
72 }
73
74 #[test]
75 fn out_of_range_write_is_noop() {
76 let mut r = Regs::new();
77 r.write(99, 1);
78 for i in 0..REG_COUNT {
80 assert_eq!(r.read(i), 0);
81 }
82 }
83}