@@ -103,6 +103,9 @@ pub trait RegisterBlockExt {
103103 /// Collect same registers in peripheral into register array
104104 fn collect_in_array ( & mut self , rspec : & str , rmod : & Hash , config : & Config ) -> PatchResult ;
105105
106+ /// Expand register array
107+ fn expand_array ( & mut self , rspec : & str , rmod : & Hash , config : & Config ) -> PatchResult ;
108+
106109 /// Collect registers in peripheral into clusters
107110 fn collect_in_cluster ( & mut self , cname : & str , cmod : & Hash , config : & Config ) -> PatchResult ;
108111
@@ -337,6 +340,13 @@ impl PeripheralExt for Peripheral {
337340 }
338341 }
339342
343+ // Expand register arrays
344+ for ( rspec, rmod) in pmod. hash_iter ( "_expand_array" ) {
345+ let rspec = rspec. str ( ) ?;
346+ self . expand_array ( rspec, rmod. hash ( ) ?, config)
347+ . with_context ( || format ! ( "During expand of `{rspec}` array" ) ) ?;
348+ }
349+
340350 // Collect registers in arrays
341351 for ( rspec, rmod) in pmod. hash_iter ( "_array" ) {
342352 let rspec = rspec. str ( ) ?;
@@ -544,21 +554,24 @@ impl RegisterBlockExt for Peripheral {
544554 registers. retain (
545555 |rc| !matches ! ( rc, RegisterCluster :: Register ( r) if matchname( & r. name, rspec) ) ,
546556 ) ;
557+ Ok ( ( ) )
558+ } else {
559+ Err ( anyhow ! ( "No registers or clusters" ) )
547560 }
548- Ok ( ( ) )
549561 }
550562
551563 fn delete_cluster ( & mut self , cspec : & str ) -> PatchResult {
552564 if let Some ( registers) = & mut self . registers {
553565 registers. retain (
554566 |rc| !matches ! ( rc, RegisterCluster :: Cluster ( c) if matchname( & c. name, cspec) ) ,
555567 ) ;
568+ Ok ( ( ) )
569+ } else {
570+ Err ( anyhow ! ( "No registers or clusters" ) )
556571 }
557- Ok ( ( ) )
558572 }
559573
560574 fn modify_cluster ( & mut self , cspec : & str , cmod : & Hash ) -> PatchResult {
561- // TODO: empty error
562575 let ctags = self . iter_clusters ( cspec) . collect :: < Vec < _ > > ( ) ;
563576 if !ctags. is_empty ( ) {
564577 let cluster_builder = make_cluster ( cmod) ?;
@@ -567,8 +580,10 @@ impl RegisterBlockExt for Peripheral {
567580 modify_dim_element ( ctag, & dim) ?;
568581 ctag. modify_from ( cluster_builder. clone ( ) , VAL_LVL ) ?;
569582 }
583+ Ok ( ( ) )
584+ } else {
585+ Err ( anyhow ! ( "No clusters" ) )
570586 }
571- Ok ( ( ) )
572587 }
573588
574589 fn strip_start ( & mut self , prefix : & str ) -> PatchResult {
@@ -621,9 +636,18 @@ impl RegisterBlockExt for Peripheral {
621636 fn collect_in_array ( & mut self , rspec : & str , rmod : & Hash , config : & Config ) -> PatchResult {
622637 let pname = self . name . clone ( ) ;
623638 if let Some ( regs) = self . registers . as_mut ( ) {
624- collect_in_array ( regs, & pname, rspec, rmod, config) ?;
639+ collect_in_array ( regs, & pname, rspec, rmod, config)
640+ } else {
641+ Err ( anyhow ! ( "No registers or clusters" ) )
642+ }
643+ }
644+
645+ fn expand_array ( & mut self , rspec : & str , rmod : & Hash , config : & Config ) -> PatchResult {
646+ if let Some ( regs) = self . registers . as_mut ( ) {
647+ expand_array ( regs, rspec, rmod, config)
648+ } else {
649+ Err ( anyhow ! ( "No registers or clusters" ) )
625650 }
626- Ok ( ( ) )
627651 }
628652
629653 fn collect_in_cluster ( & mut self , cname : & str , cmod : & Hash , config : & Config ) -> PatchResult {
@@ -866,6 +890,13 @@ impl ClusterExt for Cluster {
866890 }
867891 }
868892
893+ // Expand register arrays
894+ for ( rspec, rmod) in pmod. hash_iter ( "_expand_array" ) {
895+ let rspec = rspec. str ( ) ?;
896+ self . expand_array ( rspec, rmod. hash ( ) ?, config)
897+ . with_context ( || format ! ( "During expand of `{rspec}` array" ) ) ?;
898+ }
899+
869900 // Collect registers in arrays
870901 for ( rspec, rmod) in pmod. hash_iter ( "_array" ) {
871902 let rspec = rspec. str ( ) ?;
@@ -1096,6 +1127,11 @@ impl RegisterBlockExt for Cluster {
10961127 collect_in_array ( regs, & pname, rspec, rmod, config)
10971128 }
10981129
1130+ fn expand_array ( & mut self , rspec : & str , rmod : & Hash , config : & Config ) -> PatchResult {
1131+ let regs = & mut self . children ;
1132+ expand_array ( regs, rspec, rmod, config)
1133+ }
1134+
10991135 fn collect_in_cluster ( & mut self , cname : & str , cmod : & Hash , config : & Config ) -> PatchResult {
11001136 let pname = self . name . clone ( ) ;
11011137 let regs = & mut self . children ;
@@ -1287,6 +1323,31 @@ fn collect_in_array(
12871323 Ok ( ( ) )
12881324}
12891325
1326+ fn expand_array (
1327+ regs : & mut Vec < RegisterCluster > ,
1328+ rspec : & str ,
1329+ _rmod : & Hash ,
1330+ _config : & Config ,
1331+ ) -> PatchResult {
1332+ let mut found = false ;
1333+ for rc in std:: mem:: take ( regs) {
1334+ match rc {
1335+ RegisterCluster :: Register ( Register :: Array ( r, d) ) if matchname ( & r. name , rspec) => {
1336+ found = true ;
1337+ for ri in svd:: register:: expand ( & r, & d) {
1338+ regs. push ( RegisterCluster :: Register ( ri. single ( ) ) )
1339+ }
1340+ }
1341+ rc => regs. push ( rc) ,
1342+ }
1343+ }
1344+ if !found {
1345+ Err ( anyhow ! ( "Register {rspec} not found" ) )
1346+ } else {
1347+ Ok ( ( ) )
1348+ }
1349+ }
1350+
12901351fn collect_in_cluster (
12911352 regs : & mut Vec < RegisterCluster > ,
12921353 path : & str ,
0 commit comments