浏览代码

Merge pull request #4 from woshiluo/prototyper/pmu

refactor(prototyper): use `seq!` rewrite some repeat and match
guttatus 5 天之前
父节点
当前提交
0c8d577a4f
共有 2 个文件被更改,包括 32 次插入166 次删除
  1. 20 145
      prototyper/prototyper/src/riscv/csr.rs
  2. 12 21
      prototyper/prototyper/src/sbi/pmu.rs

+ 20 - 145
prototyper/prototyper/src/riscv/csr.rs

@@ -1,171 +1,46 @@
 #![allow(unused)]
 
+use pastey::paste;
+use seq_macro::seq;
+
 /// CSR addresses
 pub const CSR_STIMECMP: u16 = 0x14D;
 pub const CSR_MCOUNTEREN: u16 = 0x306;
 pub const CSR_MENVCFG: u16 = 0x30a;
 pub const CSR_MCYCLE: u16 = 0xb00;
 pub const CSR_MINSTRET: u16 = 0xb02;
-pub const CSR_MHPMCOUNTER3: u16 = 0xb03;
-pub const CSR_MHPMCOUNTER4: u16 = 0xb04;
-pub const CSR_MHPMCOUNTER5: u16 = 0xb05;
-pub const CSR_MHPMCOUNTER6: u16 = 0xb06;
-pub const CSR_MHPMCOUNTER7: u16 = 0xb07;
-pub const CSR_MHPMCOUNTER8: u16 = 0xb08;
-pub const CSR_MHPMCOUNTER9: u16 = 0xb09;
-pub const CSR_MHPMCOUNTER10: u16 = 0xb0a;
-pub const CSR_MHPMCOUNTER11: u16 = 0xb0b;
-pub const CSR_MHPMCOUNTER12: u16 = 0xb0c;
-pub const CSR_MHPMCOUNTER13: u16 = 0xb0d;
-pub const CSR_MHPMCOUNTER14: u16 = 0xb0e;
-pub const CSR_MHPMCOUNTER15: u16 = 0xb0f;
-pub const CSR_MHPMCOUNTER16: u16 = 0xb10;
-pub const CSR_MHPMCOUNTER17: u16 = 0xb11;
-pub const CSR_MHPMCOUNTER18: u16 = 0xb12;
-pub const CSR_MHPMCOUNTER19: u16 = 0xb13;
-pub const CSR_MHPMCOUNTER20: u16 = 0xb14;
-pub const CSR_MHPMCOUNTER21: u16 = 0xb15;
-pub const CSR_MHPMCOUNTER22: u16 = 0xb16;
-pub const CSR_MHPMCOUNTER23: u16 = 0xb17;
-pub const CSR_MHPMCOUNTER24: u16 = 0xb18;
-pub const CSR_MHPMCOUNTER25: u16 = 0xb19;
-pub const CSR_MHPMCOUNTER26: u16 = 0xb1a;
-pub const CSR_MHPMCOUNTER27: u16 = 0xb1b;
-pub const CSR_MHPMCOUNTER28: u16 = 0xb1c;
-pub const CSR_MHPMCOUNTER29: u16 = 0xb1d;
-pub const CSR_MHPMCOUNTER30: u16 = 0xb1e;
-pub const CSR_MHPMCOUNTER31: u16 = 0xb1f;
+seq!(N in 3..32 {
+    pub const CSR_MHPMCOUNTER~N: u16 = 0xb00 + N;
+});
 pub const CSR_MCYCLEH: u16 = 0xb80;
 pub const CSR_MINSTRETH: u16 = 0xb82;
