@@ -510,16 +510,38 @@ fn render_register_mod_debug(
510510 Ok ( r_debug_impl)
511511}
512512
513- type EV = ( EnumeratedValues , Option < EnumPath > ) ;
513+ #[ derive( Clone , Copy , Debug ) ]
514+ pub enum EV < ' a > {
515+ New ( & ' a EnumeratedValues ) ,
516+ Derived ( & ' a EnumeratedValues , & ' a EnumPath ) ,
517+ }
518+
519+ impl < ' a > EV < ' a > {
520+ fn values ( & self ) -> & EnumeratedValues {
521+ match self {
522+ Self :: New ( e) | Self :: Derived ( e, _) => e,
523+ }
524+ }
525+ }
526+
527+ impl < ' a > From < & ' a ( EnumeratedValues , Option < EnumPath > ) > for EV < ' a > {
528+ fn from ( value : & ' a ( EnumeratedValues , Option < EnumPath > ) ) -> Self {
529+ match value. 1 . as_ref ( ) {
530+ Some ( base) => Self :: Derived ( & value. 0 , & base) ,
531+ None => Self :: New ( & value. 0 ) ,
532+ }
533+ }
534+ }
514535
536+ #[ derive( Clone , Copy , Debug ) ]
515537pub enum RWEnum < ' a > {
516- ReadAndWriteEnum ( & ' a EV ) ,
517- ReadEnumWriteEnum ( & ' a EV , & ' a EV ) ,
518- ReadEnumWriteRaw ( & ' a EV ) ,
519- ReadRawWriteEnum ( & ' a EV ) ,
520- ReadEnum ( & ' a EV ) ,
538+ ReadAndWriteEnum ( EV < ' a > ) ,
539+ ReadEnumWriteEnum ( EV < ' a > , EV < ' a > ) ,
540+ ReadEnumWriteRaw ( EV < ' a > ) ,
541+ ReadRawWriteEnum ( EV < ' a > ) ,
542+ ReadEnum ( EV < ' a > ) ,
521543 ReadRaw ,
522- WriteEnum ( & ' a EV ) ,
544+ WriteEnum ( EV < ' a > ) ,
523545 WriteRaw ,
524546 ReadRawWriteRaw ,
525547}
@@ -549,48 +571,24 @@ impl<'a> RWEnum<'a> {
549571 pub fn can_write ( & self ) -> bool {
550572 self . read_write ( ) || self . write_only ( )
551573 }
552- pub fn read_enum ( & self ) -> Option < & ' a EV > {
553- match * self {
574+ pub fn read_enum ( & self ) -> Option < EV < ' a > > {
575+ match self {
554576 Self :: ReadAndWriteEnum ( e)
555577 | Self :: ReadEnumWriteEnum ( e, _)
556578 | Self :: ReadEnumWriteRaw ( e)
557- | Self :: ReadEnum ( e) => Some ( e) ,
579+ | Self :: ReadEnum ( e) => Some ( * e) ,
558580 _ => None ,
559581 }
560582 }
561- pub fn write_enum ( & self ) -> Option < & ' a EV > {
562- match * self {
583+ pub fn write_enum ( & self ) -> Option < EV < ' a > > {
584+ match self {
563585 Self :: ReadAndWriteEnum ( e)
564586 | Self :: ReadEnumWriteEnum ( _, e)
565587 | Self :: ReadRawWriteEnum ( e)
566- | Self :: WriteEnum ( e) => Some ( e) ,
588+ | Self :: WriteEnum ( e) => Some ( * e) ,
567589 _ => None ,
568590 }
569591 }
570- pub fn generate_reader ( & self ) -> bool {
571- matches ! (
572- self ,
573- Self :: ReadAndWriteEnum ( ( _, None ) )
574- | Self :: ReadEnumWriteEnum ( ( _, None ) , _)
575- | Self :: ReadEnumWriteRaw ( ( _, None ) )
576- | Self :: ReadRawWriteEnum ( _)
577- | Self :: ReadEnum ( ( _, None ) )
578- | Self :: ReadRaw
579- | Self :: ReadRawWriteRaw
580- )
581- }
582- pub fn generate_writer ( & self ) -> bool {
583- matches ! (
584- self ,
585- Self :: ReadAndWriteEnum ( ( _, None ) )
586- | Self :: ReadEnumWriteEnum ( _, ( _, None ) )
587- | Self :: ReadRawWriteEnum ( ( _, None ) )
588- | Self :: ReadEnumWriteRaw ( _)
589- | Self :: WriteEnum ( ( _, None ) )
590- | Self :: WriteRaw
591- | Self :: ReadRawWriteRaw
592- )
593- }
594592 pub fn generate_write_enum ( & self ) -> bool {
595593 matches ! (
596594 self ,
@@ -707,13 +705,13 @@ pub fn fields(
707705 can_write,
708706 lookup_filter ( & lookup_results, Usage :: Write ) ,
709707 ) {
710- ( true , Some ( e1) , true , Some ( e2) ) if e1. 0 == e2. 0 => RWEnum :: ReadAndWriteEnum ( e1) ,
711- ( true , Some ( e1) , true , Some ( e2) ) => RWEnum :: ReadEnumWriteEnum ( e1, e2) ,
712- ( true , Some ( e) , true , None ) => RWEnum :: ReadEnumWriteRaw ( e) ,
713- ( true , None , true , Some ( e) ) => RWEnum :: ReadRawWriteEnum ( e) ,
714- ( true , Some ( e) , false , _) => RWEnum :: ReadEnum ( e) ,
708+ ( true , Some ( e1) , true , Some ( e2) ) if e1. 0 == e2. 0 => RWEnum :: ReadAndWriteEnum ( e1. into ( ) ) ,
709+ ( true , Some ( e1) , true , Some ( e2) ) => RWEnum :: ReadEnumWriteEnum ( e1. into ( ) , e2. into ( ) ) ,
710+ ( true , Some ( e) , true , None ) => RWEnum :: ReadEnumWriteRaw ( e. into ( ) ) ,
711+ ( true , None , true , Some ( e) ) => RWEnum :: ReadRawWriteEnum ( e. into ( ) ) ,
712+ ( true , Some ( e) , false , _) => RWEnum :: ReadEnum ( e. into ( ) ) ,
715713 ( true , None , false , _) => RWEnum :: ReadRaw ,
716- ( false , _, true , Some ( e) ) => RWEnum :: WriteEnum ( e) ,
714+ ( false , _, true , Some ( e) ) => RWEnum :: WriteEnum ( e. into ( ) ) ,
717715 ( false , _, true , None ) => RWEnum :: WriteRaw ,
718716 ( true , None , true , None ) => RWEnum :: ReadRawWriteRaw ,
719717 ( false , _, false , _) => {
@@ -736,13 +734,18 @@ pub fn fields(
736734 if can_read {
737735 // get the type of value structure. It can be generated from either name field
738736 // in enumeratedValues if it's an enumeration, or from field name directly if it's not.
739- let value_read_ty = if let Some ( ( evs , _ ) ) = rwenum. read_enum ( ) {
737+ let value_read_ty = if let Some ( ev ) = rwenum. read_enum ( ) {
740738 let fmt = if rwenum. different_enums ( ) {
741739 "enum_read_name"
742740 } else {
743741 "enum_name"
744742 } ;
745- ident ( evs. name . as_deref ( ) . unwrap_or ( & name) , config, fmt, span)
743+ ident (
744+ ev. values ( ) . name . as_deref ( ) . unwrap_or ( & name) ,
745+ config,
746+ fmt,
747+ span,
748+ )
746749 } else {
747750 // raw_field_value_read_ty
748751 fty. clone ( )
@@ -753,7 +756,7 @@ pub fn fields(
753756
754757 // if this is an enumeratedValues not derived from base, generate the enum structure
755758 // and implement functions for each value in enumeration.
756- if let Some ( ( evs, None ) ) = rwenum. read_enum ( ) {
759+ if let Some ( EV :: New ( evs) ) = rwenum. read_enum ( ) {
757760 // parse enum variants from enumeratedValues svd record
758761 let mut variants = Variant :: from_enumerated_values ( evs, config) ?;
759762
@@ -889,7 +892,7 @@ pub fn fields(
889892 } ) ;
890893 }
891894 }
892- } else if let Some ( ( _, Some ( base) ) ) = rwenum. read_enum ( ) {
895+ } else if let Some ( EV :: Derived ( _, base) ) = rwenum. read_enum ( ) {
893896 // only pub use enum when derived from another register.
894897 // If field is in the same register it emits
895898 // pub use enum from same module which is not expected
@@ -913,7 +916,7 @@ pub fn fields(
913916 // name of read proxy type
914917 let reader_ty = ident ( & name, config, "field_reader" , span) ;
915918
916- if rwenum. generate_reader ( ) {
919+ if let Some ( EV :: New ( _ ) ) | None = rwenum. read_enum ( ) {
917920 // Generate the read proxy structure if necessary.
918921
919922 let reader = if width == 1 {
@@ -940,7 +943,7 @@ pub fn fields(
940943 #[ doc = #readerdoc]
941944 pub type #reader_ty = #reader;
942945 } ) ;
943- } else if let Some ( ( _, Some ( base) ) ) = rwenum. read_enum ( ) {
946+ } else if let Some ( EV :: Derived ( _, base) ) = rwenum. read_enum ( ) {
944947 // if this value is derived from a base, generate `pub use` code for each read proxy
945948 // and value if necessary.
946949
@@ -1058,13 +1061,18 @@ pub fn fields(
10581061 // If this field can be written, generate write proxy. Generate write value if it differs from
10591062 // the read value, or else we reuse read value.
10601063 if can_write {
1061- let value_write_ty = if let Some ( ( evs , _ ) ) = rwenum. write_enum ( ) {
1064+ let value_write_ty = if let Some ( ev ) = rwenum. write_enum ( ) {
10621065 let fmt = if rwenum. different_enums ( ) {
10631066 "enum_write_name"
10641067 } else {
10651068 "enum_name"
10661069 } ;
1067- ident ( evs. name . as_deref ( ) . unwrap_or ( & name) , config, fmt, span)
1070+ ident (
1071+ ev. values ( ) . name . as_deref ( ) . unwrap_or ( & name) ,
1072+ config,
1073+ fmt,
1074+ span,
1075+ )
10681076 } else {
10691077 // raw_field_value_write_ty
10701078 fty. clone ( )
@@ -1074,7 +1082,7 @@ pub fn fields(
10741082 let mut unsafety = unsafety ( f. write_constraint . as_ref ( ) , width) ;
10751083
10761084 // if we writes to enumeratedValues, generate its structure if it differs from read structure.
1077- if let Some ( ( evs, None ) ) = rwenum. write_enum ( ) {
1085+ if let Some ( EV :: New ( evs) ) = rwenum. write_enum ( ) {
10781086 // parse variants from enumeratedValues svd record
10791087 let mut variants = Variant :: from_enumerated_values ( evs, config) ?;
10801088 let map = enums_to_map ( evs) ;
@@ -1132,7 +1140,7 @@ pub fn fields(
11321140 }
11331141 } ) ;
11341142 }
1135- } else if let Some ( ( _, Some ( base) ) ) = rwenum. write_enum ( ) {
1143+ } else if let Some ( EV :: Derived ( _, base) ) = rwenum. write_enum ( ) {
11361144 // If field is in the same register it emits pub use structure from same module.
11371145 if base. register ( ) != fpath. register ( ) {
11381146 if rwenum. generate_write_enum ( ) {
@@ -1158,7 +1166,7 @@ pub fn fields(
11581166 let writer_ty = ident ( & name, config, "field_writer" , span) ;
11591167
11601168 // Generate writer structure by type alias to generic write proxy structure.
1161- if rwenum. generate_writer ( ) {
1169+ if let Some ( EV :: New ( _ ) ) | None = rwenum. write_enum ( ) {
11621170 let proxy = if width == 1 {
11631171 use ModifiedWriteValues :: * ;
11641172 let wproxy = Ident :: new (
@@ -1198,7 +1206,7 @@ pub fn fields(
11981206 #[ doc = #field_writer_brief]
11991207 pub type #writer_ty<' a, REG > = #proxy;
12001208 } ) ;
1201- } else if let Some ( ( _, Some ( base) ) ) = rwenum. write_enum ( ) {
1209+ } else if let Some ( EV :: Derived ( _, base) ) = rwenum. write_enum ( ) {
12021210 // if base.register == None, derive write from the same module. This is allowed because both
12031211 // the generated and source write proxy are in the same module.
12041212 // we never reuse writer for writer in different module does not have the same _SPEC strcuture,
0 commit comments