@@ -563,6 +563,7 @@ pub fn fields(
563
563
if can_write {
564
564
let new_pc_aw = Ident :: new ( & ( name_pc. clone ( ) + "_AW" ) , span) ;
565
565
let name_pc_w = Ident :: new ( & ( name_pc. clone ( ) + "_W" ) , span) ;
566
+ let name_pc_cgw = Ident :: new ( & ( name_pc. clone ( ) + "_CGW" ) , span) ;
566
567
567
568
let mut proxy_items = TokenStream :: new ( ) ;
568
569
let mut unsafety = unsafety ( f. write_constraint . as_ref ( ) , width) ;
@@ -639,59 +640,91 @@ pub fn fields(
639
640
} ) ;
640
641
}
641
642
642
- proxy_items. extend ( if field_dim. is_some ( ) {
643
- quote ! {
643
+ let mut proxy_items_fa = TokenStream :: new ( ) ;
644
+ let mut proxy_items_cg = TokenStream :: new ( ) ;
645
+ if field_dim. is_some ( ) {
646
+ proxy_items_fa. extend ( quote ! {
644
647
///Writes raw bits to the field
645
648
#inline
646
649
pub #unsafety fn #bits( self , value: #fty) -> & ' a mut W {
647
650
self . w. bits = ( self . w. bits & !( #hexmask << self . offset) ) | ( ( value as #rty & #hexmask) << self . offset) ;
648
651
self . w
649
652
}
650
- }
651
- } else if offset != 0 {
652
- let offset = & util:: unsuffixed ( offset) ;
653
- quote ! {
653
+ } ) ;
654
+ proxy_items_cg. extend ( quote ! {
654
655
///Writes raw bits to the field
655
656
#inline
656
657
pub #unsafety fn #bits( self , value: #fty) -> & ' a mut W {
657
- self . w. bits = ( self . w. bits & !( #hexmask << #offset ) ) | ( ( value as #rty & #hexmask) << #offset ) ;
658
+ self . w. bits = ( self . w. bits & !( #hexmask << O ) ) | ( ( value as #rty & #hexmask) << O ) ;
658
659
self . w
659
660
}
660
- }
661
+ } ) ;
661
662
} else {
662
- quote ! {
663
- ///Writes raw bits to the field
664
- #inline
665
- pub #unsafety fn #bits( self , value: #fty) -> & ' a mut W {
666
- self . w. bits = ( self . w. bits & !#hexmask) | ( value as #rty & #hexmask) ;
667
- self . w
663
+ proxy_items. extend ( if offset != 0 {
664
+ let offset = & util:: unsuffixed ( offset) ;
665
+ quote ! {
666
+ ///Writes raw bits to the field
667
+ #inline
668
+ pub #unsafety fn #bits( self , value: #fty) -> & ' a mut W {
669
+ self . w. bits = ( self . w. bits & !( #hexmask << #offset) ) | ( ( value as #rty & #hexmask) << #offset) ;
670
+ self . w
671
+ }
668
672
}
669
- }
670
- } ) ;
673
+ } else {
674
+ quote ! {
675
+ ///Writes raw bits to the field
676
+ #inline
677
+ pub #unsafety fn #bits( self , value: #fty) -> & ' a mut W {
678
+ self . w. bits = ( self . w. bits & !#hexmask) | ( value as #rty & #hexmask) ;
679
+ self . w
680
+ }
681
+ }
682
+ } ) ;
683
+ }
671
684
672
- let doc;
673
- let offset_entry;
674
- if let Some ( ( _, _, _, _, suffixes_str) ) = & field_dim {
675
- doc = format ! (
685
+ let doc = if let Some ( ( _, _, _, _, suffixes_str) ) = & field_dim {
686
+ format ! (
676
687
"Fields `{}` writer - {}" ,
677
688
util:: replace_suffix( & f. name, suffixes_str) ,
678
689
description
679
- ) ;
680
- offset_entry = quote ! { offset: usize , } ;
690
+ )
681
691
} else {
682
- doc = format ! ( "Field `{}` writer - {}" , f. name, description) ;
683
- offset_entry = quote ! { } ;
684
- }
692
+ format ! ( "Field `{}` writer - {}" , f. name, description)
693
+ } ;
694
+
695
+ mod_items. extend ( if field_dim. is_some ( ) {
696
+ quote ! {
697
+ #[ doc = #doc]
698
+ pub struct #name_pc_w<' a> {
699
+ w: & ' a mut W ,
700
+ offset: usize ,
701
+ }
702
+
703
+ impl <' a> #name_pc_w<' a> {
704
+ #proxy_items
705
+ #proxy_items_fa
706
+ }
685
707
686
- mod_items. extend ( quote ! {
687
- #[ doc = #doc]
688
- pub struct #name_pc_w<' a> {
689
- w: & ' a mut W ,
690
- #offset_entry
708
+ #[ doc = #doc]
709
+ pub struct #name_pc_cgw<' a, const O : usize > {
710
+ w: & ' a mut W ,
711
+ }
712
+
713
+ impl <' a, const O : usize > #name_pc_cgw<' a, O > {
714
+ #proxy_items
715
+ #proxy_items_cg
716
+ }
691
717
}
718
+ } else {
719
+ quote ! {
720
+ #[ doc = #doc]
721
+ pub struct #name_pc_w<' a> {
722
+ w: & ' a mut W ,
723
+ }
692
724
693
- impl <' a> #name_pc_w<' a> {
694
- #proxy_items
725
+ impl <' a> #name_pc_w<' a> {
726
+ #proxy_items
727
+ }
695
728
}
696
729
} ) ;
697
730
@@ -719,8 +752,8 @@ pub fn fields(
719
752
w_impl_items. extend ( quote ! {
720
753
#[ doc = #doc]
721
754
#inline
722
- pub fn #name_sc_n( & mut self ) -> #name_pc_w {
723
- #name_pc_w { w: self , offset : #sub_offset }
755
+ pub fn #name_sc_n( & mut self ) -> #name_pc_cgw<#sub_offset> {
756
+ #name_pc_cgw { w: self }
724
757
}
725
758
} ) ;
726
759
}
0 commit comments