@@ -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, 
@@ -172,8 +172,22 @@ pub(crate) trait RegisterBlockExt: Name {
172172    } 
173173
174174    /// Delete registers matched by rspec inside ptag 
175- fn  delete_register ( & mut  self ,  rspec :  & str )  -> PatchResult  { 
175+ fn  delete_register ( & mut  self ,  rspec :  & str ,   bpath :   & BlockPath )  -> PatchResult  { 
176176        if  let  Some ( children)  = self . children_mut ( )  { 
177+             if  children
178+                 . iter ( ) 
179+                 . filter ( 
180+                     |rc| matches ! ( rc,  RegisterCluster :: Register ( r)  if  matchname( & r. name,  rspec) ) , 
181+                 ) 
182+                 . count ( ) 
183+                 == 0 
184+             { 
185+                 log:: info!( 
186+                     "Trying to delete absent `{}` register from {}" , 
187+                     rspec, 
188+                     bpath
189+                 ) ; 
190+             } 
177191            children. retain ( 
178192                |rc| !matches ! ( rc,  RegisterCluster :: Register ( r)  if  matchname( & r. name,  rspec) ) , 
179193            ) ; 
@@ -1043,7 +1057,7 @@ impl PeripheralExt for Peripheral {
10431057                } 
10441058                Yaml :: Hash ( deletions)  => { 
10451059                    for  rspec in  deletions. str_vec_iter ( "_registers" ) ? { 
1046-                         self . delete_register ( rspec) 
1060+                         self . delete_register ( rspec,   & ppath ) 
10471061                            . with_context ( || format ! ( "Deleting registers matched to `{rspec}`" ) ) ?; 
10481062                    } 
10491063                    for  cspec in  deletions. str_vec_iter ( "_clusters" ) ? { 
@@ -1344,6 +1358,8 @@ impl InterruptExt for Peripheral {
13441358
13451359impl  ClusterExt  for  Cluster  { 
13461360    fn  pre_process ( & mut  self ,  cmod :  & Hash ,  parent :  & BlockPath ,  _config :  & Config )  -> PatchResult  { 
1361+         let  cpath = parent. new_cluster ( & self . name ) ; 
1362+ 
13471363        // Handle deletions 
13481364        if  let  Some ( deletions)  = cmod. get_yaml ( "_delete" )  { 
13491365            match  deletions { 
@@ -1362,7 +1378,7 @@ impl ClusterExt for Cluster {
13621378                } 
13631379                Yaml :: Hash ( deletions)  => { 
13641380                    for  rspec in  deletions. str_vec_iter ( "_registers" ) ? { 
1365-                         self . delete_register ( rspec) 
1381+                         self . delete_register ( rspec,   & cpath ) 
13661382                            . with_context ( || format ! ( "Deleting registers matched to `{rspec}`" ) ) ?; 
13671383                    } 
13681384                    for  cspec in  deletions. str_vec_iter ( "_clusters" ) ? { 
@@ -1386,8 +1402,6 @@ impl ClusterExt for Cluster {
13861402            } 
13871403        } 
13881404
1389-         let  cpath = parent. new_cluster ( & self . name ) ; 
1390- 
13911405        // Handle any copied peripherals 
13921406        for  ( rname,  rcopy)  in  cmod. hash_iter ( "_copy" )  { 
13931407            let  rname = rname. str ( ) ?; 
@@ -1643,10 +1657,7 @@ fn collect_in_array(
16431657    if  !check_offsets ( & offsets,  dim_increment)  { 
16441658        return  Err ( anyhow ! ( "{path}: registers cannot be collected into {rspec} array. Different addressOffset increments" ) ) ; 
16451659    } 
1646-     let  bitmasks = registers
1647-         . iter ( ) 
1648-         . map ( RegisterInfo :: get_bitmask) 
1649-         . collect :: < Vec < _ > > ( ) ; 
1660+     let  bitmasks = registers. iter ( ) . map ( |r| r. bitmask ( ) ) . collect :: < Vec < _ > > ( ) ; 
16501661    if  !bitmasks. iter ( ) . all ( |& m| m == bitmasks[ 0 ] )  { 
16511662        return  Err ( anyhow ! ( 
16521663            "{path}: registers cannot be collected into {rspec} array. Different bit masks" 
@@ -1769,10 +1780,7 @@ fn collect_in_cluster(
17691780                    "Some of `{rspec}` registers are arrays and some are not" 
17701781                ) ) ; 
17711782            } 
1772-             let  bitmasks = registers
1773-                 . iter ( ) 
1774-                 . map ( |r| RegisterInfo :: get_bitmask ( r) ) 
1775-                 . collect :: < Vec < _ > > ( ) ; 
1783+             let  bitmasks = registers. iter ( ) . map ( |r| r. bitmask ( ) ) . collect :: < Vec < _ > > ( ) ; 
17761784            let  new_dim_index = registers
17771785                . iter ( ) 
17781786                . map ( |r| { 
0 commit comments