@@ -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 adding_pos, check_offsets, common_description, make_dim_element, matchname, matchsubspec,
@@ -170,21 +170,43 @@ pub(crate) trait RegisterBlockExt: Name {
170170 }
171171
172172 /// 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 {
174174 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+ }
176188 Ok ( ( ) )
177189 } else {
178190 Err ( anyhow ! ( "No registers or clusters" ) )
179191 }
180192 }
181193
182194 /// 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 {
184196 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+ }
188210 Ok ( ( ) )
189211 } else {
190212 Err ( anyhow ! ( "No registers or clusters" ) )
@@ -195,16 +217,13 @@ pub(crate) trait RegisterBlockExt: Name {
195217 let ( cspec, ignore) = cspec. spec ( ) ;
196218
197219 if let Some ( children) = self . children_mut ( ) {
198- let mut deleted = false ;
220+ let mut done = false ;
199221 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
206225 } ) ;
207- if !deleted && !ignore {
226+ if !done && !ignore {
208227 Err ( anyhow ! ( "No matching clusters found" ) )
209228 } else {
210229 Ok ( ( ) )
@@ -1061,21 +1080,21 @@ impl PeripheralExt for Peripheral {
10611080 if let Some ( deletions) = pmod. get_yaml ( "_delete" ) {
10621081 match deletions {
10631082 Yaml :: String ( rcspec) => {
1064- self . delete_child ( rcspec) . with_context ( || {
1083+ self . delete_child ( rcspec, & ppath ) . with_context ( || {
10651084 format ! ( "Deleting registers and clusters matched to `{rcspec}`" )
10661085 } ) ?;
10671086 }
10681087 Yaml :: Array ( deletions) => {
10691088 for rcspec in deletions {
10701089 let rcspec = rcspec. str ( ) ?;
1071- self . delete_child ( rcspec) . with_context ( || {
1090+ self . delete_child ( rcspec, & ppath ) . with_context ( || {
10721091 format ! ( "Deleting registers and clusters matched to `{rcspec}`" )
10731092 } ) ?;
10741093 }
10751094 }
10761095 Yaml :: Hash ( deletions) => {
10771096 for rspec in deletions. str_vec_iter ( "_registers" ) ? {
1078- self . delete_register ( rspec)
1097+ self . delete_register ( rspec, & ppath )
10791098 . with_context ( || format ! ( "Deleting registers matched to `{rspec}`" ) ) ?;
10801099 }
10811100 for cspec in deletions. str_vec_iter ( "_clusters" ) ? {
@@ -1369,32 +1388,46 @@ impl InterruptExt for Peripheral {
13691388 }
13701389
13711390 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+ }
13731404 Ok ( ( ) )
13741405 }
13751406}
13761407
13771408impl ClusterExt for Cluster {
13781409 fn pre_process ( & mut self , cmod : & Hash , parent : & BlockPath , _config : & Config ) -> PatchResult {
1410+ let cpath = parent. new_cluster ( & self . name ) ;
1411+
13791412 // Handle deletions
13801413 if let Some ( deletions) = cmod. get_yaml ( "_delete" ) {
13811414 match deletions {
13821415 Yaml :: String ( rcspec) => {
1383- self . delete_child ( rcspec) . with_context ( || {
1416+ self . delete_child ( rcspec, & cpath ) . with_context ( || {
13841417 format ! ( "Deleting registers and clusters matched to `{rcspec}`" )
13851418 } ) ?;
13861419 }
13871420 Yaml :: Array ( deletions) => {
13881421 for rcspec in deletions {
13891422 let rcspec = rcspec. str ( ) ?;
1390- self . delete_child ( rcspec) . with_context ( || {
1423+ self . delete_child ( rcspec, & cpath ) . with_context ( || {
13911424 format ! ( "Deleting registers and clusters matched to `{rcspec}`" )
13921425 } ) ?;
13931426 }
13941427 }
13951428 Yaml :: Hash ( deletions) => {
13961429 for rspec in deletions. str_vec_iter ( "_registers" ) ? {
1397- self . delete_register ( rspec)
1430+ self . delete_register ( rspec, & cpath )
13981431 . with_context ( || format ! ( "Deleting registers matched to `{rspec}`" ) ) ?;
13991432 }
14001433 for cspec in deletions. str_vec_iter ( "_clusters" ) ? {
@@ -1418,8 +1451,6 @@ impl ClusterExt for Cluster {
14181451 }
14191452 }
14201453
1421- let cpath = parent. new_cluster ( & self . name ) ;
1422-
14231454 // Handle any copied peripherals
14241455 for ( rname, rcopy) in cmod. hash_iter ( "_copy" ) {
14251456 let rname = rname. str ( ) ?;
@@ -1675,10 +1706,7 @@ fn collect_in_array(
16751706 if !check_offsets ( & offsets, dim_increment) {
16761707 return Err ( anyhow ! ( "{path}: registers cannot be collected into {rspec} array. Different addressOffset increments" ) ) ;
16771708 }
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 < _ > > ( ) ;
16821710 if !bitmasks. iter ( ) . all ( |& m| m == bitmasks[ 0 ] ) {
16831711 return Err ( anyhow ! (
16841712 "{path}: registers cannot be collected into {rspec} array. Different bit masks"
@@ -1801,10 +1829,7 @@ fn collect_in_cluster(
18011829 "Some of `{rspec}` registers are arrays and some are not"
18021830 ) ) ;
18031831 }
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 < _ > > ( ) ;
18081833 let new_dim_index = registers
18091834 . iter ( )
18101835 . map ( |r| {
0 commit comments