@@ -4,7 +4,8 @@ use std::collections::HashMap;
44
55use quote:: ToTokens ;
66use proc_macro2:: TokenStream ;
7- use crate :: svd:: { Cluster , ClusterInfo , Defaults , Peripheral , Register , RegisterCluster , RegisterInfo } ;
7+ use crate :: svd:: { Cluster , ClusterInfo , RegisterProperties , Peripheral , Register , RegisterCluster } ;
8+ use svd_parser:: derive_from:: DeriveFrom ;
89use proc_macro2:: { Ident , Span , Punct , Spacing } ;
910use log:: warn;
1011use syn:: { parse_str, Token } ;
@@ -17,7 +18,7 @@ use crate::generate::register;
1718pub fn render (
1819 p_original : & Peripheral ,
1920 all_peripherals : & [ Peripheral ] ,
20- defaults : & Defaults ,
21+ defaults : & RegisterProperties ,
2122 nightly : bool ,
2223) -> Result < Vec < TokenStream > > {
2324 let mut out = vec ! [ ] ;
@@ -95,21 +96,6 @@ pub fn render(
9596 reg_map. insert ( & r. name , r. clone ( ) ) ;
9697 }
9798
98- // Compute the effective, derived version of a register given the definition
99- // with the derived_from property on it (`info`) and its `ancestor`
100- fn derive_reg_info ( info : & RegisterInfo , ancestor : & RegisterInfo ) -> RegisterInfo {
101- let mut derived = info. clone ( ) ;
102-
103- derived. size = derived. size . or ( ancestor. size ) ;
104- derived. access = derived. access . or ( ancestor. access ) ;
105- derived. reset_value = derived. reset_value . or ( ancestor. reset_value ) ;
106- derived. reset_mask = derived. reset_mask . or ( ancestor. reset_mask ) ;
107- derived. fields = derived. fields . or ( ancestor. fields . clone ( ) ) ;
108- derived. write_constraint = derived. write_constraint . or ( ancestor. write_constraint ) ;
109-
110- derived
111- }
112-
11399 // Build up an alternate erc list by expanding any derived registers
114100 let mut alt_erc : Vec < RegisterCluster > = registers. iter ( ) . filter_map ( |r| {
115101 match r. derived_from {
@@ -124,10 +110,10 @@ pub fn render(
124110
125111 let d = match * * ancestor {
126112 Register :: Array ( ref info, ref array_info) => {
127- Some ( RegisterCluster :: Register ( Register :: Array ( derive_reg_info ( * r , info) , array_info. clone ( ) ) ) )
113+ Some ( RegisterCluster :: Register ( Register :: Array ( r . derive_from ( info) , array_info. clone ( ) ) ) )
128114 }
129115 Register :: Single ( ref info) => {
130- Some ( RegisterCluster :: Register ( Register :: Single ( derive_reg_info ( * r , info) ) ) )
116+ Some ( RegisterCluster :: Register ( Register :: Single ( r . derive_from ( info) ) ) )
131117 }
132118 } ;
133119
@@ -155,13 +141,15 @@ pub fn render(
155141 return Ok ( out) ;
156142 }
157143
144+ let defaults = p. default_register_properties . derive_from ( defaults) ;
145+
158146 // Push any register or cluster blocks into the output
159147 let mut mod_items = vec ! [ ] ;
160- mod_items. push ( register_or_cluster_block ( ercs, defaults, None , nightly) ?) ;
148+ mod_items. push ( register_or_cluster_block ( ercs, & defaults, None , nightly) ?) ;
161149
162150 // Push all cluster related information into the peripheral module
163151 for c in & clusters {
164- mod_items. push ( cluster_block ( c, defaults, p, all_peripherals, nightly) ?) ;
152+ mod_items. push ( cluster_block ( c, & defaults, p, all_peripherals, nightly) ?) ;
165153 }
166154
167155 // Push all regsiter realted information into the peripheral module
@@ -171,7 +159,7 @@ pub fn render(
171159 registers,
172160 p,
173161 all_peripherals,
174- defaults,
162+ & defaults,
175163 ) ?) ;
176164 }
177165
@@ -428,7 +416,7 @@ impl FieldRegions {
428416
429417fn register_or_cluster_block (
430418 ercs : & [ RegisterCluster ] ,
431- defs : & Defaults ,
419+ defs : & RegisterProperties ,
432420 name : Option < & str > ,
433421 _nightly : bool ,
434422) -> Result < TokenStream > {
@@ -563,7 +551,7 @@ fn register_or_cluster_block(
563551/// `RegisterBlockField`s containing `Field`s.
564552fn expand (
565553 ercs : & [ RegisterCluster ] ,
566- defs : & Defaults ,
554+ defs : & RegisterProperties ,
567555 name : Option < & str > ,
568556) -> Result < Vec < RegisterBlockField > > {
569557 let mut ercs_expanded = vec ! [ ] ;
@@ -582,7 +570,7 @@ fn expand(
582570
583571/// Recursively calculate the size of a cluster. A cluster's size is the maximum
584572/// end position of its recursive children.
585- fn cluster_size_in_bits ( info : & ClusterInfo , defs : & Defaults ) -> Result < u32 > {
573+ fn cluster_size_in_bits ( info : & ClusterInfo , defs : & RegisterProperties ) -> Result < u32 > {
586574 let mut size = 0 ;
587575
588576 for c in & info. children {
@@ -606,12 +594,10 @@ fn cluster_size_in_bits(info: &ClusterInfo, defs: &Defaults) -> Result<u32> {
606594}
607595
608596/// Render a given cluster (and any children) into `RegisterBlockField`s
609- fn expand_cluster ( cluster : & Cluster , defs : & Defaults ) -> Result < Vec < RegisterBlockField > > {
597+ fn expand_cluster ( cluster : & Cluster , defs : & RegisterProperties ) -> Result < Vec < RegisterBlockField > > {
610598 let mut cluster_expanded = vec ! [ ] ;
611599
612- let reg_size = cluster. size . or ( defs. size ) ;
613- let mut defs = defs. clone ( ) ;
614- defs. size = reg_size;
600+ let defs = cluster. default_register_properties . derive_from ( defs) ;
615601
616602 let cluster_size = cluster_size_in_bits ( cluster, & defs)
617603 . chain_err ( || format ! ( "Cluster {} has no determinable `size` field" , cluster. name) ) ?;
@@ -663,7 +649,7 @@ fn expand_cluster(cluster: &Cluster, defs: &Defaults) -> Result<Vec<RegisterBloc
663649/// numeral indexes, or not containing all elements from 0 to size) they will be expanded
664650fn expand_register (
665651 register : & Register ,
666- defs : & Defaults ,
652+ defs : & RegisterProperties ,
667653 name : Option < & str > ,
668654) -> Result < Vec < RegisterBlockField > > {
669655 let mut register_expanded = vec ! [ ] ;
@@ -719,7 +705,7 @@ fn expand_register(
719705/// Render a Cluster Block into `TokenStream`
720706fn cluster_block (
721707 c : & Cluster ,
722- defaults : & Defaults ,
708+ defaults : & RegisterProperties ,
723709 p : & Peripheral ,
724710 all_peripherals : & [ Peripheral ] ,
725711 nightly : bool ,
@@ -738,9 +724,7 @@ fn cluster_block(
738724 . replace ( "%s" , "" ) ;
739725 let name_sc = Ident :: new ( & mod_name. to_sanitized_snake_case ( ) , Span :: call_site ( ) ) ;
740726
741- let reg_size = c. size . or ( defaults. size ) ;
742- let mut defaults = defaults. clone ( ) ;
743- defaults. size = reg_size;
727+ let defaults = c. default_register_properties . derive_from ( defaults) ;
744728
745729 let reg_block = register_or_cluster_block ( & c. children , & defaults, Some ( & mod_name) , nightly) ?;
746730
0 commit comments