Skip to content

Commit 07b0cad

Browse files
committed
Peripheral Cluster defaults
1 parent 11e11f0 commit 07b0cad

File tree

4 files changed

+25
-38
lines changed

4 files changed

+25
-38
lines changed

Cargo.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,12 @@ error-chain = "0.11.0"
3939
inflections = "1.1.0"
4040
log = { version = "~0.4", features = ["std"] }
4141
quote = "1.0"
42-
svd-parser = "0.7"
4342
proc-macro2 = "1.0"
4443

44+
[dependencies.svd-parser]
45+
version = "0.8.1"
46+
features = ["derive-from"]
47+
4548
[dependencies.syn]
4649
version = "1.0"
4750
features = ["full","extra-traits"]

src/generate/device.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ pub fn render(
161161
continue;
162162
}
163163

164-
out.extend(peripheral::render(p, &d.peripherals, &d.defaults, nightly)?);
164+
out.extend(peripheral::render(p, &d.peripherals, &d.default_register_properties, nightly)?);
165165

166166
if p.registers
167167
.as_ref()

src/generate/peripheral.rs

Lines changed: 18 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ use std::collections::HashMap;
44

55
use quote::ToTokens;
66
use proc_macro2::TokenStream;
7-
use crate::svd::{Cluster, ClusterInfo, Defaults, Peripheral, Register, RegisterCluster, RegisterInfo};
7+
use crate::svd::{Cluster, ClusterInfo, RegisterProperties, Peripheral, Register, RegisterCluster};
8+
use svd_parser::derive_from::DeriveFrom;
89
use proc_macro2::{Ident, Span, Punct, Spacing};
910
use log::warn;
1011
use syn::{parse_str, Token};
@@ -17,7 +18,7 @@ use crate::generate::register;
1718
pub fn render(
1819
p_original: &Peripheral,
1920
all_peripherals: &[Peripheral],
20-
defaults: &Defaults,
21+
defaults: &RegisterProperties,
2122
nightly: bool,
2223
) -> Result<Vec<TokenStream>> {
2324
let mut out = vec![];
@@ -95,21 +96,6 @@ pub fn render(
9596
reg_map.insert(&r.name, r.clone());
9697
}
9798

98-
// Compute the effective, derived version of a register given the definition
99-
// with the derived_from property on it (`info`) and its `ancestor`
100-
fn derive_reg_info(info: &RegisterInfo, ancestor: &RegisterInfo) -> RegisterInfo {
101-
let mut derived = info.clone();
102-
103-
derived.size = derived.size.or(ancestor.size);
104-
derived.access = derived.access.or(ancestor.access);
105-
derived.reset_value = derived.reset_value.or(ancestor.reset_value);
106-
derived.reset_mask = derived.reset_mask.or(ancestor.reset_mask);
107-
derived.fields = derived.fields.or(ancestor.fields.clone());
108-
derived.write_constraint = derived.write_constraint.or(ancestor.write_constraint);
109-
110-
derived
111-
}
112-
11399
// Build up an alternate erc list by expanding any derived registers
114100
let mut alt_erc :Vec<RegisterCluster> = registers.iter().filter_map(|r| {
115101
match r.derived_from {
@@ -124,10 +110,10 @@ pub fn render(
124110

125111
let d = match **ancestor {
126112
Register::Array(ref info, ref array_info) => {
127-
Some(RegisterCluster::Register(Register::Array(derive_reg_info(*r, info), array_info.clone())))
113+
Some(RegisterCluster::Register(Register::Array(r.derive_from(info), array_info.clone())))
128114
}
129115
Register::Single(ref info) => {
130-
Some(RegisterCluster::Register(Register::Single(derive_reg_info(*r, info))))
116+
Some(RegisterCluster::Register(Register::Single(r.derive_from(info))))
131117
}
132118
};
133119

@@ -155,13 +141,15 @@ pub fn render(
155141
return Ok(out);
156142
}
157143

144+
let defaults = p.default_register_properties.derive_from(defaults);
145+
158146
// Push any register or cluster blocks into the output
159147
let mut mod_items = vec![];
160-
mod_items.push(register_or_cluster_block(ercs, defaults, None, nightly)?);
148+
mod_items.push(register_or_cluster_block(ercs, &defaults, None, nightly)?);
161149

162150
// Push all cluster related information into the peripheral module
163151
for c in &clusters {
164-
mod_items.push(cluster_block(c, defaults, p, all_peripherals, nightly)?);
152+
mod_items.push(cluster_block(c, &defaults, p, all_peripherals, nightly)?);
165153
}
166154

167155
// Push all regsiter realted information into the peripheral module
@@ -171,7 +159,7 @@ pub fn render(
171159
registers,
172160
p,
173161
all_peripherals,
174-
defaults,
162+
&defaults,
175163
)?);
176164
}
177165

@@ -428,7 +416,7 @@ impl FieldRegions {
428416

429417
fn register_or_cluster_block(
430418
ercs: &[RegisterCluster],
431-
defs: &Defaults,
419+
defs: &RegisterProperties,
432420
name: Option<&str>,
433421
_nightly: bool,
434422
) -> Result<TokenStream> {
@@ -563,7 +551,7 @@ fn register_or_cluster_block(
563551
/// `RegisterBlockField`s containing `Field`s.
564552
fn expand(
565553
ercs: &[RegisterCluster],
566-
defs: &Defaults,
554+
defs: &RegisterProperties,
567555
name: Option<&str>,
568556
) -> Result<Vec<RegisterBlockField>> {
569557
let mut ercs_expanded = vec![];
@@ -582,7 +570,7 @@ fn expand(
582570

583571
/// Recursively calculate the size of a cluster. A cluster's size is the maximum
584572
/// end position of its recursive children.
585-
fn cluster_size_in_bits(info: &ClusterInfo, defs: &Defaults) -> Result<u32> {
573+
fn cluster_size_in_bits(info: &ClusterInfo, defs: &RegisterProperties) -> Result<u32> {
586574
let mut size = 0;
587575

588576
for c in &info.children {
@@ -606,12 +594,10 @@ fn cluster_size_in_bits(info: &ClusterInfo, defs: &Defaults) -> Result<u32> {
606594
}
607595

608596
/// Render a given cluster (and any children) into `RegisterBlockField`s
609-
fn expand_cluster(cluster: &Cluster, defs: &Defaults) -> Result<Vec<RegisterBlockField>> {
597+
fn expand_cluster(cluster: &Cluster, defs: &RegisterProperties) -> Result<Vec<RegisterBlockField>> {
610598
let mut cluster_expanded = vec![];
611599

612-
let reg_size = cluster.size.or(defs.size);
613-
let mut defs = defs.clone();
614-
defs.size = reg_size;
600+
let defs = cluster.default_register_properties.derive_from(defs);
615601

616602
let cluster_size = cluster_size_in_bits(cluster, &defs)
617603
.chain_err(|| format!("Cluster {} has no determinable `size` field", cluster.name))?;
@@ -663,7 +649,7 @@ fn expand_cluster(cluster: &Cluster, defs: &Defaults) -> Result<Vec<RegisterBloc
663649
/// numeral indexes, or not containing all elements from 0 to size) they will be expanded
664650
fn expand_register(
665651
register: &Register,
666-
defs: &Defaults,
652+
defs: &RegisterProperties,
667653
name: Option<&str>,
668654
) -> Result<Vec<RegisterBlockField>> {
669655
let mut register_expanded = vec![];
@@ -719,7 +705,7 @@ fn expand_register(
719705
/// Render a Cluster Block into `TokenStream`
720706
fn cluster_block(
721707
c: &Cluster,
722-
defaults: &Defaults,
708+
defaults: &RegisterProperties,
723709
p: &Peripheral,
724710
all_peripherals: &[Peripheral],
725711
nightly: bool,
@@ -738,9 +724,7 @@ fn cluster_block(
738724
.replace("%s", "");
739725
let name_sc = Ident::new(&mod_name.to_sanitized_snake_case(), Span::call_site());
740726

741-
let reg_size = c.size.or(defaults.size);
742-
let mut defaults = defaults.clone();
743-
defaults.size = reg_size;
727+
let defaults = c.default_register_properties.derive_from(defaults);
744728

745729
let reg_block = register_or_cluster_block(&c.children, &defaults, Some(&mod_name), nightly)?;
746730

src/generate/register.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::svd::{
2-
Access, BitRange, Defaults, EnumeratedValues, Field, Peripheral, Register, RegisterCluster,
2+
Access, BitRange, RegisterProperties, EnumeratedValues, Field, Peripheral, Register, RegisterCluster,
33
Usage, WriteConstraint,
44
};
55
use cast::u64;
@@ -14,7 +14,7 @@ pub fn render(
1414
all_registers: &[&Register],
1515
peripheral: &Peripheral,
1616
all_peripherals: &[Peripheral],
17-
defs: &Defaults,
17+
defs: &RegisterProperties,
1818
) -> Result<Vec<TokenStream>> {
1919
let access = util::access_of(register);
2020
let name = util::name_of(register);

0 commit comments

Comments
 (0)