Skip to content

Commit 4e3daa9

Browse files
committed
Use riscv macros to simplify examples and tests
1 parent 16e30d0 commit 4e3daa9

File tree

4 files changed

+14
-180
lines changed

4 files changed

+14
-180
lines changed

riscv-peripheral/examples/e310x.rs

+4-64
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,16 @@
11
//! Peripheral definitions for the E310x chip.
2+
//!
23
//! This is a simple example of how to use the `riscv-peripheral` crate to generate
34
//! peripheral definitions for a target.
45
5-
use riscv_pac::{
6-
result::{Error, Result},
7-
ExternalInterruptNumber, HartIdNumber, InterruptNumber, PriorityNumber,
8-
};
9-
106
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
7+
#[riscv::pac_enum(unsafe HartIdNumber)]
118
pub enum HartId {
129
H0 = 0,
1310
}
1411

15-
unsafe impl HartIdNumber for HartId {
16-
const MAX_HART_ID_NUMBER: usize = Self::H0 as usize;
17-
18-
#[inline]
19-
fn number(self) -> usize {
20-
self as _
21-
}
22-
23-
#[inline]
24-
fn from_number(number: usize) -> Result<Self> {
25-
match number {
26-
0 => Ok(Self::H0),
27-
_ => Err(Error::InvalidVariant(number)),
28-
}
29-
}
30-
}
31-
3212
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
33-
#[repr(usize)]
13+
#[riscv::pac_enum(unsafe ExternalInterruptNumber)]
3414
pub enum Interrupt {
3515
WATCHDOG = 1,
3616
RTC = 2,
@@ -86,29 +66,8 @@ pub enum Interrupt {
8666
I2C0 = 52,
8767
}
8868

89-
unsafe impl InterruptNumber for Interrupt {
90-
const MAX_INTERRUPT_NUMBER: usize = Self::I2C0 as usize;
91-
92-
#[inline]
93-
fn number(self) -> usize {
94-
self as _
95-
}
96-
97-
#[inline]
98-
fn from_number(number: usize) -> Result<Self> {
99-
if number == 0 || number > Self::MAX_INTERRUPT_NUMBER {
100-
Err(Error::InvalidVariant(number))
101-
} else {
102-
// SAFETY: valid interrupt number
103-
Ok(unsafe { core::mem::transmute::<usize, Interrupt>(number) })
104-
}
105-
}
106-
}
107-
108-
unsafe impl ExternalInterruptNumber for Interrupt {}
109-
11069
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
111-
#[repr(usize)]
70+
#[riscv::pac_enum(unsafe PriorityNumber)]
11271
pub enum Priority {
11372
P0 = 0,
11473
P1 = 1,
@@ -120,25 +79,6 @@ pub enum Priority {
12079
P7 = 7,
12180
}
12281

123-
unsafe impl PriorityNumber for Priority {
124-
const MAX_PRIORITY_NUMBER: usize = Self::P7 as usize;
125-
126-
#[inline]
127-
fn number(self) -> usize {
128-
self as _
129-
}
130-
131-
#[inline]
132-
fn from_number(number: usize) -> Result<Self> {
133-
if number > Self::MAX_PRIORITY_NUMBER {
134-
Err(Error::InvalidVariant(number))
135-
} else {
136-
// SAFETY: valid priority number
137-
Ok(unsafe { core::mem::transmute::<usize, Priority>(number) })
138-
}
139-
}
140-
}
141-
14282
riscv_peripheral::clint_codegen!(
14383
base 0x0200_0000,
14484
mtime_freq 32_768,

riscv-peripheral/src/aclint.rs

+3-23
Original file line numberDiff line numberDiff line change
@@ -92,36 +92,16 @@ impl<C: Clint> CLINT<C> {
9292

9393
#[cfg(test)]
9494
pub(crate) mod test {
95-
use super::HartIdNumber;
96-
use riscv_pac::result::{Error, Result};
95+
use riscv_pac::{result::Error, HartIdNumber};
9796

9897
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
99-
#[repr(usize)]
100-
pub(crate) enum HartId {
98+
#[riscv::pac_enum(unsafe HartIdNumber)]
99+
pub(super) enum HartId {
101100
H0 = 0,
102101
H1 = 1,
103102
H2 = 2,
104103
}
105104

106-
unsafe impl HartIdNumber for HartId {
107-
const MAX_HART_ID_NUMBER: usize = Self::H2 as usize;
108-
109-
#[inline]
110-
fn number(self) -> usize {
111-
self as _
112-
}
113-
114-
#[inline]
115-
fn from_number(number: usize) -> Result<Self> {
116-
if number > Self::MAX_HART_ID_NUMBER {
117-
Err(Error::InvalidVariant(number))
118-
} else {
119-
// SAFETY: valid context number
120-
Ok(unsafe { core::mem::transmute::<usize, HartId>(number) })
121-
}
122-
}
123-
}
124-
125105
#[test]
126106
fn check_hart_id_enum() {
127107
assert_eq!(HartId::H0.number(), 0);

riscv-peripheral/src/macros.rs

+3-30
Original file line numberDiff line numberDiff line change
@@ -32,22 +32,9 @@ pub use paste::paste;
3232
///
3333
/// /// HART IDs for the target CLINT peripheral
3434
/// #[derive(Clone, Copy, Debug, Eq, PartialEq)]
35+
/// #[riscv::pac_enum(unsafe HartIdNumber)]
3536
/// pub enum HartId { H0 = 0, H1 = 1, H2 = 2 }
3637
///
37-
/// // Implement `HartIdNumber` for `HartId`
38-
/// unsafe impl riscv_peripheral::aclint::HartIdNumber for HartId {
39-
/// const MAX_HART_ID_NUMBER: usize = Self::H2 as usize;
40-
/// fn number(self) -> usize { self as _ }
41-
/// fn from_number(number: usize) -> Result<Self> {
42-
/// match number {
43-
/// 0 => Ok(HartId::H0),
44-
/// 1 => Ok(HartId::H1),
45-
/// 2 => Ok(HartId::H2),
46-
/// _ => Err(Error::InvalidVariant(number)),
47-
/// }
48-
/// }
49-
/// }
50-
///
5138
/// riscv_peripheral::clint_codegen!(
5239
/// base 0x0200_0000,
5340
/// mtime_freq 32_768,
@@ -158,30 +145,16 @@ macro_rules! clint_codegen {
158145
/// let pendings = plic.pendings(); // Pendings registers
159146
/// ```
160147
///
161-
///
162148
/// ## Base address and per-HART context proxies
163149
///
164150
/// ```
165151
/// use riscv_pac::result::{Error, Result};
166152
///
167153
/// /// HART IDs for the target CLINT peripheral
168154
/// #[derive(Clone, Copy, Debug, Eq, PartialEq)]
155+
/// #[riscv::pac_enum(unsafe HartIdNumber)]
169156
/// pub enum HartId { H0 = 0, H1 = 1, H2 = 2 }
170157
///
171-
/// // Implement `HartIdNumber` for `HartId`
172-
/// unsafe impl riscv_peripheral::aclint::HartIdNumber for HartId {
173-
/// const MAX_HART_ID_NUMBER: usize = Self::H2 as usize;
174-
/// fn number(self) -> usize { self as _ }
175-
/// fn from_number(number: usize) -> Result<Self> {
176-
/// match number {
177-
/// 0 => Ok(HartId::H0),
178-
/// 1 => Ok(HartId::H1),
179-
/// 2 => Ok(HartId::H2),
180-
/// _ => Err(Error::InvalidVariant(number)),
181-
/// }
182-
/// }
183-
/// }
184-
///
185158
/// riscv_peripheral::plic_codegen!(
186159
/// base 0x0C00_0000,
187160
/// harts [HartId::H0 => 0, HartId::H1 => 1, HartId::H2 => 2], // do not forget the ending comma!
@@ -242,7 +215,7 @@ macro_rules! plic_codegen {
242215
$crate::macros::paste! {
243216
impl PLIC {
244217
$(
245-
#[doc = "Returns a PLIC context proxy for context of HART "]
218+
#[doc = "Returns a PLIC context proxy for context of HART [`"]
246219
#[doc = stringify!($hart)]
247220
#[doc = "`]."]
248221
#[inline]

riscv-peripheral/src/plic.rs

+4-63
Original file line numberDiff line numberDiff line change
@@ -186,10 +186,10 @@ impl<P: Plic> CTX<P> {
186186

187187
#[cfg(test)]
188188
pub(crate) mod test {
189-
use riscv_pac::result::{Error, Result};
190-
use riscv_pac::{ExternalInterruptNumber, HartIdNumber, InterruptNumber, PriorityNumber};
189+
use riscv_pac::{result::Error, HartIdNumber, InterruptNumber, PriorityNumber};
191190

192191
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
192+
#[riscv::pac_enum(unsafe ExternalInterruptNumber)]
193193
pub(crate) enum Interrupt {
194194
I1 = 1,
195195
I2 = 2,
@@ -198,6 +198,7 @@ pub(crate) mod test {
198198
}
199199

200200
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
201+
#[riscv::pac_enum(unsafe PriorityNumber)]
201202
pub(crate) enum Priority {
202203
P0 = 0,
203204
P1 = 1,
@@ -206,73 +207,13 @@ pub(crate) mod test {
206207
}
207208

208209
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
210+
#[riscv::pac_enum(unsafe HartIdNumber)]
209211
pub(crate) enum Context {
210212
C0 = 0,
211213
C1 = 1,
212214
C2 = 2,
213215
}
214216

215-
unsafe impl InterruptNumber for Interrupt {
216-
const MAX_INTERRUPT_NUMBER: usize = Self::I4 as usize;
217-
218-
#[inline]
219-
fn number(self) -> usize {
220-
self as _
221-
}
222-
223-
#[inline]
224-
fn from_number(number: usize) -> Result<Self> {
225-
match number {
226-
1 => Ok(Interrupt::I1),
227-
2 => Ok(Interrupt::I2),
228-
3 => Ok(Interrupt::I3),
229-
4 => Ok(Interrupt::I4),
230-
_ => Err(Error::InvalidVariant(number)),
231-
}
232-
}
233-
}
234-
235-
unsafe impl ExternalInterruptNumber for Interrupt {}
236-
237-
unsafe impl PriorityNumber for Priority {
238-
const MAX_PRIORITY_NUMBER: usize = Self::P3 as usize;
239-
240-
#[inline]
241-
fn number(self) -> usize {
242-
self as _
243-
}
244-
245-
#[inline]
246-
fn from_number(number: usize) -> Result<Self> {
247-
match number {
248-
0 => Ok(Priority::P0),
249-
1 => Ok(Priority::P1),
250-
2 => Ok(Priority::P2),
251-
3 => Ok(Priority::P3),
252-
_ => Err(Error::InvalidVariant(number)),
253-
}
254-
}
255-
}
256-
257-
unsafe impl HartIdNumber for Context {
258-
const MAX_HART_ID_NUMBER: usize = Self::C2 as usize;
259-
260-
#[inline]
261-
fn number(self) -> usize {
262-
self as _
263-
}
264-
265-
#[inline]
266-
fn from_number(number: usize) -> Result<Self> {
267-
match number {
268-
0 => Ok(Context::C0),
269-
1 => Ok(Context::C1),
270-
2 => Ok(Context::C2),
271-
_ => Err(Error::InvalidVariant(number)),
272-
}
273-
}
274-
}
275-
276217
#[test]
277218
fn check_interrupt_enum() {
278219
assert_eq!(Interrupt::I1.number(), 1);

0 commit comments

Comments
 (0)