@@ -56,7 +56,7 @@ pub fn render(
5656 pub use #mod_derived as #name_snake_case;
5757 } )
5858 } else {
59- let name_constant_case_spec = format ! ( "{name}_SPEC" ) . to_constant_case_ident ( span) ;
59+ let regspec_ident = format ! ( "{name}_SPEC" ) . to_constant_case_ident ( span) ;
6060 let access = util:: access_of ( & register. properties , register. fields . as_deref ( ) ) ;
6161 let accs = if access. can_read ( ) && access. can_write ( ) {
6262 "rw"
@@ -67,13 +67,12 @@ pub fn render(
6767 } else {
6868 return Err ( anyhow ! ( "Incorrect access of register {}" , register. name) ) ;
6969 } ;
70- let alias_doc = format ! (
71- "{name} ({accs}) register accessor: an alias for `Reg<{name_constant_case_spec}>`"
72- ) ;
70+ let alias_doc =
71+ format ! ( "{name} ({accs}) register accessor: an alias for `Reg<{regspec_ident}>`" ) ;
7372 let mut out = TokenStream :: new ( ) ;
7473 out. extend ( quote ! {
7574 #[ doc = #alias_doc]
76- pub type #name_constant_case = crate :: Reg <#name_snake_case:: #name_constant_case_spec >;
75+ pub type #name_constant_case = crate :: Reg <#name_snake_case:: #regspec_ident >;
7776 } ) ;
7877 let mod_items = render_register_mod (
7978 register,
@@ -104,7 +103,7 @@ pub fn render_register_mod(
104103 let properties = & register. properties ;
105104 let name = util:: name_of ( register, config. ignore_groups ) ;
106105 let span = Span :: call_site ( ) ;
107- let name_constant_case_spec = format ! ( "{name}_SPEC" ) . to_constant_case_ident ( span) ;
106+ let regspec_ident = format ! ( "{name}_SPEC" ) . to_constant_case_ident ( span) ;
108107 let name_snake_case = name. to_snake_case_ident ( span) ;
109108 let rsize = properties
110109 . size
@@ -126,8 +125,6 @@ pub fn render_register_mod(
126125 ) ;
127126
128127 let mut mod_items = TokenStream :: new ( ) ;
129- let mut r_impl_items = TokenStream :: new ( ) ;
130- let mut w_impl_items = TokenStream :: new ( ) ;
131128 let mut methods = vec ! [ ] ;
132129
133130 let can_read = access. can_read ( ) ;
@@ -144,23 +141,23 @@ pub fn render_register_mod(
144141 mod_items. extend ( quote ! {
145142 #[ doc = #desc]
146143 #derive
147- pub struct R ( crate :: R <#name_constant_case_spec >) ;
144+ pub struct R ( crate :: R <#regspec_ident >) ;
148145 } ) ;
149146
150147 if !config. derive_more {
151148 mod_items. extend ( quote ! {
152149 impl core:: ops:: Deref for R {
153- type Target = crate :: R <#name_constant_case_spec >;
150+ type Target = crate :: R <#regspec_ident >;
154151
155152 #[ inline( always) ]
156153 fn deref( & self ) -> & Self :: Target {
157154 & self . 0
158155 }
159156 }
160157
161- impl From <crate :: R <#name_constant_case_spec >> for R {
158+ impl From <crate :: R <#regspec_ident >> for R {
162159 #[ inline( always) ]
163- fn from( reader: crate :: R <#name_constant_case_spec >) -> Self {
160+ fn from( reader: crate :: R <#regspec_ident >) -> Self {
164161 R ( reader)
165162 }
166163 }
@@ -179,13 +176,13 @@ pub fn render_register_mod(
179176 mod_items. extend ( quote ! {
180177 #[ doc = #desc]
181178 #derive
182- pub struct W ( crate :: W <#name_constant_case_spec >) ;
179+ pub struct W ( crate :: W <#regspec_ident >) ;
183180 } ) ;
184181
185182 if !config. derive_more {
186183 mod_items. extend ( quote ! {
187184 impl core:: ops:: Deref for W {
188- type Target = crate :: W <#name_constant_case_spec >;
185+ type Target = crate :: W <#regspec_ident >;
189186
190187 #[ inline( always) ]
191188 fn deref( & self ) -> & Self :: Target {
@@ -200,9 +197,9 @@ pub fn render_register_mod(
200197 }
201198 }
202199
203- impl From <crate :: W <#name_constant_case_spec >> for W {
200+ impl From <crate :: W <#regspec_ident >> for W {
204201 #[ inline( always) ]
205- fn from( writer: crate :: W <#name_constant_case_spec >) -> Self {
202+ fn from( writer: crate :: W <#regspec_ident >) -> Self {
206203 W ( writer)
207204 }
208205 }
@@ -219,8 +216,10 @@ pub fn render_register_mod(
219216 methods. push ( "modify" ) ;
220217 }
221218
222- let mut zero_to_modify_fields_bitmap: u64 = 0 ;
223- let mut one_to_modify_fields_bitmap: u64 = 0 ;
219+ let mut r_impl_items = TokenStream :: new ( ) ;
220+ let mut w_impl_items = TokenStream :: new ( ) ;
221+ let mut zero_to_modify_fields_bitmap = 0 ;
222+ let mut one_to_modify_fields_bitmap = 0 ;
224223
225224 if let Some ( cur_fields) = register. fields . as_ref ( ) {
226225 // filter out all reserved fields, as we should not generate code for
@@ -231,20 +230,21 @@ pub fn render_register_mod(
231230 . collect ( ) ;
232231
233232 if !cur_fields. is_empty ( ) {
234- fields (
233+ (
234+ r_impl_items,
235+ w_impl_items,
236+ zero_to_modify_fields_bitmap,
237+ one_to_modify_fields_bitmap,
238+ ) = fields (
235239 cur_fields,
236- register,
237- path,
238- index,
239- & name_constant_case_spec,
240+ & regspec_ident,
240241 & rty,
242+ register. modified_write_values ,
241243 access,
242244 properties,
243245 & mut mod_items,
244- & mut r_impl_items,
245- & mut w_impl_items,
246- & mut zero_to_modify_fields_bitmap,
247- & mut one_to_modify_fields_bitmap,
246+ path,
247+ index,
248248 config,
249249 ) ?;
250250 }
@@ -329,9 +329,9 @@ pub fn render_register_mod(
329329
330330 mod_items. extend ( quote ! {
331331 #[ doc = #doc]
332- pub struct #name_constant_case_spec ;
332+ pub struct #regspec_ident ;
333333
334- impl crate :: RegisterSpec for #name_constant_case_spec {
334+ impl crate :: RegisterSpec for #regspec_ident {
335335 type Ux = #rty;
336336 }
337337 } ) ;
@@ -340,7 +340,7 @@ pub fn render_register_mod(
340340 let doc = format ! ( "`read()` method returns [{name_snake_case}::R](R) reader structure" , ) ;
341341 mod_items. extend ( quote ! {
342342 #[ doc = #doc]
343- impl crate :: Readable for #name_constant_case_spec {
343+ impl crate :: Readable for #regspec_ident {
344344 type Reader = R ;
345345 }
346346 } ) ;
@@ -354,7 +354,7 @@ pub fn render_register_mod(
354354
355355 mod_items. extend ( quote ! {
356356 #[ doc = #doc]
357- impl crate :: Writable for #name_constant_case_spec {
357+ impl crate :: Writable for #regspec_ident {
358358 type Writer = W ;
359359 const ZERO_TO_MODIFY_FIELDS_BITMAP : Self :: Ux = #zero_to_modify_fields_bitmap;
360360 const ONE_TO_MODIFY_FIELDS_BITMAP : Self :: Ux = #one_to_modify_fields_bitmap;
@@ -365,7 +365,7 @@ pub fn render_register_mod(
365365 let doc = format ! ( "`reset()` method sets {} to value {rv}" , register. name) ;
366366 mod_items. extend ( quote ! {
367367 #[ doc = #doc]
368- impl crate :: Resettable for #name_constant_case_spec {
368+ impl crate :: Resettable for #regspec_ident {
369369 const RESET_VALUE : Self :: Ux = #rv;
370370 }
371371 } ) ;
@@ -376,20 +376,20 @@ pub fn render_register_mod(
376376#[ allow( clippy:: too_many_arguments) ]
377377pub fn fields (
378378 mut fields : Vec < & Field > ,
379- register : & Register ,
380- rpath : & RegisterPath ,
381- index : & Index ,
382- name_constant_case_spec : & Ident ,
379+ regspec_ident : & Ident ,
383380 rty : & Ident ,
381+ rmwv : Option < ModifiedWriteValues > ,
384382 access : Access ,
385383 properties : & RegisterProperties ,
386384 mod_items : & mut TokenStream ,
387- r_impl_items : & mut TokenStream ,
388- w_impl_items : & mut TokenStream ,
389- zero_to_modify_fields_bitmap : & mut u64 ,
390- one_to_modify_fields_bitmap : & mut u64 ,
385+ rpath : & RegisterPath ,
386+ index : & Index ,
391387 config : & Config ,
392- ) -> Result < ( ) > {
388+ ) -> Result < ( TokenStream , TokenStream , u64 , u64 ) > {
389+ let mut r_impl_items = TokenStream :: new ( ) ;
390+ let mut w_impl_items = TokenStream :: new ( ) ;
391+ let mut zero_to_modify_fields_bitmap = 0u64 ;
392+ let mut one_to_modify_fields_bitmap = 0u64 ;
393393 let span = Span :: call_site ( ) ;
394394 let can_read = access. can_read ( ) ;
395395 let can_write = access. can_write ( ) ;
@@ -666,29 +666,23 @@ pub fn fields(
666666 let base_field = util:: replace_suffix ( & base. field . name , "" ) ;
667667 let base_r = ( base_field + "_R" ) . to_constant_case_ident ( span) ;
668668 if !reader_derives. contains ( & reader_ty) {
669- derive_from_base (
670- mod_items,
671- base,
672- & fpath,
673- & reader_ty,
674- & base_r,
675- & field_reader_brief,
676- ) ?;
669+ let base_path = base_syn_path ( base, & fpath, & base_r) ?;
670+ mod_items. extend ( quote ! {
671+ #[ doc = #field_reader_brief]
672+ pub use #base_path as #reader_ty;
673+ } ) ;
677674 reader_derives. insert ( reader_ty. clone ( ) ) ;
678675 }
679676 // only pub use enum when base.register != None. if base.register == None, it emits
680677 // pub use enum from same module which is not expected
681678 if base. register ( ) != fpath. register ( ) {
682679 // use the same enum structure name
683680 if !enum_derives. contains ( & value_read_ty) {
684- derive_from_base (
685- mod_items,
686- base,
687- & fpath,
688- & value_read_ty,
689- & value_read_ty,
690- & description,
691- ) ?;
681+ let base_path = base_syn_path ( base, & fpath, & value_read_ty) ?;
682+ mod_items. extend ( quote ! {
683+ #[ doc = #description]
684+ pub use #base_path as #value_read_ty;
685+ } ) ;
692686 enum_derives. insert ( value_read_ty. clone ( ) ) ;
693687 }
694688 }
@@ -763,10 +757,7 @@ pub fn fields(
763757 // If this field can be written, generate write proxy. Generate write value if it differs from
764758 // the read value, or else we reuse read value.
765759 if can_write {
766- let mwv = f
767- . modified_write_values
768- . or ( register. modified_write_values )
769- . unwrap_or_default ( ) ;
760+ let mwv = f. modified_write_values . or ( rmwv) . unwrap_or_default ( ) ;
770761 // gets a brief of write proxy
771762 let field_writer_brief = format ! ( "Field `{name}{brief_suffix}` writer - {description}" ) ;
772763
@@ -864,7 +855,7 @@ pub fn fields(
864855 } ,
865856 span,
866857 ) ;
867- quote ! { crate :: #wproxy<' a, #rty, #name_constant_case_spec , #value_write_ty, O > }
858+ quote ! { crate :: #wproxy<' a, #rty, #regspec_ident , #value_write_ty, O > }
868859 } else {
869860 let wproxy = Ident :: new (
870861 if unsafety {
@@ -875,7 +866,7 @@ pub fn fields(
875866 span,
876867 ) ;
877868 let width = & util:: unsuffixed ( width as _ ) ;
878- quote ! { crate :: #wproxy<' a, #rty, #name_constant_case_spec , #fty, #value_write_ty, #width, O > }
869+ quote ! { crate :: #wproxy<' a, #rty, #regspec_ident , #fty, #value_write_ty, #width, O > }
879870 } ;
880871 mod_items. extend ( quote ! {
881872 #[ doc = #field_writer_brief]
@@ -899,14 +890,11 @@ pub fn fields(
899890 if writer_reader_different_enum {
900891 // use the same enum structure name
901892 if !writer_enum_derives. contains ( & value_write_ty) {
902- derive_from_base (
903- mod_items,
904- base,
905- & fpath,
906- & value_write_ty,
907- & value_write_ty,
908- & description,
909- ) ?;
893+ let base_path = base_syn_path ( base, & fpath, & value_write_ty) ?;
894+ mod_items. extend ( quote ! {
895+ #[ doc = #description]
896+ pub use #base_path as #value_write_ty;
897+ } ) ;
910898 writer_enum_derives. insert ( value_write_ty. clone ( ) ) ;
911899 }
912900 }
@@ -920,14 +908,11 @@ pub fn fields(
920908 let base_field = util:: replace_suffix ( & base. field . name , "" ) ;
921909 let base_w = ( base_field + "_W" ) . to_constant_case_ident ( span) ;
922910 if !writer_derives. contains ( & writer_ty) {
923- derive_from_base (
924- mod_items,
925- base,
926- & fpath,
927- & writer_ty,
928- & base_w,
929- & field_writer_brief,
930- ) ?;
911+ let base_path = base_syn_path ( base, & fpath, & base_w) ?;
912+ mod_items. extend ( quote ! {
913+ #[ doc = #field_writer_brief]
914+ pub use #base_path as #writer_ty;
915+ } ) ;
931916 writer_derives. insert ( writer_ty. clone ( ) ) ;
932917 }
933918 }
@@ -981,16 +966,21 @@ pub fn fields(
981966 match mwv {
982967 Modify | Set | Clear => { }
983968 OneToSet | OneToClear | OneToToggle => {
984- * one_to_modify_fields_bitmap |= bitmask;
969+ one_to_modify_fields_bitmap |= bitmask;
985970 }
986971 ZeroToClear | ZeroToSet | ZeroToToggle => {
987- * zero_to_modify_fields_bitmap |= bitmask;
972+ zero_to_modify_fields_bitmap |= bitmask;
988973 }
989974 }
990975 }
991976 }
992977
993- Ok ( ( ) )
978+ Ok ( (
979+ r_impl_items,
980+ w_impl_items,
981+ zero_to_modify_fields_bitmap,
982+ one_to_modify_fields_bitmap,
983+ ) )
994984}
995985
996986fn unsafety ( write_constraint : Option < & WriteConstraint > , width : u32 ) -> bool {
@@ -1180,33 +1170,26 @@ fn description_with_bits(description: &str, offset: u64, width: u32) -> String {
11801170 res
11811171}
11821172
1183- fn derive_from_base (
1184- mod_items : & mut TokenStream ,
1173+ fn base_syn_path (
11851174 base : & EnumPath ,
1186- field : & FieldPath ,
1187- pc : & Ident ,
1188- base_pc : & Ident ,
1189- desc : & str ,
1190- ) -> Result < ( ) , syn:: Error > {
1175+ fpath : & FieldPath ,
1176+ base_ident : & Ident ,
1177+ ) -> Result < syn:: TypePath , syn:: Error > {
11911178 let span = Span :: call_site ( ) ;
1192- let path = if base. register ( ) == field . register ( ) {
1193- ident_to_path ( base_pc . clone ( ) )
1194- } else if base. register ( ) . block == field . register ( ) . block {
1179+ let path = if base. register ( ) == fpath . register ( ) {
1180+ ident_to_path ( base_ident . clone ( ) )
1181+ } else if base. register ( ) . block == fpath . register ( ) . block {
11951182 let mut segments = Punctuated :: new ( ) ;
11961183 segments. push ( path_segment ( Ident :: new ( "super" , span) ) ) ;
11971184 segments. push ( path_segment ( base. register ( ) . name . to_snake_case_ident ( span) ) ) ;
1198- segments. push ( path_segment ( base_pc . clone ( ) ) ) ;
1185+ segments. push ( path_segment ( base_ident . clone ( ) ) ) ;
11991186 type_path ( segments)
12001187 } else {
12011188 let mut rmod_ = crate :: util:: register_path_to_ty ( base. register ( ) , span) ;
1202- rmod_. path . segments . push ( path_segment ( base_pc . clone ( ) ) ) ;
1189+ rmod_. path . segments . push ( path_segment ( base_ident . clone ( ) ) ) ;
12031190 rmod_
12041191 } ;
1205- mod_items. extend ( quote ! {
1206- #[ doc = #desc]
1207- pub use #path as #pc;
1208- } ) ;
1209- Ok ( ( ) )
1192+ Ok ( path)
12101193}
12111194
12121195fn lookup_filter (
0 commit comments