11use crate :: svd:: {
2- Access , BitRange , EnumeratedValues , Field , Peripheral , Register , RegisterProperties , Usage ,
3- WriteConstraint ,
2+ Access , BitRange , DeriveFrom , EnumeratedValues , Field , Peripheral , Register ,
3+ RegisterProperties , Usage , WriteConstraint ,
44} ;
55use cast:: u64;
66use core:: u64;
@@ -19,16 +19,15 @@ pub fn render(
1919 defs : & RegisterProperties ,
2020 config : & Config ,
2121) -> Result < TokenStream > {
22- let access = util:: access_of ( register) ;
22+ let properties = register. properties . derive_from ( defs) ;
23+ let access = util:: access_of ( & properties, register. fields . as_deref ( ) ) ;
2324 let name = util:: name_of ( register, config. ignore_groups ) ;
2425 let span = Span :: call_site ( ) ;
2526 let name_pc = Ident :: new ( & name. to_sanitized_upper_case ( ) , span) ;
2627 let name_uc_spec = Ident :: new ( & format ! ( "{}_SPEC" , & name. to_sanitized_upper_case( ) ) , span) ;
2728 let name_sc = Ident :: new ( & name. to_sanitized_snake_case ( ) , span) ;
28- let rsize = register
29- . properties
29+ let rsize = properties
3030 . size
31- . or ( defs. size )
3231 . ok_or_else ( || anyhow ! ( "Register {} has no `size` field" , register. name) ) ?;
3332 let rsize = if rsize < 8 {
3433 8
@@ -45,11 +44,6 @@ pub fn render(
4544 } ) )
4645 . as_ref ( ) ,
4746 ) ;
48- let res_val = register
49- . properties
50- . reset_value
51- . or ( defs. reset_value )
52- . map ( |v| v as u64 ) ;
5347
5448 let mut mod_items = TokenStream :: new ( ) ;
5549 let mut r_impl_items = TokenStream :: new ( ) ;
@@ -58,7 +52,7 @@ pub fn render(
5852
5953 let can_read = [ Access :: ReadOnly , Access :: ReadWriteOnce , Access :: ReadWrite ] . contains ( & access) ;
6054 let can_write = access != Access :: ReadOnly ;
61- let can_reset = res_val . is_some ( ) ;
55+ let can_reset = properties . reset_value . is_some ( ) ;
6256
6357 if can_read {
6458 let desc = format ! ( "Register `{}` reader" , register. name) ;
@@ -142,8 +136,8 @@ pub fn render(
142136 peripheral,
143137 all_peripherals,
144138 & rty,
145- res_val,
146139 access,
140+ & properties,
147141 & mut mod_items,
148142 & mut r_impl_items,
149143 & mut w_impl_items,
@@ -262,7 +256,7 @@ pub fn render(
262256 }
263257 } ) ;
264258 }
265- if let Some ( rv) = res_val . map ( util:: hex) {
259+ if let Some ( rv) = properties . reset_value . map ( util:: hex) {
266260 let doc = format ! ( "`reset()` method sets {} to value {}" , register. name, & rv) ;
267261 mod_items. extend ( quote ! {
268262 #[ doc = #doc]
@@ -295,8 +289,8 @@ pub fn fields(
295289 peripheral : & Peripheral ,
296290 all_peripherals : & [ Peripheral ] ,
297291 rty : & Ident ,
298- reset_value : Option < u64 > ,
299292 access : Access ,
293+ properties : & RegisterProperties ,
300294 mod_items : & mut TokenStream ,
301295 r_impl_items : & mut TokenStream ,
302296 w_impl_items : & mut TokenStream ,
@@ -326,11 +320,11 @@ pub fn fields(
326320 let mask = u64:: MAX >> ( 64 - width) ;
327321 let hexmask = & util:: hex ( mask) ;
328322 let offset = u64:: from ( offset) ;
329- let rv = reset_value. map ( |rv| ( rv >> offset) & mask) ;
323+ let rv = properties . reset_value . map ( |rv| ( rv >> offset) & mask) ;
330324 let fty = width. to_ty ( ) ?;
331325 let evs = & f. enumerated_values ;
332326
333- let use_mask = if let Some ( size) = parent . properties . size {
327+ let use_mask = if let Some ( size) = properties. size {
334328 size != width
335329 } else {
336330 true
0 commit comments