@@ -1202,14 +1202,20 @@ fn collect_in_array(
12021202 . iter ( )
12031203 . map ( |r| r. address_offset )
12041204 . 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+ }
12051212 let bitmasks = registers
12061213 . iter ( )
12071214 . map ( RegisterInfo :: get_bitmask)
12081215 . 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 ] ) {
12111217 return Err ( anyhow ! (
1212- "{}: registers cannot be collected into {rspec} array" ,
1218+ "{}: registers cannot be collected into {rspec} array. Different bit masks " ,
12131219 path
12141220 ) ) ;
12151221 }
@@ -1248,8 +1254,7 @@ fn collect_in_cluster(
12481254 cmod : & Hash ,
12491255) -> PatchResult {
12501256 let mut rdict = linked_hash_map:: LinkedHashMap :: new ( ) ;
1251- let mut first = true ;
1252- let mut check = true ;
1257+ let mut first = None ;
12531258 let mut dim = 0 ;
12541259 let mut dim_index = Vec :: new ( ) ;
12551260 let mut dim_increment = 0 ;
@@ -1311,43 +1316,43 @@ fn collect_in_cluster(
13111316 Ok ( r. name [ li..r. name . len ( ) - ri] . to_string ( ) )
13121317 } )
13131318 . 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 {
13191333 dim = registers. len ( ) ;
13201334 dim_index = new_dim_index;
1321- dim_increment = 0 ;
13221335 offsets = registers
13231336 . iter ( )
13241337 . map ( |r| r. address_offset )
13251338 . collect :: < Vec < _ > > ( ) ;
13261339 if dim > 1 {
13271340 dim_increment = offsets[ 1 ] - offsets[ 0 ] ;
13281341 }
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+ ) ) ;
13421353 }
13431354 }
13441355 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- ) ) ;
13511356 }
13521357 let address_offset = rdict
13531358 . values ( )
0 commit comments