@@ -359,37 +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
- if let Some ( base) = & base {
363
- let pc = base. field . to_sanitized_upper_case ( ) ;
364
- let base_pc_r = Ident :: from ( & * format ! ( "{}_R" , pc) ) ;
365
- let desc = format ! ( "Possible values of the field `{}`" , f. name, ) ;
366
-
367
- if let ( Some ( peripheral) , Some ( register) ) = ( & base. peripheral , & base. register ) {
368
- let pmod_ = peripheral. to_sanitized_snake_case ( ) ;
369
- let rmod_ = register. to_sanitized_snake_case ( ) ;
370
- let pmod_ = Ident :: from ( & * pmod_) ;
371
- let rmod_ = Ident :: from ( & * rmod_) ;
372
-
373
- mod_items. push ( quote ! {
374
- #[ doc = #desc]
375
- pub type #_pc_r = crate :: #pmod_:: #rmod_:: #base_pc_r;
376
- } ) ;
377
- } else if let Some ( register) = & base. register {
378
- let mod_ = register. to_sanitized_snake_case ( ) ;
379
- let mod_ = Ident :: from ( & * mod_) ;
380
-
381
- mod_items. push ( quote ! {
382
- #[ doc = #desc]
383
- pub type #_pc_r = super :: #mod_:: #base_pc_r;
384
- } ) ;
385
- } else {
386
- mod_items. push ( quote ! {
387
- #[ doc = #desc]
388
- pub type #_pc_r = #base_pc_r;
389
- } ) ;
390
- }
391
- }
392
-
393
362
let description = & util:: escape_brackets ( & f. description ) ;
394
363
let sc = & f. sc ;
395
364
r_impl_items. push ( quote ! {
@@ -400,8 +369,14 @@ pub fn fields(
400
369
}
401
370
} ) ;
402
371
403
- let variants = Variant :: from_enumerated_values ( evs) ?;
372
+ if let Some ( base) = & base {
373
+ let pc = base. field . to_sanitized_upper_case ( ) ;
374
+ let base_pc_r = Ident :: from ( & * format ! ( "{}_R" , pc) ) ;
375
+ derive_from_base ( mod_items, & base, & _pc_r, & base_pc_r, f. name ) ;
376
+ }
377
+
404
378
if base. is_none ( ) {
379
+ let variants = Variant :: from_enumerated_values ( evs) ?;
405
380
let has_reserved_variant = evs. values . len ( ) != ( 1 << f. width ) ;
406
381
let desc = format ! ( "Possible values of the field `{}`" , f. name, ) ;
407
382
@@ -522,7 +497,7 @@ pub fn fields(
522
497
}
523
498
} ) ;
524
499
}
525
-
500
+
526
501
} else {
527
502
let description = & util:: escape_brackets ( & f. description ) ;
528
503
let sc = & f. sc ;
@@ -560,45 +535,7 @@ pub fn fields(
560
535
let base_pc_w = base. as_ref ( ) . map ( |base| {
561
536
let pc = base. field . to_sanitized_upper_case ( ) ;
562
537
let base_pc_w = Ident :: from ( & * format ! ( "{}W" , pc) ) ;
563
-
564
- if let ( Some ( peripheral) , Some ( register) ) = ( & base. peripheral , & base. register ) {
565
- let pmod_ = peripheral. to_sanitized_snake_case ( ) ;
566
- let rmod_ = register. to_sanitized_snake_case ( ) ;
567
- let pmod_ = Ident :: from ( & * pmod_) ;
568
- let rmod_ = Ident :: from ( & * rmod_) ;
569
-
570
- mod_items. push ( quote ! {
571
- #[ doc = #pc_w_doc]
572
- pub type #pc_w =
573
- crate :: #pmod_:: #rmod_:: #base_pc_w;
574
- } ) ;
575
-
576
- quote ! {
577
- crate :: #pmod_:: #rmod_:: #base_pc_w
578
- }
579
- } else if let Some ( register) = & base. register {
580
- let mod_ = register. to_sanitized_snake_case ( ) ;
581
- let mod_ = Ident :: from ( & * mod_) ;
582
-
583
- mod_items. push ( quote ! {
584
- #[ doc = #pc_w_doc]
585
- pub type #pc_w =
586
- super :: #mod_:: #base_pc_w;
587
- } ) ;
588
-
589
- quote ! {
590
- super :: #mod_:: #base_pc_w
591
- }
592
- } else {
593
- mod_items. push ( quote ! {
594
- #[ doc = #pc_w_doc]
595
- pub type #pc_w = #base_pc_w;
596
- } ) ;
597
-
598
- quote ! {
599
- #base_pc_w
600
- }
601
- }
538
+ derive_from_base ( mod_items, & base, & pc_w, & base_pc_w, f. name )
602
539
} ) ;
603
540
604
541
if base. is_none ( ) {
@@ -788,6 +725,49 @@ impl Variant {
788
725
}
789
726
}
790
727
728
+ fn derive_from_base ( mod_items : & mut Vec < Tokens > , base : & Base , pc : & Ident , base_pc : & Ident , fname : & str ) -> quote:: Tokens {
729
+ let desc = format ! ( "Possible values of the field `{}`" , fname, ) ;
730
+
731
+ if let ( Some ( peripheral) , Some ( register) ) = ( & base. peripheral , & base. register ) {
732
+ let pmod_ = peripheral. to_sanitized_snake_case ( ) ;
733
+ let rmod_ = register. to_sanitized_snake_case ( ) ;
734
+ let pmod_ = Ident :: from ( & * pmod_) ;
735
+ let rmod_ = Ident :: from ( & * rmod_) ;
736
+
737
+ mod_items. push ( quote ! {
738
+ #[ doc = #desc]
739
+ pub type #pc =
740
+ crate :: #pmod_:: #rmod_:: #base_pc;
741
+ } ) ;
742
+
743
+ quote ! {
744
+ crate :: #pmod_:: #rmod_:: #base_pc
745
+ }
746
+ } else if let Some ( register) = & base. register {
747
+ let mod_ = register. to_sanitized_snake_case ( ) ;
748
+ let mod_ = Ident :: from ( & * mod_) ;
749
+
750
+ mod_items. push ( quote ! {
751
+ #[ doc = #desc]
752
+ pub type #pc =
753
+ super :: #mod_:: #base_pc;
754
+ } ) ;
755
+
756
+ quote ! {
757
+ super :: #mod_:: #base_pc
758
+ }
759
+ } else {
760
+ mod_items. push ( quote ! {
761
+ #[ doc = #desc]
762
+ pub type #pc = #base_pc;
763
+ } ) ;
764
+
765
+ quote ! {
766
+ #base_pc
767
+ }
768
+ }
769
+ }
770
+
791
771
#[ derive( Clone , Debug ) ]
792
772
pub struct Base < ' a > {
793
773
pub peripheral : Option < & ' a str > ,
0 commit comments