Skip to main content

gwr_models/registers/
regfile.rs

1// Copyright (c) 2023 Graphcore Ltd. All rights reserved.
2
3//! Control and Status Registers.
4
5#[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                    // ignore missing indices
39                    _ => {},
40                }
41            }
42
43            #[must_use] pub fn read(&self, index: u64) -> u64 {
44                match index {
45                    $( $index => self.[< $reg_name:lower >].read(), )+
46                    // ignore missing indices
47                    _ => {0},
48                }
49            }
50
51            /// Perform a `synchronous` reset
52            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}