osiris_process/register/
integral.rs

1//! Implements a integral register bank.
2
3use osiris_data::data::atomic::Word;
4use osiris_data::data::identification::Identifier;
5
6use crate::register::{RangeApplication, RegisterBank, RegisterId, RegisterRange, REGISTERS_IN_BANK};
7
8
9/// A function on a range which returns a [Word].
10pub type BankApplication = RangeApplication<Word>;
11
12/// The register bank.
13/// 
14/// The struct contains the whole register array.
15#[derive(Clone, Debug)]
16pub struct Bank {
17    registers: Vec<Word>,
18}
19
20impl RegisterBank<Word> for Bank {
21    fn new() -> Self {
22        Self { registers: vec![Word::default(); REGISTERS_IN_BANK] }
23    }
24
25    fn set(&mut self, register: RegisterId, word: Word) {
26        self.registers[register.to_usize()] = word;
27    }
28
29    fn get(&self, register: RegisterId) -> Word {
30        self.registers[register.to_usize()]
31    }
32
33    fn apply(&self, range: RegisterRange, function: BankApplication) -> Word {
34        let slice = self.slice(range);
35        function(slice)
36    }
37    
38    fn slice(&self, range: RegisterRange) -> &[Word] {
39        &self.registers[range.to_usize_range()]
40    }
41
42    fn copy(&mut self, to: RegisterId, slice: &[Word]) {
43        let mut index = to.to_usize();
44        for w in slice {
45            if index > REGISTERS_IN_BANK {
46                break;
47            }
48            self.registers[index] = *w;
49            index += 1;
50        }
51    }
52}
53
54impl Default for Bank {
55    fn default() -> Self { Self::new() }
56}