@@ -1249,10 +1249,8 @@ fn collect_in_array(
12491249 let dim_increment = if dim > 1 {
12501250 offsets[ 1 ] - offsets[ 0 ]
12511251 } else {
1252- registers[ 0 ]
1253- . properties
1254- . size
1255- . map ( |s| s / 8 )
1252+ rmod. get_u32 ( "dimIncrement" ) ?
1253+ . or_else ( || registers[ 0 ] . properties . size . map ( |s| s / 8 ) )
12561254 . unwrap_or_default ( )
12571255 } ;
12581256 if !check_offsets ( & offsets, dim_increment) {
@@ -1359,24 +1357,24 @@ fn collect_in_cluster(
13591357 let mut first = None ;
13601358 let mut dim = 0 ;
13611359 let mut dim_index = Vec :: new ( ) ;
1362- let mut dim_increment = 0 ;
1360+ let mut dim_increment = cmod . get_u32 ( "dimIncrement" ) ? . unwrap_or ( 0 ) ;
13631361 let mut offsets = Vec :: new ( ) ;
13641362 let mut place = usize:: MAX ;
13651363 let mut rspecs = Vec :: new ( ) ;
13661364 let single = !cname. contains ( "%s" ) ;
13671365
13681366 for ( rspec, rmod) in cmod {
13691367 let rspec = rspec. str ( ) ?;
1370- if rspec == "description" {
1368+ if rspec == "description" || rspec == "dimIncrement" {
13711369 continue ;
13721370 }
13731371 let mut registers = Vec :: new ( ) ;
13741372 let mut i = 0 ;
13751373 let ( rspec, ignore) = rspec. spec ( ) ;
13761374 while i < regs. len ( ) {
13771375 match & regs[ i] {
1378- RegisterCluster :: Register ( Register :: Single ( r ) ) if matchname ( & r. name , rspec) => {
1379- if let RegisterCluster :: Register ( Register :: Single ( r ) ) = regs. remove ( i) {
1376+ RegisterCluster :: Register ( r ) if matchname ( & r. name , rspec) => {
1377+ if let RegisterCluster :: Register ( r ) = regs. remove ( i) {
13801378 registers. push ( r) ;
13811379 place = place. min ( i) ;
13821380 }
@@ -1399,15 +1397,29 @@ fn collect_in_cluster(
13991397 ) ) ;
14001398 }
14011399 rspecs. push ( rspec. to_string ( ) ) ;
1400+
14021401 if single {
14031402 if registers. len ( ) > 1 {
14041403 return Err ( anyhow ! ( "{path}: more than one registers {rspec} found" ) ) ;
14051404 }
14061405 } else {
14071406 registers. sort_by_key ( |r| r. address_offset ) ;
1407+ if let Register :: Array ( _, rdim) = & registers[ 0 ] {
1408+ if !registers
1409+ . iter ( )
1410+ . skip ( 1 )
1411+ . all ( |r| matches ! ( r, Register :: Array ( _, d) if d == rdim) )
1412+ {
1413+ return Err ( anyhow ! ( "`{rspec}` have different dim blocks" ) ) ;
1414+ }
1415+ } else if !registers. iter ( ) . skip ( 1 ) . all ( |r| r. is_single ( ) ) {
1416+ return Err ( anyhow ! (
1417+ "Some of `{rspec}` registers are arrays and some are not"
1418+ ) ) ;
1419+ }
14081420 let bitmasks = registers
14091421 . iter ( )
1410- . map ( RegisterInfo :: get_bitmask)
1422+ . map ( |r| RegisterInfo :: get_bitmask ( r ) )
14111423 . collect :: < Vec < _ > > ( ) ;
14121424 let new_dim_index = registers
14131425 . iter ( )
@@ -1483,7 +1495,7 @@ fn collect_in_cluster(
14831495 config. update_fields = true ;
14841496 let cluster = if single {
14851497 for ( _, ( rmod, mut registers) ) in rdict. into_iter ( ) {
1486- let mut reg = registers. swap_remove ( 0 ) . single ( ) ;
1498+ let mut reg = registers. swap_remove ( 0 ) ;
14871499 let rmod = rmod. hash ( ) ?;
14881500 reg. process ( rmod, path, & config)
14891501 . with_context ( || format ! ( "Processing register `{}`" , reg. name) ) ?;
@@ -1497,7 +1509,7 @@ fn collect_in_cluster(
14971509 cinfo. children ( children) . build ( VAL_LVL ) ?. single ( )
14981510 } else {
14991511 for ( rspec, ( rmod, mut registers) ) in rdict. into_iter ( ) {
1500- let mut reg = registers. swap_remove ( 0 ) . single ( ) ;
1512+ let mut reg = registers. swap_remove ( 0 ) ;
15011513 let rmod = rmod. hash ( ) ?;
15021514 reg. process ( rmod, path, & config)
15031515 . with_context ( || format ! ( "Processing register `{}`" , reg. name) ) ?;
0 commit comments