-pub const CSR_MHPMCOUNTER3H: u16 = 0xb83;
-pub const CSR_MHPMCOUNTER4H: u16 = 0xb84;
-pub const CSR_MHPMCOUNTER5H: u16 = 0xb85;
-pub const CSR_MHPMCOUNTER6H: u16 = 0xb86;
-pub const CSR_MHPMCOUNTER7H: u16 = 0xb87;
-pub const CSR_MHPMCOUNTER8H: u16 = 0xb88;
-pub const CSR_MHPMCOUNTER9H: u16 = 0xb89;
-pub const CSR_MHPMCOUNTER10H: u16 = 0xb8a;
-pub const CSR_MHPMCOUNTER11H: u16 = 0xb8b;
-pub const CSR_MHPMCOUNTER12H: u16 = 0xb8c;
-pub const CSR_MHPMCOUNTER13H: u16 = 0xb8d;
-pub const CSR_MHPMCOUNTER14H: u16 = 0xb8e;
-pub const CSR_MHPMCOUNTER15H: u16 = 0xb8f;
-pub const CSR_MHPMCOUNTER16H: u16 = 0xb90;
-pub const CSR_MHPMCOUNTER17H: u16 = 0xb91;
-pub const CSR_MHPMCOUNTER18H: u16 = 0xb92;
-pub const CSR_MHPMCOUNTER19H: u16 = 0xb93;
-pub const CSR_MHPMCOUNTER20H: u16 = 0xb94;
-pub const CSR_MHPMCOUNTER21H: u16 = 0xb95;
-pub const CSR_MHPMCOUNTER22H: u16 = 0xb96;
-pub const CSR_MHPMCOUNTER23H: u16 = 0xb97;
-pub const CSR_MHPMCOUNTER24H: u16 = 0xb98;
-pub const CSR_MHPMCOUNTER25H: u16 = 0xb99;
-pub const CSR_MHPMCOUNTER26H: u16 = 0xb9a;
-pub const CSR_MHPMCOUNTER27H: u16 = 0xb9b;
-pub const CSR_MHPMCOUNTER28H: u16 = 0xb9c;
-pub const CSR_MHPMCOUNTER29H: u16 = 0xb9d;
-pub const CSR_MHPMCOUNTER30H: u16 = 0xb9e;
-pub const CSR_MHPMCOUNTER31H: u16 = 0xb9f;
+seq!(N in 3..32 {
+    paste! {
+        pub const [<CSR_MHPMCOUNTER ~N H>]: u16 = 0xb80 + N;
+    }
+});
 /* User Counters/Timers */
 pub const CSR_CYCLE: u16 = 0xc00;
 pub const CSR_TIME: u16 = 0xc01;
 pub const CSR_INSTRET: u16 = 0xc02;
-pub const CSR_HPMCOUNTER3: u16 = 0xc03;
-pub const CSR_HPMCOUNTER4: u16 = 0xc04;
-pub const CSR_HPMCOUNTER5: u16 = 0xc05;
-pub const CSR_HPMCOUNTER6: u16 = 0xc06;
-pub const CSR_HPMCOUNTER7: u16 = 0xc07;
-pub const CSR_HPMCOUNTER8: u16 = 0xc08;
-pub const CSR_HPMCOUNTER9: u16 = 0xc09;
-pub const CSR_HPMCOUNTER10: u16 = 0xc0a;
-pub const CSR_HPMCOUNTER11: u16 = 0xc0b;
-pub const CSR_HPMCOUNTER12: u16 = 0xc0c;
-pub const CSR_HPMCOUNTER13: u16 = 0xc0d;
-pub const CSR_HPMCOUNTER14: u16 = 0xc0e;
-pub const CSR_HPMCOUNTER15: u16 = 0xc0f;
-pub const CSR_HPMCOUNTER16: u16 = 0xc10;
-pub const CSR_HPMCOUNTER17: u16 = 0xc11;
-pub const CSR_HPMCOUNTER18: u16 = 0xc12;
-pub const CSR_HPMCOUNTER19: u16 = 0xc13;
-pub const CSR_HPMCOUNTER20: u16 = 0xc14;
-pub const CSR_HPMCOUNTER21: u16 = 0xc15;
-pub const CSR_HPMCOUNTER22: u16 = 0xc16;
-pub const CSR_HPMCOUNTER23: u16 = 0xc17;
-pub const CSR_HPMCOUNTER24: u16 = 0xc18;
-pub const CSR_HPMCOUNTER25: u16 = 0xc19;
-pub const CSR_HPMCOUNTER26: u16 = 0xc1a;
-pub const CSR_HPMCOUNTER27: u16 = 0xc1b;
-pub const CSR_HPMCOUNTER28: u16 = 0xc1c;
-pub const CSR_HPMCOUNTER29: u16 = 0xc1d;
-pub const CSR_HPMCOUNTER30: u16 = 0xc1e;
-pub const CSR_HPMCOUNTER31: u16 = 0xc1f;
+seq!(N in 3..32 {
+    pub const CSR_HPMCOUNTER~N: u16 = 0xc00 + N;
+});
 /// MHPMEVENT
 pub const CSR_MCOUNTINHIBIT: u16 = 0x320;
 pub const CSR_MCYCLECFG: u16 = 0x321;
 pub const CSR_MINSTRETCFG: u16 = 0x322;
