@@ -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) ?;
@@ -635,12 +637,13 @@ impl RegisterBlockExt for Peripheral {
635
637
// Find all registers that match the spec
636
638
let mut rcount = 0 ;
637
639
let pname = self . name . clone ( ) ;
640
+ let ( rspec, ignore) = rspec. spec ( ) ;
638
641
for rtag in self . iter_registers ( rspec) {
639
642
rcount += 1 ;
640
643
rtag. process ( rmod, & pname, config)
641
644
. with_context ( || format ! ( "Processing register `{}`" , rtag. name) ) ?;
642
645
}
643
- if rcount == 0 {
646
+ if !ignore && rcount == 0 {
644
647
Err ( anyhow ! (
645
648
"Could not find `{pname}:{rspec}. Present registers: {}.`" ,
646
649
self . registers( ) . map( |r| r. name. as_str( ) ) . join( ", " )
@@ -654,12 +657,13 @@ impl RegisterBlockExt for Peripheral {
654
657
// Find all clusters that match the spec
655
658
let mut ccount = 0 ;
656
659
let pname = self . name . clone ( ) ;
660
+ let ( cspec, ignore) = cspec. spec ( ) ;
657
661
for ctag in self . iter_clusters ( cspec) {
658
662
ccount += 1 ;
659
663
ctag. process ( cmod, & pname, config)
660
664
. with_context ( || format ! ( "Processing cluster `{}`" , ctag. name) ) ?;
661
665
}
662
- if ccount == 0 {
666
+ if !ignore && ccount == 0 {
663
667
Err ( anyhow ! (
664
668
"Could not find `{pname}:{cspec}. Present clusters: {}.`" ,
665
669
self . clusters( ) . map( |c| c. name. as_str( ) ) . join( ", " )
@@ -1090,12 +1094,13 @@ impl RegisterBlockExt for Cluster {
1090
1094
// Find all registers that match the spec
1091
1095
let mut rcount = 0 ;
1092
1096
let pname = self . name . clone ( ) ;
1097
+ let ( rspec, ignore) = rspec. spec ( ) ;
1093
1098
for rtag in self . iter_registers ( rspec) {
1094
1099
rcount += 1 ;
1095
1100
rtag. process ( rmod, & pname, config)
1096
1101
. with_context ( || format ! ( "Processing register `{}`" , rtag. name) ) ?;
1097
1102
}
1098
- if rcount == 0 {
1103
+ if !ignore && rcount == 0 {
1099
1104
Err ( anyhow ! (
1100
1105
"Could not find `{pname}:{}:{rspec}. Present registers: {}.`" ,
1101
1106
self . name,
@@ -1110,12 +1115,13 @@ impl RegisterBlockExt for Cluster {
1110
1115
// Find all clusters that match the spec
1111
1116
let mut ccount = 0 ;
1112
1117
let pname = self . name . clone ( ) ;
1118
+ let ( cspec, ignore) = cspec. spec ( ) ;
1113
1119
for ctag in self . iter_clusters ( cspec) {
1114
1120
ccount += 1 ;
1115
1121
ctag. process ( cmod, & pname, config)
1116
1122
. with_context ( || format ! ( "Processing cluster `{}`" , ctag. name) ) ?;
1117
1123
}
1118
- if ccount == 0 {
1124
+ if !ignore && ccount == 0 {
1119
1125
Err ( anyhow ! (
1120
1126
"Could not find `{pname}:{}:{cspec}. Present clusters: {}.`" ,
1121
1127
self . name,
@@ -1137,6 +1143,7 @@ fn collect_in_array(
1137
1143
let mut registers = Vec :: new ( ) ;
1138
1144
let mut place = usize:: MAX ;
1139
1145
let mut i = 0 ;
1146
+ let ( rspec, ignore) = rspec. spec ( ) ;
1140
1147
while i < regs. len ( ) {
1141
1148
match & regs[ i] {
1142
1149
RegisterCluster :: Register ( Register :: Single ( r) ) if matchname ( & r. name , rspec) => {
@@ -1149,6 +1156,9 @@ fn collect_in_array(
1149
1156
}
1150
1157
}
1151
1158
if registers. is_empty ( ) {
1159
+ if ignore {
1160
+ return Ok ( ( ) ) ;
1161
+ }
1152
1162
return Err ( anyhow ! (
1153
1163
"{path}: registers {rspec} not found. Present registers: {}.`" ,
1154
1164
regs. iter( )
@@ -1277,9 +1287,9 @@ fn collect_in_cluster(
1277
1287
if rspec == "description" {
1278
1288
continue ;
1279
1289
}
1280
- rspecs. push ( rspec. to_string ( ) ) ;
1281
1290
let mut registers = Vec :: new ( ) ;
1282
1291
let mut i = 0 ;
1292
+ let ( rspec, ignore) = rspec. spec ( ) ;
1283
1293
while i < regs. len ( ) {
1284
1294
match & regs[ i] {
1285
1295
RegisterCluster :: Register ( Register :: Single ( r) ) if matchname ( & r. name , rspec) => {
@@ -1292,6 +1302,9 @@ fn collect_in_cluster(
1292
1302
}
1293
1303
}
1294
1304
if registers. is_empty ( ) {
1305
+ if ignore {
1306
+ continue ;
1307
+ }
1295
1308
return Err ( anyhow ! (
1296
1309
"{path}: registers {rspec} not found. Present registers: {}.`" ,
1297
1310
regs. iter( )
@@ -1302,6 +1315,7 @@ fn collect_in_cluster(
1302
1315
. join( ", " )
1303
1316
) ) ;
1304
1317
}
1318
+ rspecs. push ( rspec. to_string ( ) ) ;
1305
1319
if single {
1306
1320
if registers. len ( ) > 1 {
1307
1321
return Err ( anyhow ! ( "{path}: more than one registers {rspec} found" ) ) ;
@@ -1362,6 +1376,11 @@ fn collect_in_cluster(
1362
1376
}
1363
1377
rdict. insert ( rspec. to_string ( ) , registers) ;
1364
1378
}
1379
+ if rdict. is_empty ( ) {
1380
+ return Err ( anyhow ! (
1381
+ "{path}: registers cannot be collected into {cname} cluster. No matches found"
1382
+ ) ) ;
1383
+ }
1365
1384
let address_offset = rdict
1366
1385
. values ( )
1367
1386
. min_by_key ( |rs| rs[ 0 ] . address_offset )
0 commit comments