Skip to content

Commit 552dcea

Browse files
committed
config
1 parent d0e9e5f commit 552dcea

File tree

7 files changed

+55
-45
lines changed

7 files changed

+55
-45
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
99

1010
### Changed
1111

12+
- use `Config` to pass options over all render levels
1213
- Use register iterator from `svd-parser`
1314
- rm unneeded `core::convert::` prefix on `From`
1415

src/generate/device.rs

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,14 @@ use quote::{quote, ToTokens};
44
use std::fs::File;
55
use std::io::Write;
66

7-
use crate::util::{self, ToSanitizedUpperCase};
7+
use crate::util::{self, Config, ToSanitizedUpperCase};
88
use crate::Target;
99
use anyhow::Result;
1010

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

1313
/// Whole device generation
14-
pub fn render(
15-
d: &Device,
16-
target: Target,
17-
nightly: bool,
18-
generic_mod: bool,
19-
make_mod: bool,
20-
device_x: &mut String,
21-
) -> Result<TokenStream> {
14+
pub fn render(d: &Device, config: &Config, device_x: &mut String) -> Result<TokenStream> {
2215
let mut out = TokenStream::new();
2316

2417
let commit_info = {
@@ -46,14 +39,14 @@ pub fn render(
4639
commit_info
4740
);
4841

49-
if target == Target::Msp430 {
42+
if config.target == Target::Msp430 {
5043
out.extend(quote! {
5144
#![feature(abi_msp430_interrupt)]
5245
});
5346
}
5447

5548
out.extend(quote! { #![doc = #doc] });
56-
if !make_mod {
49+
if !config.make_mod {
5750
out.extend(quote! {
5851
// Deny a subset of warnings
5952
#![deny(const_err)]
@@ -109,7 +102,7 @@ pub fn render(
109102

110103
let mut fields = TokenStream::new();
111104
let mut exprs = TokenStream::new();
112-
if target == Target::CortexM {
105+
if config.target == Target::CortexM {
113106
out.extend(quote! {
114107
pub use cortex_m::peripheral::Peripherals as CorePeripherals;
115108
#[cfg(feature = "rt")]
@@ -133,7 +126,7 @@ pub fn render(
133126
}
134127
}
135128

136-
if target == Target::Msp430 {
129+
if config.target == Target::Msp430 {
137130
out.extend(quote! {
138131
// XXX: Are there any core peripherals, really? Requires bump of msp430 crate.
139132
// pub use msp430::peripheral::Peripherals as CorePeripherals;
@@ -145,10 +138,10 @@ pub fn render(
145138
}
146139

147140
let generic_file = std::str::from_utf8(include_bytes!("generic.rs"))?;
148-
if generic_mod {
141+
if config.generic_mod {
149142
writeln!(File::create("generic.rs")?, "{}", generic_file)?;
150143

151-
if !make_mod {
144+
if !config.make_mod {
152145
out.extend(quote! {
153146
#[allow(unused_imports)]
154147
use generic::*;
@@ -169,10 +162,10 @@ pub fn render(
169162
});
170163
}
171164

172-
out.extend(interrupt::render(target, &d.peripherals, device_x)?);
165+
out.extend(interrupt::render(config.target, &d.peripherals, device_x)?);
173166

174167
for p in &d.peripherals {
175-
if target == Target::CortexM && core_peripherals.contains(&&*p.name.to_uppercase()) {
168+
if config.target == Target::CortexM && core_peripherals.contains(&&*p.name.to_uppercase()) {
176169
// Core peripherals are handled above
177170
continue;
178171
}
@@ -181,7 +174,7 @@ pub fn render(
181174
p,
182175
&d.peripherals,
183176
&d.default_register_properties,
184-
nightly,
177+
config,
185178
)?);
186179

187180
if p.registers
@@ -206,7 +199,7 @@ pub fn render(
206199
}
207200

208201
let span = Span::call_site();
209-
let take = match target {
202+
let take = match config.target {
210203
Target::CortexM => Some(Ident::new("cortex_m", span)),
211204
Target::Msp430 => Some(Ident::new("msp430", span)),
212205
Target::RISCV => Some(Ident::new("riscv", span)),

src/generate/peripheral.rs

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ use quote::{quote, ToTokens};
1010
use svd_parser::derive_from::DeriveFrom;
1111
use syn::{parse_str, Token};
1212

13-
use crate::util::{self, FullName, ToSanitizedSnakeCase, ToSanitizedUpperCase, BITS_PER_BYTE};
13+
use crate::util::{
14+
self, Config, FullName, ToSanitizedSnakeCase, ToSanitizedUpperCase, BITS_PER_BYTE,
15+
};
1416
use anyhow::{anyhow, bail, Context, Result};
1517

1618
use crate::generate::register;
@@ -19,7 +21,7 @@ pub fn render(
1921
p_original: &Peripheral,
2022
all_peripherals: &[Peripheral],
2123
defaults: &RegisterProperties,
22-
nightly: bool,
24+
config: &Config,
2325
) -> Result<TokenStream> {
2426
let mut out = TokenStream::new();
2527

@@ -177,11 +179,11 @@ pub fn render(
177179

178180
// Push any register or cluster blocks into the output
179181
let mut mod_items = TokenStream::new();
180-
mod_items.extend(register_or_cluster_block(&ercs, &defaults, None, nightly)?);
182+
mod_items.extend(register_or_cluster_block(&ercs, &defaults, None, config)?);
181183

182184
// Push all cluster related information into the peripheral module
183185
for c in &clusters {
184-
mod_items.extend(cluster_block(c, &defaults, p, all_peripherals, nightly)?);
186+
mod_items.extend(cluster_block(c, &defaults, p, all_peripherals, config)?);
185187
}
186188

187189
// Push all register related information into the peripheral module
@@ -192,6 +194,7 @@ pub fn render(
192194
p,
193195
all_peripherals,
194196
&defaults,
197+
config,
195198
)?);
196199
}
197200

@@ -235,10 +238,7 @@ impl Region {
235238
let mut idents: Vec<_> = self
236239
.rbfs
237240
.iter()
238-
.filter_map(|f| match &f.field.ident {
239-
None => None,
240-
Some(ident) => Some(ident.to_string()),
241-
})
241+
.filter_map(|f| f.field.ident.as_ref().map(|ident| ident.to_string()))
242242
.collect();
243243
if idents.is_empty() {
244244
return None;
@@ -276,10 +276,7 @@ impl Region {
276276
let idents: Vec<_> = self
277277
.rbfs
278278
.iter()
279-
.filter_map(|f| match &f.field.ident {
280-
None => None,
281-
Some(ident) => Some(ident.to_string()),
282-
})
279+
.filter_map(|f| f.field.ident.as_ref().map(|ident| ident.to_string()))
283280
.collect();
284281

285282
if idents.is_empty() {
@@ -445,7 +442,7 @@ fn register_or_cluster_block(
445442
ercs: &[RegisterCluster],
446443
defs: &RegisterProperties,
447444
name: Option<&str>,
448-
_nightly: bool,
445+
_config: &Config,
449446
) -> Result<TokenStream> {
450447
let mut rbfs = TokenStream::new();
451448
let mut accessors = TokenStream::new();
@@ -738,7 +735,7 @@ fn cluster_block(
738735
defaults: &RegisterProperties,
739736
p: &Peripheral,
740737
all_peripherals: &[Peripheral],
741-
nightly: bool,
738+
config: &Config,
742739
) -> Result<TokenStream> {
743740
let mut mod_items = TokenStream::new();
744741

@@ -758,7 +755,7 @@ fn cluster_block(
758755

759756
let defaults = c.default_register_properties.derive_from(defaults);
760757

761-
let reg_block = register_or_cluster_block(&c.children, &defaults, Some(&mod_name), nightly)?;
758+
let reg_block = register_or_cluster_block(&c.children, &defaults, Some(&mod_name), config)?;
762759

763760
// Generate definition for each of the registers.
764761
let registers = util::only_registers(&c.children);
@@ -769,13 +766,14 @@ fn cluster_block(
769766
p,
770767
all_peripherals,
771768
&defaults,
769+
config,
772770
)?);
773771
}
774772

775773
// Generate the sub-cluster blocks.
776774
let clusters = util::only_clusters(&c.children);
777775
for c in &clusters {
778-
mod_items.extend(cluster_block(c, &defaults, p, all_peripherals, nightly)?);
776+
mod_items.extend(cluster_block(c, &defaults, p, all_peripherals, config)?);
779777
}
780778

781779
Ok(quote! {

src/generate/register.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use log::warn;
88
use proc_macro2::{Ident, Punct, Spacing, Span, TokenStream};
99
use quote::{quote, ToTokens};
1010

11-
use crate::util::{self, ToSanitizedSnakeCase, ToSanitizedUpperCase, U32Ext};
11+
use crate::util::{self, Config, ToSanitizedSnakeCase, ToSanitizedUpperCase, U32Ext};
1212
use anyhow::{anyhow, Result};
1313

1414
pub fn render(
@@ -17,6 +17,7 @@ pub fn render(
1717
peripheral: &Peripheral,
1818
all_peripherals: &[Peripheral],
1919
defs: &RegisterProperties,
20+
config: &Config,
2021
) -> Result<TokenStream> {
2122
let access = util::access_of(register);
2223
let name = util::name_of(register);
@@ -141,6 +142,7 @@ pub fn render(
141142
&mut mod_items,
142143
&mut r_impl_items,
143144
&mut w_impl_items,
145+
config,
144146
)?;
145147
}
146148
}
@@ -267,6 +269,7 @@ pub fn fields(
267269
mod_items: &mut TokenStream,
268270
r_impl_items: &mut TokenStream,
269271
w_impl_items: &mut TokenStream,
272+
_config: &Config,
270273
) -> Result<()> {
271274
let span = Span::call_site();
272275
let can_read = [Access::ReadOnly, Access::ReadWriteOnce, Access::ReadWrite].contains(&access);

src/lib.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,7 @@ use svd_parser as svd;
486486
mod generate;
487487
mod util;
488488

489-
pub use crate::util::Target;
489+
pub use crate::util::{Config, Target};
490490

491491
#[non_exhaustive]
492492
pub struct Generation {
@@ -515,8 +515,14 @@ pub fn generate(xml: &str, target: Target, nightly: bool) -> Result<Generation>
515515

516516
let device = svd::parse(xml)?;
517517
let mut device_x = String::new();
518-
let items = generate::device::render(&device, target, nightly, false, false, &mut device_x)
519-
.or(Err(SvdError::Render))?;
518+
let config = Config {
519+
target,
520+
nightly,
521+
generic_mod: false,
522+
make_mod: false,
523+
};
524+
let items =
525+
generate::device::render(&device, &config, &mut device_x).or(Err(SvdError::Render))?;
520526

521527
let mut lib_rs = String::new();
522528
writeln!(

src/main.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use std::process;
1313
use anyhow::{Context, Result};
1414
use clap::{App, Arg};
1515

16-
use crate::util::{build_rs, Target};
16+
use crate::util::{build_rs, Config, Target};
1717

1818
fn run() -> Result<()> {
1919
use std::io::Read;
@@ -99,15 +99,15 @@ fn run() -> Result<()> {
9999
let generic_mod = matches.is_present("generic_mod");
100100
let make_mod = matches.is_present("make_mod");
101101

102-
let mut device_x = String::new();
103-
let items = generate::device::render(
104-
&device,
102+
let config = Config {
105103
target,
106104
nightly,
107105
generic_mod,
108106
make_mod,
109-
&mut device_x,
110-
)?;
107+
};
108+
109+
let mut device_x = String::new();
110+
let items = generate::device::render(&device, &config, &mut device_x)?;
111111
let filename = if make_mod { "mod.rs" } else { "lib.rs" };
112112
let mut file = File::create(filename).expect("Couldn't create output file");
113113

src/util.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,15 @@ pub const BITS_PER_BYTE: u32 = 8;
1313
/// that are not valid in Rust ident
1414
const BLACKLIST_CHARS: &[char] = &['(', ')', '[', ']', '/', ' ', '-'];
1515

16+
#[derive(Clone, Copy, PartialEq)]
17+
pub struct Config {
18+
pub target: Target,
19+
pub nightly: bool,
20+
pub generic_mod: bool,
21+
pub make_mod: bool,
22+
}
23+
24+
#[allow(clippy::upper_case_acronyms)]
1625
#[allow(non_camel_case_types)]
1726
#[derive(Clone, Copy, PartialEq)]
1827
pub enum Target {

0 commit comments

Comments
 (0)