osiris_process/register/
floating_point.rs

1//! Implements a floating-point register bank.
2
3use osiris_data::data::atomic::Word;
4use osiris_data::data::composite::Array;
5use osiris_data::data::identification::Identifier;
6
7use crate::register::{RangeApplication, RegisterBank, RegisterId, RegisterRange, REGISTERS_IN_BANK};
8
9/// A function on a range which returns a [Number].
10pub type VectorApplication = RangeApplication<Number>;
11
12/// A [Number] is the machine's floating point number type.
13#[derive(Copy, Clone, Debug, Default)]
14pub struct Number(f64);
15
16impl Number {
17    /// Creates a value from a raw value.
18    pub fn new(data: f64) -> Self { Self(data) }
19    
20    /// Returns the number raw value.
21    pub fn to_f64(&self) -> f64 { self.0 }
22    
23    /// Creates a value from its raw data.
24    pub fn from_u64(data: u64) -> Self { Self::new(f64::from_bits(data)) }
25    
26    /// Creates a value from its raw data.
27    pub fn from_word(data: Word) -> Self { Self::new(f64::from_bits(data.to_u64())) }
28    
29    /// Returns the raw data representing the number.
30    pub fn to_u64(&self) -> u64 { self.0.to_bits() }
31
32    /// Returns the raw data representing the number in a [Word].
33    pub fn to_word(&self) -> Word { Word::new(self.to_u64()) }
34
35    /// Creates an array of [Number] from a slice containing raw data. 
36    pub fn from_words_slice(from: &[Word]) -> Vec<Self> {
37        let mut slice = vec![];
38        for e in from {
39            slice.push(Self::from_word(*e));
40        }
41        slice
42    }
43
44    /// Creates an array of raw data [Word]s from a [Number] slice.
45    pub fn slice_to_array(from: &[Self]) -> Array {
46        let mut array:Array = Array::new(0);
47        for e in from {
48            array.push(e.to_word());
49        }
50        array
51    }
52}
53
54
55/// The register bank of floating point values.
56///
57/// The struct contains the whole register array.
58#[derive(Clone, Debug)]
59pub struct Vector {
60    registers: Vec<Number>,
61}
62
63impl RegisterBank<Number> for Vector {
64    fn new() -> Self {
65        Self { registers: vec![Number::default(); REGISTERS_IN_BANK] }
66    }
67
68    fn set(&mut self, register: RegisterId, number: Number) {
69        if register.to_usize() > REGISTERS_IN_BANK {
70            return;
71        }
72        self.registers[register.to_usize()] = number;
73    }
74    
75    fn get(&self, register: RegisterId) -> Number {
76        self.registers[register.to_usize()]
77    }
78
79    fn apply(&self, range: RegisterRange, function: VectorApplication) -> Number {
80        let slice = &self.registers[range.to_usize_range()];
81        function(slice)
82    }
83
84    fn slice(&self, range: RegisterRange) -> &[Number] {
85        &self.registers[range.to_usize_range()]
86    }
87
88    fn copy(&mut self, to: RegisterId, slice: &[Number]) {
89        let mut index = to.to_usize();
90        for w in slice {
91            self.registers[index] = *w;
92            index += 1;
93        }
94    }
95}
96
97impl Default for Vector {
98    fn default() -> Self { Self::new() }
99}