@@ -26,7 +26,7 @@ fn regspec(name: &str, config: &Config, span: Span) -> Ident {
2626}
2727
2828fn field_accessor ( name : & str , config : & Config , span : Span ) -> Ident {
29- const INTERNALS : [ & str ; 1 ] = [ "bits" ] ;
29+ const INTERNALS : [ & str ; 2 ] = [ "bits" , "set "] ;
3030 let sc = config
3131 . ident_formats
3232 . get ( "field_accessor" )
@@ -355,44 +355,6 @@ pub fn render_register_mod(
355355
356356 mod_items. extend ( w_impl_items) ;
357357
358- // the writer can be safe if:
359- // * there is a single field that covers the entire register
360- // * that field can represent all values
361- // * the write constraints of the register allow full range of values
362- let can_write_safe = !unsafety (
363- register
364- . fields
365- . as_ref ( )
366- . and_then ( |fields| fields. first ( ) )
367- . and_then ( |field| field. write_constraint )
368- . as_ref ( ) ,
369- rsize,
370- ) || !unsafety ( register. write_constraint . as_ref ( ) , rsize) ;
371-
372- if can_write_safe {
373- mod_items. extend ( quote ! {
374- #[ doc = "Writes raw bits to the register." ]
375- #[ inline( always) ]
376- pub fn bits( & mut self , bits: #rty) -> & mut Self {
377- self . bits = bits;
378- self
379- }
380- } ) ;
381- } else {
382- mod_items. extend ( quote ! {
383- /// Writes raw bits to the register.
384- ///
385- /// # Safety
386- ///
387- /// Passing incorrect value can cause undefined behaviour. See reference manual
388- #[ inline( always) ]
389- pub unsafe fn bits( & mut self , bits: #rty) -> & mut Self {
390- self . bits = bits;
391- self
392- }
393- } ) ;
394- }
395-
396358 close. to_tokens ( & mut mod_items) ;
397359 }
398360
@@ -425,6 +387,22 @@ pub fn render_register_mod(
425387 } ) ;
426388 }
427389 if can_write {
390+ // the writer can be safe if:
391+ // * there is a single field that covers the entire register
392+ // * that field can represent all values
393+ // * the write constraints of the register allow full range of values
394+ let can_write_safe = !unsafety (
395+ register
396+ . fields
397+ . as_ref ( )
398+ . and_then ( |fields| fields. first ( ) )
399+ . and_then ( |field| field. write_constraint )
400+ . as_ref ( ) ,
401+ rsize,
402+ ) || !unsafety ( register. write_constraint . as_ref ( ) , rsize) ;
403+ let safe_ty = if can_write_safe { "Safe" } else { "Unsafe" } ;
404+ let safe_ty = Ident :: new ( safe_ty, span) ;
405+
428406 let doc = format ! ( "`write(|w| ..)` method takes [`{mod_ty}::W`](W) writer structure" , ) ;
429407
430408 let zero_to_modify_fields_bitmap = util:: hex ( zero_to_modify_fields_bitmap) ;
@@ -433,6 +411,7 @@ pub fn render_register_mod(
433411 mod_items. extend ( quote ! {
434412 #[ doc = #doc]
435413 impl crate :: Writable for #regspec_ty {
414+ type Safety = crate :: #safe_ty;
436415 const ZERO_TO_MODIFY_FIELDS_BITMAP : #rty = #zero_to_modify_fields_bitmap;
437416 const ONE_TO_MODIFY_FIELDS_BITMAP : #rty = #one_to_modify_fields_bitmap;
438417 }
0 commit comments