@@ -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,35 @@ 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 (
749- ev. values ( ) . name . as_deref ( ) . unwrap_or ( & name) ,
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 (
759+ if config. field_names_for_enums {
760+ & name
761+ } else {
762+ ev. values ( ) . name . as_deref ( ) . unwrap_or ( & name)
763+ } ,
750764 config,
751765 fmt,
752766 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 ( ) ;
767+ ) ;
761768
762- if let Some ( ev) = rwenum. read_enum ( ) {
763769 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.
766770 EV :: New ( evs) => {
767771 // parse enum variants from enumeratedValues svd record
768772 let mut variants = Variant :: from_enumerated_values ( evs, config) ?;
@@ -909,24 +913,31 @@ pub fn fields(
909913 }
910914 }
911915 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- }
916+ let base_ident = if config. field_names_for_enums {
917+ ident (
918+ & util:: replace_suffix ( & base. field ( ) . name , "" ) ,
919+ config,
920+ fmt,
921+ span,
922+ )
923+ } else {
924+ ident ( & base. name , config, fmt, span)
925+ } ;
926+ if !derives. contains ( & value_read_ty) {
927+ let base_path = base_syn_path ( base, & fpath, & base_ident, config) ?;
928+ mod_items. extend ( quote ! {
929+ #[ doc = #description]
930+ pub use #base_path as #value_read_ty;
931+ } ) ;
926932 }
927933 }
928934 }
929- }
935+ derives. insert ( value_read_ty. clone ( ) ) ;
936+ value_read_ty
937+ } else {
938+ // raw_field_value_read_ty
939+ fty. clone ( )
940+ } ;
930941
931942 // get a brief description for this field
932943 // the suffix string from field name is removed in brief description.
@@ -1083,29 +1094,32 @@ pub fn fields(
10831094 // If this field can be written, generate write proxy. Generate write value if it differs from
10841095 // the read value, or else we reuse read value.
10851096 if can_write {
1097+ let mut proxy_items = TokenStream :: new ( ) ;
1098+ let mut unsafety = unsafety ( f. write_constraint . as_ref ( ) , width) ;
1099+
1100+ // if we writes to enumeratedValues, generate its structure if it differs from read structure.
10861101 let value_write_ty = if let Some ( ev) = rwenum. write_enum ( ) {
1087- let fmt = if rwenum. different_enums ( ) {
1088- "enum_write_name"
1102+ let derives;
1103+ let fmt;
1104+ if rwenum. different_enums ( ) {
1105+ derives = & mut write_enum_derives;
1106+ fmt = "enum_write_name" ;
10891107 } else {
1090- "enum_name"
1108+ derives = & mut enum_derives;
1109+ fmt = "enum_name" ;
10911110 } ;
1092- ident (
1093- ev. values ( ) . name . as_deref ( ) . unwrap_or ( & name) ,
1111+ let value_write_ty = ident (
1112+ if config. field_names_for_enums {
1113+ & name
1114+ } else {
1115+ ev. values ( ) . name . as_deref ( ) . unwrap_or ( & name)
1116+ } ,
10941117 config,
10951118 fmt,
10961119 span,
1097- )
1098- } else {
1099- // raw_field_value_write_ty
1100- fty. clone ( )
1101- } ;
1120+ ) ;
11021121
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 ( ) {
11071122 match ev {
1108- // if we writes to enumeratedValues, generate its structure if it differs from read structure.
11091123 EV :: New ( evs) => {
11101124 // parse variants from enumeratedValues svd record
11111125 let mut variants = Variant :: from_enumerated_values ( evs, config) ?;
@@ -1167,24 +1181,31 @@ pub fn fields(
11671181 }
11681182 }
11691183 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- }
1184+ let base_ident = if config. field_names_for_enums {
1185+ ident (
1186+ & util:: replace_suffix ( & base. field ( ) . name , "" ) ,
1187+ config,
1188+ fmt,
1189+ span,
1190+ )
1191+ } else {
1192+ ident ( & base. name , config, fmt, span)
1193+ } ;
1194+ if rwenum. generate_write_enum ( ) && !derives. contains ( & value_write_ty) {
1195+ let base_path = base_syn_path ( base, & fpath, & base_ident, config) ?;
1196+ mod_items. extend ( quote ! {
1197+ #[ doc = #description]
1198+ pub use #base_path as #value_write_ty;
1199+ } ) ;
11841200 }
11851201 }
11861202 }
1187- }
1203+ derives. insert ( value_write_ty. clone ( ) ) ;
1204+ value_write_ty
1205+ } else {
1206+ // raw_field_value_write_ty
1207+ fty. clone ( )
1208+ } ;
11881209
11891210 let mwv = f. modified_write_values . or ( rmwv) . unwrap_or_default ( ) ;
11901211
@@ -1238,11 +1259,6 @@ pub fn fields(
12381259 } ) ;
12391260 }
12401261 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-
12461262 // generate pub use field_1 writer as field_2 writer
12471263 let base_field = util:: replace_suffix ( & base. field . name , "" ) ;
12481264 let base_w = ident ( & base_field, config, "field_writer" , span) ;
0 commit comments