@@ -26,7 +26,7 @@ fn regspec(name: &str, config: &Config, span: Span) -> Ident {
26
26
}
27
27
28
28
fn field_accessor ( name : & str , config : & Config , span : Span ) -> Ident {
29
- const INTERNALS : [ & str ; 1 ] = [ "bits" ] ;
29
+ const INTERNALS : [ & str ; 2 ] = [ "bits" , "set "] ;
30
30
let sc = config
31
31
. ident_formats
32
32
. get ( "field_accessor" )
@@ -355,44 +355,6 @@ pub fn render_register_mod(
355
355
356
356
mod_items. extend ( w_impl_items) ;
357
357
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
-
396
358
close. to_tokens ( & mut mod_items) ;
397
359
}
398
360
@@ -425,6 +387,22 @@ pub fn render_register_mod(
425
387
} ) ;
426
388
}
427
389
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
+
428
406
let doc = format ! ( "`write(|w| ..)` method takes [`{mod_ty}::W`](W) writer structure" , ) ;
429
407
430
408
let zero_to_modify_fields_bitmap = util:: hex ( zero_to_modify_fields_bitmap) ;
@@ -433,6 +411,7 @@ pub fn render_register_mod(
433
411
mod_items. extend ( quote ! {
434
412
#[ doc = #doc]
435
413
impl crate :: Writable for #regspec_ty {
414
+ type Safety = crate :: #safe_ty;
436
415
const ZERO_TO_MODIFY_FIELDS_BITMAP : #rty = #zero_to_modify_fields_bitmap;
437
416
const ONE_TO_MODIFY_FIELDS_BITMAP : #rty = #one_to_modify_fields_bitmap;
438
417
}
0 commit comments