11#![ no_std]
22
3+ pub use riscv_pac_macros:: * ;
4+
35/// Trait for enums of target-specific exception numbers.
46///
57/// This trait should be implemented by a peripheral access crate (PAC) on its enum of available
@@ -133,23 +135,22 @@ pub unsafe trait HartIdNumber: Copy {
133135mod test {
134136 use super :: * ;
135137
136- #[ derive( Clone , Copy , Debug , Eq , PartialEq ) ]
138+ #[ derive( Clone , Copy , Debug , Eq , PartialEq , ExceptionNumber ) ]
137139 #[ repr( u16 ) ]
138140 enum Exception {
139141 E1 = 1 ,
140142 E3 = 3 ,
141143 }
142144
143- #[ derive( Clone , Copy , Debug , Eq , PartialEq ) ]
145+ #[ derive( Clone , Copy , Debug , Eq , PartialEq , InterruptNumber ) ]
144146 #[ repr( u16 ) ]
145147 enum Interrupt {
146148 I1 = 1 ,
147149 I2 = 2 ,
148- I3 = 3 ,
149150 I4 = 4 ,
150151 }
151152
152- #[ derive( Clone , Copy , Debug , Eq , PartialEq ) ]
153+ #[ derive( Clone , Copy , Debug , Eq , PartialEq , PriorityNumber ) ]
153154 #[ repr( u8 ) ]
154155 enum Priority {
155156 P0 = 0 ,
@@ -158,118 +159,37 @@ mod test {
158159 P3 = 3 ,
159160 }
160161
161- #[ derive( Clone , Copy , Debug , Eq , PartialEq ) ]
162+ #[ derive( Clone , Copy , Debug , Eq , PartialEq , HartIdNumber ) ]
162163 #[ repr( u16 ) ]
163- enum Context {
164- C0 = 0 ,
165- C1 = 1 ,
166- C2 = 2 ,
167- }
168-
169- unsafe impl ExceptionNumber for Exception {
170- const MAX_EXCEPTION_NUMBER : u16 = Self :: E3 as u16 ;
171-
172- #[ inline]
173- fn number ( self ) -> u16 {
174- self as _
175- }
176-
177- #[ inline]
178- fn from_number ( number : u16 ) -> Result < Self , u16 > {
179- if number > Self :: MAX_EXCEPTION_NUMBER || number == 0 {
180- Err ( number)
181- } else if number == 1 || number == 3 {
182- // SAFETY: valid exception number
183- Ok ( unsafe { core:: mem:: transmute ( number) } )
184- } else {
185- Err ( number)
186- }
187- }
188- }
189-
190- unsafe impl InterruptNumber for Interrupt {
191- const MAX_INTERRUPT_NUMBER : u16 = Self :: I4 as u16 ;
192-
193- #[ inline]
194- fn number ( self ) -> u16 {
195- self as _
196- }
197-
198- #[ inline]
199- fn from_number ( number : u16 ) -> Result < Self , u16 > {
200- if number > Self :: MAX_INTERRUPT_NUMBER || number == 0 {
201- Err ( number)
202- } else {
203- // SAFETY: valid interrupt number
204- Ok ( unsafe { core:: mem:: transmute ( number) } )
205- }
206- }
207- }
208-
209- unsafe impl PriorityNumber for Priority {
210- const MAX_PRIORITY_NUMBER : u8 = Self :: P3 as u8 ;
211-
212- #[ inline]
213- fn number ( self ) -> u8 {
214- self as _
215- }
216-
217- #[ inline]
218- fn from_number ( number : u8 ) -> Result < Self , u8 > {
219- if number > Self :: MAX_PRIORITY_NUMBER {
220- Err ( number)
221- } else {
222- // SAFETY: valid priority number
223- Ok ( unsafe { core:: mem:: transmute ( number) } )
224- }
225- }
226- }
227-
228- unsafe impl HartIdNumber for Context {
229- const MAX_HART_ID_NUMBER : u16 = Self :: C2 as u16 ;
230-
231- #[ inline]
232- fn number ( self ) -> u16 {
233- self as _
234- }
235-
236- #[ inline]
237- fn from_number ( number : u16 ) -> Result < Self , u16 > {
238- if number > Self :: MAX_HART_ID_NUMBER {
239- Err ( number)
240- } else {
241- // SAFETY: valid context number
242- Ok ( unsafe { core:: mem:: transmute ( number) } )
243- }
244- }
164+ enum HartId {
165+ H0 = 0 ,
166+ H1 = 1 ,
167+ H2 = 2 ,
245168 }
246169
247170 #[ test]
248171 fn check_exception_enum ( ) {
249172 assert_eq ! ( Exception :: E1 . number( ) , 1 ) ;
250173 assert_eq ! ( Exception :: E3 . number( ) , 3 ) ;
251174
252- assert_eq ! ( Exception :: from_number( 1 ) , Ok ( Exception :: E1 ) ) ;
253- assert_eq ! ( Exception :: from_number( 3 ) , Ok ( Exception :: E3 ) ) ;
254-
255175 assert_eq ! ( Exception :: from_number( 0 ) , Err ( 0 ) ) ;
176+ assert_eq ! ( Exception :: from_number( 1 ) , Ok ( Exception :: E1 ) ) ;
256177 assert_eq ! ( Exception :: from_number( 2 ) , Err ( 2 ) ) ;
178+ assert_eq ! ( Exception :: from_number( 3 ) , Ok ( Exception :: E3 ) ) ;
257179 assert_eq ! ( Exception :: from_number( 4 ) , Err ( 4 ) ) ;
258180 }
259181
260182 #[ test]
261183 fn check_interrupt_enum ( ) {
262184 assert_eq ! ( Interrupt :: I1 . number( ) , 1 ) ;
263185 assert_eq ! ( Interrupt :: I2 . number( ) , 2 ) ;
264- assert_eq ! ( Interrupt :: I3 . number( ) , 3 ) ;
265186 assert_eq ! ( Interrupt :: I4 . number( ) , 4 ) ;
266187
188+ assert_eq ! ( Interrupt :: from_number( 0 ) , Err ( 0 ) ) ;
267189 assert_eq ! ( Interrupt :: from_number( 1 ) , Ok ( Interrupt :: I1 ) ) ;
268190 assert_eq ! ( Interrupt :: from_number( 2 ) , Ok ( Interrupt :: I2 ) ) ;
269- assert_eq ! ( Interrupt :: from_number( 3 ) , Ok ( Interrupt :: I3 ) ) ;
191+ assert_eq ! ( Interrupt :: from_number( 3 ) , Err ( 3 ) ) ;
270192 assert_eq ! ( Interrupt :: from_number( 4 ) , Ok ( Interrupt :: I4 ) ) ;
271-
272- assert_eq ! ( Interrupt :: from_number( 0 ) , Err ( 0 ) ) ;
273193 assert_eq ! ( Interrupt :: from_number( 5 ) , Err ( 5 ) ) ;
274194 }
275195
@@ -284,20 +204,18 @@ mod test {
284204 assert_eq ! ( Priority :: from_number( 1 ) , Ok ( Priority :: P1 ) ) ;
285205 assert_eq ! ( Priority :: from_number( 2 ) , Ok ( Priority :: P2 ) ) ;
286206 assert_eq ! ( Priority :: from_number( 3 ) , Ok ( Priority :: P3 ) ) ;
287-
288207 assert_eq ! ( Priority :: from_number( 4 ) , Err ( 4 ) ) ;
289208 }
290209
291210 #[ test]
292- fn check_context_enum ( ) {
293- assert_eq ! ( Context :: C0 . number( ) , 0 ) ;
294- assert_eq ! ( Context :: C1 . number( ) , 1 ) ;
295- assert_eq ! ( Context :: C2 . number( ) , 2 ) ;
296-
297- assert_eq ! ( Context :: from_number( 0 ) , Ok ( Context :: C0 ) ) ;
298- assert_eq ! ( Context :: from_number( 1 ) , Ok ( Context :: C1 ) ) ;
299- assert_eq ! ( Context :: from_number( 2 ) , Ok ( Context :: C2 ) ) ;
300-
301- assert_eq ! ( Context :: from_number( 3 ) , Err ( 3 ) ) ;
211+ fn check_hart_id_enum ( ) {
212+ assert_eq ! ( HartId :: H0 . number( ) , 0 ) ;
213+ assert_eq ! ( HartId :: H1 . number( ) , 1 ) ;
214+ assert_eq ! ( HartId :: H2 . number( ) , 2 ) ;
215+
216+ assert_eq ! ( HartId :: from_number( 0 ) , Ok ( HartId :: H0 ) ) ;
217+ assert_eq ! ( HartId :: from_number( 1 ) , Ok ( HartId :: H1 ) ) ;
218+ assert_eq ! ( HartId :: from_number( 2 ) , Ok ( HartId :: H2 ) ) ;
219+ assert_eq ! ( HartId :: from_number( 3 ) , Err ( 3 ) ) ;
302220 }
303221}
0 commit comments