@@ -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