@@ -357,11 +357,13 @@ pub fn gen_peripheral(p: &Peripheral, d: &Defaults) -> Vec<Tokens> {
357357 let access = access ( & register) ;
358358
359359 items. extend ( gen_register ( register, d) ) ;
360- if access != Access :: WriteOnly {
361- items. extend ( gen_register_r ( register, d) ) ;
362- }
363- if access != Access :: ReadOnly {
364- items. extend ( gen_register_w ( register, d) ) ;
360+ if let Some ( ref fields) = register. fields {
361+ if access != Access :: WriteOnly {
362+ items. extend ( gen_register_r ( register, d, fields) ) ;
363+ }
364+ if access != Access :: ReadOnly {
365+ items. extend ( gen_register_w ( register, d, fields) ) ;
366+ }
365367 }
366368 }
367369
@@ -454,13 +456,14 @@ fn type_of(r: &Register) -> String {
454456
455457fn access ( r : & Register ) -> Access {
456458 r. access . unwrap_or_else ( || {
457- let fields = r. fields
458- . as_ref ( )
459- . expect ( & format ! ( "{:#?} has no `fields` field" , r) ) ;
460- if fields. iter ( ) . all ( |f| f. access == Some ( Access :: ReadOnly ) ) {
461- Access :: ReadOnly
462- } else if fields. iter ( ) . all ( |f| f. access == Some ( Access :: WriteOnly ) ) {
463- Access :: WriteOnly
459+ if let Some ( ref fields) = r. fields {
460+ if fields. iter ( ) . all ( |f| f. access == Some ( Access :: ReadOnly ) ) {
461+ Access :: ReadOnly
462+ } else if fields. iter ( ) . all ( |f| f. access == Some ( Access :: WriteOnly ) ) {
463+ Access :: WriteOnly
464+ } else {
465+ Access :: ReadWrite
466+ }
464467 } else {
465468 Access :: ReadWrite
466469 }
@@ -479,8 +482,6 @@ pub fn gen_register(r: &Register, d: &Defaults) -> Vec<Tokens> {
479482 . to_ty ( ) ;
480483 let access = access ( r) ;
481484
482- let name_r = Ident :: new ( format ! ( "{}R" , ty) ) ;
483- let name_w = Ident :: new ( format ! ( "{}W" , ty) ) ;
484485 match access {
485486 Access :: ReadOnly => {
486487 items. push ( quote ! {
@@ -489,80 +490,130 @@ pub fn gen_register(r: &Register, d: &Defaults) -> Vec<Tokens> {
489490 register: :: volatile_register:: RO <#bits_ty>
490491 }
491492 } ) ;
492-
493- items. push ( quote ! {
494- impl #name {
495- pub fn read( & self ) -> #name_r {
496- #name_r { bits: self . register. read( ) }
497- }
498- }
499- } ) ;
500493 }
501-
502494 Access :: ReadWrite => {
503495 items. push ( quote ! {
504496 #[ repr( C ) ]
505497 pub struct #name {
506498 register: :: volatile_register:: RW <#bits_ty>
507499 }
508500 } ) ;
509-
510- items. push ( quote ! {
511- impl #name {
512- pub fn modify<F >( & mut self , f: F )
513- where for <' w> F : FnOnce ( & #name_r, & ' w mut #name_w) -> & ' w mut #name_w,
514- {
515- let bits = self . register. read( ) ;
516- let r = #name_r { bits: bits } ;
517- let mut w = #name_w { bits: bits } ;
518- f( & r, & mut w) ;
519- self . register. write( w. bits) ;
520- }
521-
522- pub fn read( & self ) -> #name_r {
523- #name_r { bits: self . register. read( ) }
524- }
525-
526- pub fn write<F >( & mut self , f: F )
527- where F : FnOnce ( & mut #name_w) -> & mut #name_w,
528- {
529- let mut w = #name_w:: reset_value( ) ;
530- f( & mut w) ;
531- self . register. write( w. bits) ;
532- }
533- }
534- } ) ;
535501 }
536-
537502 Access :: WriteOnly => {
538503 items. push ( quote ! {
539504 #[ repr( C ) ]
540505 pub struct #name {
541506 register: :: volatile_register:: WO <#bits_ty>
542507 }
543508 } ) ;
509+ }
510+ _ => unreachable ! ( ) ,
511+ }
544512
545- items. push ( quote ! {
546- impl #name {
547- pub fn write<F >( & self , f: F )
548- where F : FnOnce ( & mut #name_w) -> & mut #name_w,
549- {
550- let mut w = #name_w:: reset_value( ) ;
551- f( & mut w) ;
552- self . register. write( w. bits) ;
513+ if r. fields . is_some ( ) {
514+ let name_r = Ident :: new ( format ! ( "{}R" , ty) ) ;
515+ let name_w = Ident :: new ( format ! ( "{}W" , ty) ) ;
516+ match access {
517+ Access :: ReadOnly => {
518+ items. push ( quote ! {
519+ impl #name {
520+ pub fn read( & self ) -> #name_r {
521+ #name_r { bits: self . register. read( ) }
522+ }
553523 }
554- }
555- } ) ;
524+ } ) ;
525+ }
526+ Access :: ReadWrite => {
527+ items. push ( quote ! {
528+ impl #name {
529+ pub fn modify<F >( & mut self , f: F )
530+ where for <' w> F : FnOnce ( & #name_r, & ' w mut #name_w) -> & ' w mut #name_w,
531+ {
532+ let bits = self . register. read( ) ;
533+ let r = #name_r { bits: bits } ;
534+ let mut w = #name_w { bits: bits } ;
535+ f( & r, & mut w) ;
536+ self . register. write( w. bits) ;
537+ }
538+
539+ pub fn read( & self ) -> #name_r {
540+ #name_r { bits: self . register. read( ) }
541+ }
542+
543+ pub fn write<F >( & mut self , f: F )
544+ where F : FnOnce ( & mut #name_w) -> & mut #name_w,
545+ {
546+ let mut w = #name_w:: reset_value( ) ;
547+ f( & mut w) ;
548+ self . register. write( w. bits) ;
549+ }
550+ }
551+ } ) ;
552+ }
553+
554+ Access :: WriteOnly => {
555+ items. push ( quote ! {
556+ impl #name {
557+ pub fn write<F >( & self , f: F )
558+ where F : FnOnce ( & mut #name_w) -> & mut #name_w,
559+ {
560+ let mut w = #name_w:: reset_value( ) ;
561+ f( & mut w) ;
562+ self . register. write( w. bits) ;
563+ }
564+ }
565+ } ) ;
566+ }
567+
568+ _ => unreachable ! ( ) ,
556569 }
570+ } else {
571+ match access {
572+ Access :: ReadOnly => {
573+ items. push ( quote ! {
574+ impl #name {
575+ pub fn read( & self ) -> #bits_ty {
576+ self . register. read( )
577+ }
578+ }
579+ } ) ;
580+ }
581+ Access :: ReadWrite => {
582+ items. push ( quote ! {
583+ impl #name {
584+ pub fn read( & self ) -> #bits_ty {
585+ self . register. read( )
586+ }
587+
588+ pub fn write( & mut self , value: #bits_ty) {
589+ self . register. write( value) ;
590+ }
591+ }
592+ } ) ;
593+ }
557594
558- _ => unreachable ! ( ) ,
595+ Access :: WriteOnly => {
596+ items. push ( quote ! {
597+ impl #name {
598+ pub fn write( & mut self , value: #bits_ty) {
599+ self . register. write( value) ;
600+ }
601+ }
602+ } ) ;
603+ }
604+
605+ _ => unreachable ! ( ) ,
606+ }
559607 }
560608
561609 items
562610}
563611
564612#[ doc( hidden) ]
565- pub fn gen_register_r ( r : & Register , d : & Defaults ) -> Vec < Tokens > {
613+ pub fn gen_register_r ( r : & Register ,
614+ d : & Defaults ,
615+ fields : & [ svd:: Field ] )
616+ -> Vec < Tokens > {
566617 let mut items = vec ! [ ] ;
567618
568619 let name = Ident :: new ( format ! ( "{}R" , type_of( r) ) ) ;
@@ -580,9 +631,7 @@ pub fn gen_register_r(r: &Register, d: &Defaults) -> Vec<Tokens> {
580631
581632 let mut impl_items = vec ! [ ] ;
582633
583- for field in r. fields
584- . as_ref ( )
585- . expect ( & format ! ( "{:#?} has no `fields` field" , r) ) {
634+ for field in fields {
586635 if let Some ( Access :: WriteOnly ) = field. access {
587636 continue ;
588637 }
@@ -643,7 +692,10 @@ pub fn gen_register_r(r: &Register, d: &Defaults) -> Vec<Tokens> {
643692}
644693
645694#[ doc( hidden) ]
646- pub fn gen_register_w ( r : & Register , d : & Defaults ) -> Vec < Tokens > {
695+ pub fn gen_register_w ( r : & Register ,
696+ d : & Defaults ,
697+ fields : & [ svd:: Field ] )
698+ -> Vec < Tokens > {
647699 let mut items = vec ! [ ] ;
648700
649701 let name = Ident :: new ( format ! ( "{}W" , type_of( r) ) ) ;
@@ -673,9 +725,7 @@ pub fn gen_register_w(r: &Register, d: &Defaults) -> Vec<Tokens> {
673725 } ) ;
674726 }
675727
676- for field in r. fields
677- . as_ref ( )
678- . expect ( & format ! ( "{:#?} has no `fields` field" , r) ) {
728+ for field in fields {
679729 if let Some ( Access :: ReadOnly ) = field. access {
680730 continue ;
681731 }
0 commit comments