@@ -1202,14 +1202,20 @@ fn collect_in_array(
1202
1202
. iter ( )
1203
1203
. map ( |r| r. address_offset )
1204
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
+ }
1205
1212
let bitmasks = registers
1206
1213
. iter ( )
1207
1214
. map ( RegisterInfo :: get_bitmask)
1208
1215
. collect :: < Vec < _ > > ( ) ;
1209
- let dim_increment = if dim > 1 { offsets[ 1 ] - offsets[ 0 ] } else { 0 } ;
1210
- if !( check_offsets ( & offsets, dim_increment) && bitmasks. iter ( ) . all ( |& m| m == bitmasks[ 0 ] ) ) {
1216
+ if !bitmasks. iter ( ) . all ( |& m| m == bitmasks[ 0 ] ) {
1211
1217
return Err ( anyhow ! (
1212
- "{}: registers cannot be collected into {rspec} array" ,
1218
+ "{}: registers cannot be collected into {rspec} array. Different bit masks " ,
1213
1219
path
1214
1220
) ) ;
1215
1221
}
@@ -1248,8 +1254,7 @@ fn collect_in_cluster(
1248
1254
cmod : & Hash ,
1249
1255
) -> PatchResult {
1250
1256
let mut rdict = linked_hash_map:: LinkedHashMap :: new ( ) ;
1251
- let mut first = true ;
1252
- let mut check = true ;
1257
+ let mut first = None ;
1253
1258
let mut dim = 0 ;
1254
1259
let mut dim_index = Vec :: new ( ) ;
1255
1260
let mut dim_increment = 0 ;
@@ -1311,43 +1316,43 @@ fn collect_in_cluster(
1311
1316
Ok ( r. name [ li..r. name . len ( ) - ri] . to_string ( ) )
1312
1317
} )
1313
1318
. collect :: < Result < Vec < _ > , _ > > ( ) ;
1314
- let new_dim_index = match new_dim_index {
1315
- Ok ( v) => v,
1316
- Err ( e) => return Err ( e) ,
1317
- } ;
1318
- 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 {
1319
1333
dim = registers. len ( ) ;
1320
1334
dim_index = new_dim_index;
1321
- dim_increment = 0 ;
1322
1335
offsets = registers
1323
1336
. iter ( )
1324
1337
. map ( |r| r. address_offset )
1325
1338
. collect :: < Vec < _ > > ( ) ;
1326
1339
if dim > 1 {
1327
1340
dim_increment = offsets[ 1 ] - offsets[ 0 ] ;
1328
1341
}
1329
- if !( check_offsets ( & offsets, dim_increment)
1330
- && bitmasks. iter ( ) . all ( |& m| m == bitmasks[ 0 ] ) )
1331
- {
1332
- check = false ;
1333
- break ;
1334
- }
1335
- } else if ( dim != registers. len ( ) )
1336
- || ( dim_index != new_dim_index)
1337
- || ( !check_offsets ( & offsets, dim_increment) )
1338
- || ( !bitmasks. iter ( ) . all ( |& m| m == bitmasks[ 0 ] ) )
1339
- {
1340
- check = false ;
1341
- 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
+ ) ) ;
1342
1353
}
1343
1354
}
1344
1355
rdict. insert ( rspec. to_string ( ) , registers) ;
1345
- first = false ;
1346
- }
1347
- if !check {
1348
- return Err ( anyhow ! (
1349
- "{path}: registers cannot be collected into {cname} cluster"
1350
- ) ) ;
1351
1356
}
1352
1357
let address_offset = rdict
1353
1358
. values ( )
0 commit comments