@@ -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, common_description, make_dim_element, matchname, matchsubspec,
14
- modify_dim_element, spec_ind, Config , PatchResult , VAL_LVL ,
14
+ modify_dim_element, spec_ind, Config , PatchResult , Spec , VAL_LVL ,
15
15
} ;
16
16
use super :: { make_cluster, make_interrupt, make_register} ;
17
17
@@ -407,6 +407,7 @@ impl RegisterBlockExt for Peripheral {
407
407
}
408
408
409
409
fn modify_register ( & mut self , rspec : & str , rmod : & Hash ) -> PatchResult {
410
+ // TODO: empty error
410
411
let rtags = self . iter_registers ( rspec) . collect :: < Vec < _ > > ( ) ;
411
412
if !rtags. is_empty ( ) {
412
413
let register_builder = make_register ( rmod) ?;
@@ -557,6 +558,7 @@ impl RegisterBlockExt for Peripheral {
557
558
}
558
559
559
560
fn modify_cluster ( & mut self , cspec : & str , cmod : & Hash ) -> PatchResult {
561
+ // TODO: empty error
560
562
let ctags = self . iter_clusters ( cspec) . collect :: < Vec < _ > > ( ) ;
561
563
if !ctags. is_empty ( ) {
562
564
let cluster_builder = make_cluster ( cmod) ?;
@@ -646,12 +648,13 @@ impl RegisterBlockExt for Peripheral {
646
648
// Find all registers that match the spec
647
649
let mut rcount = 0 ;
648
650
let pname = self . name . clone ( ) ;
651
+ let ( rspec, ignore) = rspec. spec ( ) ;
649
652
for rtag in self . iter_registers ( rspec) {
650
653
rcount += 1 ;
651
654
rtag. process ( rmod, & pname, config)
652
655
. with_context ( || format ! ( "Processing register `{}`" , rtag. name) ) ?;
653
656
}
654
- if rcount == 0 {
657
+ if !ignore && rcount == 0 {
655
658
Err ( anyhow ! (
656
659
"Could not find `{pname}:{rspec}. Present registers: {}.`" ,
657
660
self . registers( ) . map( |r| r. name. as_str( ) ) . join( ", " )
@@ -665,12 +668,13 @@ impl RegisterBlockExt for Peripheral {
665
668
// Find all clusters that match the spec
666
669
let mut ccount = 0 ;
667
670
let pname = self . name . clone ( ) ;
671
+ let ( cspec, ignore) = cspec. spec ( ) ;
668
672
for ctag in self . iter_clusters ( cspec) {
669
673
ccount += 1 ;
670
674
ctag. process ( cmod, & pname, config)
671
675
. with_context ( || format ! ( "Processing cluster `{}`" , ctag. name) ) ?;
672
676
}
673
- if ccount == 0 {
677
+ if !ignore && ccount == 0 {
674
678
Err ( anyhow ! (
675
679
"Could not find `{pname}:{cspec}. Present clusters: {}.`" ,
676
680
self . clusters( ) . map( |c| c. name. as_str( ) ) . join( ", " )
@@ -1112,12 +1116,13 @@ impl RegisterBlockExt for Cluster {
1112
1116
// Find all registers that match the spec
1113
1117
let mut rcount = 0 ;
1114
1118
let pname = self . name . clone ( ) ;
1119
+ let ( rspec, ignore) = rspec. spec ( ) ;
1115
1120
for rtag in self . iter_registers ( rspec) {
1116
1121
rcount += 1 ;
1117
1122
rtag. process ( rmod, & pname, config)
1118
1123
. with_context ( || format ! ( "Processing register `{}`" , rtag. name) ) ?;
1119
1124
}
1120
- if rcount == 0 {
1125
+ if !ignore && rcount == 0 {
1121
1126
Err ( anyhow ! (
1122
1127
"Could not find `{pname}:{}:{rspec}. Present registers: {}.`" ,
1123
1128
self . name,
@@ -1132,12 +1137,13 @@ impl RegisterBlockExt for Cluster {
1132
1137
// Find all clusters that match the spec
1133
1138
let mut ccount = 0 ;
1134
1139
let pname = self . name . clone ( ) ;
1140
+ let ( cspec, ignore) = cspec. spec ( ) ;
1135
1141
for ctag in self . iter_clusters ( cspec) {
1136
1142
ccount += 1 ;
1137
1143
ctag. process ( cmod, & pname, config)
1138
1144
. with_context ( || format ! ( "Processing cluster `{}`" , ctag. name) ) ?;
1139
1145
}
1140
- if ccount == 0 {
1146
+ if !ignore && ccount == 0 {
1141
1147
Err ( anyhow ! (
1142
1148
"Could not find `{pname}:{}:{cspec}. Present clusters: {}.`" ,
1143
1149
self . name,
@@ -1159,6 +1165,7 @@ fn collect_in_array(
1159
1165
let mut registers = Vec :: new ( ) ;
1160
1166
let mut place = usize:: MAX ;
1161
1167
let mut i = 0 ;
1168
+ let ( rspec, ignore) = rspec. spec ( ) ;
1162
1169
while i < regs. len ( ) {
1163
1170
match & regs[ i] {
1164
1171
RegisterCluster :: Register ( Register :: Single ( r) ) if matchname ( & r. name , rspec) => {
@@ -1171,6 +1178,9 @@ fn collect_in_array(
1171
1178
}
1172
1179
}
1173
1180
if registers. is_empty ( ) {
1181
+ if ignore {
1182
+ return Ok ( ( ) ) ;
1183
+ }
1174
1184
return Err ( anyhow ! (
1175
1185
"{path}: registers {rspec} not found. Present registers: {}.`" ,
1176
1186
regs. iter( )
@@ -1299,9 +1309,9 @@ fn collect_in_cluster(
1299
1309
if rspec == "description" {
1300
1310
continue ;
1301
1311
}
1302
- rspecs. push ( rspec. to_string ( ) ) ;
1303
1312
let mut registers = Vec :: new ( ) ;
1304
1313
let mut i = 0 ;
1314
+ let ( rspec, ignore) = rspec. spec ( ) ;
1305
1315
while i < regs. len ( ) {
1306
1316
match & regs[ i] {
1307
1317
RegisterCluster :: Register ( Register :: Single ( r) ) if matchname ( & r. name , rspec) => {
@@ -1314,6 +1324,9 @@ fn collect_in_cluster(
1314
1324
}
1315
1325
}
1316
1326
if registers. is_empty ( ) {
1327
+ if ignore {
1328
+ continue ;
1329
+ }
1317
1330
return Err ( anyhow ! (
1318
1331
"{path}: registers {rspec} not found. Present registers: {}.`" ,
1319
1332
regs. iter( )
@@ -1324,6 +1337,7 @@ fn collect_in_cluster(
1324
1337
. join( ", " )
1325
1338
) ) ;
1326
1339
}
1340
+ rspecs. push ( rspec. to_string ( ) ) ;
1327
1341
if single {
1328
1342
if registers. len ( ) > 1 {
1329
1343
return Err ( anyhow ! ( "{path}: more than one registers {rspec} found" ) ) ;
@@ -1384,6 +1398,11 @@ fn collect_in_cluster(
1384
1398
}
1385
1399
rdict. insert ( rspec. to_string ( ) , registers) ;
1386
1400
}
1401
+ if rdict. is_empty ( ) {
1402
+ return Err ( anyhow ! (
1403
+ "{path}: registers cannot be collected into {cname} cluster. No matches found"
1404
+ ) ) ;
1405
+ }
1387
1406
let address_offset = rdict
1388
1407
. values ( )
1389
1408
. min_by_key ( |rs| rs[ 0 ] . address_offset )
0 commit comments