@@ -131,6 +131,9 @@ pub(crate) trait RegisterBlockExt: Name {
131
131
/// Get mutable register by name
132
132
fn get_mut_reg ( & mut self , name : & str ) -> Option < & mut Register > ;
133
133
134
+ /// Register/cluster block
135
+ fn children ( & self ) -> Option < & Vec < RegisterCluster > > ;
136
+
134
137
/// Register/cluster block
135
138
fn children_mut ( & mut self ) -> Option < & mut Vec < RegisterCluster > > ;
136
139
@@ -156,6 +159,16 @@ pub(crate) trait RegisterBlockExt: Name {
156
159
157
160
fn add_child ( & mut self , child : RegisterCluster ) ;
158
161
162
+ /// Delete registers and clusters matched by rspec inside ptag
163
+ fn delete_child ( & mut self , rcspec : & str ) -> PatchResult {
164
+ if let Some ( children) = self . children_mut ( ) {
165
+ children. retain ( |rc| !matchname ( rc. name ( ) , rcspec) ) ;
166
+ Ok ( ( ) )
167
+ } else {
168
+ Err ( anyhow ! ( "No registers or clusters" ) )
169
+ }
170
+ }
171
+
159
172
/// Delete registers matched by rspec inside ptag
160
173
fn delete_register ( & mut self , rspec : & str ) -> PatchResult {
161
174
if let Some ( children) = self . children_mut ( ) {
@@ -301,31 +314,38 @@ pub(crate) trait RegisterBlockExt: Name {
301
314
todo ! ( )
302
315
}
303
316
317
+ fn modify_child ( & mut self , rcspec : & str , rcmod : & Hash , bpath : & BlockPath ) -> PatchResult {
318
+ let ( rcspec, ignore) = rcspec. spec ( ) ;
319
+ let rtags = self . iter_registers ( rcspec) . collect :: < Vec < _ > > ( ) ;
320
+ if rtags. is_empty ( ) && !ignore {
321
+ let ctags = self . iter_clusters ( rcspec) . collect :: < Vec < _ > > ( ) ;
322
+ if ctags. is_empty ( ) {
323
+ let present = self . present_registers ( ) ;
324
+ Err ( anyhow ! (
325
+ "Could not find `{bpath}:{rcspec}. Present registers: {present}.`"
326
+ ) )
327
+ } else {
328
+ modify_cluster ( ctags, rcmod)
329
+ }
330
+ } else {
331
+ modify_register ( rtags, rcmod)
332
+ }
333
+ }
334
+
304
335
/// Modify rspec inside ptag according to rmod
305
- fn modify_register ( & mut self , rspec : & str , rmod : & Hash , _bpath : & BlockPath ) -> PatchResult {
306
- let ( rspec, _ignore ) = rspec. spec ( ) ;
336
+ fn modify_register ( & mut self , rspec : & str , rmod : & Hash , bpath : & BlockPath ) -> PatchResult {
337
+ let ( rspec, ignore ) = rspec. spec ( ) ;
307
338
let rtags = self . iter_registers ( rspec) . collect :: < Vec < _ > > ( ) ;
308
- // TODO: enable this check
309
- /*if rtags.is_empty() && !ignore {
339
+ if rtags. is_empty ( ) && !ignore {
310
340
let present = self . present_registers ( ) ;
311
341
return Err ( anyhow ! (
312
342
"Could not find `{bpath}:{rspec}. Present registers: {present}.`"
313
343
) ) ;
314
- }*/
315
- let register_builder = make_register ( rmod) ?;
316
- let dim = make_dim_element ( rmod) ?;
317
- for rtag in rtags {
318
- modify_dim_element ( rtag, & dim) ?;
319
- rtag. modify_from ( register_builder. clone ( ) , VAL_LVL ) ?;
320
- if let Some ( "" ) = rmod. get_str ( "access" ) ? {
321
- rtag. properties . access = None ;
322
- }
323
344
}
324
- Ok ( ( ) )
345
+ modify_register ( rtags , rmod )
325
346
}
326
347
327
348
/// Modify cspec inside ptag according to cmod
328
-
329
349
fn modify_cluster ( & mut self , cspec : & str , cmod : & Hash , bpath : & BlockPath ) -> PatchResult {
330
350
let ( cspec, ignore) = cspec. spec ( ) ;
331
351
let ctags = self . iter_clusters ( cspec) . collect :: < Vec < _ > > ( ) ;
@@ -335,13 +355,39 @@ pub(crate) trait RegisterBlockExt: Name {
335
355
"Could not find cluster `{bpath}:{cspec}. Present clusters: {present}.`"
336
356
) ) ;
337
357
}
338
- let cluster_builder = make_cluster ( cmod) ?;
339
- let dim = make_dim_element ( cmod) ?;
340
- for ctag in ctags {
341
- modify_dim_element ( ctag, & dim) ?;
342
- ctag. modify_from ( cluster_builder. clone ( ) , VAL_LVL ) ?;
358
+ modify_cluster ( ctags, cmod)
359
+ }
360
+ /// Work through a register or cluster
361
+ fn process_child (
362
+ & mut self ,
363
+ rcspec : & str ,
364
+ rcmod : & Hash ,
365
+ bpath : & BlockPath ,
366
+ config : & Config ,
367
+ ) -> PatchResult {
368
+ let ( rspec, ignore) = rcspec. spec ( ) ;
369
+ let rtags = self . iter_registers ( rspec) . collect :: < Vec < _ > > ( ) ;
370
+ if rtags. is_empty ( ) && !ignore {
371
+ let ctags = self . iter_clusters ( rspec) . collect :: < Vec < _ > > ( ) ;
372
+ if ctags. is_empty ( ) {
373
+ let present = self . present_registers ( ) ;
374
+ Err ( anyhow ! (
375
+ "Could not find `{bpath}:{rspec}. Present registers: {present}.`"
376
+ ) )
377
+ } else {
378
+ for ctag in ctags {
379
+ ctag. process ( rcmod, bpath, config)
380
+ . with_context ( || format ! ( "Processing cluster `{}`" , ctag. name) ) ?;
381
+ }
382
+ Ok ( ( ) )
383
+ }
384
+ } else {
385
+ for rtag in rtags {
386
+ rtag. process ( rcmod, bpath, config)
387
+ . with_context ( || format ! ( "Processing register `{}`" , rtag. name) ) ?;
388
+ }
389
+ Ok ( ( ) )
343
390
}
344
- Ok ( ( ) )
345
391
}
346
392
/// Work through a register, handling all fields
347
393
fn process_register (
@@ -507,6 +553,29 @@ pub(crate) trait RegisterBlockExt: Name {
507
553
}
508
554
}
509
555
556
+ fn modify_register ( rtags : Vec < & mut Register > , rmod : & Hash ) -> PatchResult {
557
+ let register_builder = make_register ( rmod) ?;
558
+ let dim = make_dim_element ( rmod) ?;
559
+ for rtag in rtags {
560
+ modify_dim_element ( rtag, & dim) ?;
561
+ rtag. modify_from ( register_builder. clone ( ) , VAL_LVL ) ?;
562
+ if let Some ( "" ) = rmod. get_str ( "access" ) ? {
563
+ rtag. properties . access = None ;
564
+ }
565
+ }
566
+ Ok ( ( ) )
567
+ }
568
+
569
+ fn modify_cluster ( ctags : Vec < & mut Cluster > , cmod : & Hash ) -> PatchResult {
570
+ let cluster_builder = make_cluster ( cmod) ?;
571
+ let dim = make_dim_element ( cmod) ?;
572
+ for ctag in ctags {
573
+ modify_dim_element ( ctag, & dim) ?;
574
+ ctag. modify_from ( cluster_builder. clone ( ) , VAL_LVL ) ?;
575
+ }
576
+ Ok ( ( ) )
577
+ }
578
+
510
579
impl RegisterBlockExt for Peripheral {
511
580
const RB_TYPE : & ' static str = "peripheral" ;
512
581
@@ -531,6 +600,9 @@ impl RegisterBlockExt for Peripheral {
531
600
fn get_mut_reg ( & mut self , name : & str ) -> Option < & mut Register > {
532
601
self . get_mut_register ( name)
533
602
}
603
+ fn children ( & self ) -> Option < & Vec < RegisterCluster > > {
604
+ self . registers . as_ref ( )
605
+ }
534
606
fn children_mut ( & mut self ) -> Option < & mut Vec < RegisterCluster > > {
535
607
self . registers . as_mut ( )
536
608
}
@@ -566,6 +638,9 @@ impl RegisterBlockExt for Cluster {
566
638
fn get_mut_reg ( & mut self , name : & str ) -> Option < & mut Register > {
567
639
self . get_mut_register ( name)
568
640
}
641
+ fn children ( & self ) -> Option < & Vec < RegisterCluster > > {
642
+ Some ( & self . children )
643
+ }
569
644
fn children_mut ( & mut self ) -> Option < & mut Vec < RegisterCluster > > {
570
645
Some ( & mut self . children )
571
646
}
@@ -617,15 +692,17 @@ impl PeripheralExt for Peripheral {
617
692
// Handle deletions
618
693
if let Some ( deletions) = pmod. get_yaml ( "_delete" ) {
619
694
match deletions {
620
- Yaml :: String ( rspec) => {
621
- self . delete_register ( rspec)
622
- . with_context ( || format ! ( "Deleting registers matched to `{rspec}`" ) ) ?;
695
+ Yaml :: String ( rcspec) => {
696
+ self . delete_child ( rcspec) . with_context ( || {
697
+ format ! ( "Deleting registers and clusters matched to `{rcspec}`" )
698
+ } ) ?;
623
699
}
624
700
Yaml :: Array ( deletions) => {
625
- for rspec in deletions {
626
- let rspec = rspec. str ( ) ?;
627
- self . delete_register ( rspec)
628
- . with_context ( || format ! ( "Deleting registers matched to `{rspec}`" ) ) ?;
701
+ for rcspec in deletions {
702
+ let rcspec = rcspec. str ( ) ?;
703
+ self . delete_child ( rcspec) . with_context ( || {
704
+ format ! ( "Deleting registers and clusters matched to `{rcspec}`" )
705
+ } ) ?;
629
706
}
630
707
}
631
708
Yaml :: Hash ( deletions) => {
@@ -716,16 +793,16 @@ impl PeripheralExt for Peripheral {
716
793
} ) ?;
717
794
}
718
795
}
719
- "_cluster " => {
796
+ "_clusters " => {
720
797
for ( cspec, val) in rmod {
721
798
let cspec = cspec. str ( ) ?;
722
799
self . modify_cluster ( cspec, val. hash ( ) ?, & ppath)
723
800
. with_context ( || format ! ( "Modifying clusters matched to `{cspec}`" ) ) ?;
724
801
}
725
802
}
726
- rspec => self
727
- . modify_register ( rspec , rmod , & ppath )
728
- . with_context ( || format ! ( "Modifying registers matched to `{rspec}`" ) ) ?,
803
+ rcspec => self . modify_child ( rcspec , rmod , & ppath ) . with_context ( || {
804
+ format ! ( "Modifying registers or clusters matched to `{rcspec}`" )
805
+ } ) ?,
729
806
}
730
807
}
731
808
@@ -795,14 +872,14 @@ impl PeripheralExt for Peripheral {
795
872
}
796
873
}
797
874
798
- // Handle registers
799
- for ( rspec , register ) in pmod {
800
- let rspec = rspec . str ( ) ?;
801
- if Self :: KEYWORDS . contains ( & rspec ) {
875
+ // Handle registers or clusters
876
+ for ( rcspec , rcmod ) in pmod {
877
+ let rcspec = rcspec . str ( ) ?;
878
+ if Self :: KEYWORDS . contains ( & rcspec ) {
802
879
continue ;
803
880
}
804
- self . process_register ( rspec , register . hash ( ) ?, & ppath, config)
805
- . with_context ( || format ! ( "According to `{rspec }`" ) ) ?;
881
+ self . process_child ( rcspec , rcmod . hash ( ) ?, & ppath, config)
882
+ . with_context ( || format ! ( "According to `{rcspec }`" ) ) ?;
806
883
}
807
884
808
885
// Expand register arrays
@@ -874,15 +951,17 @@ impl ClusterExt for Cluster {
874
951
// Handle deletions
875
952
if let Some ( deletions) = cmod. get_yaml ( "_delete" ) {
876
953
match deletions {
877
- Yaml :: String ( rspec) => {
878
- self . delete_register ( rspec)
879
- . with_context ( || format ! ( "Deleting registers matched to `{rspec}`" ) ) ?;
954
+ Yaml :: String ( rcspec) => {
955
+ self . delete_child ( rcspec) . with_context ( || {
956
+ format ! ( "Deleting registers and clusters matched to `{rcspec}`" )
957
+ } ) ?;
880
958
}
881
959
Yaml :: Array ( deletions) => {
882
- for rspec in deletions {
883
- let rspec = rspec. str ( ) ?;
884
- self . delete_register ( rspec)
885
- . with_context ( || format ! ( "Deleting registers matched to `{rspec}`" ) ) ?;
960
+ for rcspec in deletions {
961
+ let rcspec = rcspec. str ( ) ?;
962
+ self . delete_child ( rcspec) . with_context ( || {
963
+ format ! ( "Deleting registers and clusters matched to `{rcspec}`" )
964
+ } ) ?;
886
965
}
887
966
}
888
967
Yaml :: Hash ( deletions) => {
@@ -963,16 +1042,16 @@ impl ClusterExt for Cluster {
963
1042
. with_context ( || format ! ( "Modifying registers matched to `{rspec}`" ) ) ?;
964
1043
}
965
1044
}
966
- "_cluster " => {
1045
+ "_clusters " => {
967
1046
for ( cspec, val) in rmod {
968
1047
let cspec = cspec. str ( ) ?;
969
1048
self . modify_cluster ( cspec, val. hash ( ) ?, & cpath)
970
1049
. with_context ( || format ! ( "Modifying clusters matched to `{cspec}`" ) ) ?;
971
1050
}
972
1051
}
973
- rspec => self
974
- . modify_register ( rspec , rmod , & cpath )
975
- . with_context ( || format ! ( "Modifying registers matched to `{rspec}`" ) ) ?,
1052
+ rcspec => self . modify_child ( rcspec , rmod , & cpath ) . with_context ( || {
1053
+ format ! ( "Modifying registers or clusters matched to `{rcspec}`" )
1054
+ } ) ?,
976
1055
}
977
1056
}
978
1057
@@ -1050,14 +1129,14 @@ impl ClusterExt for Cluster {
1050
1129
. with_context ( || format ! ( "According to `{cspec}`" ) ) ?;
1051
1130
}
1052
1131
1053
- // Handle registers
1054
- for ( rspec , register ) in cmod {
1055
- let rspec = rspec . str ( ) ?;
1056
- if Self :: KEYWORDS . contains ( & rspec ) {
1132
+ // Handle registers or clusters
1133
+ for ( rcspec , rcmod ) in cmod {
1134
+ let rcspec = rcspec . str ( ) ?;
1135
+ if Self :: KEYWORDS . contains ( & rcspec ) {
1057
1136
continue ;
1058
1137
}
1059
- self . process_register ( rspec , register . hash ( ) ?, & cpath, config)
1060
- . with_context ( || format ! ( "According to `{rspec }`" ) ) ?;
1138
+ self . process_child ( rcspec , rcmod . hash ( ) ?, & cpath, config)
1139
+ . with_context ( || format ! ( "According to `{rcspec }`" ) ) ?;
1061
1140
}
1062
1141
1063
1142
self . post_process ( cmod, parent, config)
0 commit comments