-pub const CSR_MHPMEVENT3: u16 = 0x323;
-pub const CSR_MHPMEVENT4: u16 = 0x324;
-pub const CSR_MHPMEVENT5: u16 = 0x325;
-pub const CSR_MHPMEVENT6: u16 = 0x326;
-pub const CSR_MHPMEVENT7: u16 = 0x327;
-pub const CSR_MHPMEVENT8: u16 = 0x328;
-pub const CSR_MHPMEVENT9: u16 = 0x329;
-pub const CSR_MHPMEVENT10: u16 = 0x32a;
-pub const CSR_MHPMEVENT11: u16 = 0x32b;
-pub const CSR_MHPMEVENT12: u16 = 0x32c;
-pub const CSR_MHPMEVENT13: u16 = 0x32d;
-pub const CSR_MHPMEVENT14: u16 = 0x32e;
-pub const CSR_MHPMEVENT15: u16 = 0x32f;
-pub const CSR_MHPMEVENT16: u16 = 0x330;
-pub const CSR_MHPMEVENT17: u16 = 0x331;
-pub const CSR_MHPMEVENT18: u16 = 0x332;
-pub const CSR_MHPMEVENT19: u16 = 0x333;
-pub const CSR_MHPMEVENT20: u16 = 0x334;
-pub const CSR_MHPMEVENT21: u16 = 0x335;
-pub const CSR_MHPMEVENT22: u16 = 0x336;
-pub const CSR_MHPMEVENT23: u16 = 0x337;
-pub const CSR_MHPMEVENT24: u16 = 0x338;
-pub const CSR_MHPMEVENT25: u16 = 0x339;
-pub const CSR_MHPMEVENT26: u16 = 0x33a;
-pub const CSR_MHPMEVENT27: u16 = 0x33b;
-pub const CSR_MHPMEVENT28: u16 = 0x33c;
-pub const CSR_MHPMEVENT29: u16 = 0x33d;
-pub const CSR_MHPMEVENT30: u16 = 0x33e;
-pub const CSR_MHPMEVENT31: u16 = 0x33f;
+seq!(N in 3..32 {
+    pub const CSR_MHPMEVENT~N: u16 = 0x320 + N;
+});
 
 // For RV32
 pub const CSR_CYCLEH: u16 = 0xc80;
 pub const CSR_TIMEH: u16 = 0xc81;
 pub const CSR_INSTRETH: u16 = 0xc82;
