@@ -539,7 +539,7 @@ fn register_or_cluster_block(
539539 let ercs_expanded = expand ( ercs, derive_infos, config)
540540 . with_context ( || "Could not expand register or cluster block" ) ?;
541541
542- // Locate conflicting regions; we'll need to use unions to derive_infoesent them.
542+ // Locate conflicting regions; we'll need to use unions to represent them.
543543 let mut regions = FieldRegions :: default ( ) ;
544544
545545 for reg_block_field in & ercs_expanded {
@@ -1084,15 +1084,15 @@ fn expand_register(
10841084 let description = register. description . clone ( ) . unwrap_or_default ( ) ;
10851085
10861086 let info_name = register. fullname ( config. ignore_groups ) ;
1087- let ty_name = if register. is_single ( ) {
1087+ let mut ty_name = if register. is_single ( ) {
10881088 info_name. to_string ( )
10891089 } else {
10901090 util:: replace_suffix ( & info_name, "" )
10911091 } ;
1092- let ty = name_to_ty ( & ty_name) ;
10931092
10941093 match register {
10951094 Register :: Single ( info) => {
1095+ let ty = name_to_ty ( & ty_name) ;
10961096 let syn_field = new_syn_field ( ty_name. to_snake_case_ident ( Span :: call_site ( ) ) , ty) ;
10971097 register_expanded. push ( RegisterBlockField {
10981098 syn_field,
@@ -1114,20 +1114,36 @@ fn expand_register(
11141114 false => true ,
11151115 } ;
11161116
1117- // force expansion if we're implicitly deriving so we don't get name collisions
1118- let array_convertible = if let DeriveInfo :: Implicit ( _) = derive_info {
1119- false
1117+ // if dimIndex exists, test if it is a sequence of numbers from 0 to dim
1118+ let sequential_indexes_from0 = array_info
1119+ . indexes_as_range ( )
1120+ . filter ( |r| * r. start ( ) == 0 )
1121+ . is_some ( ) ;
1122+
1123+ // force expansion and rename if we're deriving an array that doesnt start at 0 so we don't get name collisions
1124+ let index: Cow < str > = if let Some ( dim_index) = & array_info. dim_index {
1125+ dim_index. first ( ) . unwrap ( ) . into ( )
11201126 } else {
1121- sequential_addresses && convert_list
1127+ if sequential_indexes_from0 {
1128+ "0" . into ( )
1129+ } else {
1130+ "" . into ( )
1131+ }
1132+ } ;
1133+ let array_convertible = match derive_info {
1134+ DeriveInfo :: Implicit ( _) => {
1135+ ty_name = util:: replace_suffix ( & info_name, & index) ;
1136+ sequential_addresses && convert_list && sequential_indexes_from0
1137+ }
1138+ DeriveInfo :: Explicit ( _) => {
1139+ ty_name = util:: replace_suffix ( & info_name, & index) ;
1140+ sequential_addresses && convert_list && sequential_indexes_from0
1141+ }
1142+ _ => sequential_addresses && convert_list,
11221143 } ;
1144+ let ty = name_to_ty ( & ty_name) ;
11231145
11241146 if array_convertible {
1125- // if dimIndex exists, test if it is a sequence of numbers from 0 to dim
1126- let sequential_indexes_from0 = array_info
1127- . indexes_as_range ( )
1128- . filter ( |r| * r. start ( ) == 0 )
1129- . is_some ( ) ;
1130-
11311147 let accessors = if sequential_indexes_from0 {
11321148 Vec :: new ( )
11331149 } else {
@@ -1211,33 +1227,22 @@ fn render_ercs(
12111227 RegisterCluster :: Register ( reg) => {
12121228 trace ! ( "Register: {}, DeriveInfo: {}" , reg. name, derive_info) ;
12131229 let mut rpath = None ;
1214- let before_name = reg. name . to_string ( ) ;
12151230 if let DeriveInfo :: Implicit ( rp) = derive_info {
1216- let mut idx_name = None ;
1217- let info_name = reg. fullname ( config. ignore_groups ) . to_string ( ) ;
1218- if let Register :: Array ( _, array_info) = reg {
1219- for ( _, i) in array_info. indexes ( ) . enumerate ( ) {
1220- idx_name = Some ( util:: replace_suffix ( & info_name, & i) . to_string ( ) ) ;
1221- }
1222- }
1223- if let Some ( name) = idx_name {
1224- reg. name = name;
1225- }
12261231 rpath = Some ( rp. clone ( ) ) ;
12271232 } else {
12281233 let dpath = reg. derived_from . take ( ) ;
12291234 if let Some ( dpath) = dpath {
12301235 rpath = derive_register ( reg, & dpath, path, index) ?;
12311236 }
12321237 }
1238+ let reg_name = & reg. name ;
12331239 let rendered_reg =
12341240 register:: render ( reg, path, rpath, index, config) . with_context ( || {
12351241 let descrip = reg. description . as_deref ( ) . unwrap_or ( "No description" ) ;
12361242 format ! (
1237- "Error rendering register\n Name: {before_name }\n Description: {descrip}"
1243+ "Error rendering register\n Name: {reg_name }\n Description: {descrip}"
12381244 )
12391245 } ) ?;
1240- reg. name = before_name;
12411246 mod_items. extend ( rendered_reg)
12421247 }
12431248 }
0 commit comments