Skip to content

Commit e63aaa7

Browse files
committed
use expend_properties
1 parent 2669746 commit e63aaa7

File tree

8 files changed

+48
-99
lines changed

8 files changed

+48
-99
lines changed

CHANGELOG.md

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

88
## [Unreleased]
99

10+
- Use `expand_properties` from `svd-parser`
1011
- Use modifiedWriteValues for 1-bitwise fields if present
1112
- Use generic `FieldWriter`, `FieldReader`, `BitWriter`, `BitReader`
1213
- Disable two clippy warnings in `array_proxy.rs`

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ serde_json = "1.0.79"
4949
serde_yaml = "0.8.23"
5050

5151
[dependencies.svd-parser]
52-
features = ["derive-from"]
53-
version = "0.13.2"
52+
features = ["expand"]
53+
version = "0.13.3"
5454

5555
[dependencies.svd-rs]
5656
features = ["serde"]

ci/script.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,7 @@ main() {
491491
echo 'version = "0.3.0"' >> $td/Cargo.toml
492492

493493
# Test MSP430
494-
#test_svd_for_target msp430 https://raw.githubusercontent.com/pftbest/msp430g2553/v0.3.0-svd/msp430g2553.svd
494+
test_svd_for_target msp430 https://raw.githubusercontent.com/pftbest/msp430g2553/v0.3.0-svd/msp430g2553.svd
495495
;;
496496

497497
# Community-provided RISC-V SVDs

src/generate/device.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ pub fn render(d: &Device, config: &Config, device_x: &mut String) -> Result<Toke
213213
}
214214

