@@ -2,16 +2,16 @@ 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
- use crate :: errors:: * ;
14
13
use crate :: util:: { self , ToSanitizedSnakeCase , ToSanitizedUpperCase , BITS_PER_BYTE } ;
14
+ use anyhow:: { anyhow, bail, Context , Result } ;
15
15
16
16
use crate :: generate:: register;
17
17
@@ -23,16 +23,20 @@ pub fn render(
23
23
) -> Result < Vec < TokenStream > > {
24
24
let mut out = vec ! [ ] ;
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
@@ -97,31 +101,35 @@ pub fn render(
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
119
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
- }
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
+ ) ) ,
118
126
} ;
119
127
120
128
d
121
129
}
122
130
None => Some ( RegisterCluster :: Register ( ( * r) . clone ( ) ) ) ,
123
- }
124
- } ) . collect ( ) ;
131
+ } )
132
+ . collect ( ) ;
125
133
126
134
// Now add the clusters to our alternate erc list
127
135
let clusters = util:: only_clusters ( ercs) ;
@@ -508,11 +516,16 @@ fn register_or_cluster_block(
508
516
// name, along with the region number, falling back to
509
517
// the offset and end in case we couldn't figure out a
510
518
// nice identifier.
511
- let name = Ident :: new ( & format ! (
512
- "_reserved_{}_{}" ,
513
- i,
514
- region. compute_ident( ) . unwrap_or_else( || format!( "{}_{}" , region. offset, region. end) )
515
- ) , span) ;
519
+ let name = Ident :: new (
520
+ & format ! (
521
+ "_reserved_{}_{}" ,
522
+ i,
523
+ region
524
+ . compute_ident( )
525
+ . unwrap_or_else( || format!( "{}_{}" , region. offset, region. end) )
526
+ ) ,
527
+ span,
528
+ ) ;
516
529
let pad = ( region. end - region. offset ) as usize ;
517
530
fields. extend ( quote ! {
518
531
#name: [ u8 ; #pad] ,
@@ -521,10 +534,13 @@ fn register_or_cluster_block(
521
534
last_end = region. end ;
522
535
}
523
536
524
- let name = Ident :: new ( & match name {
525
- Some ( name) => name. to_sanitized_upper_case ( ) ,
526
- None => "RegisterBlock" . into ( ) ,
527
- } , span) ;
537
+ let name = Ident :: new (
538
+ & match name {
539
+ Some ( name) => name. to_sanitized_upper_case ( ) ,
540
+ None => "RegisterBlock" . into ( ) ,
541
+ } ,
542
+ span,
543
+ ) ;
528
544
529
545
let accessors = if have_accessors {
530
546
quote ! {
@@ -600,12 +616,12 @@ fn expand_cluster(cluster: &Cluster, defs: &RegisterProperties) -> Result<Vec<Re
600
616
let defs = cluster. default_register_properties . derive_from ( defs) ;
601
617
602
618
let cluster_size = cluster_size_in_bits ( cluster, & defs)
603
- . chain_err ( || format ! ( "Cluster {} has no determinable `size` field" , cluster. name) ) ?;
619
+ . with_context ( || format ! ( "Cluster {} has no determinable `size` field" , cluster. name) ) ?;
604
620
605
621
match cluster {
606
622
Cluster :: Single ( info) => cluster_expanded. push ( RegisterBlockField {
607
623
field : convert_svd_cluster ( cluster) ,
608
- description : info. description . clone ( ) ,
624
+ description : info. description . clone ( ) . unwrap_or ( "" ) ,
609
625
offset : info. address_offset ,
610
626
size : cluster_size,
611
627
} ) ,
@@ -625,15 +641,15 @@ fn expand_cluster(cluster: &Cluster, defs: &RegisterProperties) -> Result<Vec<Re
625
641
if array_convertible {
626
642
cluster_expanded. push ( RegisterBlockField {
627
643
field : convert_svd_cluster ( & cluster) ,
628
- description : info. description . clone ( ) ,
644
+ description : info. description . clone ( ) . unwrap_or ( "" ) ,
629
645
offset : info. address_offset ,
630
646
size : cluster_size * array_info. dim ,
631
647
} ) ;
632
648
} else {
633
649
for ( field_num, field) in expand_svd_cluster ( cluster) . iter ( ) . enumerate ( ) {
634
650
cluster_expanded. push ( RegisterBlockField {
635
651
field : field. clone ( ) ,
636
- description : info. description . clone ( ) ,
652
+ description : info. description . clone ( ) . unwrap_or ( "" ) ,
637
653
offset : info. address_offset + field_num as u32 * array_info. dim_increment ,
638
654
size : cluster_size,
639
655
} ) ;
@@ -657,7 +673,7 @@ fn expand_register(
657
673
let register_size = register
658
674
. size
659
675
. or ( defs. size )
660
- . ok_or_else ( || format ! ( "Register {} has no `size` field" , register. name) ) ?;
676
+ . ok_or_else ( || anyhow ! ( "Register {} has no `size` field" , register. name) ) ?;
661
677
662
678
match register {
663
679
Register :: Single ( info) => register_expanded. push ( RegisterBlockField {
@@ -713,7 +729,8 @@ fn cluster_block(
713
729
let mut mod_items: Vec < TokenStream > = vec ! [ ] ;
714
730
715
731
// name_sc needs to take into account array type.
716
- let description = util:: escape_brackets ( util:: respace ( & c. description ) . as_ref ( ) ) ;
732
+ let description =
733
+ util:: escape_brackets ( util:: respace ( & c. description . clone ( ) . unwrap_or ( "" ) ) . as_ref ( ) ) ;
717
734
718
735
// Generate the register block.
719
736
let mod_name = match c {
@@ -820,10 +837,10 @@ fn expand_svd_register(register: &Register, name: Option<&str>) -> Vec<syn::Fiel
820
837
fn convert_svd_register ( register : & Register , name : Option < & str > ) -> syn:: Field {
821
838
let name_to_ty = |name : & String , ns : Option < & str > | -> String {
822
839
if let Some ( ns) = ns {
823
- String :: from ( "self::" )
824
- + & ns. to_sanitized_snake_case ( )
825
- + "::"
826
- + & name. to_sanitized_upper_case ( )
840
+ String :: from ( "self::" )
841
+ + & ns. to_sanitized_snake_case ( )
842
+ + "::"
843
+ + & name. to_sanitized_upper_case ( )
827
844
} else {
828
845
name. to_sanitized_upper_case ( ) . to_string ( )
829
846
}
@@ -832,7 +849,7 @@ fn convert_svd_register(register: &Register, name: Option<&str>) -> syn::Field {
832
849
match register {
833
850
Register :: Single ( info) => new_syn_field (
834
851
& info. name . to_sanitized_snake_case ( ) ,
835
- syn:: Type :: Path ( parse_str :: < syn:: TypePath > ( & name_to_ty ( & info. name , name) ) . unwrap ( ) )
852
+ syn:: Type :: Path ( parse_str :: < syn:: TypePath > ( & name_to_ty ( & info. name , name) ) . unwrap ( ) ) ,
836
853
) ,
837
854
Register :: Array ( info, array_info) => {
838
855
let has_brackets = info. name . contains ( "[%s]" ) ;
@@ -843,9 +860,14 @@ fn convert_svd_register(register: &Register, name: Option<&str>) -> syn::Field {
843
860
info. name . replace ( "%s" , "" )
844
861
} ;
845
862
846
- let ty = syn:: Type :: Array ( parse_str :: < syn:: TypeArray > (
847
- & format ! ( "[{};{}]" , name_to_ty( & nb_name, name) , u64 :: from( array_info. dim) )
848
- ) . unwrap ( ) ) ;
863
+ let ty = syn:: Type :: Array (
864
+ parse_str :: < syn:: TypeArray > ( & format ! (
865
+ "[{};{}]" ,
866
+ name_to_ty( & nb_name, name) ,
867
+ u64 :: from( array_info. dim)
868
+ ) )
869
+ . unwrap ( ) ,
870
+ ) ;
849
871
850
872
new_syn_field ( & nb_name. to_sanitized_snake_case ( ) , ty)
851
873
}
@@ -905,7 +927,9 @@ fn convert_svd_cluster(cluster: &Cluster) -> syn::Field {
905
927
match cluster {
906
928
Cluster :: Single ( info) => new_syn_field (
907
929
& info. name . to_sanitized_snake_case ( ) ,
908
- syn:: Type :: Path ( parse_str :: < syn:: TypePath > ( & info. name . to_sanitized_upper_case ( ) ) . unwrap ( ) )
930
+ syn:: Type :: Path (
931
+ parse_str :: < syn:: TypePath > ( & info. name . to_sanitized_upper_case ( ) ) . unwrap ( ) ,
932
+ ) ,
909
933
) ,
910
934
Cluster :: Array ( info, array_info) => {
911
935
let has_brackets = info. name . contains ( "[%s]" ) ;
@@ -916,9 +940,14 @@ fn convert_svd_cluster(cluster: &Cluster) -> syn::Field {
916
940
info. name . replace ( "%s" , "" )
917
941
} ;
918
942
919
- let ty = syn:: Type :: Array ( parse_str :: < syn:: TypeArray > (
920
- & format ! ( "[{};{}]" , & name. to_sanitized_upper_case( ) , u64 :: from( array_info. dim) )
921
- ) . unwrap ( ) ) ;
943
+ let ty = syn:: Type :: Array (
944
+ parse_str :: < syn:: TypeArray > ( & format ! (
945
+ "[{};{}]" ,
946
+ & name. to_sanitized_upper_case( ) ,
947
+ u64 :: from( array_info. dim)
948
+ ) )
949
+ . unwrap ( ) ,
950
+ ) ;
922
951
923
952
new_syn_field ( & name. to_sanitized_snake_case ( ) , ty)
924
953
}
@@ -929,7 +958,9 @@ fn new_syn_field(ident: &str, ty: syn::Type) -> syn::Field {
929
958
let span = Span :: call_site ( ) ;
930
959
syn:: Field {
931
960
ident : Some ( Ident :: new ( ident, span) ) ,
932
- vis : syn:: Visibility :: Public ( syn:: VisPublic { pub_token : Token ! [ pub ] ( span) } ) ,
961
+ vis : syn:: Visibility :: Public ( syn:: VisPublic {
962
+ pub_token : Token ! [ pub ] ( span) ,
963
+ } ) ,
933
964
attrs : vec ! [ ] ,
934
965
colon_token : Some ( Token ! [ : ] ( span) ) ,
935
966
ty,
0 commit comments