@@ -456,21 +456,22 @@ pub fn gen_peripheral(p: &Peripheral, d: &Defaults) -> Vec<Tokens> {
456
456
let mut fields = vec ! [ ] ;
457
457
let mut offset = 0 ;
458
458
let mut i = 0 ;
459
- let registers = p. registers
460
- . as_ref ( )
461
- . expect ( & format ! ( "{:#?} has no `registers` field" , p) ) ;
459
+ let registers =
460
+ p. registers
461
+ . as_ref ( )
462
+ . expect ( & format ! ( "Peripheral {} has no `registers` field" , p. name) ) ;
462
463
463
464
for register in & expand ( registers) {
464
465
let pad = if let Some ( pad) = register. offset
465
- . checked_sub ( offset) {
466
+ . checked_sub ( offset) {
466
467
pad
467
468
} else {
468
469
writeln ! ( io:: stderr( ) ,
469
470
"WARNING {} overlaps with another register at offset \
470
471
{}. Ignoring.",
471
472
register. name,
472
473
register. offset)
473
- . ok ( ) ;
474
+ . ok ( ) ;
474
475
continue ;
475
476
} ;
476
477
@@ -486,7 +487,7 @@ pub fn gen_peripheral(p: &Peripheral, d: &Defaults) -> Vec<Tokens> {
486
487
let comment = & format ! ( "0x{:02x} - {}" ,
487
488
register. offset,
488
489
respace( & register. info
489
- . description) )
490
+ . description) )
490
491
[ ..] ;
491
492
492
493
let reg_ty = match register. ty {
@@ -501,10 +502,11 @@ pub fn gen_peripheral(p: &Peripheral, d: &Defaults) -> Vec<Tokens> {
501
502
502
503
offset = register. offset +
503
504
register. info
504
- . size
505
- . or ( d. size )
506
- . expect ( & format ! ( "{:#?} has no `size` field" , register. info) ) /
507
- 8 ;
505
+ . size
506
+ . or ( d. size )
507
+ . expect ( & format ! ( "Register {}.{} has no `size` field" ,
508
+ p. name,
509
+ register. name) ) / 8 ;
508
510
}
509
511
510
512
let p_name = Ident :: new ( & * p. name . to_sanitized_pascal_case ( ) ) ;
@@ -571,8 +573,8 @@ fn expand(registers: &[Register]) -> Vec<ExpandedRegister> {
571
573
. map ( |v| Cow :: from ( & * * v) )
572
574
. unwrap_or_else ( || {
573
575
Cow :: from ( ( 0 ..array_info. dim )
574
- . map ( |i| i. to_string ( ) )
575
- . collect :: < Vec < _ > > ( ) )
576
+ . map ( |i| i. to_string ( ) )
577
+ . collect :: < Vec < _ > > ( ) )
576
578
} ) ;
577
579
578
580
for ( idx, i) in indices. iter ( ) . zip ( 0 ..) {
@@ -586,11 +588,12 @@ fn expand(registers: &[Register]) -> Vec<ExpandedRegister> {
586
588
i * array_info. dim_increment ;
587
589
588
590
out. push ( ExpandedRegister {
589
- info : info,
590
- name : name. to_sanitized_snake_case ( ) . into_owned ( ) ,
591
- offset : offset,
592
- ty : Either :: Right ( ty. clone ( ) ) ,
593
- } ) ;
591
+ info : info,
592
+ name : name. to_sanitized_snake_case ( )
593
+ . into_owned ( ) ,
594
+ offset : offset,
595
+ ty : Either :: Right ( ty. clone ( ) ) ,
596
+ } ) ;
594
597
}
595
598
}
596
599
}
@@ -616,16 +619,21 @@ fn name_of(r: &Register) -> Cow<str> {
616
619
617
620
fn access ( r : & Register ) -> Access {
618
621
r. access . unwrap_or_else ( || if let Some ( ref fields) = r. fields {
619
- if fields. iter ( ) . all ( |f| f. access == Some ( Access :: ReadOnly ) ) {
620
- Access :: ReadOnly
621
- } else if fields. iter ( ) . all ( |f| f. access == Some ( Access :: WriteOnly ) ) {
622
+ if fields. iter ( ) . all ( |f| {
623
+ f. access ==
624
+ Some ( Access :: ReadOnly )
625
+ } ) {
626
+ Access :: ReadOnly
627
+ } else if fields. iter ( ) . all ( |f| {
628
+ f. access == Some ( Access :: WriteOnly )
629
+ } ) {
622
630
Access :: WriteOnly
623
631
} else {
624
632
Access :: ReadWrite
625
633
}
626
- } else {
627
- Access :: ReadWrite
628
- } )
634
+ } else {
635
+ Access :: ReadWrite
636
+ } )
629
637
}
630
638
631
639
#[ cfg_attr( feature = "cargo-clippy" , allow( cyclomatic_complexity) ) ]
@@ -642,7 +650,7 @@ pub fn gen_register(r: &Register,
642
650
643
651
let reg_ty = r. size
644
652
. or ( d. size )
645
- . expect ( & format ! ( "{:#? } has no `size` field" , r) )
653
+ . expect ( & format ! ( "Register { } has no `size` field" , r. name ) )
646
654
. to_ty ( ) ;
647
655
let access = access ( r) ;
648
656
@@ -777,10 +785,10 @@ pub fn gen_register(r: &Register,
777
785
continue ;
778
786
}
779
787
780
- let field_name = Ident :: new ( & * field . name
781
- . to_sanitized_snake_case ( ) ) ;
782
- let _field_name =
783
- Ident :: new ( & * format ! ( "_{}" ,
788
+ let field_name =
789
+ Ident :: new ( & * field . name
790
+ . to_sanitized_snake_case ( ) ) ;
791
+ let _field_name = Ident :: new ( & * format ! ( "_{}" ,
784
792
field. name
785
793
. replace( BLACKLIST_CHARS , "" )
786
794
. to_snake_case( ) ) ) ;
@@ -815,9 +823,10 @@ pub fn gen_register(r: &Register,
815
823
let variants = ( 0 ..1 << width)
816
824
. map ( |i| {
817
825
let value = u64:: from ( i) ;
818
- if let Some ( ev) = evs. values
819
- . iter ( )
820
- . find ( |ev| ev. value == Some ( i) ) {
826
+ if let Some ( ev) =
827
+ evs. values
828
+ . iter ( )
829
+ . find ( |ev| ev. value == Some ( i) ) {
821
830
let sc = Ident :: new ( & * ev. name
822
831
. replace ( BLACKLIST_CHARS , "" )
823
832
. to_snake_case ( ) ) ;
@@ -861,8 +870,9 @@ pub fn gen_register(r: &Register,
861
870
. to_sanitized_pascal_case( ) ) )
862
871
} ;
863
872
864
- if let Some ( register) = base. as_ref ( )
865
- . and_then ( |base| base. register ) {
873
+ if let Some ( register) =
874
+ base. as_ref ( )
875
+ . and_then ( |base| base. register ) {
866
876
let register =
867
877
Ident :: new ( & * register. to_sanitized_snake_case ( ) ) ;
868
878
@@ -1004,8 +1014,9 @@ pub fn gen_register(r: &Register,
1004
1014
continue ;
1005
1015
}
1006
1016
1007
- let field_name_sc = Ident :: new ( & * field. name
1008
- . to_sanitized_snake_case ( ) ) ;
1017
+ let field_name_sc =
1018
+ Ident :: new ( & * field. name
1019
+ . to_sanitized_snake_case ( ) ) ;
1009
1020
let width = field. bit_range . width ;
1010
1021
let mask = Lit :: Int ( ( 1u64 << width) - 1 , IntTy :: Unsuffixed ) ;
1011
1022
let offset = Lit :: Int ( u64:: from ( field. bit_range . offset ) ,
@@ -1049,8 +1060,9 @@ pub fn gen_register(r: &Register,
1049
1060
. to_sanitized_pascal_case( ) ) )
1050
1061
} ;
1051
1062
1052
- if let Some ( register) = base. as_ref ( )
1053
- . and_then ( |base| base. register ) {
1063
+ if let Some ( register) =
1064
+ base. as_ref ( )
1065
+ . and_then ( |base| base. register ) {
1054
1066
let register =
1055
1067
Ident :: new ( & * register. to_sanitized_snake_case ( ) ) ;
1056
1068
@@ -1063,15 +1075,18 @@ pub fn gen_register(r: &Register,
1063
1075
}
1064
1076
}
1065
1077
1066
- let variants =
1067
- evs. values
1068
- . iter ( )
1069
- . map ( |ev| {
1070
- // TODO better error message
1071
- let value = u64:: from ( ev. value
1072
- . expect ( "no value in EnumeratedValue" ) ) ;
1073
-
1074
- Variant {
1078
+ let variants = evs. values
1079
+ . iter ( )
1080
+ . map ( |ev| {
1081
+ let value =
1082
+ u64:: from ( ev. value
1083
+ . expect ( & format ! ( "no value in \
1084
+ EnumeratedValue in \
1085
+ {}.{}",
1086
+ r. name,
1087
+ field. name) ) ) ;
1088
+
1089
+ Variant {
1075
1090
doc : ev. description
1076
1091
. clone ( )
1077
1092
. unwrap_or_else ( || {
@@ -1083,8 +1098,8 @@ pub fn gen_register(r: &Register,
1083
1098
. to_sanitized_snake_case ( ) ) ,
1084
1099
value : value,
1085
1100
}
1086
- } )
1087
- . collect :: < Vec < _ > > ( ) ;
1101
+ } )
1102
+ . collect :: < Vec < _ > > ( ) ;
1088
1103
1089
1104
// Whether the `bits` method should be `unsafe`.
1090
1105
// `bits` can be safe when enumeratedValues covers all
@@ -1261,33 +1276,43 @@ fn lookup<'a>(evs: &'a [EnumeratedValues],
1261
1276
let mut parts = base. split ( '.' ) ;
1262
1277
1263
1278
let ( register, fields, field) = match ( parts. next ( ) ,
1264
- parts. next ( ) ) {
1279
+ parts. next ( ) ) {
1265
1280
( Some ( register) , Some ( field) ) => {
1266
- // TODO better error message
1267
1281
let fields = all_registers. iter ( )
1268
1282
. find ( |r| r. name == register)
1269
- . expect ( "couldn't find register" )
1283
+ . expect ( & format ! ( "couldn't find register {} \
1284
+ requested by 'derivedFrom=\
1285
+ \" {}\" '",
1286
+ register,
1287
+ base) )
1270
1288
. fields
1271
1289
. as_ref ( )
1272
- . expect ( "no fields" ) ;
1290
+ . expect ( & format ! ( "register {} has no fields" ,
1291
+ register) ) ;
1273
1292
1274
1293
( Some ( register) , & fields[ ..] , field)
1275
1294
}
1276
1295
( Some ( field) , None ) => ( None , fields, field) ,
1277
1296
_ => unreachable ! ( ) ,
1278
1297
} ;
1279
1298
1280
- // TODO better error message
1281
- let evs = fields. iter ( )
1282
- . flat_map ( |f| f. enumerated_values . iter ( ) )
1283
- . find ( |evs| evs. name . as_ref ( ) . map ( |s| & * * s) == Some ( field) )
1284
- . expect ( "" ) ;
1299
+ let evs =
1300
+ fields. iter ( )
1301
+ . flat_map ( |f| f. enumerated_values . iter ( ) )
1302
+ . find ( |evs| {
1303
+ evs. name . as_ref ( ) . map ( |s| & * * s) == Some ( field)
1304
+ } )
1305
+ . expect ( & format ! ( "couldn't find field {} in {}" ,
1306
+ field,
1307
+ register. map( |r| {
1308
+ format!( "register {}" , r)
1309
+ } ) . unwrap_or( "this register" . to_owned( ) ) ) ) ;
1285
1310
1286
1311
( evs,
1287
1312
Some ( Base {
1288
- register : register,
1289
- field : field,
1290
- } ) )
1313
+ register : register,
1314
+ field : field,
1315
+ } ) )
1291
1316
} else {
1292
1317
( evs, None )
1293
1318
}
0 commit comments