@@ -359,37 +359,6 @@ pub fn fields(
359359 let _pc_r = & f. _pc_r ;
360360
361361 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-
393362 let description = & util:: escape_brackets ( & f. description ) ;
394363 let sc = & f. sc ;
395364 r_impl_items. push ( quote ! {
@@ -400,8 +369,14 @@ pub fn fields(
400369 }
401370 } ) ;
402371
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+
404378 if base. is_none ( ) {
379+ let variants = Variant :: from_enumerated_values ( evs) ?;
405380 let has_reserved_variant = evs. values . len ( ) != ( 1 << f. width ) ;
406381 let desc = format ! ( "Possible values of the field `{}`" , f. name, ) ;
407382
@@ -522,7 +497,7 @@ pub fn fields(
522497 }
523498 } ) ;
524499 }
525-
500+
526501 } else {
527502 let description = & util:: escape_brackets ( & f. description ) ;
528503 let sc = & f. sc ;
@@ -560,45 +535,7 @@ pub fn fields(
560535 let base_pc_w = base. as_ref ( ) . map ( |base| {
561536 let pc = base. field . to_sanitized_upper_case ( ) ;
562537 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 )
602539 } ) ;
603540
604541 if base. is_none ( ) {
@@ -788,6 +725,49 @@ impl Variant {
788725 }
789726}
790727
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+
791771#[ derive( Clone , Debug ) ]
792772pub struct Base < ' a > {
793773 pub peripheral : Option < & ' a str > ,
0 commit comments