@@ -222,13 +222,40 @@ pub fn render(p_original: &Peripheral, index: &Index, config: &Config) -> Result
222222 Ok ( out)
223223}
224224
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+
225252#[ derive( Clone , Debug ) ]
226253struct RegisterBlockField {
227254 syn_field : syn:: Field ,
228255 description : String ,
229256 offset : u32 ,
230257 size : u32 ,
231- accessors : Option < TokenStream > ,
258+ accessors : Vec < ArrayAccessor > ,
232259}
233260
234261#[ derive( Clone , Debug ) ]
@@ -471,9 +498,6 @@ fn register_or_cluster_block(
471498
472499 for reg_block_field in & ercs_expanded {
473500 regions. add ( reg_block_field) ?;
474- if let Some ( ts) = & reg_block_field. accessors {
475- accessors. extend ( ts. clone ( ) ) ;
476- }
477501 }
478502
479503 // 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(
524548 reg_block_field. syn_field . to_tokens ( & mut region_rbfs) ;
525549 Punct :: new ( ',' , Spacing :: Alone ) . to_tokens ( & mut region_rbfs) ;
526550 }
551+ accessors. extend (
552+ reg_block_field
553+ . accessors
554+ . iter ( )
555+ . map ( |a| a. to_tokens ( is_region_a_union) ) ,
556+ ) ;
527557 }
528558
529559 if !is_region_a_union {
@@ -692,7 +722,7 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
692722 description,
693723 offset : info. address_offset ,
694724 size : cluster_size,
695- accessors : None ,
725+ accessors : Vec :: new ( ) ,
696726 } )
697727 }
698728 Cluster :: Array ( info, array_info) => {
@@ -726,10 +756,10 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
726756
727757 if array_convertible {
728758 let accessors = if sequential_indexes_from0 {
729- None
759+ Vec :: new ( )
730760 } else {
731761 let span = Span :: call_site ( ) ;
732- let mut accessors = TokenStream :: new ( ) ;
762+ let mut accessors = Vec :: new ( ) ;
733763 let nb_name_cs = ty_name. to_snake_case_ident ( span) ;
734764 for ( i, idx) in array_info. indexes ( ) . enumerate ( ) {
735765 let idx_name =
@@ -740,15 +770,15 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
740770 & description,
741771 ) ;
742772 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 ,
749779 } ) ;
750780 }
751- Some ( accessors)
781+ accessors
752782 } ;
753783 let array_ty = new_syn_array ( ty, array_info. dim ) ;
754784 cluster_expanded. push ( RegisterBlockField {
@@ -772,7 +802,7 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
772802 description : info. description . as_ref ( ) . unwrap_or ( & info. name ) . into ( ) ,
773803 offset : info. address_offset ,
774804 size : 0 ,
775- accessors : None ,
805+ accessors : Vec :: new ( ) ,
776806 } ) ;
777807 } else {
778808 for ( field_num, idx) in array_info. indexes ( ) . enumerate ( ) {
@@ -785,7 +815,7 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
785815 description : description. clone ( ) ,
786816 offset : info. address_offset + field_num as u32 * array_info. dim_increment ,
787817 size : cluster_size,
788- accessors : None ,
818+ accessors : Vec :: new ( ) ,
789819 } ) ;
790820 }
791821 }
@@ -822,7 +852,7 @@ fn expand_register(register: &Register, config: &Config) -> Result<Vec<RegisterB
822852 description,
823853 offset : info. address_offset ,
824854 size : register_size,
825- accessors : None ,
855+ accessors : Vec :: new ( ) ,
826856 } )
827857 }
828858 Register :: Array ( info, array_info) => {
@@ -847,10 +877,10 @@ fn expand_register(register: &Register, config: &Config) -> Result<Vec<RegisterB
847877 . is_some ( ) ;
848878
849879 let accessors = if sequential_indexes_from0 {
850- None
880+ Vec :: new ( )
851881 } else {
852882 let span = Span :: call_site ( ) ;
853- let mut accessors = TokenStream :: new ( ) ;
883+ let mut accessors = Vec :: new ( ) ;
854884 let nb_name_cs = ty_name. to_snake_case_ident ( span) ;
855885 for ( i, idx) in array_info. indexes ( ) . enumerate ( ) {
856886 let idx_name =
@@ -861,15 +891,15 @@ fn expand_register(register: &Register, config: &Config) -> Result<Vec<RegisterB
861891 & description,
862892 ) ;
863893 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 ,
870900 } ) ;
871901 }
872- Some ( accessors)
902+ accessors
873903 } ;
874904 let array_ty = new_syn_array ( ty, array_info. dim ) ;
875905 let syn_field =
@@ -892,7 +922,7 @@ fn expand_register(register: &Register, config: &Config) -> Result<Vec<RegisterB
892922 description : description. clone ( ) ,
893923 offset : info. address_offset + field_num as u32 * array_info. dim_increment ,
894924 size : register_size,
895- accessors : None ,
925+ accessors : Vec :: new ( ) ,
896926 } ) ;
897927 }
898928 }
0 commit comments