@@ -484,8 +484,15 @@ impl RegisterBlockExt for Peripheral {
484
484
return Err ( anyhow ! ( "derive: incorrect syntax for {rname}" ) ) ;
485
485
} ;
486
486
487
- self . get_register ( rderive)
488
- . ok_or_else ( || anyhow ! ( "register {rderive} not found" ) ) ?;
487
+ self . get_register ( rderive) . ok_or_else ( || {
488
+ anyhow ! (
489
+ "register {rderive} not found. Present registers: {}.`" ,
490
+ self . registers( )
491
+ . map( |r| r. name. as_str( ) )
492
+ . collect:: <Vec <_>>( )
493
+ . join( ", " )
494
+ )
495
+ } ) ?;
489
496
490
497
match self . get_mut_register ( rname) {
491
498
Some ( register) => register. modify_from ( info, VAL_LVL ) ?,
@@ -643,7 +650,13 @@ impl RegisterBlockExt for Peripheral {
643
650
. with_context ( || format ! ( "Processing register `{}`" , rtag. name) ) ?;
644
651
}
645
652
if rcount == 0 {
646
- Err ( anyhow ! ( "Could not find `{pname}:{rspec}`" ) )
653
+ Err ( anyhow ! (
654
+ "Could not find `{pname}:{rspec}. Present registers: {}.`" ,
655
+ self . registers( )
656
+ . map( |r| r. name. as_str( ) )
657
+ . collect:: <Vec <_>>( )
658
+ . join( ", " )
659
+ ) )
647
660
} else {
648
661
Ok ( ( ) )
649
662
}
@@ -659,7 +672,13 @@ impl RegisterBlockExt for Peripheral {
659
672
. with_context ( || format ! ( "Processing cluster `{}`" , ctag. name) ) ?;
660
673
}
661
674
if ccount == 0 {
662
- Err ( anyhow ! ( "Could not find `{pname}:{cspec}`" ) )
675
+ Err ( anyhow ! (
676
+ "Could not find `{pname}:{cspec}. Present clusters: {}.`" ,
677
+ self . clusters( )
678
+ . map( |c| c. name. as_str( ) )
679
+ . collect:: <Vec <_>>( )
680
+ . join( ", " )
681
+ ) )
663
682
} else {
664
683
Ok ( ( ) )
665
684
}
@@ -944,8 +963,15 @@ impl RegisterBlockExt for Cluster {
944
963
return Err ( anyhow ! ( "derive: incorrect syntax for {rname}" ) ) ;
945
964
} ;
946
965
947
- self . get_register ( rderive)
948
- . ok_or_else ( || anyhow ! ( "register {rderive} not found" ) ) ?;
966
+ self . get_register ( rderive) . ok_or_else ( || {
967
+ anyhow ! (
968
+ "register {rderive} not found. Present registers: {}.`" ,
969
+ self . registers( )
970
+ . map( |r| r. name. as_str( ) )
971
+ . collect:: <Vec <_>>( )
972
+ . join( ", " )
973
+ )
974
+ } ) ?;
949
975
950
976
match self . get_mut_register ( rname) {
951
977
Some ( register) => register. modify_from ( info, VAL_LVL ) ?,
@@ -1088,7 +1114,14 @@ impl RegisterBlockExt for Cluster {
1088
1114
. with_context ( || format ! ( "Processing register `{}`" , rtag. name) ) ?;
1089
1115
}
1090
1116
if rcount == 0 {
1091
- Err ( anyhow ! ( "Could not find `{pname}:{rspec}`" ) )
1117
+ Err ( anyhow ! (
1118
+ "Could not find `{pname}:{}:{rspec}. Present registers: {}.`" ,
1119
+ self . name,
1120
+ self . registers( )
1121
+ . map( |r| r. name. as_str( ) )
1122
+ . collect:: <Vec <_>>( )
1123
+ . join( ", " )
1124
+ ) )
1092
1125
} else {
1093
1126
Ok ( ( ) )
1094
1127
}
@@ -1104,7 +1137,14 @@ impl RegisterBlockExt for Cluster {
1104
1137
. with_context ( || format ! ( "Processing cluster `{}`" , ctag. name) ) ?;
1105
1138
}
1106
1139
if ccount == 0 {
1107
- Err ( anyhow ! ( "Could not find `{pname}:{cspec}`" ) )
1140
+ Err ( anyhow ! (
1141
+ "Could not find `{pname}:{}:{cspec}. Present clusters: {}.`" ,
1142
+ self . name,
1143
+ self . clusters( )
1144
+ . map( |c| c. name. as_str( ) )
1145
+ . collect:: <Vec <_>>( )
1146
+ . join( ", " )
1147
+ ) )
1108
1148
} else {
1109
1149
Ok ( ( ) )
1110
1150
}
@@ -1132,7 +1172,16 @@ fn collect_in_array(
1132
1172
}
1133
1173
}
1134
1174
if registers. is_empty ( ) {
1135
- return Err ( anyhow ! ( "{path}: registers {rspec} not found" ) ) ;
1175
+ return Err ( anyhow ! (
1176
+ "{path}: registers {rspec} not found. Present registers: {}.`" ,
1177
+ regs. iter( )
1178
+ . filter_map( |rc| match rc {
1179
+ RegisterCluster :: Register ( r) => Some ( r. name. as_str( ) ) ,
1180
+ _ => None ,
1181
+ } )
1182
+ . collect:: <Vec <_>>( )
1183
+ . join( ", " )
1184
+ ) ) ;
1136
1185
}
1137
1186
registers. sort_by_key ( |r| r. address_offset ) ;
1138
1187
let Some ( ( li, ri) ) = spec_ind ( rspec) else {
@@ -1153,14 +1202,20 @@ fn collect_in_array(
1153
1202
. iter ( )
1154
1203
. map ( |r| r. address_offset )
1155
1204
. collect :: < Vec < _ > > ( ) ;
1205
+ let dim_increment = if dim > 1 { offsets[ 1 ] - offsets[ 0 ] } else { 0 } ;
1206
+ if !check_offsets ( & offsets, dim_increment) {
1207
+ return Err ( anyhow ! (
1208
+ "{}: registers cannot be collected into {rspec} array. Different addressOffset increments" ,
1209
+ path
1210
+ ) ) ;
1211
+ }
1156
1212
let bitmasks = registers
1157
1213
. iter ( )
1158
1214
. map ( RegisterInfo :: get_bitmask)
1159
1215
. collect :: < Vec < _ > > ( ) ;
1160
- let dim_increment = if dim > 1 { offsets[ 1 ] - offsets[ 0 ] } else { 0 } ;
1161
- if !( check_offsets ( & offsets, dim_increment) && bitmasks. iter ( ) . all ( |& m| m == bitmasks[ 0 ] ) ) {
1216
+ if !bitmasks. iter ( ) . all ( |& m| m == bitmasks[ 0 ] ) {
1162
1217
return Err ( anyhow ! (
1163
- "{}: registers cannot be collected into {rspec} array" ,
1218
+ "{}: registers cannot be collected into {rspec} array. Different bit masks " ,
1164
1219
path
1165
1220
) ) ;
1166
1221
}
@@ -1199,8 +1254,7 @@ fn collect_in_cluster(
1199
1254
cmod : & Hash ,
1200
1255
) -> PatchResult {
1201
1256
let mut rdict = linked_hash_map:: LinkedHashMap :: new ( ) ;
1202
- let mut first = true ;
1203
- let mut check = true ;
1257
+ let mut first = None ;
1204
1258
let mut dim = 0 ;
1205
1259
let mut dim_index = Vec :: new ( ) ;
1206
1260
let mut dim_increment = 0 ;
@@ -1229,7 +1283,16 @@ fn collect_in_cluster(
1229
1283
}
1230
1284
}
1231
1285
if registers. is_empty ( ) {
1232
- return Err ( anyhow ! ( "{path}: registers {rspec} not found" ) ) ;
1286
+ return Err ( anyhow ! (
1287
+ "{path}: registers {rspec} not found. Present registers: {}.`" ,
1288
+ regs. iter( )
1289
+ . filter_map( |rc| match rc {
1290
+ RegisterCluster :: Register ( r) => Some ( r. name. as_str( ) ) ,
1291
+ _ => None ,
1292
+ } )
1293
+ . collect:: <Vec <_>>( )
1294
+ . join( ", " )
1295
+ ) ) ;
1233
1296
}
1234
1297
if single {
1235
1298
if registers. len ( ) > 1 {
@@ -1253,43 +1316,43 @@ fn collect_in_cluster(
1253
1316
Ok ( r. name [ li..r. name . len ( ) - ri] . to_string ( ) )
1254
1317
} )
1255
1318
. collect :: < Result < Vec < _ > , _ > > ( ) ;
1256
- let new_dim_index = match new_dim_index {
1257
- Ok ( v) => v,
1258
- Err ( e) => return Err ( e) ,
1259
- } ;
1260
- if first {
1319
+ let new_dim_index = new_dim_index?;
1320
+ if let Some ( rspec1) = first. as_ref ( ) {
1321
+ let len = registers. len ( ) ;
1322
+ if dim != len {
1323
+ return Err ( anyhow ! (
1324
+ "{path}: registers cannot be collected into {cname} cluster. Different number of registers {rspec} ({len}) and {rspec1} ({dim})"
1325
+ ) ) ;
1326
+ }
1327
+ if dim_index != new_dim_index {
1328
+ return Err ( anyhow ! (
1329
+ "{path}: registers cannot be collected into {cname} cluster. {rspec} and {rspec1} have different indeces"
1330
+ ) ) ;
1331
+ }
1332
+ } else {
1261
1333
dim = registers. len ( ) ;
1262
1334
dim_index = new_dim_index;
1263
- dim_increment = 0 ;
1264
1335
offsets = registers
1265
1336
. iter ( )
1266
1337
. map ( |r| r. address_offset )
1267
1338
. collect :: < Vec < _ > > ( ) ;
1268
1339
if dim > 1 {
1269
1340
dim_increment = offsets[ 1 ] - offsets[ 0 ] ;
1270
1341
}
1271
- if !( check_offsets ( & offsets, dim_increment)
1272
- && bitmasks. iter ( ) . all ( |& m| m == bitmasks[ 0 ] ) )
1273
- {
1274
- check = false ;
1275
- break ;
1276
- }
1277
- } else if ( dim != registers. len ( ) )
1278
- || ( dim_index != new_dim_index)
1279
- || ( !check_offsets ( & offsets, dim_increment) )
1280
- || ( !bitmasks. iter ( ) . all ( |& m| m == bitmasks[ 0 ] ) )
1281
- {
1282
- check = false ;
1283
- break ;
1342
+ first = Some ( rspec. clone ( ) ) ;
1343
+ }
1344
+ if !check_offsets ( & offsets, dim_increment) {
1345
+ return Err ( anyhow ! (
1346
+ "{path}: registers cannot be collected into {cname} cluster. Different addressOffset increments in {rspec} registers"
1347
+ ) ) ;
1348
+ }
1349
+ if !bitmasks. iter ( ) . all ( |& m| m == bitmasks[ 0 ] ) {
1350
+ return Err ( anyhow ! (
1351
+ "{path}: registers cannot be collected into {cname} cluster. Different bit masks in {rspec} registers"
1352
+ ) ) ;
1284
1353
}
1285
1354
}
1286
1355
rdict. insert ( rspec. to_string ( ) , registers) ;
1287
- first = false ;
1288
- }
1289
- if !check {
1290
- return Err ( anyhow ! (
1291
- "{path}: registers cannot be collected into {cname} cluster"
1292
- ) ) ;
1293
1356
}
1294
1357
let address_offset = rdict
1295
1358
. values ( )
0 commit comments