@@ -5,7 +5,7 @@ use std::collections::HashMap;
55use std:: mem:: take;
66use svd_rs:: {
77 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 ,
99} ;
1010
1111#[ derive( Clone , Debug , Default ) ]
@@ -398,3 +398,38 @@ pub fn expand(indevice: &Device) -> Result<Device> {
398398
399399 Ok ( device)
400400}
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