@@ -255,10 +255,10 @@ pub fn fields(
255
255
} = f. bit_range ;
256
256
let sc = f. name . to_sanitized_snake_case ( ) ;
257
257
let pc = f. name . to_sanitized_upper_case ( ) ;
258
- let pc_r = Ident :: from ( & * format ! ( "{}R " , pc) ) ;
258
+ let pc_r = Ident :: from ( & * format ! ( "{}_A " , pc) ) ;
259
259
let _pc_r = Ident :: from ( & * format ! ( "{}_R" , pc) ) ;
260
- let pc_w = Ident :: from ( & * format ! ( "{}W " , pc) ) ;
261
- let _pc_w = Ident :: from ( & * format ! ( "_{}W " , pc) ) ;
260
+ let pc_w = Ident :: from ( & * format ! ( "{}_AW " , pc) ) ;
261
+ let _pc_w = Ident :: from ( & * format ! ( "{}_W " , pc) ) ;
262
262
let _sc = Ident :: from ( & * format ! ( "_{}" , sc) ) ;
263
263
let bits = if width == 1 {
264
264
Ident :: from ( "bit" )
@@ -319,6 +319,16 @@ pub fn fields(
319
319
all_peripherals,
320
320
) ?;
321
321
322
+
323
+ let pc_r = & f. pc_r ;
324
+ let mut pc_w = & f. pc_r ;
325
+
326
+ let mut base_pc_w = None ;
327
+ let mut evs_r = None ;
328
+
329
+ let _pc_r = & f. _pc_r ;
330
+ let _pc_w = & f. _pc_w ;
331
+
322
332
if can_read {
323
333
let cast = if f. width == 1 {
324
334
quote ! { != 0 }
@@ -328,18 +338,17 @@ pub fn fields(
328
338
let value = if offset != 0 {
329
339
let offset = & f. offset ;
330
340
quote ! {
331
- ( ( self . bits( ) >> #offset) & #mask) #cast
341
+ ( ( self . bits >> #offset) & #mask) #cast
332
342
}
333
343
} else {
334
344
quote ! {
335
- ( self . bits( ) & #mask) #cast
345
+ ( self . bits & #mask) #cast
336
346
}
337
347
} ;
338
348
339
- let pc_r = & f. pc_r ;
340
- let _pc_r = & f. _pc_r ;
341
-
342
349
if let Some ( ( evs, base) ) = lookup_filter ( & lookup_results, Usage :: Read ) {
350
+ evs_r = Some ( evs. clone ( ) ) ;
351
+
343
352
let description = & util:: escape_brackets ( & f. description ) ;
344
353
let sc = & f. sc ;
345
354
r_impl_items. push ( quote ! {
@@ -350,11 +359,18 @@ pub fn fields(
350
359
}
351
360
} ) ;
352
361
353
- if let Some ( base) = & base {
362
+ base_pc_w = base. as_ref ( ) . map ( | base| {
354
363
let pc = base. field . to_sanitized_upper_case ( ) ;
355
- let base_pc_r = Ident :: from ( & * format ! ( "{}_R" , pc) ) ;
356
- derive_from_base ( mod_items, & base, & _pc_r, & base_pc_r, f. name ) ;
357
- }
364
+ let base_pc_r = Ident :: from ( & * format ! ( "{}_A" , pc) ) ;
365
+ let base_pc_r = derive_from_base ( mod_items, & base, & pc_r, & base_pc_r, f. name ) ;
366
+
367
+ mod_items. push ( quote ! {
368
+ ///Reader of the field
369
+ pub type #_pc_r = crate :: FR <#fty, #base_pc_r>;
370
+ } ) ;
371
+
372
+ base_pc_r
373
+ } ) ;
358
374
359
375
if base. is_none ( ) {
360
376
let has_reserved_variant = evs. values . len ( ) != ( 1 << f. width ) ;
@@ -394,7 +410,7 @@ pub fn fields(
394
410
#[ inline( always) ]
395
411
pub fn variant( & self ) -> crate :: Variant <#fty, #pc_r> {
396
412
use crate :: Variant :: * ;
397
- match self . bits( ) {
413
+ match self . bits {
398
414
#( #arms) , *
399
415
}
400
416
}
@@ -404,7 +420,7 @@ pub fn fields(
404
420
///Enumerated values
405
421
#[ inline( always) ]
406
422
pub fn variant( & self ) -> #pc_r {
407
- match self . bits( ) {
423
+ match self . bits {
408
424
#( #arms) , *
409
425
}
410
426
}
@@ -471,16 +487,19 @@ pub fn fields(
471
487
if variants. len ( ) == 1 << f. width {
472
488
unsafety = None ;
473
489
}
474
- let pc_w = & f. pc_w ;
475
490
476
- let base_pc_w = base. as_ref ( ) . map ( |base| {
477
- let pc = base. field . to_sanitized_upper_case ( ) ;
478
- let base_pc_w = Ident :: from ( & * format ! ( "{}W" , pc) ) ;
479
- derive_from_base ( mod_items, & base, & pc_w, & base_pc_w, f. name )
480
- } ) ;
491
+ if Some ( evs) != evs_r. as_ref ( ) {
492
+ pc_w = & f. pc_w ;
481
493
482
- if base. is_none ( ) {
483
- add_from_variants ( mod_items, & variants, pc_w, & f) ;
494
+ base_pc_w = base. as_ref ( ) . map ( |base| {
495
+ let pc = base. field . to_sanitized_upper_case ( ) ;
496
+ let base_pc_w = Ident :: from ( & * format ! ( "{}_AW" , pc) ) ;
497
+ derive_from_base ( mod_items, & base, & pc_w, & base_pc_w, f. name )
498
+ } ) ;
499
+
500
+ if base. is_none ( ) {
501
+ add_from_variants ( mod_items, & variants, pc_w, & f) ;
502
+ }
484
503
}
485
504
486
505
proxy_items. push ( quote ! {
@@ -556,7 +575,6 @@ pub fn fields(
556
575
}
557
576
} ) ;
558
577
559
- let _pc_w = & f. _pc_w ;
560
578
mod_items. push ( quote ! {
561
579
///Proxy
562
580
pub struct #_pc_w<' a> {
0 commit comments