scounteren.rs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. //! scounteren register
  2. use bit_field::BitField;
  3. /// scounteren register
  4. #[derive(Clone, Copy, Debug)]
  5. pub struct Scounteren {
  6. bits: usize,
  7. }
  8. impl Scounteren {
  9. /// User "cycle\[h\]" Enable
  10. #[inline]
  11. pub fn cy(&self) -> bool {
  12. self.bits.get_bit(0)
  13. }
  14. /// User "time\[h\]" Enable
  15. #[inline]
  16. pub fn tm(&self) -> bool {
  17. self.bits.get_bit(1)
  18. }
  19. /// User "instret\[h]\" Enable
  20. #[inline]
  21. pub fn ir(&self) -> bool {
  22. self.bits.get_bit(2)
  23. }
  24. /// User "hpm\[x\]" Enable (bits 3-31)
  25. #[inline]
  26. pub fn hpm(&self, index: usize) -> bool {
  27. assert!(3 <= index && index < 32);
  28. self.bits.get_bit(index)
  29. }
  30. }
  31. read_csr_as!(Scounteren, 0x106, __read_scounteren);
  32. write_csr!(0x106, __write_scounteren);
  33. set!(0x106, __set_scounteren);
  34. clear!(0x106, __clear_scounteren);
  35. set_clear_csr!(
  36. /// User cycle Enable
  37. , set_cy, clear_cy, 1 << 0);
  38. set_clear_csr!(
  39. /// User time Enable
  40. , set_tm, clear_tm, 1 << 1);
  41. set_clear_csr!(
  42. /// User instret Enable
  43. , set_ir, clear_ir, 1 << 2);
  44. #[inline]
  45. pub unsafe fn set_hpm(index: usize) {
  46. assert!(3 <= index && index < 32);
  47. _set(1 << index);
  48. }
  49. #[inline]
  50. pub unsafe fn clear_hpm(index: usize) {
  51. assert!(3 <= index && index < 32);
  52. _clear(1 << index);
  53. }