Skip to content

Commit 63d7f41

Browse files
authored
Try #398:
2 parents f7cb4c3 + 681e548 commit 63d7f41

File tree

9 files changed

+208
-138
lines changed

9 files changed

+208
-138
lines changed

Cargo.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,15 @@ path = "src/main.rs"
3535
cast = "0.2.2"
3636
clap = "2.26.0"
3737
env_logger = "~0.5"
38-
error-chain = "0.11.0"
3938
inflections = "1.1.0"
4039
log = { version = "~0.4", features = ["std"] }
4140
quote = "1.0"
4241
proc-macro2 = "1.0"
42+
anyhow = "1.0.19"
43+
thiserror = "1.0.5"
4344

4445
[dependencies.svd-parser]
45-
version = "0.8.1"
46+
version = "0.9.0"
4647
features = ["derive-from"]
4748

4849
[dependencies.syn]

src/errors.rs

Lines changed: 0 additions & 1 deletion
This file was deleted.

src/generate/device.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1+
use crate::svd::Device;
2+
use proc_macro2::{Ident, Span, TokenStream};
13
use quote::ToTokens;
2-
use proc_macro2::{TokenStream, Ident, Span};
34
use std::fs::File;
45
use std::io::Write;
5-
use crate::svd::Device;
66

7-
use crate::errors::*;
87
use crate::util::{self, ToSanitizedUpperCase};
98
use crate::Target;
9+
use anyhow::Result;
1010

1111
use crate::generate::{interrupt, peripheral};
1212

@@ -104,8 +104,7 @@ pub fn render(
104104

105105
let core_peripherals: &[_] = if fpu_present {
106106
&[
107-
"CBP", "CPUID", "DCB", "DWT", "FPB", "FPU", "ITM", "MPU", "NVIC", "SCB", "SYST",
108-
"TPIU",
107+
"CBP", "CPUID", "DCB", "DWT", "FPB", "FPU", "ITM", "MPU", "NVIC", "SCB", "SYST", "TPIU",
109108
]
110109
} else {
111110
&[
@@ -161,7 +160,12 @@ pub fn render(
161160
continue;
162161
}
163162

164-
out.extend(peripheral::render(p, &d.peripherals, &d.default_register_properties, nightly)?);
163+
out.extend(peripheral::render(
164+
p,
165+
&d.peripherals,
166+
&d.default_register_properties,
167+
nightly,
168+
)?);
165169

166170
if p.registers
167171
.as_ref()

src/generate/interrupt.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ use crate::svd::Peripheral;
55
use cast::u64;
66
use proc_macro2::{Ident, Span, TokenStream};
77

8-
use crate::errors::*;
98
use crate::util::{self, ToSanitizedUpperCase};
109
use crate::Target;
10+
use anyhow::Result;
1111

1212
/// Generates code for `src/interrupt.rs`
1313
pub fn render(

src/generate/peripheral.rs

Lines changed: 81 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@ use std::borrow::Cow;
22
use std::cmp::Ordering;
33
use std::collections::HashMap;
44

5-
use quote::ToTokens;
5+
use crate::svd::{Cluster, ClusterInfo, Peripheral, Register, RegisterCluster, RegisterProperties};
6+
use log::warn;
67
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;
810
use svd_parser::derive_from::DeriveFrom;
9-
use proc_macro2::{Ident, Span, Punct, Spacing};
10-
use log::warn;
1111
use syn::{parse_str, Token};
1212

13-
use crate::errors::*;
1413
use crate::util::{self, ToSanitizedSnakeCase, ToSanitizedUpperCase, BITS_PER_BYTE};
14+
use anyhow::{anyhow, bail, Context, Result};
1515

1616
use crate::generate::register;
1717

@@ -23,16 +23,20 @@ pub fn render(
2323
) -> Result<Vec<TokenStream>> {
2424
let mut out = vec![];
2525

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));
2930

3031
let p_merged = p_derivedfrom.map(|ancestor| p_original.derive_from(ancestor));
3132
let p = p_merged.as_ref().unwrap_or(p_original);
3233

3334
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+
);
3640
return Ok(out);
3741
}
3842

@@ -97,31 +101,35 @@ pub fn render(
97101
}
98102

99103
// 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 {
102107
Some(ref derived) => {
103108
let ancestor = match reg_map.get(derived) {
104109
Some(r) => r,
105110
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;
108116
}
109117
};
110118

111119
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+
)),
118126
};
119127

120128
d
121129
}
122130
None => Some(RegisterCluster::Register((*r).clone())),
123-
}
124-
}).collect();
131+
})
132+
.collect();
125133

