1
1
use crate :: svd:: {
2
2
self , Access , BitRange , DimElement , EnumeratedValue , EnumeratedValues , Field , MaybeArray ,
3
3
ModifiedWriteValues , ReadAction , Register , RegisterProperties , Usage , WriteConstraint ,
4
+ WriteConstraintRange ,
4
5
} ;
5
6
use core:: u64;
6
7
use log:: warn;
@@ -408,7 +409,7 @@ pub fn render_register_mod(
408
409
} else {
409
410
Safety :: Unsafe
410
411
} ;
411
- let safe_ty = safe_ty. ident ( span ) ;
412
+ let safe_ty = safe_ty. ident ( rsize ) ;
412
413
413
414
let doc = format ! ( "`write(|w| ..)` method takes [`{mod_ty}::W`](W) writer structure" , ) ;
414
415
@@ -1138,17 +1139,14 @@ pub fn fields(
1138
1139
. map ( |v| Variant :: from_value ( v, def, config) )
1139
1140
} )
1140
1141
. transpose ( ) ?;
1142
+ // if the write structure is finite, it can be safely written.
1141
1143
if variants. len ( ) == 1 << width {
1144
+ safety = Safety :: Safe ;
1142
1145
} else if let Some ( def) = def. take ( ) {
1143
1146
variants. push ( def) ;
1144
1147
safety = Safety :: Safe ;
1145
1148
}
1146
1149
1147
- // if the write structure is finite, it can be safely written.
1148
- if variants. len ( ) == 1 << width {
1149
- safety = Safety :: Safe ;
1150
- }
1151
-
1152
1150
// generate write value structure and From conversation if we can't reuse read value structure.
1153
1151
if rwenum. generate_write_enum ( ) {
1154
1152
if variants. is_empty ( ) {
@@ -1241,14 +1239,14 @@ pub fn fields(
1241
1239
}
1242
1240
} else {
1243
1241
let wproxy = Ident :: new ( "FieldWriter" , span) ;
1244
- let width = & unsuffixed ( width) ;
1242
+ let uwidth = & unsuffixed ( width) ;
1245
1243
if value_write_ty == "u8" && safety != Safety :: Safe {
1246
- quote ! { crate :: #wproxy<' a, REG , #width > }
1244
+ quote ! { crate :: #wproxy<' a, REG , #uwidth > }
1247
1245
} else if safety != Safety :: Safe {
1248
- quote ! { crate :: #wproxy<' a, REG , #width , #value_write_ty> }
1246
+ quote ! { crate :: #wproxy<' a, REG , #uwidth , #value_write_ty> }
1249
1247
} else {
1250
- let safe_ty = safety. ident ( span ) ;
1251
- quote ! { crate :: #wproxy<' a, REG , #width , #value_write_ty, crate :: #safe_ty> }
1248
+ let safe_ty = safety. ident ( width ) ;
1249
+ quote ! { crate :: #wproxy<' a, REG , #uwidth , #value_write_ty, crate :: #safe_ty> }
1252
1250
}
1253
1251
} ;
1254
1252
mod_items. extend ( quote ! {
@@ -1371,9 +1369,10 @@ pub fn fields(
1371
1369
) )
1372
1370
}
1373
1371
1374
- #[ derive( Clone , Debug , PartialEq , Eq ) ]
1372
+ #[ derive( Clone , Copy , Debug , PartialEq , Eq ) ]
1375
1373
enum Safety {
1376
1374
Unsafe ,
1375
+ Range ( WriteConstraintRange ) ,
1377
1376
Safe ,
1378
1377
}
1379
1378
@@ -1393,18 +1392,26 @@ impl Safety {
1393
1392
// if a writeConstraint exists then respect it
1394
1393
Self :: Safe
1395
1394
}
1395
+ Some ( & WriteConstraint :: Range ( range) ) => Self :: Range ( range) ,
1396
1396
_ => Self :: Unsafe ,
1397
1397
}
1398
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
- )
1399
+ fn ident ( & self , width : u32 ) -> TokenStream {
1400
+ match self {
1401
+ Self :: Safe => quote ! ( Safe ) ,
1402
+ Self :: Unsafe => quote ! ( Unsafe ) ,
1403
+ Self :: Range ( range) => {
1404
+ let min = unsuffixed ( range. min ) ;
1405
+ let max = unsuffixed ( range. max ) ;
1406
+ if range. min == 0 {
1407
+ quote ! ( RangeTo <#max>)
1408
+ } else if range. max == u64:: MAX >> ( 64 - width) {
1409
+ quote ! ( RangeFrom <#min>)
1410
+ } else {
1411
+ quote ! ( Range <#min, #max>)
1412
+ }
1413
+ }
1414
+ }
1408
1415
}
1409
1416
}
1410
1417
0 commit comments