@@ -277,7 +277,7 @@ pub fn fields(
277
277
let pc_r = Ident :: from ( & * format ! ( "{}R" , pc) ) ;
278
278
let _pc_r = Ident :: from ( & * format ! ( "{}_R" , pc) ) ;
279
279
let pc_w = Ident :: from ( & * format ! ( "{}W" , pc) ) ;
280
- let _pc_w = Ident :: from ( & * format ! ( "_{}W " , pc) ) ;
280
+ let _pc_w = Ident :: from ( & * format ! ( "{}_W " , pc) ) ;
281
281
let _sc = Ident :: from ( & * format ! ( "_{}" , sc) ) ;
282
282
let bits = if width == 1 {
283
283
Ident :: from ( "bit" )
@@ -359,8 +359,6 @@ pub fn fields(
359
359
let _pc_r = & f. _pc_r ;
360
360
361
361
if let Some ( ( evs, base) ) = lookup_filter ( & lookup_results, Usage :: Read ) {
362
- let variants = Variant :: from_enumerated_values ( evs) ?;
363
-
364
362
if let Some ( base) = & base {
365
363
let pc = base. field . to_sanitized_upper_case ( ) ;
366
364
let base_pc_r = Ident :: from ( & * format ! ( "{}_R" , pc) ) ;
@@ -402,7 +400,9 @@ pub fn fields(
402
400
}
403
401
} ) ;
404
402
403
+ let variants = Variant :: from_enumerated_values ( evs) ?;
405
404
if base. is_none ( ) {
405
+ let has_reserved_variant = evs. values . len ( ) != ( 1 << f. width ) ;
406
406
let desc = format ! ( "Possible values of the field `{}`" , f. name, ) ;
407
407
408
408
let vars = variants
@@ -447,6 +447,53 @@ pub fn fields(
447
447
}
448
448
} ) ;
449
449
450
+ let mut arms = variants
451
+ . iter ( )
452
+ . map ( |v| {
453
+ let i = util:: unsuffixed_or_bool ( v. value , f. width ) ;
454
+ let pc = & v. pc ;
455
+
456
+ if has_reserved_variant {
457
+ quote ! { #i => Val ( #pc_r:: #pc) }
458
+ } else {
459
+ quote ! { #i => #pc_r:: #pc }
460
+ }
461
+ } )
462
+ . collect :: < Vec < _ > > ( ) ;
463
+
464
+ if has_reserved_variant {
465
+ arms. push ( quote ! {
466
+ i => Res ( i)
467
+ } ) ;
468
+ } else if 1 << f. width . to_ty_width ( ) ? != variants. len ( ) {
469
+ arms. push ( quote ! {
470
+ _ => unreachable!( )
471
+ } ) ;
472
+ }
473
+
474
+ if has_reserved_variant {
475
+ enum_items. push ( quote ! {
476
+ ///Enumerated values
477
+ #[ inline( always) ]
478
+ pub fn variant( & self ) -> crate :: Variant <#fty, #pc_r> {
479
+ use crate :: Variant :: * ;
480
+ match self . bits( ) {
481
+ #( #arms) , *
482
+ }
483
+ }
484
+ } ) ;
485
+ } else {
486
+ enum_items. push ( quote ! {
487
+ ///Enumerated values
488
+ #[ inline( always) ]
489
+ pub fn variant( & self ) -> #pc_r {
490
+ match self . bits( ) {
491
+ #( #arms) , *
492
+ }
493
+ }
494
+ } ) ;
495
+ }
496
+
450
497
for v in & variants {
451
498
let pc = & v. pc ;
452
499
let sc = & v. sc ;
@@ -578,11 +625,9 @@ pub fn fields(
578
625
} ) ;
579
626
580
627
mod_items. push ( quote ! {
581
- impl #pc_w {
582
- #[ allow( missing_docs) ]
583
- #[ doc( hidden) ]
628
+ impl crate :: ToBits <#fty> for #pc_w {
584
629
#[ inline( always) ]
585
- pub fn _bits( & self ) -> #fty {
630
+ fn _bits( & self ) -> #fty {
586
631
match * self {
587
632
#( #arms) , *
588
633
}
@@ -595,6 +640,7 @@ pub fn fields(
595
640
///Writes `variant` to the field
596
641
#[ inline( always) ]
597
642
pub fn variant( self , variant: #pc_w) -> & ' a mut W {
643
+ use crate :: ToBits ;
598
644
#unsafety {
599
645
self . #bits( variant. _bits( ) )
600
646
}
0 commit comments