@@ -620,8 +620,9 @@ pub fn fields(
620
620
621
621
// Hack for #625
622
622
let mut enum_derives = HashSet :: new ( ) ;
623
+ let mut read_enum_derives = HashSet :: new ( ) ;
624
+ let mut write_enum_derives = HashSet :: new ( ) ;
623
625
let mut reader_derives = HashSet :: new ( ) ;
624
- let mut writer_enum_derives = HashSet :: new ( ) ;
625
626
let mut writer_derives = HashSet :: new ( ) ;
626
627
627
628
// TODO enumeratedValues
@@ -737,32 +738,31 @@ pub fn fields(
737
738
738
739
// If this field can be read, generate read proxy structure and value structure.
739
740
if can_read {
740
- // get the type of value structure. It can be generated from either name field
741
- // in enumeratedValues if it's an enumeration, or from field name directly if it's not.
741
+ // collect information on items in enumeration to generate it later.
742
+ let mut enum_items = TokenStream :: new ( ) ;
743
+
744
+ // if this is an enumeratedValues not derived from base, generate the enum structure
745
+ // and implement functions for each value in enumeration.
742
746
let value_read_ty = if let Some ( ev) = rwenum. read_enum ( ) {
743
- let fmt = if rwenum. different_enums ( ) {
744
- "enum_read_name"
747
+ let derives;
748
+ let fmt;
749
+ if rwenum. different_enums ( ) {
750
+ derives = & mut read_enum_derives;
751
+ fmt = "enum_read_name" ;
745
752
} else {
746
- "enum_name"
753
+ derives = & mut enum_derives;
754
+ fmt = "enum_name" ;
747
755
} ;
748
- ident (
756
+ // get the type of value structure. It can be generated from either name field
757
+ // in enumeratedValues if it's an enumeration, or from field name directly if it's not.
758
+ let value_read_ty = ident (
749
759
ev. values ( ) . name . as_deref ( ) . unwrap_or ( & name) ,
750
760
config,
751
761
fmt,
752
762
span,
753
- )
754
- } else {
755
- // raw_field_value_read_ty
756
- fty. clone ( )
757
- } ;
758
-
759
- // collect information on items in enumeration to generate it later.
760
- let mut enum_items = TokenStream :: new ( ) ;
763
+ ) ;
761
764
762
- if let Some ( ev) = rwenum. read_enum ( ) {
763
765
match ev {
764
- // if this is an enumeratedValues not derived from base, generate the enum structure
765
- // and implement functions for each value in enumeration.
766
766
EV :: New ( evs) => {
767
767
// parse enum variants from enumeratedValues svd record
768
768
let mut variants = Variant :: from_enumerated_values ( evs, config) ?;
@@ -909,24 +909,22 @@ pub fn fields(
909
909
}
910
910
}
911
911
EV :: Derived ( _, base) => {
912
- // only pub use enum when derived from another register.
913
- // If field is in the same register it emits
914
- // pub use enum from same module which is not expected
915
- if base. register ( ) != fpath. register ( ) {
916
- // use the same enum structure name
917
- if !enum_derives. contains ( & value_read_ty) {
918
- let base_path =
919
- base_syn_path ( base, & fpath, & value_read_ty, config) ?;
920
- mod_items. extend ( quote ! {
921
- #[ doc = #description]
922
- pub use #base_path as #value_read_ty;
923
- } ) ;
924
- enum_derives. insert ( value_read_ty. clone ( ) ) ;
925
- }
912
+ let base_ident = ident ( & base. name , config, fmt, span) ;
913
+ if !derives. contains ( & value_read_ty) {
914
+ let base_path = base_syn_path ( base, & fpath, & base_ident, config) ?;
915
+ mod_items. extend ( quote ! {
916
+ #[ doc = #description]
917
+ pub use #base_path as #value_read_ty;
918
+ } ) ;
926
919
}
927
920
}
928
921
}
929
- }
922
+ derives. insert ( value_read_ty. clone ( ) ) ;
923
+ value_read_ty
924
+ } else {
925
+ // raw_field_value_read_ty
926
+ fty. clone ( )
927
+ } ;
930
928
931
929
// get a brief description for this field
932
930
// the suffix string from field name is removed in brief description.
@@ -1083,29 +1081,28 @@ pub fn fields(
1083
1081
// If this field can be written, generate write proxy. Generate write value if it differs from
1084
1082
// the read value, or else we reuse read value.
1085
1083
if can_write {
1084
+ let mut proxy_items = TokenStream :: new ( ) ;
1085
+ let mut unsafety = unsafety ( f. write_constraint . as_ref ( ) , width) ;
1086
+
1087
+ // if we writes to enumeratedValues, generate its structure if it differs from read structure.
1086
1088
let value_write_ty = if let Some ( ev) = rwenum. write_enum ( ) {
1087
- let fmt = if rwenum. different_enums ( ) {
1088
- "enum_write_name"
1089
+ let derives;
1090
+ let fmt;
1091
+ if rwenum. different_enums ( ) {
1092
+ derives = & mut write_enum_derives;
1093
+ fmt = "enum_write_name" ;
1089
1094
} else {
1090
- "enum_name"
1095
+ derives = & mut enum_derives;
1096
+ fmt = "enum_name" ;
1091
1097
} ;
1092
- ident (
1098
+ let value_write_ty = ident (
1093
1099
ev. values ( ) . name . as_deref ( ) . unwrap_or ( & name) ,
1094
1100
config,
1095
1101
fmt,
1096
1102
span,
1097
- )
1098
- } else {
1099
- // raw_field_value_write_ty
1100
- fty. clone ( )
1101
- } ;
1103
+ ) ;
1102
1104
1103
- let mut proxy_items = TokenStream :: new ( ) ;
1104
- let mut unsafety = unsafety ( f. write_constraint . as_ref ( ) , width) ;
1105
-
1106
- if let Some ( ev) = rwenum. write_enum ( ) {
1107
1105
match ev {
1108
- // if we writes to enumeratedValues, generate its structure if it differs from read structure.
1109
1106
EV :: New ( evs) => {
1110
1107
// parse variants from enumeratedValues svd record
1111
1108
let mut variants = Variant :: from_enumerated_values ( evs, config) ?;
@@ -1167,24 +1164,23 @@ pub fn fields(
1167
1164
}
1168
1165
}
1169
1166
EV :: Derived ( _, base) => {
1170
- // If field is in the same register it emits pub use structure from same module.
1171
- if base. register ( ) != fpath. register ( ) {
1172
- // use the same enum structure name
1173
- if rwenum. generate_write_enum ( )
1174
- && !writer_enum_derives. contains ( & value_write_ty)
1175
- {
1176
- let base_path =
1177
- base_syn_path ( base, & fpath, & value_write_ty, config) ?;
1178
- mod_items. extend ( quote ! {
1179
- #[ doc = #description]
1180
- pub use #base_path as #value_write_ty;
1181
- } ) ;
1182
- writer_enum_derives. insert ( value_write_ty. clone ( ) ) ;
1183
- }
1167
+ let base_ident = ident ( & base. name , config, fmt, span) ;
1168
+
1169
+ if rwenum. generate_write_enum ( ) && !derives. contains ( & value_write_ty) {
1170
+ let base_path = base_syn_path ( base, & fpath, & base_ident, config) ?;
1171
+ mod_items. extend ( quote ! {
1172
+ #[ doc = #description]
1173
+ pub use #base_path as #value_write_ty;
1174
+ } ) ;
1184
1175
}
1185
1176
}
1186
1177
}
1187
- }
1178
+ derives. insert ( value_write_ty. clone ( ) ) ;
1179
+ value_write_ty
1180
+ } else {
1181
+ // raw_field_value_write_ty
1182
+ fty. clone ( )
1183
+ } ;
1188
1184
1189
1185
let mwv = f. modified_write_values . or ( rmwv) . unwrap_or_default ( ) ;
1190
1186
@@ -1238,11 +1234,6 @@ pub fn fields(
1238
1234
} ) ;
1239
1235
}
1240
1236
Some ( EV :: Derived ( _, base) ) => {
1241
- // if base.register == None, derive write from the same module. This is allowed because both
1242
- // the generated and source write proxy are in the same module.
1243
- // we never reuse writer for writer in different module does not have the same _SPEC strcuture,
1244
- // thus we cannot write to current register using re-exported write proxy.
1245
-
1246
1237
// generate pub use field_1 writer as field_2 writer
1247
1238
let base_field = util:: replace_suffix ( & base. field . name , "" ) ;
1248
1239
let base_w = ident ( & base_field, config, "field_writer" , span) ;
0 commit comments