@@ -219,6 +219,9 @@ pub fn render_register_mod(
219
219
methods. push ( "modify" ) ;
220
220
}
221
221
222
+ let mut zero_to_modify_fields_bitmap: u64 = 0 ;
223
+ let mut one_to_modify_fields_bitmap: u64 = 0 ;
224
+
222
225
if let Some ( cur_fields) = register. fields . as_ref ( ) {
223
226
// filter out all reserved fields, as we should not generate code for
224
227
// them
@@ -240,6 +243,8 @@ pub fn render_register_mod(
240
243
& mut mod_items,
241
244
& mut r_impl_items,
242
245
& mut w_impl_items,
246
+ & mut zero_to_modify_fields_bitmap,
247
+ & mut one_to_modify_fields_bitmap,
243
248
config,
244
249
) ?;
245
250
}
@@ -343,21 +348,25 @@ pub fn render_register_mod(
343
348
if can_write {
344
349
let doc =
345
350
format ! ( "`write(|w| ..)` method takes [{name_snake_case}::W](W) writer structure" , ) ;
351
+
352
+ let zero_to_modify_fields_bitmap = util:: hex ( zero_to_modify_fields_bitmap) ;
353
+ let one_to_modify_fields_bitmap = util:: hex ( one_to_modify_fields_bitmap) ;
354
+
346
355
mod_items. extend ( quote ! {
347
356
#[ doc = #doc]
348
357
impl crate :: Writable for #name_constant_case_spec {
349
358
type Writer = W ;
359
+ const ZERO_TO_MODIFY_FIELDS_BITMAP : Self :: Ux = #zero_to_modify_fields_bitmap;
360
+ const ONE_TO_MODIFY_FIELDS_BITMAP : Self :: Ux = #one_to_modify_fields_bitmap;
350
361
}
351
362
} ) ;
352
363
}
353
364
if let Some ( rv) = properties. reset_value . map ( util:: hex) {
354
- let rv = rv. into_token_stream ( ) ;
355
365
let doc = format ! ( "`reset()` method sets {} to value {rv}" , register. name) ;
356
366
mod_items. extend ( quote ! {
357
367
#[ doc = #doc]
358
368
impl crate :: Resettable for #name_constant_case_spec {
359
- #[ inline( always) ]
360
- fn reset_value( ) -> Self :: Ux { #rv }
369
+ const RESET_VALUE : Self :: Ux = #rv;
361
370
}
362
371
} ) ;
363
372
}
@@ -377,6 +386,8 @@ pub fn fields(
377
386
mod_items : & mut TokenStream ,
378
387
r_impl_items : & mut TokenStream ,
379
388
w_impl_items : & mut TokenStream ,
389
+ zero_to_modify_fields_bitmap : & mut u64 ,
390
+ one_to_modify_fields_bitmap : & mut u64 ,
380
391
config : & Config ,
381
392
) -> Result < ( ) > {
382
393
let span = Span :: call_site ( ) ;
@@ -837,19 +848,16 @@ pub fn fields(
837
848
// derive writer structure by type alias to generic write proxy structure.
838
849
if should_derive_writer {
839
850
let proxy = if width == 1 {
851
+ use ModifiedWriteValues :: * ;
840
852
let wproxy = Ident :: new (
841
853
match mwv {
842
- ModifiedWriteValues :: Modify => "BitWriter" ,
843
- ModifiedWriteValues :: OneToSet | ModifiedWriteValues :: Set => {
844
- "BitWriter1S"
845
- }
846
- ModifiedWriteValues :: ZeroToClear | ModifiedWriteValues :: Clear => {
847
- "BitWriter0C"
848
- }
849
- ModifiedWriteValues :: OneToClear => "BitWriter1C" ,
850
- ModifiedWriteValues :: ZeroToSet => "BitWriter0C" ,
851
- ModifiedWriteValues :: OneToToggle => "BitWriter1T" ,
852
- ModifiedWriteValues :: ZeroToToggle => "BitWriter0T" ,
854
+ Modify | Set | Clear => "BitWriter" ,
855
+ OneToSet => "BitWriter1S" ,
856
+ ZeroToClear => "BitWriter0C" ,
857
+ OneToClear => "BitWriter1C" ,
858
+ ZeroToSet => "BitWriter0C" ,
859
+ OneToToggle => "BitWriter1T" ,
860
+ ZeroToToggle => "BitWriter0T" ,
853
861
} ,
854
862
span,
855
863
) ;
@@ -965,6 +973,17 @@ pub fn fields(
965
973
}
966
974
} ) ;
967
975
}
976
+ let bitmask = ( u64:: MAX >> ( 64 - width) ) << offset;
977
+ use ModifiedWriteValues :: * ;
978
+ match mwv {
979
+ Modify | Set | Clear => { }
980
+ OneToSet | OneToClear | OneToToggle => {
981
+ * one_to_modify_fields_bitmap |= bitmask;
982
+ }
983
+ ZeroToClear | ZeroToSet | ZeroToToggle => {
984
+ * zero_to_modify_fields_bitmap |= bitmask;
985
+ }
986
+ }
968
987
}
969
988
}
970
989
0 commit comments