@@ -620,8 +620,9 @@ pub fn fields(
620620
621621 // Hack for #625
622622 let mut enum_derives = HashSet :: new ( ) ;
623+ let mut read_enum_derives = HashSet :: new ( ) ;
624+ let mut write_enum_derives = HashSet :: new ( ) ;
623625 let mut reader_derives = HashSet :: new ( ) ;
624- let mut writer_enum_derives = HashSet :: new ( ) ;
625626 let mut writer_derives = HashSet :: new ( ) ;
626627
627628 // TODO enumeratedValues
@@ -737,32 +738,31 @@ pub fn fields(
737738
738739 // If this field can be read, generate read proxy structure and value structure.
739740 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.
742746 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" ;
745752 } else {
746- "enum_name"
753+ derives = & mut enum_derives;
754+ fmt = "enum_name" ;
747755 } ;
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 (
749759 ev. values ( ) . name . as_deref ( ) . unwrap_or ( & name) ,
750760 config,
751761 fmt,
752762 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+ ) ;
761764
762- if let Some ( ev) = rwenum. read_enum ( ) {
763765 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.
766766 EV :: New ( evs) => {
767767 // parse enum variants from enumeratedValues svd record
768768 let mut variants = Variant :: from_enumerated_values ( evs, config) ?;
@@ -909,24 +909,22 @@ pub fn fields(
909909 }
910910 }
911911 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+ } ) ;
926919 }
927920 }
928921 }
929- }
922+ derives. insert ( value_read_ty. clone ( ) ) ;
923+ value_read_ty
924+ } else {
925+ // raw_field_value_read_ty
926+ fty. clone ( )
927+ } ;
930928
931929 // get a brief description for this field
932930 // the suffix string from field name is removed in brief description.
@@ -1083,29 +1081,28 @@ pub fn fields(
10831081 // If this field can be written, generate write proxy. Generate write value if it differs from
10841082 // the read value, or else we reuse read value.
10851083 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.
10861088 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" ;
10891094 } else {
1090- "enum_name"
1095+ derives = & mut enum_derives;
1096+ fmt = "enum_name" ;
10911097 } ;
1092- ident (
1098+ let value_write_ty = ident (
10931099 ev. values ( ) . name . as_deref ( ) . unwrap_or ( & name) ,
10941100 config,
10951101 fmt,
10961102 span,
1097- )
1098- } else {
1099- // raw_field_value_write_ty
1100- fty. clone ( )
1101- } ;
1103+ ) ;
11021104
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 ( ) {
11071105 match ev {
1108- // if we writes to enumeratedValues, generate its structure if it differs from read structure.
11091106 EV :: New ( evs) => {
11101107 // parse variants from enumeratedValues svd record
11111108 let mut variants = Variant :: from_enumerated_values ( evs, config) ?;
@@ -1167,24 +1164,23 @@ pub fn fields(
11671164 }
11681165 }
11691166 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+ } ) ;
11841175 }
11851176 }
11861177 }
1187- }
1178+ derives. insert ( value_write_ty. clone ( ) ) ;
1179+ value_write_ty
1180+ } else {
1181+ // raw_field_value_write_ty
1182+ fty. clone ( )
1183+ } ;
11881184
11891185 let mwv = f. modified_write_values . or ( rmwv) . unwrap_or_default ( ) ;
11901186
@@ -1238,11 +1234,6 @@ pub fn fields(
12381234 } ) ;
12391235 }
12401236 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-
12461237 // generate pub use field_1 writer as field_2 writer
12471238 let base_field = util:: replace_suffix ( & base. field . name , "" ) ;
12481239 let base_w = ident ( & base_field, config, "field_writer" , span) ;
0 commit comments