215215
debug!("Rendering peripheral {}", p.name);
216-
match peripheral::render(p, &d.peripherals, &d.default_register_properties, config) {
216+
match peripheral::render(p, &d.peripherals, config) {
217217
Ok(periph) => out.extend(periph),
218218
Err(e) => {
219219
let descrip = p.description.as_deref().unwrap_or("No description");

src/generate/peripheral.rs

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

55
use crate::svd::{
66
array::names, Cluster, ClusterInfo, DeriveFrom, DimElement, Peripheral, Register,
7-
RegisterCluster, RegisterProperties,
7+
RegisterCluster,
88
};
99
use log::{debug, trace, warn};
1010
use proc_macro2::{Ident, Punct, Spacing, Span, TokenStream};
@@ -22,7 +22,6 @@ use crate::generate::register;
2222
pub fn render(
2323
p_original: &Peripheral,
2424
all_peripherals: &[Peripheral],
25-
defaults: &RegisterProperties,
2625
config: &Config,
2726
) -> Result<TokenStream> {
2827
let mut out = TokenStream::new();
@@ -213,28 +212,26 @@ pub fn render(
213212
return Ok(TokenStream::new());
214213
}
215214

216-
let defaults = p.default_register_properties.derive_from(defaults);
217-
218215
// Push any register or cluster blocks into the output
219216
debug!(
220217
"Pushing {} register or cluster blocks into output",
221218
ercs.len()
222219
);
223220
let mut mod_items = TokenStream::new();
224-
mod_items.extend(register_or_cluster_block(&ercs, &defaults, None, config)?);
221+
mod_items.extend(register_or_cluster_block(&ercs, None, config)?);
225222

226223
debug!("Pushing cluster information into output");
227224
// Push all cluster related information into the peripheral module
228225
for c in &clusters {
229226
trace!("Cluster: {}", c.name);
230-
mod_items.extend(cluster_block(c, &defaults, p, all_peripherals, config)?);
227+
mod_items.extend(cluster_block(c, p, all_peripherals, config)?);
231228
}
232229

233230
debug!("Pushing register information into output");
234231
// Push all register related information into the peripheral module
235232
for reg in registers {
236233
trace!("Register: {}", reg.name);
237-
match register::render(reg, registers, p, all_peripherals, &defaults, config) {
234+
match register::render(reg, registers, p, all_peripherals, config) {
238235
Ok(rendered_reg) => mod_items.extend(rendered_reg),
239236
Err(e) => {
240237
let res: Result<TokenStream> = Err(e);
@@ -504,15 +501,14 @@ fn make_comment(size: u32, offset: u32, description: &str) -> String {
504501

505502
fn register_or_cluster_block(
506503
ercs: &[RegisterCluster],
507-
defs: &RegisterProperties,
508504
name: Option<&str>,
509505
config: &Config,
510506
) -> Result<TokenStream> {
511507
let mut rbfs = TokenStream::new();
512508
let mut accessors = TokenStream::new();
513509

514-
let ercs_expanded = expand(ercs, defs, name, config)
515-
.with_context(|| "Could not expand register or cluster block")?;
510+
let ercs_expanded =
511+
expand(ercs, name, config).with_context(|| "Could not expand register or cluster block")?;
516512

517513
// Locate conflicting regions; we'll need to use unions to represent them.
518514
let mut regions = FieldRegions::default();
@@ -640,7 +636,6 @@ fn register_or_cluster_block(
640636
/// `RegisterBlockField`s containing `Field`s.
641637
fn expand(
642638
ercs: &[RegisterCluster],
643-
defs: &RegisterProperties,
644639
name: Option<&str>,
645640
config: &Config,
646641
) -> Result<Vec<RegisterBlockField>> {
@@ -649,34 +644,26 @@ fn expand(
649644
debug!("Expanding registers or clusters into Register Block Fields");
650645
for erc in ercs {
651646
match &erc {
652-
RegisterCluster::Register(register) => {
653-
match expand_register(register, defs, name, config) {
654-
Ok(expanded_reg) => {
655-
trace!("Register: {}", register.name);
656-
ercs_expanded.extend(expanded_reg);
657-
}
658-
Err(e) => {
659-
let res = Err(e);
660-
return handle_reg_error("Error expanding register", register, res);
661-
}
647+
RegisterCluster::Register(register) => match expand_register(register, name, config) {
648+
Ok(expanded_reg) => {
649+
trace!("Register: {}", register.name);
650+
ercs_expanded.extend(expanded_reg);
662651
}
663-
}
664-
RegisterCluster::Cluster(cluster) => {
665-
match expand_cluster(cluster, defs, name, config) {
666-
Ok(expanded_cluster) => {
667-
trace!("Cluster: {}", cluster.name);
668-
ercs_expanded.extend(expanded_cluster);
669-
}
670-
Err(e) => {
671-
let res = Err(e);
672-
return handle_cluster_error(
673-
"Error expanding register cluster",
674-
cluster,
675-
res,
676-
);
677-
}
652+
Err(e) => {
653+
let res = Err(e);
654+
return handle_reg_error("Error expanding register", register, res);
678655
}
679-
}
656+
},
657+
RegisterCluster::Cluster(cluster) => match expand_cluster(cluster, name, config) {
658+
Ok(expanded_cluster) => {
659+
trace!("Cluster: {}", cluster.name);
660+
ercs_expanded.extend(expanded_cluster);
661+
}
662+
Err(e) => {
663+
let res = Err(e);
664+
return handle_cluster_error("Error expanding register cluster", cluster, res);
665+
}
666+
},
680667
};
681668
}
682669

@@ -688,13 +675,9 @@ fn expand(
688675
/// Calculate the size of a Cluster. If it is an array, then the dimensions
689676
/// tell us the size of the array. Otherwise, inspect the contents using
690677
/// [cluster_info_size_in_bits].
691-
fn cluster_size_in_bits(
692-
cluster: &Cluster,
693-
defs: &RegisterProperties,
694-
config: &Config,
695-
) -> Result<u32> {
678+
fn cluster_size_in_bits(cluster: &Cluster, config: &Config) -> Result<u32> {
696679
match cluster {
697-
Cluster::Single(info) => cluster_info_size_in_bits(info, defs, config),
680+
Cluster::Single(info) => cluster_info_size_in_bits(info, config),
698681
// If the contained array cluster has a mismatch between the
699682
// dimIncrement and the size of the array items, then the array
700683
// will get expanded in expand_cluster below. The overall size
@@ -704,33 +687,29 @@ fn cluster_size_in_bits(
704687
return Ok(0); // Special case!
705688
}
706689
let last_offset = (dim.dim - 1) * dim.dim_increment * BITS_PER_BYTE;
707-
let last_size = cluster_info_size_in_bits(info, defs, config);
690+
let last_size = cluster_info_size_in_bits(info, config);
708691
Ok(last_offset + last_size?)
709692
}
710693
}
711694
}
712695

713696
/// Recursively calculate the size of a ClusterInfo. A cluster's size is the
714697
/// maximum end position of its recursive children.
715-
fn cluster_info_size_in_bits(
716-
info: &ClusterInfo,
717-
defs: &RegisterProperties,
718-
config: &Config,
719-
) -> Result<u32> {
698+
fn cluster_info_size_in_bits(info: &ClusterInfo, config: &Config) -> Result<u32> {
720699
let mut size = 0;
721700

722701
for c in &info.children {
723702
let end = match c {
724703
RegisterCluster::Register(reg) => {
725-
let reg_size: u32 = expand_register(reg, defs, None, config)?
704+
let reg_size: u32 = expand_register(reg, None, config)?
726705
.iter()
727706
.map(|rbf| rbf.size)
728707
.sum();
729708

730709
(reg.address_offset * BITS_PER_BYTE) + reg_size
731710
}
732711
RegisterCluster::Cluster(clust) => {
733-
(clust.address_offset * BITS_PER_BYTE) + cluster_size_in_bits(clust, defs, config)?
712+
(clust.address_offset * BITS_PER_BYTE) + cluster_size_in_bits(clust, config)?
734713
}
735714
};
736715

@@ -742,15 +721,12 @@ fn cluster_info_size_in_bits(
742721
/// Render a given cluster (and any children) into `RegisterBlockField`s
743722
fn expand_cluster(
744723
cluster: &Cluster,
745-
defs: &RegisterProperties,
746724
name: Option<&str>,
747725
config: &Config,
748726
) -> Result<Vec<RegisterBlockField>> {
749727
let mut cluster_expanded = vec![];
750728

751-
let defs = cluster.default_register_properties.derive_from(defs);
752-
753-
let cluster_size = cluster_info_size_in_bits(cluster, &defs, config)
729+
let cluster_size = cluster_info_size_in_bits(cluster, config)
754730
.with_context(|| format!("Cluster {} has no determinable `size` field", cluster.name))?;
755731

756732
match cluster {
@@ -851,7 +827,6 @@ fn expand_cluster(
851827
/// numeral indexes, or not containing all elements from 0 to size) they will be expanded
852828
fn expand_register(
853829
register: &Register,
854-
defs: &RegisterProperties,
855830
name: Option<&str>,
856831
config: &Config,
857832
) -> Result<Vec<RegisterBlockField>> {
@@ -860,7 +835,6 @@ fn expand_register(
860835
let register_size = register
861836
.properties
862837
.size
863-
.or(defs.size)
864838
.ok_or_else(|| anyhow!("Register {} has no `size` field", register.name))?;
865839

866840
match register {
@@ -961,7 +935,6 @@ fn expand_register(
961935
/// Render a Cluster Block into `TokenStream`
962936
fn cluster_block(
963937
c: &Cluster,
964-
defaults: &RegisterProperties,
965938
p: &Peripheral,
966939
all_peripherals: &[Peripheral],
967940
config: &Config,
@@ -982,14 +955,12 @@ fn cluster_block(
982955
);
983956
let name_sc = Ident::new(&mod_name.to_sanitized_snake_case(), Span::call_site());
984957

985-
let defaults = c.default_register_properties.derive_from(defaults);
986-
987-
let reg_block = register_or_cluster_block(&c.children, &defaults, Some(&mod_name), config)?;
958+
let reg_block = register_or_cluster_block(&c.children, Some(&mod_name), config)?;
988959

989960
// Generate definition for each of the registers.
990961
let registers = util::only_registers(&c.children);
991962
for reg in &registers {
992-
match register::render(reg, &registers, p, all_peripherals, &defaults, config) {
963+
match register::render(reg, &registers, p, all_peripherals, config) {
993964
Ok(rendered_reg) => mod_items.extend(rendered_reg),
994965
Err(e) => {
995966
let res: Result<TokenStream> = Err(e);
@@ -1005,7 +976,7 @@ fn cluster_block(
1005976
// Generate the sub-cluster blocks.
1006977
let clusters = util::only_clusters(&c.children);
1007978
for c in &clusters {
1008-
mod_items.extend(cluster_block(c, &defaults, p, all_peripherals, config)?);
979+
mod_items.extend(cluster_block(c, p, all_peripherals, config)?);
1009980
}
1010981

1011982
Ok(quote! {

src/generate/register.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::svd::{
2-
Access, BitRange, DeriveFrom, EnumeratedValues, Field, ModifiedWriteValues, Peripheral,
3-
ReadAction, Register, RegisterProperties, Usage, WriteConstraint,
2+
Access, BitRange, EnumeratedValues, Field, ModifiedWriteValues, Peripheral, ReadAction,
3+
Register, RegisterProperties, Usage, WriteConstraint,
44
};
55
use cast::u64;
66
use core::u64;
@@ -18,10 +18,9 @@ pub fn render(
1818
all_registers: &[&Register],
1919
peripheral: &Peripheral,
2020
all_peripherals: &[Peripheral],
21-
defs: &RegisterProperties,
2221
config: &Config,
2322
) -> Result<TokenStream> {
24-
let properties = register.properties.derive_from(defs);
23+
let properties = &register.properties;
2524
let access = util::access_of(&properties, register.fields.as_deref());
2625
let name = util::name_of(register, config.ignore_groups);
2726
let span = Span::call_site();

src/lib.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,7 @@ pub fn load_from(input: &str, config: &crate::util::Config) -> Result<svd::Devic
570570
use self::util::SourceType;
571571
use svd_parser::ValidateLevel;
572572

573-
Ok(match config.source_type {
573+
let mut device = match config.source_type {
574574
SourceType::Xml => {
575575
let mut parser_config = svd_parser::Config::default();
576576
parser_config.validate_level = if config.strict {
@@ -586,7 +586,9 @@ pub fn load_from(input: &str, config: &crate::util::Config) -> Result<svd::Devic
586586
.with_context(|| "Error parsing SVD YAML file".to_string())?,
587587
SourceType::Json => serde_json::from_str(input)
588588
.with_context(|| "Error parsing SVD JSON file".to_string())?,
589-
})
589+
};
590+
svd_parser::expand_properties(&mut device);
591+
Ok(device)
590592
}
591593

592594
/// Assigns a handler to an interrupt

src/util.rs

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -454,38 +454,14 @@ fn handle_erc_error<T>(msg: &str, name: &str, descrip: &str, res: Result<T>) ->
454454

455455
pub fn get_register_sizes(d: &Device) -> HashSet<u32> {
456456
let mut reg_sizes = HashSet::new();
457-
if let Some(size) = d.default_register_properties.size {
458-
reg_sizes.insert(size);
459-
}
460457
for p in &d.peripherals {
461-
if let Some(size) = p.default_register_properties.size {
462-
reg_sizes.insert(size);
463-
}
464-
if let Some(chilren) = &p.registers {
465-
for rc in chilren {
466-
get_register_sizes_in_register_cluster(&mut reg_sizes, rc);
467-
}
468-
}
469-
}
470-
reg_sizes
471-
}
472-
473-
fn get_register_sizes_in_register_cluster(reg_sizes: &mut HashSet<u32>, rc: &RegisterCluster) {
474-
match rc {
475-
RegisterCluster::Cluster(c) => {
476-
if let Some(size) = c.default_register_properties.size {
477-
reg_sizes.insert(size);
478-
for rc in &c.children {
479-
get_register_sizes_in_register_cluster(reg_sizes, rc);
480-
}
481-
}
482-
}
483-
RegisterCluster::Register(r) => {
458+
for r in p.all_registers() {
484459
if let Some(size) = r.properties.size {
485460
reg_sizes.insert(size);
486461
}
487462
}
488463
}
464+
reg_sizes
489465
}
490466

491467
pub trait FullName {

0 commit comments

Comments
 (0)