@@ -393,17 +393,22 @@ pub fn render_register_mod(
393
393
// * there is a single field that covers the entire register
394
394
// * that field can represent all values
395
395
// * the write constraints of the register allow full range of values
396
- let can_write_safe = ! unsafety (
396
+ let safe_ty = if let Safety :: Safe = Safety :: get (
397
397
register
398
398
. fields
399
399
. as_ref ( )
400
400
. and_then ( |fields| fields. first ( ) )
401
401
. and_then ( |field| field. write_constraint )
402
402
. as_ref ( ) ,
403
403
rsize,
404
- ) || !unsafety ( register. write_constraint . as_ref ( ) , rsize) ;
405
- let safe_ty = if can_write_safe { "Safe" } else { "Unsafe" } ;
406
- let safe_ty = Ident :: new ( safe_ty, span) ;
404
+ ) {
405
+ Safety :: Safe
406
+ } else if let Safety :: Safe = Safety :: get ( register. write_constraint . as_ref ( ) , rsize) {
407
+ Safety :: Safe
408
+ } else {
409
+ Safety :: Unsafe
410
+ } ;
411
+ let safe_ty = safe_ty. ident ( span) ;
407
412
408
413
let doc = format ! ( "`write(|w| ..)` method takes [`{mod_ty}::W`](W) writer structure" , ) ;
409
414
@@ -1097,7 +1102,7 @@ pub fn fields(
1097
1102
// the read value, or else we reuse read value.
1098
1103
if can_write {
1099
1104
let mut proxy_items = TokenStream :: new ( ) ;
1100
- let mut unsafety = unsafety ( f. write_constraint . as_ref ( ) , width) ;
1105
+ let mut safety = Safety :: get ( f. write_constraint . as_ref ( ) , width) ;
1101
1106
1102
1107
// if we writes to enumeratedValues, generate its structure if it differs from read structure.
1103
1108
let value_write_ty = if let Some ( ev) = rwenum. write_enum ( ) {
@@ -1136,12 +1141,12 @@ pub fn fields(
1136
1141
if variants. len ( ) == 1 << width {
1137
1142
} else if let Some ( def) = def. take ( ) {
1138
1143
variants. push ( def) ;
1139
- unsafety = false ;
1144
+ safety = Safety :: Safe ;
1140
1145
}
1141
1146
1142
1147
// if the write structure is finite, it can be safely written.
1143
1148
if variants. len ( ) == 1 << width {
1144
- unsafety = false ;
1149
+ safety = Safety :: Safe ;
1145
1150
}
1146
1151
1147
1152
// generate write value structure and From conversation if we can't reuse read value structure.
@@ -1237,13 +1242,12 @@ pub fn fields(
1237
1242
} else {
1238
1243
let wproxy = Ident :: new ( "FieldWriter" , span) ;
1239
1244
let width = & unsuffixed ( width) ;
1240
- if value_write_ty == "u8" && unsafety {
1245
+ if value_write_ty == "u8" && safety != Safety :: Safe {
1241
1246
quote ! { crate :: #wproxy<' a, REG , #width> }
1242
- } else if unsafety {
1247
+ } else if safety != Safety :: Safe {
1243
1248
quote ! { crate :: #wproxy<' a, REG , #width, #value_write_ty> }
1244
1249
} else {
1245
- let safe_ty =
1246
- Ident :: new ( if unsafety { "Unsafe" } else { "Safe" } , span) ;
1250
+ let safe_ty = safety. ident ( span) ;
1247
1251
quote ! { crate :: #wproxy<' a, REG , #width, #value_write_ty, crate :: #safe_ty> }
1248
1252
}
1249
1253
} ;
@@ -1367,22 +1371,40 @@ pub fn fields(
1367
1371
) )
1368
1372
}
1369
1373
1370
- fn unsafety ( write_constraint : Option < & WriteConstraint > , width : u32 ) -> bool {
1371
- match & write_constraint {
1372
- Some ( & WriteConstraint :: Range ( range) )
1373
- if range. min == 0 && range. max == u64:: MAX >> ( 64 - width) =>
1374
- {
1375
- // the SVD has acknowledged that it's safe to write
1376
- // any value that can fit in the field
1377
- false
1378
- }
1379
- None if width == 1 => {
1380
- // the field is one bit wide, so we assume it's legal to write
1381
- // either value into it or it wouldn't exist; despite that
1382
- // if a writeConstraint exists then respect it
1383
- false
1374
+ #[ derive( Clone , Debug , PartialEq , Eq ) ]
1375
+ enum Safety {
1376
+ Unsafe ,
1377
+ Safe ,
1378
+ }
1379
+
1380
+ impl Safety {
1381
+ fn get ( write_constraint : Option < & WriteConstraint > , width : u32 ) -> Self {
1382
+ match & write_constraint {
1383
+ Some ( & WriteConstraint :: Range ( range) )
1384
+ if range. min == 0 && range. max == u64:: MAX >> ( 64 - width) =>
1385
+ {
1386
+ // the SVD has acknowledged that it's safe to write
1387
+ // any value that can fit in the field
1388
+ Self :: Safe
1389
+ }
1390
+ None if width == 1 => {
1391
+ // the field is one bit wide, so we assume it's legal to write
1392
+ // either value into it or it wouldn't exist; despite that
1393
+ // if a writeConstraint exists then respect it
1394
+ Self :: Safe
1395
+ }
1396
+ _ => Self :: Unsafe ,
1384
1397
}
1385
- _ => true ,
1398
+ }
1399
+ fn ident ( & self , span : Span ) -> Ident {
1400
+ Ident :: new (
1401
+ if let Self :: Safe = self {
1402
+ "Safe"
1403
+ } else {
1404
+ "Unsafe"
1405
+ } ,
1406
+ span,
1407
+ )
1386
1408
}
1387
1409
}
1388
1410
0 commit comments