@@ -9,7 +9,7 @@ use svd_parser::svd::{
9
9
use yaml_rust:: { yaml:: Hash , Yaml } ;
10
10
11
11
use super :: iterators:: { MatchIter , Matched } ;
12
- use super :: register:: { RegisterExt , RegisterInfoExt } ;
12
+ use super :: register:: RegisterExt ;
13
13
use super :: yaml_ext:: { AsType , GetVal , ToYaml } ;
14
14
use super :: {
15
15
adding_pos, check_offsets, common_description, make_dim_element, matchname, matchsubspec,
@@ -170,21 +170,43 @@ pub(crate) trait RegisterBlockExt: Name {
170
170
}
171
171
172
172
/// Delete registers and clusters matched by rspec inside ptag
173
- fn delete_child ( & mut self , rcspec : & str ) -> PatchResult {
173
+ fn delete_child ( & mut self , rcspec : & str , bpath : & BlockPath ) -> PatchResult {
174
174
if let Some ( children) = self . children_mut ( ) {
175
- children. retain ( |rc| !matchname ( rc. name ( ) , rcspec) ) ;
175
+ let mut done = false ;
176
+ children. retain ( |rc| {
177
+ let del = matchname ( rc. name ( ) , rcspec) ;
178
+ done |= del;
179
+ !del
180
+ } ) ;
181
+ if !done {
182
+ log:: info!(
183
+ "Trying to delete absent `{}` register/cluster from {}" ,
184
+ rcspec,
185
+ bpath
186
+ ) ;
187
+ }
176
188
Ok ( ( ) )
177
189
} else {
178
190
Err ( anyhow ! ( "No registers or clusters" ) )
179
191
}
180
192
}
181
193
182
194
/// Delete registers matched by rspec inside ptag
183
- fn delete_register ( & mut self , rspec : & str ) -> PatchResult {
195
+ fn delete_register ( & mut self , rspec : & str , bpath : & BlockPath ) -> PatchResult {
184
196
if let Some ( children) = self . children_mut ( ) {
185
- children. retain (
186
- |rc| !matches ! ( rc, RegisterCluster :: Register ( r) if matchname( & r. name, rspec) ) ,
187
- ) ;
197
+ let mut done = false ;
198
+ children. retain ( |rc| {
199
+ let del = matches ! ( rc, RegisterCluster :: Register ( r) if matchname( & r. name, rspec) ) ;
200
+ done |= del;
201
+ !del
202
+ } ) ;
203
+ if !done {
204
+ log:: info!(
205
+ "Trying to delete absent `{}` register from {}" ,
206
+ rspec,
207
+ bpath
208
+ ) ;
209
+ }
188
210
Ok ( ( ) )
189
211
} else {
190
212
Err ( anyhow ! ( "No registers or clusters" ) )
@@ -195,16 +217,13 @@ pub(crate) trait RegisterBlockExt: Name {
195
217
let ( cspec, ignore) = cspec. spec ( ) ;
196
218
197
219
if let Some ( children) = self . children_mut ( ) {
198
- let mut deleted = false ;
220
+ let mut done = false ;
199
221
children. retain ( |rc| {
200
- let retain =
201
- !matches ! ( rc, RegisterCluster :: Cluster ( c) if matchname( & c. name, cspec) ) ;
202
- if !retain {
203
- deleted = true ;
204
- }
205
- retain
222
+ let del = matches ! ( rc, RegisterCluster :: Cluster ( c) if matchname( & c. name, cspec) ) ;
223
+ done |= del;
224
+ !del
206
225
} ) ;
207
- if !deleted && !ignore {
226
+ if !done && !ignore {
208
227
Err ( anyhow ! ( "No matching clusters found" ) )
209
228
} else {
210
229
Ok ( ( ) )
@@ -1061,21 +1080,21 @@ impl PeripheralExt for Peripheral {
1061
1080
if let Some ( deletions) = pmod. get_yaml ( "_delete" ) {
1062
1081
match deletions {
1063
1082
Yaml :: String ( rcspec) => {
1064
- self . delete_child ( rcspec) . with_context ( || {
1083
+ self . delete_child ( rcspec, & ppath ) . with_context ( || {
1065
1084
format ! ( "Deleting registers and clusters matched to `{rcspec}`" )
1066
1085
} ) ?;
1067
1086
}
1068
1087
Yaml :: Array ( deletions) => {
1069
1088
for rcspec in deletions {
1070
1089
let rcspec = rcspec. str ( ) ?;
1071
- self . delete_child ( rcspec) . with_context ( || {
1090
+ self . delete_child ( rcspec, & ppath ) . with_context ( || {
1072
1091
format ! ( "Deleting registers and clusters matched to `{rcspec}`" )
1073
1092
} ) ?;
1074
1093
}
1075
1094
}
1076
1095
Yaml :: Hash ( deletions) => {
1077
1096
for rspec in deletions. str_vec_iter ( "_registers" ) ? {
1078
- self . delete_register ( rspec)
1097
+ self . delete_register ( rspec, & ppath )
1079
1098
. with_context ( || format ! ( "Deleting registers matched to `{rspec}`" ) ) ?;
1080
1099
}
1081
1100
for cspec in deletions. str_vec_iter ( "_clusters" ) ? {
@@ -1369,32 +1388,46 @@ impl InterruptExt for Peripheral {
1369
1388
}
1370
1389
1371
1390
fn delete_interrupt ( & mut self , ispec : & str ) -> PatchResult {
1372
- self . interrupt . retain ( |i| !( matchname ( & i. name , ispec) ) ) ;
1391
+ let mut done = false ;
1392
+ self . interrupt . retain ( |i| {
1393
+ let del = matchname ( & i. name , ispec) ;
1394
+ done |= del;
1395
+ !del
1396
+ } ) ;
1397
+ if !done {
1398
+ log:: info!(
1399
+ "Trying to delete absent `{}` interrupt from {}" ,
1400
+ ispec,
1401
+ self . name
1402
+ ) ;
1403
+ }
1373
1404
Ok ( ( ) )
1374
1405
}
1375
1406
}
1376
1407
1377
1408
impl ClusterExt for Cluster {
1378
1409
fn pre_process ( & mut self , cmod : & Hash , parent : & BlockPath , _config : & Config ) -> PatchResult {
1410
+ let cpath = parent. new_cluster ( & self . name ) ;
1411
+
1379
1412
// Handle deletions
1380
1413
if let Some ( deletions) = cmod. get_yaml ( "_delete" ) {
1381
1414
match deletions {
1382
1415
Yaml :: String ( rcspec) => {
1383
- self . delete_child ( rcspec) . with_context ( || {
1416
+ self . delete_child ( rcspec, & cpath ) . with_context ( || {
1384
1417
format ! ( "Deleting registers and clusters matched to `{rcspec}`" )
1385
1418
} ) ?;
1386
1419
}
1387
1420
Yaml :: Array ( deletions) => {
1388
1421
for rcspec in deletions {
1389
1422
let rcspec = rcspec. str ( ) ?;
1390
- self . delete_child ( rcspec) . with_context ( || {
1423
+ self . delete_child ( rcspec, & cpath ) . with_context ( || {
1391
1424
format ! ( "Deleting registers and clusters matched to `{rcspec}`" )
1392
1425
} ) ?;
1393
1426
}
1394
1427
}
1395
1428
Yaml :: Hash ( deletions) => {
1396
1429
for rspec in deletions. str_vec_iter ( "_registers" ) ? {
1397
- self . delete_register ( rspec)
1430
+ self . delete_register ( rspec, & cpath )
1398
1431
. with_context ( || format ! ( "Deleting registers matched to `{rspec}`" ) ) ?;
1399
1432
}
1400
1433
for cspec in deletions. str_vec_iter ( "_clusters" ) ? {
@@ -1418,8 +1451,6 @@ impl ClusterExt for Cluster {
1418
1451
}
1419
1452
}
1420
1453
1421
- let cpath = parent. new_cluster ( & self . name ) ;
1422
-
1423
1454
// Handle any copied peripherals
1424
1455
for ( rname, rcopy) in cmod. hash_iter ( "_copy" ) {
1425
1456
let rname = rname. str ( ) ?;
@@ -1675,10 +1706,7 @@ fn collect_in_array(
1675
1706
if !check_offsets ( & offsets, dim_increment) {
1676
1707
return Err ( anyhow ! ( "{path}: registers cannot be collected into {rspec} array. Different addressOffset increments" ) ) ;
1677
1708
}
1678
- let bitmasks = registers
1679
- . iter ( )
1680
- . map ( RegisterInfo :: get_bitmask)
1681
- . collect :: < Vec < _ > > ( ) ;
1709
+ let bitmasks = registers. iter ( ) . map ( |r| r. bitmask ( ) ) . collect :: < Vec < _ > > ( ) ;
1682
1710
if !bitmasks. iter ( ) . all ( |& m| m == bitmasks[ 0 ] ) {
1683
1711
return Err ( anyhow ! (
1684
1712
"{path}: registers cannot be collected into {rspec} array. Different bit masks"
@@ -1801,10 +1829,7 @@ fn collect_in_cluster(
1801
1829
"Some of `{rspec}` registers are arrays and some are not"
1802
1830
) ) ;
1803
1831
}
1804
- let bitmasks = registers
1805
- . iter ( )
1806
- . map ( |r| RegisterInfo :: get_bitmask ( r) )
1807
- . collect :: < Vec < _ > > ( ) ;
1832
+ let bitmasks = registers. iter ( ) . map ( |r| r. bitmask ( ) ) . collect :: < Vec < _ > > ( ) ;
1808
1833
let new_dim_index = registers
1809
1834
. iter ( )
1810
1835
. map ( |r| {
0 commit comments