@@ -59,17 +59,17 @@ pub fn render(
5959 methods. push ( "read" ) ;
6060 }
6161
62+ let res_val = register
63+ . reset_value
64+ . or ( defs. reset_value )
65+ . map ( |v| v as u64 ) ;
6266 if can_write {
6367 let desc = format ! ( "Writer for register {}" , register. name) ;
6468 mod_items. push ( quote ! {
6569 #[ doc = #desc]
6670 pub type W = crate :: W <#rty, super :: #name_pc>;
6771 } ) ;
68- let res_val = register
69- . reset_value
70- . or ( defs. reset_value )
71- . map ( |v| util:: hex ( v as u64 ) ) ;
72- if let Some ( rv) = res_val {
72+ if let Some ( rv) = res_val. map ( util:: hex) {
7373 let doc = format ! ( "Register {} `reset()`'s with value {}" , register. name, & rv) ;
7474 mod_items. push ( quote ! {
7575 #[ doc = #doc]
@@ -106,6 +106,7 @@ pub fn render(
106106 peripheral,
107107 all_peripherals,
108108 & rty,
109+ res_val,
109110 access,
110111 & mut mod_items,
111112 & mut r_impl_items,
@@ -206,6 +207,7 @@ pub fn fields(
206207 peripheral : & Peripheral ,
207208 all_peripherals : & [ Peripheral ] ,
208209 rty : & Ident ,
210+ reset_value : Option < u64 > ,
209211 access : Access ,
210212 mod_items : & mut Vec < Tokens > ,
211213 r_impl_items : & mut Vec < Tokens > ,
@@ -240,6 +242,7 @@ pub fn fields(
240242 description. push_str ( " - " ) ;
241243 description. push_str ( & * util:: respace ( & util:: escape_brackets ( d) ) ) ;
242244 }
245+
243246 Ok ( F {
244247 _pc_w,
245248 _sc,
@@ -252,9 +255,9 @@ pub fn fields(
252255 access : f. access ,
253256 evs : & f. enumerated_values ,
254257 sc : Ident :: from ( & * sc) ,
255- mask : util :: hex ( 1u64 . wrapping_neg ( ) >> ( 64 -width) ) ,
258+ mask : 1u64 . wrapping_neg ( ) >> ( 64 -width) ,
256259 name : & f. name ,
257- offset : util :: unsuffixed ( u64:: from ( f . bit_range . offset ) ) ,
260+ offset : u64:: from ( offset) ,
258261 ty : width. to_ty ( ) ?,
259262 write_constraint : f. write_constraint . as_ref ( ) ,
260263 } )
@@ -272,8 +275,9 @@ pub fn fields(
272275 let can_write = ( access != Access :: ReadOnly ) && ( f. access != Some ( Access :: ReadOnly ) ) ;
273276
274277 let bits = & f. bits ;
275- let mask = & f. mask ;
276- let offset: usize = f. offset . parse ( ) . unwrap ( ) ;
278+ let mask = & util:: hex ( f. mask ) ;
279+ let offset = f. offset ;
280+ let rv = reset_value. map ( |rv| ( rv >> offset) & f. mask ) ;
277281 let fty = & f. ty ;
278282
279283 let lookup_results = lookup (
@@ -294,6 +298,7 @@ pub fn fields(
294298
295299 let _pc_r = & f. _pc_r ;
296300 let _pc_w = & f. _pc_w ;
301+ let description = & util:: escape_brackets ( & f. description ) ;
297302
298303 if can_read {
299304 let cast = if f. width == 1 {
@@ -302,7 +307,7 @@ pub fn fields(
302307 quote ! { as #fty }
303308 } ;
304309 let value = if offset != 0 {
305- let offset = & f . offset ;
310+ let offset = & util :: unsuffixed ( offset) ;
306311 quote ! {
307312 ( ( self . bits >> #offset) & #mask) #cast
308313 }
@@ -315,7 +320,6 @@ pub fn fields(
315320 if let Some ( ( evs, base) ) = lookup_filter ( & lookup_results, Usage :: Read ) {
316321 evs_r = Some ( evs. clone ( ) ) ;
317322
318- let description = & util:: escape_brackets ( & f. description ) ;
319323 let sc = & f. sc ;
320324 r_impl_items. push ( quote ! {
321325 #[ doc = #description]
@@ -328,7 +332,7 @@ pub fn fields(
328332 base_pc_w = base. as_ref ( ) . map ( |base| {
329333 let pc = base. field . to_sanitized_upper_case ( ) ;
330334 let base_pc_r = Ident :: from ( & * format ! ( "{}_A" , pc) ) ;
331- let base_pc_r = derive_from_base ( mod_items, & base, & pc_r, & base_pc_r, f . name ) ;
335+ let base_pc_r = derive_from_base ( mod_items, & base, & pc_r, & base_pc_r, description ) ;
332336
333337 let doc = format ! ( "Reader of field `{}`" , f. name) ;
334338 mod_items. push ( quote ! {
@@ -343,7 +347,7 @@ pub fn fields(
343347 let has_reserved_variant = evs. values . len ( ) != ( 1 << f. width ) ;
344348 let variants = Variant :: from_enumerated_values ( evs) ?;
345349
346- add_from_variants ( mod_items, & variants, pc_r, & f) ;
350+ add_from_variants ( mod_items, & variants, pc_r, & f, description , rv ) ;
347351
348352 let mut enum_items = vec ! [ ] ;
349353
@@ -425,7 +429,6 @@ pub fn fields(
425429 }
426430
427431 } else {
428- let description = & util:: escape_brackets ( & f. description ) ;
429432 let sc = & f. sc ;
430433 r_impl_items. push ( quote ! {
431434 #[ doc = #description]
@@ -463,11 +466,11 @@ pub fn fields(
463466 base_pc_w = base. as_ref ( ) . map ( |base| {
464467 let pc = base. field . to_sanitized_upper_case ( ) ;
465468 let base_pc_w = Ident :: from ( & * format ! ( "{}_AW" , pc) ) ;
466- derive_from_base ( mod_items, & base, & pc_w, & base_pc_w, f . name )
469+ derive_from_base ( mod_items, & base, & pc_w, & base_pc_w, description )
467470 } ) ;
468471
469472 if base. is_none ( ) {
470- add_from_variants ( mod_items, & variants, pc_w, & f) ;
473+ add_from_variants ( mod_items, & variants, pc_w, & f, description , rv ) ;
471474 }
472475 }
473476
@@ -523,7 +526,7 @@ pub fn fields(
523526 }
524527
525528 proxy_items. push ( if offset != 0 {
526- let offset = & f . offset ;
529+ let offset = & util :: unsuffixed ( offset) ;
527530 quote ! {
528531 ///Writes raw bits to the field
529532 #[ inline( always) ]
@@ -555,7 +558,6 @@ pub fn fields(
555558 }
556559 } ) ;
557560
558- let description = & util:: escape_brackets ( & f. description ) ;
559561 let sc = & f. sc ;
560562 w_impl_items. push ( quote ! {
561563 #[ doc = #description]
@@ -622,14 +624,13 @@ impl Variant {
622624 }
623625}
624626
625- fn add_from_variants ( mod_items : & mut Vec < Tokens > , variants : & Vec < Variant > , pc : & Ident , f : & F ) {
627+ fn add_from_variants ( mod_items : & mut Vec < Tokens > , variants : & Vec < Variant > , pc : & Ident , f : & F , desc : & str , reset_value : Option < u64 > ) {
626628 let fty = & f. ty ;
627- let desc = format ! ( "Possible values of the field `{}`" , f. name) ;
628629
629630 let vars = variants
630631 . iter ( )
631632 . map ( |v| {
632- let desc = util:: escape_brackets ( & v . doc ) ;
633+ let desc = util:: escape_brackets ( & format ! ( "{}: {}" , v . value , v . doc) ) ;
633634 let pcv = & v. pc ;
634635 quote ! {
635636 #[ doc = #desc]
@@ -638,6 +639,12 @@ fn add_from_variants(mod_items: &mut Vec<Tokens>, variants: &Vec<Variant>, pc: &
638639 } )
639640 . collect :: < Vec < _ > > ( ) ;
640641
642+ let desc = if let Some ( rv) = reset_value {
643+ format ! ( "{}\n \n Value on reset: {}" , desc, rv)
644+ } else {
645+ desc. to_owned ( )
646+ } ;
647+
641648 mod_items. push ( quote ! {
642649 #[ doc = #desc]
643650 #[ derive( Clone , Copy , Debug , PartialEq ) ]
@@ -667,9 +674,7 @@ fn add_from_variants(mod_items: &mut Vec<Tokens>, variants: &Vec<Variant>, pc: &
667674 } ) ;
668675}
669676
670- fn derive_from_base ( mod_items : & mut Vec < Tokens > , base : & Base , pc : & Ident , base_pc : & Ident , fname : & str ) -> quote:: Tokens {
671- let desc = format ! ( "Possible values of the field `{}`" , fname, ) ;
672-
677+ fn derive_from_base ( mod_items : & mut Vec < Tokens > , base : & Base , pc : & Ident , base_pc : & Ident , desc : & str ) -> quote:: Tokens {
673678 if let ( Some ( peripheral) , Some ( register) ) = ( & base. peripheral , & base. register ) {
674679 let pmod_ = peripheral. to_sanitized_snake_case ( ) ;
675680 let rmod_ = register. to_sanitized_snake_case ( ) ;
@@ -716,9 +721,9 @@ struct F<'a> {
716721 access : Option < Access > ,
717722 description : String ,
718723 evs : & ' a [ EnumeratedValues ] ,
719- mask : Tokens ,
724+ mask : u64 ,
720725 name : & ' a str ,
721- offset : Tokens ,
726+ offset : u64 ,
722727 pc_r : Ident ,
723728 _pc_r : Ident ,
724729 pc_w : Ident ,
0 commit comments