@@ -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,97 @@ 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 ! (
676
- "Fields `{}` writer - {}" ,
685
+ let mut cgdoc = String :: new ( ) ;
686
+ let doc = if let Some ( ( _, _, _, _, suffixes_str) ) = & field_dim {
687
+ cgdoc = format ! (
688
+ "Fields `{}` const generic writer - {}" ,
677
689
util:: replace_suffix( & f. name, suffixes_str) ,
678
690
description
679
691
) ;
680
- offset_entry = quote ! { offset: usize , } ;
692
+ format ! (
693
+ "Fields `{}` writer - {}" ,
694
+ util:: replace_suffix( & f. name, suffixes_str) ,
695
+ description
696
+ )
681
697
} else {
682
- doc = format ! ( "Field `{}` writer - {}" , f. name, description) ;
683
- offset_entry = quote ! { } ;
684
- }
698
+ format ! ( "Field `{}` writer - {}" , f. name, description)
699
+ } ;
700
+
701
+ mod_items. extend ( if field_dim. is_some ( ) {
702
+ quote ! {
703
+ #[ doc = #doc]
704
+ pub struct #name_pc_w<' a> {
705
+ w: & ' a mut W ,
706
+ offset: usize ,
707
+ }
708
+
709
+ impl <' a> #name_pc_w<' a> {
710
+ #proxy_items
711
+ #proxy_items_fa
712
+ }
685
713
686
- mod_items. extend ( quote ! {
687
- #[ doc = #doc]
688
- pub struct #name_pc_w<' a> {
689
- w: & ' a mut W ,
690
- #offset_entry
714
+ #[ doc = #cgdoc]
715
+ pub struct #name_pc_cgw<' a, const O : usize > {
716
+ w: & ' a mut W ,
717
+ }
718
+
719
+ impl <' a, const O : usize > #name_pc_cgw<' a, O > {
720
+ #proxy_items
721
+ #proxy_items_cg
722
+ }
691
723
}
724
+ } else {
725
+ quote ! {
726
+ #[ doc = #doc]
727
+ pub struct #name_pc_w<' a> {
728
+ w: & ' a mut W ,
729
+ }
692
730
693
- impl <' a> #name_pc_w<' a> {
694
- #proxy_items
731
+ impl <' a> #name_pc_w<' a> {
732
+ #proxy_items
733
+ }
695
734
}
696
735
} ) ;
697
736
@@ -719,8 +758,8 @@ pub fn fields(
719
758
w_impl_items. extend ( quote ! {
720
759
#[ doc = #doc]
721
760
#inline
722
- pub fn #name_sc_n( & mut self ) -> #name_pc_w {
723
- #name_pc_w { w: self , offset : #sub_offset }
761
+ pub fn #name_sc_n( & mut self ) -> #name_pc_cgw<#sub_offset> {
762
+ #name_pc_cgw { w: self }
724
763
}
725
764
} ) ;
726
765
}
0 commit comments