@@ -5,7 +5,7 @@ use std::collections::HashMap;
5
5
use std:: mem:: take;
6
6
use svd_rs:: {
7
7
array:: names, cluster, field, peripheral, register, BitRange , Cluster , ClusterInfo , DeriveFrom ,
8
- Device , EnumeratedValues , Field , Peripheral , Register , RegisterCluster ,
8
+ Device , EnumeratedValues , Field , Peripheral , Register , RegisterCluster , RegisterProperties ,
9
9
} ;
10
10
11
11
#[ derive( Clone , Debug , Default ) ]
@@ -398,3 +398,31 @@ pub fn expand(indevice: &Device) -> Result<Device> {
398
398
399
399
Ok ( device)
400
400
}
401
+
402
+ /// Takes register `size`, `access`, `reset_value` and `reset_mask`
403
+ /// from peripheral or device properties if absent in register
404
+ pub fn expand_properties ( device : & mut Device ) {
405
+ let default = device. default_register_properties . clone ( ) ;
406
+ for p in & mut device. peripherals {
407
+ let default = p. default_register_properties . derive_from ( & default) ;
408
+ if let Some ( regs) = p. registers . as_mut ( ) {
409
+ for rc in regs {
410
+ expand_properties_register_cluster ( rc, & default) ;
411
+ }
412
+ }
413
+ }
414
+ }
415
+
416
+ fn expand_properties_register_cluster ( rc : & mut RegisterCluster , default : & RegisterProperties ) {
417
+ match rc {
418
+ RegisterCluster :: Cluster ( c) => {
419
+ let default = c. default_register_properties . derive_from ( & default) ;
420
+ for rc in & mut c. children {
421
+ expand_properties_register_cluster ( rc, & default) ;
422
+ }
423
+ }
424
+ RegisterCluster :: Register ( r) => {
425
+ r. properties = r. properties . derive_from ( default) ;
426
+ }
427
+ }
428
+ }
0 commit comments