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 ,
@@ -315,7 +309,7 @@ pub fn fields(
315309 let name_sc = Ident :: new ( & name. to_sanitized_snake_case ( ) , span) ;
316310 let name_pc = name. to_sanitized_upper_case ( ) ;
317311 let bits = Ident :: new ( if width == 1 { "bit" } else { "bits" } , span) ;
318- let description_raw = f. description . as_ref ( ) . map ( |s| s . as_str ( ) ) . unwrap_or ( "" ) ; // raw description, if absent using empty string
312+ let description_raw = f. description . as_deref ( ) . unwrap_or ( "" ) ; // raw description, if absent using empty string
319313 let description = util:: respace ( & util:: escape_brackets ( description_raw) ) ;
320314
321315 let can_read = can_read
@@ -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
@@ -450,7 +444,7 @@ pub fn fields(
450444 Span :: call_site ( ) ,
451445 ) ;
452446 let doc = util:: replace_suffix (
453- & description_with_bits ( & description_raw, sub_offset, width) ,
447+ & description_with_bits ( description_raw, sub_offset, width) ,
454448 suffix,
455449 ) ;
456450 r_impl_items. extend ( quote ! {
@@ -462,7 +456,7 @@ pub fn fields(
462456 } ) ;
463457 }
464458 } else {
465- let doc = description_with_bits ( & description_raw, offset, width) ;
459+ let doc = description_with_bits ( description_raw, offset, width) ;
466460 r_impl_items. extend ( quote ! {
467461 #[ doc = #doc]
468462 #inline
@@ -815,7 +809,7 @@ pub fn fields(
815809 Span :: call_site ( ) ,
816810 ) ;
817811 let doc = util:: replace_suffix (
818- & description_with_bits ( & description_raw, sub_offset, width) ,
812+ & description_with_bits ( description_raw, sub_offset, width) ,
819813 suffix,
820814 ) ;
821815 let sub_offset = util:: unsuffixed ( sub_offset as u64 ) ;
@@ -838,7 +832,7 @@ pub fn fields(
838832 }
839833 }
840834 } else {
841- let doc = description_with_bits ( & description_raw, offset, width) ;
835+ let doc = description_with_bits ( description_raw, offset, width) ;
842836 w_impl_items. extend ( quote ! {
843837 #[ doc = #doc]
844838 #inline
0 commit comments