@@ -103,6 +103,9 @@ pub trait RegisterBlockExt {
103
103
/// Collect same registers in peripheral into register array
104
104
fn collect_in_array ( & mut self , rspec : & str , rmod : & Hash , config : & Config ) -> PatchResult ;
105
105
106
+ /// Expand register array
107
+ fn expand_array ( & mut self , rspec : & str , rmod : & Hash , config : & Config ) -> PatchResult ;
108
+
106
109
/// Collect registers in peripheral into clusters
107
110
fn collect_in_cluster ( & mut self , cname : & str , cmod : & Hash , config : & Config ) -> PatchResult ;
108
111
@@ -337,6 +340,13 @@ impl PeripheralExt for Peripheral {
337
340
}
338
341
}
339
342
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
+
340
350
// Collect registers in arrays
341
351
for ( rspec, rmod) in pmod. hash_iter ( "_array" ) {
342
352
let rspec = rspec. str ( ) ?;
@@ -544,21 +554,24 @@ impl RegisterBlockExt for Peripheral {
544
554
registers. retain (
545
555
|rc| !matches ! ( rc, RegisterCluster :: Register ( r) if matchname( & r. name, rspec) ) ,
546
556
) ;
557
+ Ok ( ( ) )
558
+ } else {
559
+ Err ( anyhow ! ( "No registers or clusters" ) )
547
560
}
548
- Ok ( ( ) )
549
561
}
550
562
551
563
fn delete_cluster ( & mut self , cspec : & str ) -> PatchResult {
552
564
if let Some ( registers) = & mut self . registers {
553
565
registers. retain (
554
566
|rc| !matches ! ( rc, RegisterCluster :: Cluster ( c) if matchname( & c. name, cspec) ) ,
555
567
) ;
568
+ Ok ( ( ) )
569
+ } else {
570
+ Err ( anyhow ! ( "No registers or clusters" ) )
556
571
}
557
- Ok ( ( ) )
558
572
}
559
573
560
574
fn modify_cluster ( & mut self , cspec : & str , cmod : & Hash ) -> PatchResult {
561
- // TODO: empty error
562
575
let ctags = self . iter_clusters ( cspec) . collect :: < Vec < _ > > ( ) ;
563
576
if !ctags. is_empty ( ) {
564
577
let cluster_builder = make_cluster ( cmod) ?;
@@ -567,8 +580,10 @@ impl RegisterBlockExt for Peripheral {
567
580
modify_dim_element ( ctag, & dim) ?;
568
581
ctag. modify_from ( cluster_builder. clone ( ) , VAL_LVL ) ?;
569
582
}
583
+ Ok ( ( ) )
584
+ } else {
585
+ Err ( anyhow ! ( "No clusters" ) )
570
586
}
571
- Ok ( ( ) )
572
587
}
573
588
574
589
fn strip_start ( & mut self , prefix : & str ) -> PatchResult {
@@ -621,9 +636,18 @@ impl RegisterBlockExt for Peripheral {
621
636
fn collect_in_array ( & mut self , rspec : & str , rmod : & Hash , config : & Config ) -> PatchResult {
622
637
let pname = self . name . clone ( ) ;
623
638
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" ) )
625
650
}
626
- Ok ( ( ) )
627
651
}
628
652
629
653
fn collect_in_cluster ( & mut self , cname : & str , cmod : & Hash , config : & Config ) -> PatchResult {
@@ -866,6 +890,13 @@ impl ClusterExt for Cluster {
866
890
}
867
891
}
868
892
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
+
869
900
// Collect registers in arrays
870
901
for ( rspec, rmod) in pmod. hash_iter ( "_array" ) {
871
902
let rspec = rspec. str ( ) ?;
@@ -1096,6 +1127,11 @@ impl RegisterBlockExt for Cluster {
1096
1127
collect_in_array ( regs, & pname, rspec, rmod, config)
1097
1128
}
1098
1129
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
+
1099
1135
fn collect_in_cluster ( & mut self , cname : & str , cmod : & Hash , config : & Config ) -> PatchResult {
1100
1136
let pname = self . name . clone ( ) ;
1101
1137
let regs = & mut self . children ;
@@ -1287,6 +1323,31 @@ fn collect_in_array(
1287
1323
Ok ( ( ) )
1288
1324
}
1289
1325
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
+
1290
1351
fn collect_in_cluster (
1291
1352
regs : & mut Vec < RegisterCluster > ,
1292
1353
path : & str ,
0 commit comments