@@ -2,12 +2,12 @@ use std::borrow::Cow;
2
2
use std:: cmp:: Ordering ;
3
3
use std:: collections:: HashMap ;
4
4
5
- use quote:: ToTokens ;
5
+ use crate :: svd:: { Cluster , ClusterInfo , Peripheral , Register , RegisterCluster , RegisterProperties } ;
6
+ use log:: warn;
6
7
use proc_macro2:: TokenStream ;
7
- use crate :: svd:: { Cluster , ClusterInfo , RegisterProperties , Peripheral , Register , RegisterCluster } ;
8
+ use proc_macro2:: { Ident , Punct , Spacing , Span } ;
9
+ use quote:: ToTokens ;
8
10
use svd_parser:: derive_from:: DeriveFrom ;
9
- use proc_macro2:: { Ident , Span , Punct , Spacing } ;
10
- use log:: warn;
11
11
use syn:: { parse_str, Token } ;
12
12
13
13
use crate :: errors:: * ;
@@ -23,16 +23,20 @@ pub fn render(
23
23
) -> Result < TokenStream > {
24
24
let mut out = TokenStream :: new ( ) ;
25
25
26
- let p_derivedfrom = p_original. derived_from . as_ref ( ) . and_then ( |s| {
27
- all_peripherals. iter ( ) . find ( |x| x. name == * s)
28
- } ) ;
26
+ let p_derivedfrom = p_original
27
+ . derived_from
28
+ . as_ref ( )
29
+ . and_then ( |s| all_peripherals. iter ( ) . find ( |x| x. name == * s) ) ;
29
30
30
31
let p_merged = p_derivedfrom. map ( |ancestor| p_original. derive_from ( ancestor) ) ;
31
32
let p = p_merged. as_ref ( ) . unwrap_or ( p_original) ;
32
33
33
34
if p_original. derived_from . is_some ( ) && p_derivedfrom. is_none ( ) {
34
- eprintln ! ( "Couldn't find derivedFrom original: {} for {}, skipping" ,
35
- p_original. derived_from. as_ref( ) . unwrap( ) , p_original. name) ;
35
+ eprintln ! (
36
+ "Couldn't find derivedFrom original: {} for {}, skipping" ,
37
+ p_original. derived_from. as_ref( ) . unwrap( ) ,
38
+ p_original. name
39
+ ) ;
36
40
return Ok ( out) ;
37
41
}
38
42
@@ -93,35 +97,37 @@ pub fn render(
93
97
// Build a map so that we can look up registers within this peripheral
94
98
let mut reg_map = HashMap :: new ( ) ;
95
99
for r in registers {
96
- reg_map. insert ( & r. name , r . clone ( ) ) ;
100
+ reg_map. insert ( & r. name , svd_parser :: svd :: register :: Register :: clone ( r ) ) ;
97
101
}
98
102
99
103
// Build up an alternate erc list by expanding any derived registers
100
- let mut alt_erc : Vec < RegisterCluster > = registers. iter ( ) . filter_map ( |r| {
101
- match r. derived_from {
104
+ let mut alt_erc: Vec < RegisterCluster > = registers
105
+ . iter ( )
106
+ . filter_map ( |r| match r. derived_from {
102
107
Some ( ref derived) => {
103
108
let ancestor = match reg_map. get ( derived) {
104
109
Some ( r) => r,
105
110
None => {
106
- eprintln ! ( "register {} derivedFrom missing register {}" , r. name, derived) ;
107
- return None
111
+ eprintln ! (
112
+ "register {} derivedFrom missing register {}" ,
113
+ r. name, derived
114
+ ) ;
115
+ return None ;
108
116
}
109
117
} ;
110
118
111
- let d = match * * ancestor {
112
- Register :: Array ( ref info, ref array_info) => {
113
- Some ( RegisterCluster :: Register ( Register :: Array ( r. derive_from ( info) , array_info. clone ( ) ) ) )
114
- }
115
- Register :: Single ( ref info) => {
116
- Some ( RegisterCluster :: Register ( Register :: Single ( r. derive_from ( info) ) ) )
117
- }
118
- } ;
119
-
120
- d
119
+ match * ancestor {
120
+ Register :: Array ( ref info, ref array_info) => Some ( RegisterCluster :: Register (
121
+ Register :: Array ( r. derive_from ( info) , array_info. clone ( ) ) ,
122
+ ) ) ,
123
+ Register :: Single ( ref info) => Some ( RegisterCluster :: Register (
124
+ Register :: Single ( r. derive_from ( info) ) ,
125
+ ) ) ,
126
+ }
121
127
}
122
128
None => Some ( RegisterCluster :: Register ( ( * r) . clone ( ) ) ) ,
123
- }
124
- } ) . collect ( ) ;
129
+ } )
130
+ . collect ( ) ;
125
131
126
132
// Now add the clusters to our alternate erc list
127
133
let clusters = util:: only_clusters ( ercs) ;
@@ -507,11 +513,16 @@ fn register_or_cluster_block(
507
513
// name, along with the region number, falling back to
508
514
// the offset and end in case we couldn't figure out a
509
515
// nice identifier.
510
- let name = Ident :: new ( & format ! (
511
- "_reserved_{}_{}" ,
512
- i,
513
- region. compute_ident( ) . unwrap_or_else( || format!( "{}_{}" , region. offset, region. end) )
514
- ) , span) ;
516
+ let name = Ident :: new (
517
+ & format ! (
518
+ "_reserved_{}_{}" ,
519
+ i,
520
+ region
521
+ . compute_ident( )
522
+ . unwrap_or_else( || format!( "{}_{}" , region. offset, region. end) )
523
+ ) ,
524
+ span,
525
+ ) ;
515
526
let pad = ( region. end - region. offset ) as usize ;
516
527
fields. extend ( quote ! {
517
528
#name: [ u8 ; #pad] ,
@@ -520,10 +531,13 @@ fn register_or_cluster_block(
520
531
last_end = region. end ;
521
532
}
522
533
523
- let name = Ident :: new ( & match name {
524
- Some ( name) => name. to_sanitized_upper_case ( ) ,
525
- None => "RegisterBlock" . into ( ) ,
526
- } , span) ;
534
+ let name = Ident :: new (
535
+ & match name {
536
+ Some ( name) => name. to_sanitized_upper_case ( ) ,
537
+ None => "RegisterBlock" . into ( ) ,
538
+ } ,
539
+ span,
540
+ ) ;
527
541
528
542
let accessors = if have_accessors {
529
543
quote ! {
@@ -819,10 +833,10 @@ fn expand_svd_register(register: &Register, name: Option<&str>) -> Vec<syn::Fiel
819
833
fn convert_svd_register ( register : & Register , name : Option < & str > ) -> syn:: Field {
820
834
let name_to_ty = |name : & String , ns : Option < & str > | -> String {
821
835
if let Some ( ns) = ns {
822
- String :: from ( "self::" )
823
- + & ns. to_sanitized_snake_case ( )
824
- + "::"
825
- + & name. to_sanitized_upper_case ( )
836
+ String :: from ( "self::" )
837
+ + & ns. to_sanitized_snake_case ( )
838
+ + "::"
839
+ + & name. to_sanitized_upper_case ( )
826
840
} else {
827
841
name. to_sanitized_upper_case ( ) . to_string ( )
828
842
}
@@ -831,7 +845,7 @@ fn convert_svd_register(register: &Register, name: Option<&str>) -> syn::Field {
831
845
match register {
832
846
Register :: Single ( info) => new_syn_field (
833
847
& info. name . to_sanitized_snake_case ( ) ,
834
- syn:: Type :: Path ( parse_str :: < syn:: TypePath > ( & name_to_ty ( & info. name , name) ) . unwrap ( ) )
848
+ syn:: Type :: Path ( parse_str :: < syn:: TypePath > ( & name_to_ty ( & info. name , name) ) . unwrap ( ) ) ,
835
849
) ,
836
850
Register :: Array ( info, array_info) => {
837
851
let has_brackets = info. name . contains ( "[%s]" ) ;
@@ -842,9 +856,14 @@ fn convert_svd_register(register: &Register, name: Option<&str>) -> syn::Field {
842
856
info. name . replace ( "%s" , "" )
843
857
} ;
844
858
845
- let ty = syn:: Type :: Array ( parse_str :: < syn:: TypeArray > (
846
- & format ! ( "[{};{}]" , name_to_ty( & nb_name, name) , u64 :: from( array_info. dim) )
847
- ) . unwrap ( ) ) ;
859
+ let ty = syn:: Type :: Array (
860
+ parse_str :: < syn:: TypeArray > ( & format ! (
861
+ "[{};{}]" ,
862
+ name_to_ty( & nb_name, name) ,
863
+ u64 :: from( array_info. dim)
864
+ ) )
865
+ . unwrap ( ) ,
866
+ ) ;
848
867
849
868
new_syn_field ( & nb_name. to_sanitized_snake_case ( ) , ty)
850
869
}
@@ -904,7 +923,9 @@ fn convert_svd_cluster(cluster: &Cluster) -> syn::Field {
904
923
match cluster {
905
924
Cluster :: Single ( info) => new_syn_field (
906
925
& info. name . to_sanitized_snake_case ( ) ,
907
- syn:: Type :: Path ( parse_str :: < syn:: TypePath > ( & info. name . to_sanitized_upper_case ( ) ) . unwrap ( ) )
926
+ syn:: Type :: Path (
927
+ parse_str :: < syn:: TypePath > ( & info. name . to_sanitized_upper_case ( ) ) . unwrap ( ) ,
928
+ ) ,
908
929
) ,
909
930
Cluster :: Array ( info, array_info) => {
910
931
let has_brackets = info. name . contains ( "[%s]" ) ;
@@ -915,9 +936,14 @@ fn convert_svd_cluster(cluster: &Cluster) -> syn::Field {
915
936
info. name . replace ( "%s" , "" )
916
937
} ;
917
938
918
- let ty = syn:: Type :: Array ( parse_str :: < syn:: TypeArray > (
919
- & format ! ( "[{};{}]" , & name. to_sanitized_upper_case( ) , u64 :: from( array_info. dim) )
920
- ) . unwrap ( ) ) ;
939
+ let ty = syn:: Type :: Array (
940
+ parse_str :: < syn:: TypeArray > ( & format ! (
941
+ "[{};{}]" ,
942
+ & name. to_sanitized_upper_case( ) ,
943
+ u64 :: from( array_info. dim)
944
+ ) )
945
+ . unwrap ( ) ,
946
+ ) ;
921
947
922
948
new_syn_field ( & name. to_sanitized_snake_case ( ) , ty)
923
949
}
@@ -928,7 +954,9 @@ fn new_syn_field(ident: &str, ty: syn::Type) -> syn::Field {
928
954
let span = Span :: call_site ( ) ;
929
955
syn:: Field {
930
956
ident : Some ( Ident :: new ( ident, span) ) ,
931
- vis : syn:: Visibility :: Public ( syn:: VisPublic { pub_token : Token ! [ pub ] ( span) } ) ,
957
+ vis : syn:: Visibility :: Public ( syn:: VisPublic {
958
+ pub_token : Token ! [ pub ] ( span) ,
959
+ } ) ,
932
960
attrs : vec ! [ ] ,
933
961
colon_token : Some ( Token ! [ : ] ( span) ) ,
934
962
ty,
0 commit comments