@@ -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,38 @@ 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
+ if p. derived_from . is_some ( ) {
408
+ continue ;
409
+ }
410
+ let default = p. default_register_properties . derive_from ( & default) ;
411
+ if let Some ( regs) = p. registers . as_mut ( ) {
412
+ expand_properties_registers ( regs, & default) ;
413
+ }
414
+ }
415
+ }
416
+
417
+ fn expand_properties_registers ( regs : & mut [ RegisterCluster ] , default : & RegisterProperties ) {
418
+ for rc in regs {
419
+ match rc {
420
+ RegisterCluster :: Cluster ( c) => {
421
+ if c. derived_from . is_some ( ) {
422
+ continue ;
423
+ }
424
+ let default = c. default_register_properties . derive_from ( & default) ;
425
+ expand_properties_registers ( & mut c. children , & default) ;
426
+ }
427
+ RegisterCluster :: Register ( r) => {
428
+ if r. derived_from . is_some ( ) {
429
+ continue ;
430
+ }
431
+ r. properties = r. properties . derive_from ( default) ;
432
+ }
433
+ }
434
+ }
435
+ }
0 commit comments