@@ -219,6 +219,9 @@ pub fn render_register_mod(
219219 methods. push ( "modify" ) ;
220220 }
221221
222+ let mut zero_to_modify_fields_bitmap: u64 = 0 ;
223+ let mut one_to_modify_fields_bitmap: u64 = 0 ;
224+
222225 if let Some ( cur_fields) = register. fields . as_ref ( ) {
223226 // filter out all reserved fields, as we should not generate code for
224227 // them
@@ -240,6 +243,8 @@ pub fn render_register_mod(
240243 & mut mod_items,
241244 & mut r_impl_items,
242245 & mut w_impl_items,
246+ & mut zero_to_modify_fields_bitmap,
247+ & mut one_to_modify_fields_bitmap,
243248 config,
244249 ) ?;
245250 }
@@ -343,21 +348,25 @@ pub fn render_register_mod(
343348 if can_write {
344349 let doc =
345350 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+
346355 mod_items. extend ( quote ! {
347356 #[ doc = #doc]
348357 impl crate :: Writable for #name_constant_case_spec {
349358 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;
350361 }
351362 } ) ;
352363 }
353364 if let Some ( rv) = properties. reset_value . map ( util:: hex) {
354- let rv = rv. into_token_stream ( ) ;
355365 let doc = format ! ( "`reset()` method sets {} to value {rv}" , register. name) ;
356366 mod_items. extend ( quote ! {
357367 #[ doc = #doc]
358368 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;
361370 }
362371 } ) ;
363372 }
@@ -377,6 +386,8 @@ pub fn fields(
377386 mod_items : & mut TokenStream ,
378387 r_impl_items : & mut TokenStream ,
379388 w_impl_items : & mut TokenStream ,
389+ zero_to_modify_fields_bitmap : & mut u64 ,
390+ one_to_modify_fields_bitmap : & mut u64 ,
380391 config : & Config ,
381392) -> Result < ( ) > {
382393 let span = Span :: call_site ( ) ;
@@ -837,19 +848,16 @@ pub fn fields(
837848 // derive writer structure by type alias to generic write proxy structure.
838849 if should_derive_writer {
839850 let proxy = if width == 1 {
851+ use ModifiedWriteValues :: * ;
840852 let wproxy = Ident :: new (
841853 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" ,
853861 } ,
854862 span,
855863 ) ;
@@ -965,6 +973,17 @@ pub fn fields(
965973 }
966974 } ) ;
967975 }
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+ }
968987 }
969988 }
970989
0 commit comments