@@ -510,16 +510,38 @@ fn render_register_mod_debug(
510
510
Ok ( r_debug_impl)
511
511
}
512
512
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
+ }
514
535
536
+ #[ derive( Clone , Copy , Debug ) ]
515
537
pub 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 > ) ,
521
543
ReadRaw ,
522
- WriteEnum ( & ' a EV ) ,
544
+ WriteEnum ( EV < ' a > ) ,
523
545
WriteRaw ,
524
546
ReadRawWriteRaw ,
525
547
}
@@ -549,48 +571,24 @@ impl<'a> RWEnum<'a> {
549
571
pub fn can_write ( & self ) -> bool {
550
572
self . read_write ( ) || self . write_only ( )
551
573
}
552
- pub fn read_enum ( & self ) -> Option < & ' a EV > {
553
- match * self {
574
+ pub fn read_enum ( & self ) -> Option < EV < ' a > > {
575
+ match self {
554
576
Self :: ReadAndWriteEnum ( e)
555
577
| Self :: ReadEnumWriteEnum ( e, _)
556
578
| Self :: ReadEnumWriteRaw ( e)
557
- | Self :: ReadEnum ( e) => Some ( e) ,
579
+ | Self :: ReadEnum ( e) => Some ( * e) ,
558
580
_ => None ,
559
581
}
560
582
}
561
- pub fn write_enum ( & self ) -> Option < & ' a EV > {
562
- match * self {
583
+ pub fn write_enum ( & self ) -> Option < EV < ' a > > {
584
+ match self {
563
585
Self :: ReadAndWriteEnum ( e)
564
586
| Self :: ReadEnumWriteEnum ( _, e)
565
587
| Self :: ReadRawWriteEnum ( e)
566
- | Self :: WriteEnum ( e) => Some ( e) ,
588
+ | Self :: WriteEnum ( e) => Some ( * e) ,
567
589
_ => None ,
568
590
}
569
591
}
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
- }
594
592
pub fn generate_write_enum ( & self ) -> bool {
595
593
matches ! (
596
594
self ,
@@ -707,13 +705,13 @@ pub fn fields(
707
705
can_write,
708
706
lookup_filter ( & lookup_results, Usage :: Write ) ,
709
707
) {
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 ( ) ) ,
715
713
( true , None , false , _) => RWEnum :: ReadRaw ,
716
- ( false , _, true , Some ( e) ) => RWEnum :: WriteEnum ( e) ,
714
+ ( false , _, true , Some ( e) ) => RWEnum :: WriteEnum ( e. into ( ) ) ,
717
715
( false , _, true , None ) => RWEnum :: WriteRaw ,
718
716
( true , None , true , None ) => RWEnum :: ReadRawWriteRaw ,
719
717
( false , _, false , _) => {
@@ -736,13 +734,18 @@ pub fn fields(
736
734
if can_read {
737
735
// get the type of value structure. It can be generated from either name field
738
736
// 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 ( ) {
740
738
let fmt = if rwenum. different_enums ( ) {
741
739
"enum_read_name"
742
740
} else {
743
741
"enum_name"
744
742
} ;
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
+ )
746
749
} else {
747
750
// raw_field_value_read_ty
748
751
fty. clone ( )
@@ -753,7 +756,7 @@ pub fn fields(
753
756
754
757
// if this is an enumeratedValues not derived from base, generate the enum structure
755
758
// 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 ( ) {
757
760
// parse enum variants from enumeratedValues svd record
758
761
let mut variants = Variant :: from_enumerated_values ( evs, config) ?;
759
762
@@ -889,7 +892,7 @@ pub fn fields(
889
892
} ) ;
890
893
}
891
894
}
892
- } else if let Some ( ( _, Some ( base) ) ) = rwenum. read_enum ( ) {
895
+ } else if let Some ( EV :: Derived ( _, base) ) = rwenum. read_enum ( ) {
893
896
// only pub use enum when derived from another register.
894
897
// If field is in the same register it emits
895
898
// pub use enum from same module which is not expected
@@ -913,7 +916,7 @@ pub fn fields(
913
916
// name of read proxy type
914
917
let reader_ty = ident ( & name, config, "field_reader" , span) ;
915
918
916
- if rwenum. generate_reader ( ) {
919
+ if let Some ( EV :: New ( _ ) ) | None = rwenum. read_enum ( ) {
917
920
// Generate the read proxy structure if necessary.
918
921
919
922
let reader = if width == 1 {
@@ -940,7 +943,7 @@ pub fn fields(
940
943
#[ doc = #readerdoc]
941
944
pub type #reader_ty = #reader;
942
945
} ) ;
943
- } else if let Some ( ( _, Some ( base) ) ) = rwenum. read_enum ( ) {
946
+ } else if let Some ( EV :: Derived ( _, base) ) = rwenum. read_enum ( ) {
944
947
// if this value is derived from a base, generate `pub use` code for each read proxy
945
948
// and value if necessary.
946
949
@@ -1058,13 +1061,18 @@ pub fn fields(
1058
1061
// If this field can be written, generate write proxy. Generate write value if it differs from
1059
1062
// the read value, or else we reuse read value.
1060
1063
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 ( ) {
1062
1065
let fmt = if rwenum. different_enums ( ) {
1063
1066
"enum_write_name"
1064
1067
} else {
1065
1068
"enum_name"
1066
1069
} ;
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
+ )
1068
1076
} else {
1069
1077
// raw_field_value_write_ty
1070
1078
fty. clone ( )
@@ -1074,7 +1082,7 @@ pub fn fields(
1074
1082
let mut unsafety = unsafety ( f. write_constraint . as_ref ( ) , width) ;
1075
1083
1076
1084
// 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 ( ) {
1078
1086
// parse variants from enumeratedValues svd record
1079
1087
let mut variants = Variant :: from_enumerated_values ( evs, config) ?;
1080
1088
let map = enums_to_map ( evs) ;
@@ -1132,7 +1140,7 @@ pub fn fields(
1132
1140
}
1133
1141
} ) ;
1134
1142
}
1135
- } else if let Some ( ( _, Some ( base) ) ) = rwenum. write_enum ( ) {
1143
+ } else if let Some ( EV :: Derived ( _, base) ) = rwenum. write_enum ( ) {
1136
1144
// If field is in the same register it emits pub use structure from same module.
1137
1145
if base. register ( ) != fpath. register ( ) {
1138
1146
if rwenum. generate_write_enum ( ) {
@@ -1158,7 +1166,7 @@ pub fn fields(
1158
1166
let writer_ty = ident ( & name, config, "field_writer" , span) ;
1159
1167
1160
1168
// 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 ( ) {
1162
1170
let proxy = if width == 1 {
1163
1171
use ModifiedWriteValues :: * ;
1164
1172
let wproxy = Ident :: new (
@@ -1198,7 +1206,7 @@ pub fn fields(
1198
1206
#[ doc = #field_writer_brief]
1199
1207
pub type #writer_ty<' a, REG > = #proxy;
1200
1208
} ) ;
1201
- } else if let Some ( ( _, Some ( base) ) ) = rwenum. write_enum ( ) {
1209
+ } else if let Some ( EV :: Derived ( _, base) ) = rwenum. write_enum ( ) {
1202
1210
// if base.register == None, derive write from the same module. This is allowed because both
1203
1211
// the generated and source write proxy are in the same module.
1204
1212
// we never reuse writer for writer in different module does not have the same _SPEC strcuture,
0 commit comments