osiris_process/register/
floating_point.rs1use 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
9pub type VectorApplication = RangeApplication<Number>;
11
12#[derive(Copy, Clone, Debug, Default)]
14pub struct Number(f64);
15
16impl Number {
17 pub fn new(data: f64) -> Self { Self(data) }
19
20 pub fn to_f64(&self) -> f64 { self.0 }
22
23 pub fn from_u64(data: u64) -> Self { Self::new(f64::from_bits(data)) }
25
26 pub fn from_word(data: Word) -> Self { Self::new(f64::from_bits(data.to_u64())) }
28
29 pub fn to_u64(&self) -> u64 { self.0.to_bits() }
31
32 pub fn to_word(&self) -> Word { Word::new(self.to_u64()) }
34
35 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 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#[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}