gwr_models/registers/
regfile.rs1#[macro_export]
6macro_rules! build_register_file {
7 (
8 $(#[$($rf_attrs:tt)*])*
9 $regfile:ident, $states:path ;
10 $(
11 $reg_name:ident: $index:expr, $reg_view:ident, $state:ident
12 ),+ $(,)*
13 ) => {
14 $crate::registers::paste! {
15 pub mod [< $regfile:lower _indices >] {
16 $( pub const [< $state:upper >]: u64 = $index; )+
17 }
18
19 $(#[$($rf_attrs)*])*
20 pub struct [< $regfile Regs >] {
21 $( pub [< $reg_name:lower >] : [< $reg_view Reg >], )+
22 }
23
24 impl [< $regfile Regs >] {
25 #[must_use] pub fn new(states: &$states, index: usize) -> Self {
26 $(
27 let [< $reg_view:lower _state >] = states.[< $state:lower >][index].clone();
28 let [< $reg_name:lower >] = [< $reg_view Reg >]::new([< $reg_view:lower _state >]);
29 )+
30 Self {
31 $( [< $reg_name:lower >], )+
32 }
33 }
34
35 pub fn write(&self, resolver: &impl gwr_engine::traits::Resolver, index: u64, value: u64) {
36 match index {
37 $( $index => self.[< $reg_name:lower >].write(resolver, value), )+
38 _ => {},
40 }
41 }
42
43 #[must_use] pub fn read(&self, index: u64) -> u64 {
44 match index {
45 $( $index => self.[< $reg_name:lower >].read(), )+
46 _ => {0},
48 }
49 }
50
51 pub fn reset_sync(&self, resolver: &impl gwr_engine::traits::Resolver) {
53 $(
54 self.[< $reg_name:lower >].reset_sync(resolver);
55 )+
56 }
57 }
58 }}
59}