@@ -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 {
@@ -670,7 +700,7 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
670
700
let mut cluster_expanded = vec ! [ ] ;
671
701
672
702
let cluster_size = cluster_info_size_in_bits ( cluster, config)
673
- . with_context ( || format ! ( "Cluster {} has no determinable ` size` field " , cluster. name) ) ?;
703
+ . with_context ( || format ! ( "Can't calculate cluster {} size" , cluster. name) ) ?;
674
704
let description = cluster
675
705
. description
676
706
. as_ref ( )
@@ -692,12 +722,21 @@ 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) => {
699
- let sequential_addresses =
700
- ( array_info. dim == 1 ) || ( cluster_size == array_info. dim_increment * BITS_PER_BYTE ) ;
729
+ let increment_bits = array_info. dim_increment * BITS_PER_BYTE ;
730
+ if cluster_size > increment_bits {
731
+ let cname = & cluster. name ;
732
+ return Err ( anyhow ! ( "Cluster {cname} has size {cluster_size} bits that is more then array increment {increment_bits} bits" ) ) ;
733
+ }
734
+ let cluster_size = if config. max_cluster_size {
735
+ increment_bits
736
+ } else {
737
+ cluster_size
738
+ } ;
739
+ let sequential_addresses = ( array_info. dim == 1 ) || ( cluster_size == increment_bits) ;
701
740
702
741
// if dimIndex exists, test if it is a sequence of numbers from 0 to dim
703
742
let sequential_indexes_from0 = array_info
@@ -717,10 +756,10 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
717
756
718
757
if array_convertible {
719
758
let accessors = if sequential_indexes_from0 {
720
- None
759
+ Vec :: new ( )
721
760
} else {
722
761
let span = Span :: call_site ( ) ;
723
- let mut accessors = TokenStream :: new ( ) ;
762
+ let mut accessors = Vec :: new ( ) ;
724
763
let nb_name_cs = ty_name. to_snake_case_ident ( span) ;
725
764
for ( i, idx) in array_info. indexes ( ) . enumerate ( ) {
726
765
let idx_name =
@@ -731,15 +770,15 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
731
770
& description,
732
771
) ;
733
772
let i = unsuffixed ( i as _ ) ;
734
- accessors. extend ( quote ! {
735
- # [ doc = # comment]
736
- # [ inline ( always ) ]
737
- pub fn #idx_name ( & self ) -> & #ty {
738
- & self . # nb_name_cs[ #i ]
739
- }
773
+ accessors. push ( ArrayAccessor {
774
+ doc : comment,
775
+ name : idx_name ,
776
+ ty : ty . clone ( ) ,
777
+ basename : nb_name_cs. clone ( ) ,
778
+ i ,
740
779
} ) ;
741
780
}
742
- Some ( accessors)
781
+ accessors
743
782
} ;
744
783
let array_ty = new_syn_array ( ty, array_info. dim ) ;
745
784
cluster_expanded. push ( RegisterBlockField {
@@ -763,7 +802,7 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
763
802
description : info. description . as_ref ( ) . unwrap_or ( & info. name ) . into ( ) ,
764
803
offset : info. address_offset ,
765
804
size : 0 ,
766
- accessors : None ,
805
+ accessors : Vec :: new ( ) ,
767
806
} ) ;
768
807
} else {
769
808
for ( field_num, idx) in array_info. indexes ( ) . enumerate ( ) {
@@ -776,7 +815,7 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
776
815
description : description. clone ( ) ,
777
816
offset : info. address_offset + field_num as u32 * array_info. dim_increment ,
778
817
size : cluster_size,
779
- accessors : None ,
818
+ accessors : Vec :: new ( ) ,
780
819
} ) ;
781
820
}
782
821
}
@@ -813,7 +852,7 @@ fn expand_register(register: &Register, config: &Config) -> Result<Vec<RegisterB
813
852
description,
814
853
offset : info. address_offset ,
815
854
size : register_size,
816
- accessors : None ,
855
+ accessors : Vec :: new ( ) ,
817
856
} )
818
857
}
819
858
Register :: Array ( info, array_info) => {
@@ -838,10 +877,10 @@ fn expand_register(register: &Register, config: &Config) -> Result<Vec<RegisterB
838
877
. is_some ( ) ;
839
878
840
879
let accessors = if sequential_indexes_from0 {
841
- None
880
+ Vec :: new ( )
842
881
} else {
843
882
let span = Span :: call_site ( ) ;
844
- let mut accessors = TokenStream :: new ( ) ;
883
+ let mut accessors = Vec :: new ( ) ;
845
884
let nb_name_cs = ty_name. to_snake_case_ident ( span) ;
846
885
for ( i, idx) in array_info. indexes ( ) . enumerate ( ) {
847
886
let idx_name =
@@ -852,15 +891,15 @@ fn expand_register(register: &Register, config: &Config) -> Result<Vec<RegisterB
852
891
& description,
853
892
) ;
854
893
let i = unsuffixed ( i as _ ) ;
855
- accessors. extend ( quote ! {
856
- # [ doc = # comment]
857
- # [ inline ( always ) ]
858
- pub fn #idx_name ( & self ) -> & #ty {
859
- & self . # nb_name_cs[ #i ]
860
- }
894
+ accessors. push ( ArrayAccessor {
895
+ doc : comment,
896
+ name : idx_name ,
897
+ ty : ty . clone ( ) ,
898
+ basename : nb_name_cs. clone ( ) ,
899
+ i ,
861
900
} ) ;
862
901
}
863
- Some ( accessors)
902
+ accessors
864
903
} ;
865
904
let array_ty = new_syn_array ( ty, array_info. dim ) ;
866
905
let syn_field =
@@ -883,7 +922,7 @@ fn expand_register(register: &Register, config: &Config) -> Result<Vec<RegisterB
883
922
description : description. clone ( ) ,
884
923
offset : info. address_offset + field_num as u32 * array_info. dim_increment ,
885
924
size : register_size,
886
- accessors : None ,
925
+ accessors : Vec :: new ( ) ,
887
926
} ) ;
888
927
}
889
928
}
0 commit comments