@@ -2,9 +2,7 @@ use std::borrow::Cow;
22use std:: cmp:: Ordering ;
33use svd_parser:: expand:: { derive_cluster, derive_peripheral, derive_register, BlockPath , Index } ;
44
5- use crate :: svd:: {
6- array:: names, Cluster , ClusterInfo , DimElement , Peripheral , Register , RegisterCluster ,
7- } ;
5+ use crate :: svd:: { array:: names, Cluster , ClusterInfo , Peripheral , Register , RegisterCluster } ;
86use log:: { debug, trace, warn} ;
97use proc_macro2:: { Ident , Punct , Spacing , Span , TokenStream } ;
108use quote:: { quote, ToTokens } ;
@@ -533,13 +531,11 @@ fn register_or_cluster_block(
533531 last_end = region. end ;
534532 }
535533
536- let name = Ident :: new (
537- & match name {
538- Some ( name) => name. to_sanitized_constant_case ( ) ,
539- None => "RegisterBlock" . into ( ) ,
540- } ,
541- span,
542- ) ;
534+ let name = if let Some ( name) = name {
535+ name. to_constant_case_ident ( span)
536+ } else {
537+ Ident :: new ( "RegisterBlock" , span)
538+ } ;
543539
544540 let accessors = if !accessors. is_empty ( ) {
545541 quote ! {
@@ -654,14 +650,24 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
654650 . unwrap_or ( & cluster. name )
655651 . to_string ( ) ;
656652
653+ let ty_name = if cluster. is_single ( ) {
654+ cluster. name . to_string ( )
655+ } else {
656+ util:: replace_suffix ( & cluster. name , "" )
657+ } ;
658+ let ty = syn:: Type :: Path ( name_to_ty ( & ty_name) ) ;
659+
657660 match cluster {
658- Cluster :: Single ( info) => cluster_expanded. push ( RegisterBlockField {
659- syn_field : cluster_to_syn_field ( cluster) ?,
660- description,
661- offset : info. address_offset ,
662- size : cluster_size,
663- accessors : None ,
664- } ) ,
661+ Cluster :: Single ( info) => {
662+ let syn_field = new_syn_field ( info. name . to_snake_case_ident ( Span :: call_site ( ) ) , ty) ;
663+ cluster_expanded. push ( RegisterBlockField {
664+ syn_field,
665+ description,
666+ offset : info. address_offset ,
667+ size : cluster_size,
668+ accessors : None ,
669+ } )
670+ }
665671 Cluster :: Array ( info, array_info) => {
666672 let sequential_addresses =
667673 ( array_info. dim == 1 ) || ( cluster_size == array_info. dim_increment * BITS_PER_BYTE ) ;
@@ -688,9 +694,7 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
688694 } else {
689695 let span = Span :: call_site ( ) ;
690696 let mut accessors = TokenStream :: new ( ) ;
691- let nb_name = util:: replace_suffix ( & info. name , "" ) ;
692- let ty = name_to_ty ( & nb_name) ;
693- let nb_name_cs = nb_name. to_snake_case_ident ( span) ;
697+ let nb_name_cs = ty_name. to_snake_case_ident ( span) ;
694698 for ( i, idx) in array_info. indexes ( ) . enumerate ( ) {
695699 let idx_name =
696700 util:: replace_suffix ( & info. name , & idx) . to_snake_case_ident ( span) ;
@@ -710,8 +714,12 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
710714 }
711715 Some ( accessors)
712716 } ;
717+ let array_ty = new_syn_array ( ty, array_info. dim ) ;
713718 cluster_expanded. push ( RegisterBlockField {
714- syn_field : cluster_to_syn_field ( cluster) ?,
719+ syn_field : new_syn_field (
720+ ty_name. to_snake_case_ident ( Span :: call_site ( ) ) ,
721+ array_ty,
722+ ) ,
715723 description,
716724 offset : info. address_offset ,
717725 size : cluster_size * array_info. dim ,
@@ -720,11 +728,17 @@ fn expand_cluster(cluster: &Cluster, config: &Config) -> Result<Vec<RegisterBloc
720728 } else if sequential_indexes_from0 && config. const_generic {
721729 // Include a ZST ArrayProxy giving indexed access to the
722730 // elements.
723- cluster_expanded. push ( array_proxy ( info, array_info) ) ;
731+ let ap_path = array_proxy_type ( ty, array_info) ;
732+ let syn_field =
733+ new_syn_field ( ty_name. to_snake_case_ident ( Span :: call_site ( ) ) , ap_path) ;
734+ cluster_expanded. push ( RegisterBlockField {
735+ syn_field,
736+ description : info. description . as_ref ( ) . unwrap_or ( & info. name ) . into ( ) ,
737+ offset : info. address_offset ,
738+ size : 0 ,
739+ accessors : None ,
740+ } ) ;
724741 } else {
725- let ty_name = util:: replace_suffix ( & info. name , "" ) ;
726- let ty = syn:: Type :: Path ( name_to_ty ( & ty_name) ) ;
727-
728742 for ( field_num, idx) in array_info. indexes ( ) . enumerate ( ) {
729743 let nb_name = util:: replace_suffix ( & info. name , & idx) ;
730744 let syn_field =
@@ -756,15 +770,25 @@ fn expand_register(register: &Register, config: &Config) -> Result<Vec<RegisterB
756770 . ok_or_else ( || anyhow ! ( "Register {} has no `size` field" , register. name) ) ?;
757771 let description = register. description . clone ( ) . unwrap_or_default ( ) ;
758772
773+ let info_name = register. fullname ( config. ignore_groups ) ;
774+ let ty_name = if register. is_single ( ) {
775+ info_name. to_string ( )
776+ } else {
777+ util:: replace_suffix ( & info_name, "" )
778+ } ;
779+ let ty = name_to_wrapped_ty ( & ty_name) ;
780+
759781 match register {
760- Register :: Single ( info) => register_expanded. push ( RegisterBlockField {
761- syn_field : register_to_syn_field ( register, config. ignore_groups )
762- . with_context ( || "syn error occured" ) ?,
763- description,
764- offset : info. address_offset ,
765- size : register_size,
766- accessors : None ,
767- } ) ,
782+ Register :: Single ( info) => {
783+ let syn_field = new_syn_field ( ty_name. to_snake_case_ident ( Span :: call_site ( ) ) , ty) ;
784+ register_expanded. push ( RegisterBlockField {
785+ syn_field,
786+ description,
787+ offset : info. address_offset ,
788+ size : register_size,
789+ accessors : None ,
790+ } )
791+ }
768792 Register :: Array ( info, array_info) => {
769793 let sequential_addresses = ( array_info. dim == 1 )
770794 || ( register_size == array_info. dim_increment * BITS_PER_BYTE ) ;
@@ -791,10 +815,7 @@ fn expand_register(register: &Register, config: &Config) -> Result<Vec<RegisterB
791815 } else {
792816 let span = Span :: call_site ( ) ;
793817 let mut accessors = TokenStream :: new ( ) ;
794- let nb_name = util:: replace_suffix ( & info. fullname ( config. ignore_groups ) , "" ) ;
795- let ty = name_to_wrapped_ty ( & nb_name) ;
796- let nb_name_cs = nb_name. to_snake_case_ident ( span) ;
797- let info_name = info. fullname ( config. ignore_groups ) ;
818+ let nb_name_cs = ty_name. to_snake_case_ident ( span) ;
798819 for ( i, idx) in array_info. indexes ( ) . enumerate ( ) {
799820 let idx_name =
800821 util:: replace_suffix ( & info_name, & idx) . to_snake_case_ident ( span) ;
@@ -814,18 +835,17 @@ fn expand_register(register: &Register, config: &Config) -> Result<Vec<RegisterB
814835 }
815836 Some ( accessors)
816837 } ;
838+ let array_ty = new_syn_array ( ty, array_info. dim ) ;
839+ let syn_field =
840+ new_syn_field ( ty_name. to_snake_case_ident ( Span :: call_site ( ) ) , array_ty) ;
817841 register_expanded. push ( RegisterBlockField {
818- syn_field : register_to_syn_field ( register , config . ignore_groups ) ? ,
842+ syn_field,
819843 description,
820844 offset : info. address_offset ,
821845 size : register_size * array_info. dim ,
822846 accessors,
823847 } ) ;
824848 } else {
825- let info_name = info. fullname ( config. ignore_groups ) ;
826- let ty_name = util:: replace_suffix ( & info_name, "" ) ;
827- let ty = name_to_wrapped_ty ( & ty_name) ;
828-
829849 for ( field_num, idx) in array_info. indexes ( ) . enumerate ( ) {
830850 let nb_name = util:: replace_suffix ( & info_name, & idx) ;
831851 let syn_field =
@@ -959,58 +979,6 @@ fn cluster_block(
959979 } )
960980}
961981
962- /// Convert a parsed `Register` into its `Field` equivalent
963- fn register_to_syn_field ( register : & Register , ignore_group : bool ) -> Result < syn:: Field > {
964- Ok ( match register {
965- Register :: Single ( info) => {
966- let info_name = info. fullname ( ignore_group) ;
967- let ty = name_to_wrapped_ty ( & info_name) ;
968- new_syn_field ( info_name. to_snake_case_ident ( Span :: call_site ( ) ) , ty)
969- }
970- Register :: Array ( info, array_info) => {
971- let info_name = info. fullname ( ignore_group) ;
972- let nb_name = util:: replace_suffix ( & info_name, "" ) ;
973- let ty = name_to_wrapped_ty ( & nb_name) ;
974- let array_ty = new_syn_array ( ty, array_info. dim ) ;
975-
976- new_syn_field ( nb_name. to_snake_case_ident ( Span :: call_site ( ) ) , array_ty)
977- }
978- } )
979- }
980-
981- /// Return an syn::Type for an ArrayProxy.
982- fn array_proxy ( info : & ClusterInfo , array_info : & DimElement ) -> RegisterBlockField {
983- let ty_name = util:: replace_suffix ( & info. name , "" ) ;
984- let ty = name_to_ty ( & ty_name) ;
985-
986- let ap_path = array_proxy_type ( ty, array_info) ;
987-
988- RegisterBlockField {
989- syn_field : new_syn_field ( ty_name. to_snake_case_ident ( Span :: call_site ( ) ) , ap_path) ,
990- description : info. description . as_ref ( ) . unwrap_or ( & info. name ) . into ( ) ,
991- offset : info. address_offset ,
992- size : 0 ,
993- accessors : None ,
994- }
995- }
996-
997- /// Convert a parsed `Cluster` into its `Field` equivalent
998- fn cluster_to_syn_field ( cluster : & Cluster ) -> Result < syn:: Field , syn:: Error > {
999- Ok ( match cluster {
1000- Cluster :: Single ( info) => {
1001- let ty = syn:: Type :: Path ( name_to_ty ( & info. name ) ) ;
1002- new_syn_field ( info. name . to_snake_case_ident ( Span :: call_site ( ) ) , ty)
1003- }
1004- Cluster :: Array ( info, array_info) => {
1005- let ty_name = util:: replace_suffix ( & info. name , "" ) ;
1006- let ty = syn:: Type :: Path ( name_to_ty ( & ty_name) ) ;
1007- let array_ty = new_syn_array ( ty, array_info. dim ) ;
1008-
1009- new_syn_field ( ty_name. to_snake_case_ident ( Span :: call_site ( ) ) , array_ty)
1010- }
1011- } )
1012- }
1013-
1014982fn new_syn_field ( ident : Ident , ty : syn:: Type ) -> syn:: Field {
1015983 let span = Span :: call_site ( ) ;
1016984 syn:: Field {
0 commit comments