-pub const CSR_HPMCOUNTER3H: u16 = 0xc83;
-pub const CSR_HPMCOUNTER4H: u16 = 0xc84;
-pub const CSR_HPMCOUNTER5H: u16 = 0xc85;
-pub const CSR_HPMCOUNTER6H: u16 = 0xc86;
-pub const CSR_HPMCOUNTER7H: u16 = 0xc87;
-pub const CSR_HPMCOUNTER8H: u16 = 0xc88;
-pub const CSR_HPMCOUNTER9H: u16 = 0xc89;
-pub const CSR_HPMCOUNTER10H: u16 = 0xc8a;
-pub const CSR_HPMCOUNTER11H: u16 = 0xc8b;
-pub const CSR_HPMCOUNTER12H: u16 = 0xc8c;
-pub const CSR_HPMCOUNTER13H: u16 = 0xc8d;
-pub const CSR_HPMCOUNTER14H: u16 = 0xc8e;
-pub const CSR_HPMCOUNTER15H: u16 = 0xc8f;
-pub const CSR_HPMCOUNTER16H: u16 = 0xc90;
-pub const CSR_HPMCOUNTER17H: u16 = 0xc91;
-pub const CSR_HPMCOUNTER18H: u16 = 0xc92;
-pub const CSR_HPMCOUNTER19H: u16 = 0xc93;
-pub const CSR_HPMCOUNTER20H: u16 = 0xc94;
-pub const CSR_HPMCOUNTER21H: u16 = 0xc95;
-pub const CSR_HPMCOUNTER22H: u16 = 0xc96;
-pub const CSR_HPMCOUNTER23H: u16 = 0xc97;
-pub const CSR_HPMCOUNTER24H: u16 = 0xc98;
-pub const CSR_HPMCOUNTER25H: u16 = 0xc99;
-pub const CSR_HPMCOUNTER26H: u16 = 0xc9a;
-pub const CSR_HPMCOUNTER27H: u16 = 0xc9b;
-pub const CSR_HPMCOUNTER28H: u16 = 0xc9c;
-pub const CSR_HPMCOUNTER29H: u16 = 0xc9d;
-pub const CSR_HPMCOUNTER30H: u16 = 0xc9e;
-pub const CSR_HPMCOUNTER31H: u16 = 0xc9f;
+seq!(N in 3..32 {
+    paste!{ pub const [<CSR_HPMCOUNTER ~N H>]: u16 = 0xc80 + N; }
+});
 
 /// Machine environment configuration register (menvcfg) bit fields.
 pub mod menvcfg {

+ 12 - 21
prototyper/prototyper/src/sbi/pmu.rs

@@ -750,19 +750,15 @@ fn write_mhpmevent(mhpm_offset: u16, mhpmevent_val: u64) {
     if csr >= CSR_MHPMEVENT3 && csr <= CSR_MHPMEVENT31 {
         // Convert CSR value to register index (3-31)
         let idx = csr - CSR_MHPMEVENT3 + 3;
-        macro_rules! write_event {
-            ($($i:literal),*) => {
-                $(
-                    if idx == $i {
-                        pastey::paste!{ [<mhpmevent $i>]::write(mhpmevent_val as usize) };
-                    }
-                )*
-            }
-        }
 
         // Use seq_macro to generate all valid indices from 3 to 31
         seq_macro::seq!(N in 3..=31 {
-            write_event!(N);
+            match idx {
+                #(
+                    N => pastey::paste!{ [<mhpmevent ~N>]::write(mhpmevent_val as usize) },
+                )*
+                _ =>{}
+            }
         });
     }
 }
@@ -782,19 +778,14 @@ fn write_mhpmcounter(mhpm_offset: u16, mhpmcounter_val: u64) {
 
     // Only handle valid counter indices (3-31)
     if counter_idx >= 3 && counter_idx <= 31 {
-        macro_rules! write_counter {
-            ($($i:literal),*) => {
-                $(
-                    if counter_idx == $i {
-                        pastey::paste!{ [<mhpmcounter $i>]::write(mhpmcounter_val as usize) };
-                    }
-                )*
-            }
-        }
-
         // Call the macro with all valid indices
         seq_macro::seq!(N in 3..=31 {
-            write_counter!(N);
+            match counter_idx {
+                #(
+                    N => pastey::paste!{ [<mhpmcounter ~N>]::write(mhpmcounter_val as usize) },
+                )*
+                _ =>{}
+            }
         });
     }
 }