@@ -56,7 +56,7 @@ pub fn render(
56
56
pub use #mod_derived as #name_snake_case;
57
57
} )
58
58
} 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) ;
60
60
let access = util:: access_of ( & register. properties , register. fields . as_deref ( ) ) ;
61
61
let accs = if access. can_read ( ) && access. can_write ( ) {
62
62
"rw"
@@ -67,13 +67,12 @@ pub fn render(
67
67
} else {
68
68
return Err ( anyhow ! ( "Incorrect access of register {}" , register. name) ) ;
69
69
} ;
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}>`" ) ;
73
72
let mut out = TokenStream :: new ( ) ;
74
73
out. extend ( quote ! {
75
74
#[ 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 >;
77
76
} ) ;
78
77
let mod_items = render_register_mod (
79
78
register,
@@ -104,7 +103,7 @@ pub fn render_register_mod(
104
103
let properties = & register. properties ;
105
104
let name = util:: name_of ( register, config. ignore_groups ) ;
106
105
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) ;
108
107
let name_snake_case = name. to_snake_case_ident ( span) ;
109
108
let rsize = properties
110
109
. size
@@ -126,8 +125,6 @@ pub fn render_register_mod(
126
125
) ;
127
126
128
127
let mut mod_items = TokenStream :: new ( ) ;
129
- let mut r_impl_items = TokenStream :: new ( ) ;
130
- let mut w_impl_items = TokenStream :: new ( ) ;
131
128
let mut methods = vec ! [ ] ;
132
129
133
130
let can_read = access. can_read ( ) ;
@@ -144,23 +141,23 @@ pub fn render_register_mod(
144
141
mod_items. extend ( quote ! {
145
142
#[ doc = #desc]
146
143
#derive
147
- pub struct R ( crate :: R <#name_constant_case_spec >) ;
144
+ pub struct R ( crate :: R <#regspec_ident >) ;
148
145
} ) ;
149
146
150
147
if !config. derive_more {
151
148
mod_items. extend ( quote ! {
152
149
impl core:: ops:: Deref for R {
153
- type Target = crate :: R <#name_constant_case_spec >;
150
+ type Target = crate :: R <#regspec_ident >;
154
151
155
152
#[ inline( always) ]
156
153
fn deref( & self ) -> & Self :: Target {
157
154
& self . 0
158
155
}
159
156
}
160
157
161
- impl From <crate :: R <#name_constant_case_spec >> for R {
158
+ impl From <crate :: R <#regspec_ident >> for R {
162
159
#[ inline( always) ]
163
- fn from( reader: crate :: R <#name_constant_case_spec >) -> Self {
160
+ fn from( reader: crate :: R <#regspec_ident >) -> Self {
164
161
R ( reader)
165
162
}
166
163
}
@@ -179,13 +176,13 @@ pub fn render_register_mod(
179
176
mod_items. extend ( quote ! {
180
177
#[ doc = #desc]
181
178
#derive
182
- pub struct W ( crate :: W <#name_constant_case_spec >) ;
179
+ pub struct W ( crate :: W <#regspec_ident >) ;
183
180
} ) ;
184
181
185
182
if !config. derive_more {
186
183
mod_items. extend ( quote ! {
187
184
impl core:: ops:: Deref for W {
188
- type Target = crate :: W <#name_constant_case_spec >;
185
+ type Target = crate :: W <#regspec_ident >;
189
186
190
187
#[ inline( always) ]
191
188
fn deref( & self ) -> & Self :: Target {
@@ -200,9 +197,9 @@ pub fn render_register_mod(
200
197
}
201
198
}
202
199
203
- impl From <crate :: W <#name_constant_case_spec >> for W {
200
+ impl From <crate :: W <#regspec_ident >> for W {
204
201
#[ inline( always) ]
205
- fn from( writer: crate :: W <#name_constant_case_spec >) -> Self {
202
+ fn from( writer: crate :: W <#regspec_ident >) -> Self {
206
203
W ( writer)
207
204
}
208
205
}
@@ -219,8 +216,10 @@ pub fn render_register_mod(
219
216
methods. push ( "modify" ) ;
220
217
}
221
218
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 ;
224
223
225
224
if let Some ( cur_fields) = register. fields . as_ref ( ) {
226
225
// filter out all reserved fields, as we should not generate code for
@@ -231,20 +230,21 @@ pub fn render_register_mod(
231
230
. collect ( ) ;
232
231
233
232
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 (
235
239
cur_fields,
236
- register,
237
- path,
238
- index,
239
- & name_constant_case_spec,
240
+ & regspec_ident,
240
241
& rty,
242
+ register. modified_write_values ,
241
243
access,
242
244
properties,
243
245
& 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,
248
248
config,
249
249
) ?;
250
250
}
@@ -329,9 +329,9 @@ pub fn render_register_mod(
329
329
330
330
mod_items. extend ( quote ! {
331
331
#[ doc = #doc]
332
- pub struct #name_constant_case_spec ;
332
+ pub struct #regspec_ident ;
333
333
334
- impl crate :: RegisterSpec for #name_constant_case_spec {
334
+ impl crate :: RegisterSpec for #regspec_ident {
335
335
type Ux = #rty;
336
336
}
337
337
} ) ;
@@ -340,7 +340,7 @@ pub fn render_register_mod(
340
340
let doc = format ! ( "`read()` method returns [{name_snake_case}::R](R) reader structure" , ) ;
341
341
mod_items. extend ( quote ! {
342
342
#[ doc = #doc]
343
- impl crate :: Readable for #name_constant_case_spec {
343
+ impl crate :: Readable for #regspec_ident {
344
344
type Reader = R ;
345
345
}
346
346
} ) ;
@@ -354,7 +354,7 @@ pub fn render_register_mod(
354
354
355
355
mod_items. extend ( quote ! {
356
356
#[ doc = #doc]
357
- impl crate :: Writable for #name_constant_case_spec {
357
+ impl crate :: Writable for #regspec_ident {
358
358
type Writer = W ;
359
359
const ZERO_TO_MODIFY_FIELDS_BITMAP : Self :: Ux = #zero_to_modify_fields_bitmap;
360
360
const ONE_TO_MODIFY_FIELDS_BITMAP : Self :: Ux = #one_to_modify_fields_bitmap;
@@ -365,7 +365,7 @@ pub fn render_register_mod(
365
365
let doc = format ! ( "`reset()` method sets {} to value {rv}" , register. name) ;
366
366
mod_items. extend ( quote ! {
367
367
#[ doc = #doc]
368
- impl crate :: Resettable for #name_constant_case_spec {
368
+ impl crate :: Resettable for #regspec_ident {
369
369
const RESET_VALUE : Self :: Ux = #rv;
370
370
}
371
371
} ) ;
@@ -376,20 +376,20 @@ pub fn render_register_mod(
376
376
#[ allow( clippy:: too_many_arguments) ]
377
377
pub fn fields (
378
378
mut fields : Vec < & Field > ,
379
- register : & Register ,
380
- rpath : & RegisterPath ,
381
- index : & Index ,
382
- name_constant_case_spec : & Ident ,
379
+ regspec_ident : & Ident ,
383
380
rty : & Ident ,
381
+ rmwv : Option < ModifiedWriteValues > ,
384
382
access : Access ,
385
383
properties : & RegisterProperties ,
386
384
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 ,
391
387
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 ;
393
393
let span = Span :: call_site ( ) ;
394
394
let can_read = access. can_read ( ) ;
395
395
let can_write = access. can_write ( ) ;
@@ -666,29 +666,23 @@ pub fn fields(
666
666
let base_field = util:: replace_suffix ( & base. field . name , "" ) ;
667
667
let base_r = ( base_field + "_R" ) . to_constant_case_ident ( span) ;
668
668
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
+ } ) ;
677
674
reader_derives. insert ( reader_ty. clone ( ) ) ;
678
675
}
679
676
// only pub use enum when base.register != None. if base.register == None, it emits
680
677
// pub use enum from same module which is not expected
681
678
if base. register ( ) != fpath. register ( ) {
682
679
// use the same enum structure name
683
680
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
+ } ) ;
692
686
enum_derives. insert ( value_read_ty. clone ( ) ) ;
693
687
}
694
688
}
@@ -763,10 +757,7 @@ pub fn fields(
763
757
// If this field can be written, generate write proxy. Generate write value if it differs from
764
758
// the read value, or else we reuse read value.
765
759
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 ( ) ;
770
761
// gets a brief of write proxy
771
762
let field_writer_brief = format ! ( "Field `{name}{brief_suffix}` writer - {description}" ) ;
772
763
@@ -864,7 +855,7 @@ pub fn fields(
864
855
} ,
865
856
span,
866
857
) ;
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 > }
868
859
} else {
869
860
let wproxy = Ident :: new (
870
861
if unsafety {
@@ -875,7 +866,7 @@ pub fn fields(
875
866
span,
876
867
) ;
877
868
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 > }
879
870
} ;
880
871
mod_items. extend ( quote ! {
881
872
#[ doc = #field_writer_brief]
@@ -899,14 +890,11 @@ pub fn fields(
899
890
if writer_reader_different_enum {
900
891
// use the same enum structure name
901
892
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
+ } ) ;
910
898
writer_enum_derives. insert ( value_write_ty. clone ( ) ) ;
911
899
}
912
900
}
@@ -920,14 +908,11 @@ pub fn fields(
920
908
let base_field = util:: replace_suffix ( & base. field . name , "" ) ;
921
909
let base_w = ( base_field + "_W" ) . to_constant_case_ident ( span) ;
922
910
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
+ } ) ;
931
916
writer_derives. insert ( writer_ty. clone ( ) ) ;
932
917
}
933
918
}
@@ -981,16 +966,21 @@ pub fn fields(
981
966
match mwv {
982
967
Modify | Set | Clear => { }
983
968
OneToSet | OneToClear | OneToToggle => {
984
- * one_to_modify_fields_bitmap |= bitmask;
969
+ one_to_modify_fields_bitmap |= bitmask;
985
970
}
986
971
ZeroToClear | ZeroToSet | ZeroToToggle => {
987
- * zero_to_modify_fields_bitmap |= bitmask;
972
+ zero_to_modify_fields_bitmap |= bitmask;
988
973
}
989
974
}
990
975
}
991
976
}
992
977
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
+ ) )
994
984
}
995
985
996
986
fn unsafety ( write_constraint : Option < & WriteConstraint > , width : u32 ) -> bool {
@@ -1180,33 +1170,26 @@ fn description_with_bits(description: &str, offset: u64, width: u32) -> String {
1180
1170
res
1181
1171
}
1182
1172
1183
- fn derive_from_base (
1184
- mod_items : & mut TokenStream ,
1173
+ fn base_syn_path (
1185
1174
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 > {
1191
1178
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 {
1195
1182
let mut segments = Punctuated :: new ( ) ;
1196
1183
segments. push ( path_segment ( Ident :: new ( "super" , span) ) ) ;
1197
1184
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 ( ) ) ) ;
1199
1186
type_path ( segments)
1200
1187
} else {
1201
1188
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 ( ) ) ) ;
1203
1190
rmod_
1204
1191
} ;
1205
- mod_items. extend ( quote ! {
1206
- #[ doc = #desc]
1207
- pub use #path as #pc;
1208
- } ) ;
1209
- Ok ( ( ) )
1192
+ Ok ( path)
1210
1193
}
1211
1194
1212
1195
fn lookup_filter (
0 commit comments