@@ -222,13 +222,40 @@ pub fn render(p_original: &Peripheral, index: &Index, config: &Config) -> Result
222
222
Ok ( out)
223
223
}
224
224
225
+ #[ derive( Clone , Debug ) ]
226
+ pub struct ArrayAccessor {
227
+ pub doc : String ,
228
+ pub name : Ident ,
229
+ pub ty : syn:: Type ,
230
+ pub basename : Ident ,
231
+ pub i : syn:: LitInt ,
232
+ }
233
+
234
+ impl ArrayAccessor {
235
+ pub fn to_tokens ( & self , method : bool ) -> TokenStream {
236
+ let parens = method. then ( || quote ! { ( ) } ) ;
237
+ let doc = & self . doc ;
238
+ let name = & self . name ;
239
+ let ty = & self . ty ;
240
+ let basename = & self . basename ;
241
+ let i = & self . i ;
242
+ quote ! {
243
+ #[ doc = #doc]
244
+ #[ inline( always) ]
245
+ pub fn #name( & self ) -> & #ty {
246
+ & self . #basename#parens[ #i]
247
+ }
248
+ }
249
+ }
250
+ }
251
+
225
252
#[ derive( Clone , Debug ) ]
226
253
struct RegisterBlockField {
227
254
syn_field : syn:: Field ,
228
255
description : String ,
229
256
offset : u32 ,
230
257
size : u32 ,
231
- accessors : Option < TokenStream > ,
258
+ accessors : Vec < ArrayAccessor > ,
232
259
}
233
260
234
261
#[ derive( Clone , Debug ) ]
@@ -471,9 +498,6 @@ fn register_or_cluster_block(
471
498
472
499
for reg_block_field in & ercs_expanded {
473
500
regions. add ( reg_block_field) ?;
474
- if let Some ( ts) = & reg_block_field. accessors {
475
- accessors. extend ( ts. clone ( ) ) ;
476
- }
477
501
}
478
502
479
503
// We need to compute the idents of each register/union block first to make sure no conflicts exists.
@@ -524,6 +548,12 @@ fn register_or_cluster_block(
524
548
reg_block_field. syn_field . to_tokens ( & mut region_rbfs) ;
525
549
Punct :: new ( ',' , Spacing :: Alone ) . to_tokens ( & mut region_rbfs) ;
526
550
}
551
+ accessors. extend (
552
+ reg_block_field
553
+ . accessors
554
+ . iter ( )
555
+ . map ( |a| a. to_tokens ( is_region_a_union) ) ,
556
+ ) ;
527
557
}
528
558
529
559
if !is_region_a_union {
@@ -692,7 +722,7 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
692
722
description,
693
723
offset : info. address_offset ,
694
724
size : cluster_size,
695
- accessors : None ,
725
+ accessors : Vec :: new ( ) ,
696
726
} )
697
727
}
698
728
Cluster :: Array ( info, array_info) => {
@@ -726,10 +756,10 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
726
756
727
757
if array_convertible {
728
758
let accessors = if sequential_indexes_from0 {
729
- None
759
+ Vec :: new ( )
730
760
} else {
731
761
let span = Span :: call_site ( ) ;
732
- let mut accessors = TokenStream :: new ( ) ;
762
+ let mut accessors = Vec :: new ( ) ;
733
763
let nb_name_cs = ty_name. to_snake_case_ident ( span) ;
734
764
for ( i, idx) in array_info. indexes ( ) . enumerate ( ) {
735
765
let idx_name =
@@ -740,15 +770,15 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
740
770
& description,
741
771
) ;
742
772
let i = unsuffixed ( i as _ ) ;
743
- accessors. extend ( quote ! {
744
- # [ doc = # comment]
745
- # [ inline ( always ) ]
746
- pub fn #idx_name ( & self ) -> & #ty {
747
- & self . # nb_name_cs[ #i ]
748
- }
773
+ accessors. push ( ArrayAccessor {
774
+ doc : comment,
775
+ name : idx_name ,
776
+ ty : ty . clone ( ) ,
777
+ basename : nb_name_cs. clone ( ) ,
778
+ i ,
749
779
} ) ;
750
780
}
751
- Some ( accessors)
781
+ accessors
752
782
} ;
753
783
let array_ty = new_syn_array ( ty, array_info. dim ) ;
754
784
cluster_expanded. push ( RegisterBlockField {
@@ -772,7 +802,7 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
772
802
description : info. description . as_ref ( ) . unwrap_or ( & info. name ) . into ( ) ,
773
803
offset : info. address_offset ,
774
804
size : 0 ,
775
- accessors : None ,
805
+ accessors : Vec :: new ( ) ,
776
806
} ) ;
777
807
} else {
778
808
for ( field_num, idx) in array_info. indexes ( ) . enumerate ( ) {
@@ -785,7 +815,7 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
785
815
description : description. clone ( ) ,
786
816
offset : info. address_offset + field_num as u32 * array_info. dim_increment ,
787
817
size : cluster_size,
788
- accessors : None ,
818
+ accessors : Vec :: new ( ) ,
789
819
} ) ;
790
820
}
791
821
}
@@ -822,7 +852,7 @@ fn expand_register(register: &Register, config: &Config) -> Result<Vec<RegisterB
822
852
description,
823
853
offset : info. address_offset ,
824
854
size : register_size,
825
- accessors : None ,
855
+ accessors : Vec :: new ( ) ,
826
856
} )
827
857
}
828
858
Register :: Array ( info, array_info) => {
@@ -847,10 +877,10 @@ fn expand_register(register: &Register, config: &Config) -> Result<Vec<RegisterB
847
877
. is_some ( ) ;
848
878
849
879
let accessors = if sequential_indexes_from0 {
850
- None
880
+ Vec :: new ( )
851
881
} else {
852
882
let span = Span :: call_site ( ) ;
853
- let mut accessors = TokenStream :: new ( ) ;
883
+ let mut accessors = Vec :: new ( ) ;
854
884
let nb_name_cs = ty_name. to_snake_case_ident ( span) ;
855
885
for ( i, idx) in array_info. indexes ( ) . enumerate ( ) {
856
886
let idx_name =
@@ -861,15 +891,15 @@ fn expand_register(register: &Register, config: &Config) -> Result<Vec<RegisterB
861
891
& description,
862
892
) ;
863
893
let i = unsuffixed ( i as _ ) ;
864
- accessors. extend ( quote ! {
865
- # [ doc = # comment]
866
- # [ inline ( always ) ]
867
- pub fn #idx_name ( & self ) -> & #ty {
868
- & self . # nb_name_cs[ #i ]
869
- }
894
+ accessors. push ( ArrayAccessor {
895
+ doc : comment,
896
+ name : idx_name ,
897
+ ty : ty . clone ( ) ,
898
+ basename : nb_name_cs. clone ( ) ,
899
+ i ,
870
900
} ) ;
871
901
}
872
- Some ( accessors)
902
+ accessors
873
903
} ;
874
904
let array_ty = new_syn_array ( ty, array_info. dim ) ;
875
905
let syn_field =
@@ -892,7 +922,7 @@ fn expand_register(register: &Register, config: &Config) -> Result<Vec<RegisterB
892
922
description : description. clone ( ) ,
893
923
offset : info. address_offset + field_num as u32 * array_info. dim_increment ,
894
924
size : register_size,
895
- accessors : None ,
925
+ accessors : Vec :: new ( ) ,
896
926
} ) ;
897
927
}
898
928
}
0 commit comments