@@ -11,7 +11,7 @@ use super::register::{RegisterExt, RegisterInfoExt};
11
11
use super :: yaml_ext:: { AsType , GetVal , ToYaml } ;
12
12
use super :: {
13
13
check_offsets, make_dim_element, matchname, matchsubspec, modify_dim_element, spec_ind,
14
- PatchResult , VAL_LVL ,
14
+ PatchResult , Spec , VAL_LVL ,
15
15
} ;
16
16
use super :: { make_cluster, make_interrupt, make_register} ;
17
17
@@ -412,6 +412,7 @@ impl RegisterBlockExt for Peripheral {
412
412
}
413
413
414
414
fn modify_register ( & mut self , rspec : & str , rmod : & Hash ) -> PatchResult {
415
+ // TODO: empty error
415
416
let rtags = self . iter_registers ( rspec) . collect :: < Vec < _ > > ( ) ;
416
417
if !rtags. is_empty ( ) {
417
418
let register_builder = make_register ( rmod) ?;
@@ -562,6 +563,7 @@ impl RegisterBlockExt for Peripheral {
562
563
}
563
564
564
565
fn modify_cluster ( & mut self , cspec : & str , cmod : & Hash ) -> PatchResult {
566
+ // TODO: empty error
565
567
let ctags = self . iter_clusters ( cspec) . collect :: < Vec < _ > > ( ) ;
566
568
if !ctags. is_empty ( ) {
567
569
let cluster_builder = make_cluster ( cmod) ?;
@@ -640,12 +642,13 @@ impl RegisterBlockExt for Peripheral {
640
642
// Find all registers that match the spec
641
643
let mut rcount = 0 ;
642
644
let pname = self . name . clone ( ) ;
645
+ let ( rspec, ignore) = rspec. spec ( ) ;
643
646
for rtag in self . iter_registers ( rspec) {
644
647
rcount += 1 ;
645
648
rtag. process ( rmod, & pname, update_fields)
646
649
. with_context ( || format ! ( "Processing register `{}`" , rtag. name) ) ?;
647
650
}
648
- if rcount == 0 {
651
+ if !ignore && rcount == 0 {
649
652
Err ( anyhow ! (
650
653
"Could not find `{pname}:{rspec}. Present registers: {}.`" ,
651
654
self . registers( ) . map( |r| r. name. as_str( ) ) . join( ", " )
@@ -659,12 +662,13 @@ impl RegisterBlockExt for Peripheral {
659
662
// Find all clusters that match the spec
660
663
let mut ccount = 0 ;
661
664
let pname = self . name . clone ( ) ;
665
+ let ( cspec, ignore) = cspec. spec ( ) ;
662
666
for ctag in self . iter_clusters ( cspec) {
663
667
ccount += 1 ;
664
668
ctag. process ( cmod, & pname, update_fields)
665
669
. with_context ( || format ! ( "Processing cluster `{}`" , ctag. name) ) ?;
666
670
}
667
- if ccount == 0 {
671
+ if !ignore && ccount == 0 {
668
672
Err ( anyhow ! (
669
673
"Could not find `{pname}:{cspec}. Present clusters: {}.`" ,
670
674
self . clusters( ) . map( |c| c. name. as_str( ) ) . join( ", " )
@@ -1095,12 +1099,13 @@ impl RegisterBlockExt for Cluster {
1095
1099
// Find all registers that match the spec
1096
1100
let mut rcount = 0 ;
1097
1101
let pname = self . name . clone ( ) ;
1102
+ let ( rspec, ignore) = rspec. spec ( ) ;
1098
1103
for rtag in self . iter_registers ( rspec) {
1099
1104
rcount += 1 ;
1100
1105
rtag. process ( rmod, & pname, update_fields)
1101
1106
. with_context ( || format ! ( "Processing register `{}`" , rtag. name) ) ?;
1102
1107
}
1103
- if rcount == 0 {
1108
+ if !ignore && rcount == 0 {
1104
1109
Err ( anyhow ! (
1105
1110
"Could not find `{pname}:{}:{rspec}. Present registers: {}.`" ,
1106
1111
self . name,
@@ -1115,12 +1120,13 @@ impl RegisterBlockExt for Cluster {
1115
1120
// Find all clusters that match the spec
1116
1121
let mut ccount = 0 ;
1117
1122
let pname = self . name . clone ( ) ;
1123
+ let ( cspec, ignore) = cspec. spec ( ) ;
1118
1124
for ctag in self . iter_clusters ( cspec) {
1119
1125
ccount += 1 ;
1120
1126
ctag. process ( cmod, & pname, update_fields)
1121
1127
. with_context ( || format ! ( "Processing cluster `{}`" , ctag. name) ) ?;
1122
1128
}
1123
- if ccount == 0 {
1129
+ if !ignore && ccount == 0 {
1124
1130
Err ( anyhow ! (
1125
1131
"Could not find `{pname}:{}:{cspec}. Present clusters: {}.`" ,
1126
1132
self . name,
@@ -1141,6 +1147,7 @@ fn collect_in_array(
1141
1147
let mut registers = Vec :: new ( ) ;
1142
1148
let mut place = usize:: MAX ;
1143
1149
let mut i = 0 ;
1150
+ let ( rspec, ignore) = rspec. spec ( ) ;
1144
1151
while i < regs. len ( ) {
1145
1152
match & regs[ i] {
1146
1153
RegisterCluster :: Register ( Register :: Single ( r) ) if matchname ( & r. name , rspec) => {
@@ -1153,6 +1160,9 @@ fn collect_in_array(
1153
1160
}
1154
1161
}
1155
1162
if registers. is_empty ( ) {
1163
+ if ignore {
1164
+ return Ok ( ( ) ) ;
1165
+ }
1156
1166
return Err ( anyhow ! (
1157
1167
"{path}: registers {rspec} not found. Present registers: {}.`" ,
1158
1168
regs. iter( )
@@ -1256,9 +1266,9 @@ fn collect_in_cluster(
1256
1266
if rspec == "description" {
1257
1267
continue ;
1258
1268
}
1259
- rspecs. push ( rspec. to_string ( ) ) ;
1260
1269
let mut registers = Vec :: new ( ) ;
1261
1270
let mut i = 0 ;
1271
+ let ( rspec, ignore) = rspec. spec ( ) ;
1262
1272
while i < regs. len ( ) {
1263
1273
match & regs[ i] {
1264
1274
RegisterCluster :: Register ( Register :: Single ( r) ) if matchname ( & r. name , rspec) => {
@@ -1271,6 +1281,9 @@ fn collect_in_cluster(
1271
1281
}
1272
1282
}
1273
1283
if registers. is_empty ( ) {
1284
+ if ignore {
1285
+ continue ;
1286
+ }
1274
1287
return Err ( anyhow ! (
1275
1288
"{path}: registers {rspec} not found. Present registers: {}.`" ,
1276
1289
regs. iter( )
@@ -1281,6 +1294,7 @@ fn collect_in_cluster(
1281
1294
. join( ", " )
1282
1295
) ) ;
1283
1296
}
1297
+ rspecs. push ( rspec. to_string ( ) ) ;
1284
1298
if single {
1285
1299
if registers. len ( ) > 1 {
1286
1300
return Err ( anyhow ! ( "{path}: more than one registers {rspec} found" ) ) ;
@@ -1341,6 +1355,11 @@ fn collect_in_cluster(
1341
1355
}
1342
1356
rdict. insert ( rspec. to_string ( ) , registers) ;
1343
1357
}
1358
+ if rdict. is_empty ( ) {
1359
+ return Err ( anyhow ! (
1360
+ "{path}: registers cannot be collected into {cname} cluster. No matches found"
1361
+ ) ) ;
1362
+ }
1344
1363
let address_offset = rdict
1345
1364
. values ( )
1346
1365
. min_by_key ( |rs| rs[ 0 ] . address_offset )
0 commit comments