@@ -9,7 +9,7 @@ use svd_parser::svd::{
99use yaml_rust:: { yaml:: Hash , Yaml } ;
1010
1111use super :: iterators:: { MatchIter , Matched } ;
12- use super :: register:: { RegisterExt , RegisterInfoExt } ;
12+ use super :: register:: RegisterExt ;
1313use super :: yaml_ext:: { AsType , GetVal , ToYaml } ;
1414use super :: {
1515 check_offsets, common_description, make_dim_element, matchname, matchsubspec,
@@ -162,21 +162,43 @@ pub(crate) trait RegisterBlockExt: Name {
162162 fn add_child ( & mut self , child : RegisterCluster ) ;
163163
164164 /// Delete registers and clusters matched by rspec inside ptag
165- fn delete_child ( & mut self , rcspec : & str ) -> PatchResult {
165+ fn delete_child ( & mut self , rcspec : & str , bpath : & BlockPath ) -> PatchResult {
166166 if let Some ( children) = self . children_mut ( ) {
167- children. retain ( |rc| !matchname ( rc. name ( ) , rcspec) ) ;
167+ let mut done = false ;
168+ children. retain ( |rc| {
169+ let del = matchname ( rc. name ( ) , rcspec) ;
170+ done |= del;
171+ !del
172+ } ) ;
173+ if !done {
174+ log:: info!(
175+ "Trying to delete absent `{}` register/cluster from {}" ,
176+ rcspec,
177+ bpath
178+ ) ;
179+ }
168180 Ok ( ( ) )
169181 } else {
170182 Err ( anyhow ! ( "No registers or clusters" ) )
171183 }
172184 }
173185
174186 /// Delete registers matched by rspec inside ptag
175- fn delete_register ( & mut self , rspec : & str ) -> PatchResult {
187+ fn delete_register ( & mut self , rspec : & str , bpath : & BlockPath ) -> PatchResult {
176188 if let Some ( children) = self . children_mut ( ) {
177- children. retain (
178- |rc| !matches ! ( rc, RegisterCluster :: Register ( r) if matchname( & r. name, rspec) ) ,
179- ) ;
189+ let mut done = false ;
190+ children. retain ( |rc| {
191+ let del = matches ! ( rc, RegisterCluster :: Register ( r) if matchname( & r. name, rspec) ) ;
192+ done |= del;
193+ !del
194+ } ) ;
195+ if !done {
196+ log:: info!(
197+ "Trying to delete absent `{}` register from {}" ,
198+ rspec,
199+ bpath
200+ ) ;
201+ }
180202 Ok ( ( ) )
181203 } else {
182204 Err ( anyhow ! ( "No registers or clusters" ) )
@@ -187,16 +209,13 @@ pub(crate) trait RegisterBlockExt: Name {
187209 let ( cspec, ignore) = cspec. spec ( ) ;
188210
189211 if let Some ( children) = self . children_mut ( ) {
190- let mut deleted = false ;
212+ let mut done = false ;
191213 children. retain ( |rc| {
192- let retain =
193- !matches ! ( rc, RegisterCluster :: Cluster ( c) if matchname( & c. name, cspec) ) ;
194- if !retain {
195- deleted = true ;
196- }
197- retain
214+ let del = matches ! ( rc, RegisterCluster :: Cluster ( c) if matchname( & c. name, cspec) ) ;
215+ done |= del;
216+ !del
198217 } ) ;
199- if !deleted && !ignore {
218+ if !done && !ignore {
200219 Err ( anyhow ! ( "No matching clusters found" ) )
201220 } else {
202221 Ok ( ( ) )
@@ -1029,21 +1048,21 @@ impl PeripheralExt for Peripheral {
10291048 if let Some ( deletions) = pmod. get_yaml ( "_delete" ) {
10301049 match deletions {
10311050 Yaml :: String ( rcspec) => {
1032- self . delete_child ( rcspec) . with_context ( || {
1051+ self . delete_child ( rcspec, & ppath ) . with_context ( || {
10331052 format ! ( "Deleting registers and clusters matched to `{rcspec}`" )
10341053 } ) ?;
10351054 }
10361055 Yaml :: Array ( deletions) => {
10371056 for rcspec in deletions {
10381057 let rcspec = rcspec. str ( ) ?;
1039- self . delete_child ( rcspec) . with_context ( || {
1058+ self . delete_child ( rcspec, & ppath ) . with_context ( || {
10401059 format ! ( "Deleting registers and clusters matched to `{rcspec}`" )
10411060 } ) ?;
10421061 }
10431062 }
10441063 Yaml :: Hash ( deletions) => {
10451064 for rspec in deletions. str_vec_iter ( "_registers" ) ? {
1046- self . delete_register ( rspec)
1065+ self . delete_register ( rspec, & ppath )
10471066 . with_context ( || format ! ( "Deleting registers matched to `{rspec}`" ) ) ?;
10481067 }
10491068 for cspec in deletions. str_vec_iter ( "_clusters" ) ? {
@@ -1337,32 +1356,46 @@ impl InterruptExt for Peripheral {
13371356 }
13381357
13391358 fn delete_interrupt ( & mut self , ispec : & str ) -> PatchResult {
1340- self . interrupt . retain ( |i| !( matchname ( & i. name , ispec) ) ) ;
1359+ let mut done = false ;
1360+ self . interrupt . retain ( |i| {
1361+ let del = matchname ( & i. name , ispec) ;
1362+ done |= del;
1363+ !del
1364+ } ) ;
1365+ if !done {
1366+ log:: info!(
1367+ "Trying to delete absent `{}` interrupt from {}" ,
1368+ ispec,
1369+ self . name
1370+ ) ;
1371+ }
13411372 Ok ( ( ) )
13421373 }
13431374}
13441375
13451376impl ClusterExt for Cluster {
13461377 fn pre_process ( & mut self , cmod : & Hash , parent : & BlockPath , _config : & Config ) -> PatchResult {
1378+ let cpath = parent. new_cluster ( & self . name ) ;
1379+
13471380 // Handle deletions
13481381 if let Some ( deletions) = cmod. get_yaml ( "_delete" ) {
13491382 match deletions {
13501383 Yaml :: String ( rcspec) => {
1351- self . delete_child ( rcspec) . with_context ( || {
1384+ self . delete_child ( rcspec, & cpath ) . with_context ( || {
13521385 format ! ( "Deleting registers and clusters matched to `{rcspec}`" )
13531386 } ) ?;
13541387 }
13551388 Yaml :: Array ( deletions) => {
13561389 for rcspec in deletions {
13571390 let rcspec = rcspec. str ( ) ?;
1358- self . delete_child ( rcspec) . with_context ( || {
1391+ self . delete_child ( rcspec, & cpath ) . with_context ( || {
13591392 format ! ( "Deleting registers and clusters matched to `{rcspec}`" )
13601393 } ) ?;
13611394 }
13621395 }
13631396 Yaml :: Hash ( deletions) => {
13641397 for rspec in deletions. str_vec_iter ( "_registers" ) ? {
1365- self . delete_register ( rspec)
1398+ self . delete_register ( rspec, & cpath )
13661399 . with_context ( || format ! ( "Deleting registers matched to `{rspec}`" ) ) ?;
13671400 }
13681401 for cspec in deletions. str_vec_iter ( "_clusters" ) ? {
@@ -1386,8 +1419,6 @@ impl ClusterExt for Cluster {
13861419 }
13871420 }
13881421
1389- let cpath = parent. new_cluster ( & self . name ) ;
1390-
13911422 // Handle any copied peripherals
13921423 for ( rname, rcopy) in cmod. hash_iter ( "_copy" ) {
13931424 let rname = rname. str ( ) ?;
@@ -1643,10 +1674,7 @@ fn collect_in_array(
16431674 if !check_offsets ( & offsets, dim_increment) {
16441675 return Err ( anyhow ! ( "{path}: registers cannot be collected into {rspec} array. Different addressOffset increments" ) ) ;
16451676 }
1646- let bitmasks = registers
1647- . iter ( )
1648- . map ( RegisterInfo :: get_bitmask)
1649- . collect :: < Vec < _ > > ( ) ;
1677+ let bitmasks = registers. iter ( ) . map ( |r| r. bitmask ( ) ) . collect :: < Vec < _ > > ( ) ;
16501678 if !bitmasks. iter ( ) . all ( |& m| m == bitmasks[ 0 ] ) {
16511679 return Err ( anyhow ! (
16521680 "{path}: registers cannot be collected into {rspec} array. Different bit masks"
@@ -1769,10 +1797,7 @@ fn collect_in_cluster(
17691797 "Some of `{rspec}` registers are arrays and some are not"
17701798 ) ) ;
17711799 }
1772- let bitmasks = registers
1773- . iter ( )
1774- . map ( |r| RegisterInfo :: get_bitmask ( r) )
1775- . collect :: < Vec < _ > > ( ) ;
1800+ let bitmasks = registers. iter ( ) . map ( |r| r. bitmask ( ) ) . collect :: < Vec < _ > > ( ) ;
17761801 let new_dim_index = registers
17771802 . iter ( )
17781803 . map ( |r| {
0 commit comments