126134
// Now add the clusters to our alternate erc list
127135
let clusters = util::only_clusters(ercs);
@@ -508,11 +516,16 @@ fn register_or_cluster_block(
508516
// name, along with the region number, falling back to
509517
// the offset and end in case we couldn't figure out a
510518
// 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+
);
516529
let pad = (region.end - region.offset) as usize;
517530
fields.extend(quote! {
518531
#name: [u8; #pad],
@@ -521,10 +534,13 @@ fn register_or_cluster_block(
521534
last_end = region.end;
522535
}
523536

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+
);
528544

529545
let accessors = if have_accessors {
530546
quote! {
@@ -600,12 +616,12 @@ fn expand_cluster(cluster: &Cluster, defs: &RegisterProperties) -> Result<Vec<Re
600616
let defs = cluster.default_register_properties.derive_from(defs);
601617

602618
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))?;
604620

605621
match cluster {
606622
Cluster::Single(info) => cluster_expanded.push(RegisterBlockField {
607623
field: convert_svd_cluster(cluster),
608-
description: info.description.clone(),
624+
description: info.description.clone().unwrap_or(""),
609625
offset: info.address_offset,
610626
size: cluster_size,
611627
}),
@@ -625,15 +641,15 @@ fn expand_cluster(cluster: &Cluster, defs: &RegisterProperties) -> Result<Vec<Re
625641
if array_convertible {
626642
cluster_expanded.push(RegisterBlockField {
627643
field: convert_svd_cluster(&cluster),
628-
description: info.description.clone(),
644+
description: info.description.clone().unwrap_or(""),
629645
offset: info.address_offset,
630646
size: cluster_size * array_info.dim,
631647
});
632648
} else {
633649
for (field_num, field) in expand_svd_cluster(cluster).iter().enumerate() {
634650
cluster_expanded.push(RegisterBlockField {
635651
field: field.clone(),
636-
description: info.description.clone(),
652+
description: info.description.clone().unwrap_or(""),
637653
offset: info.address_offset + field_num as u32 * array_info.dim_increment,
638654
size: cluster_size,
639655
});
@@ -657,7 +673,7 @@ fn expand_register(
657673
let register_size = register
658674
.size
659675
.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))?;
661677

662678
match register {
663679
Register::Single(info) => register_expanded.push(RegisterBlockField {
@@ -713,7 +729,8 @@ fn cluster_block(
713729
let mut mod_items: Vec<TokenStream> = vec![];
714730

715731
// 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());
717734

718735
// Generate the register block.
719736
let mod_name = match c {
@@ -820,10 +837,10 @@ fn expand_svd_register(register: &Register, name: Option<&str>) -> Vec<syn::Fiel
820837
fn convert_svd_register(register: &Register, name: Option<&str>) -> syn::Field {
821838
let name_to_ty = |name: &String, ns: Option<&str>| -> String {
822839
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()
827844
} else {
828845
name.to_sanitized_upper_case().to_string()
829846
}
@@ -832,7 +849,7 @@ fn convert_svd_register(register: &Register, name: Option<&str>) -> syn::Field {
832849
match register {
833850
Register::Single(info) => new_syn_field(
834851
&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()),
836853
),
837854
Register::Array(info, array_info) => {
838855
let has_brackets = info.name.contains("[%s]");
@@ -843,9 +860,14 @@ fn convert_svd_register(register: &Register, name: Option<&str>) -> syn::Field {
843860
info.name.replace("%s", "")
844861
};
845862

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+
);
849871

850872
new_syn_field(&nb_name.to_sanitized_snake_case(), ty)
851873
}
@@ -905,7 +927,9 @@ fn convert_svd_cluster(cluster: &Cluster) -> syn::Field {
905927
match cluster {
906928
Cluster::Single(info) => new_syn_field(
907929
&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+
),
909933
),
910934
Cluster::Array(info, array_info) => {
911935
let has_brackets = info.name.contains("[%s]");
@@ -916,9 +940,14 @@ fn convert_svd_cluster(cluster: &Cluster) -> syn::Field {
916940
info.name.replace("%s", "")
917941
};
918942

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+
);
922951

923952
new_syn_field(&name.to_sanitized_snake_case(), ty)
924953
}
@@ -929,7 +958,9 @@ fn new_syn_field(ident: &str, ty: syn::Type) -> syn::Field {
929958
let span = Span::call_site();
930959
syn::Field {
931960
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+
}),
933964
attrs: vec![],
934965
colon_token: Some(Token![:](span)),
935966
ty,

0 commit comments

Comments
 (0)