Skip to content

Commit 9bc5ec6

Browse files
committed
add --ignore_groups
1 parent 1d9f9a6 commit 9bc5ec6

File tree

5 files changed

+49
-27
lines changed

5 files changed

+49
-27
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+
- option `ignore_groups` for optional disabling #506
1213
- [breaking-change] move `const_generic` from features to options
1314
- use `Config` to pass options over all render levels
1415
- Use register iterator from `svd-parser`

src/generate/peripheral.rs

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -442,13 +442,13 @@ fn register_or_cluster_block(
442442
ercs: &[RegisterCluster],
443443
defs: &RegisterProperties,
444444
name: Option<&str>,
445-
_config: &Config,
445+
config: &Config,
446446
) -> Result<TokenStream> {
447447
let mut rbfs = TokenStream::new();
448448
let mut accessors = TokenStream::new();
449449
let mut have_accessors = false;
450450

451-
let ercs_expanded = expand(ercs, defs, name)?;
451+
let ercs_expanded = expand(ercs, defs, name, config)?;
452452

453453
// Locate conflicting regions; we'll need to use unions to represent them.
454454
let mut regions = FieldRegions::default();
@@ -576,13 +576,14 @@ fn expand(
576576
ercs: &[RegisterCluster],
577577
defs: &RegisterProperties,
578578
name: Option<&str>,
579+
config: &Config,
579580
) -> Result<Vec<RegisterBlockField>> {
580581
let mut ercs_expanded = vec![];
581582

582583
for erc in ercs {
583584
ercs_expanded.extend(match &erc {
584-
RegisterCluster::Register(register) => expand_register(register, defs, name)?,
585-
RegisterCluster::Cluster(cluster) => expand_cluster(cluster, defs, name)?,
585+
RegisterCluster::Register(register) => expand_register(register, defs, name, config)?,
586+
RegisterCluster::Cluster(cluster) => expand_cluster(cluster, defs, name, config)?,
586587
});
587588
}
588589

@@ -593,21 +594,25 @@ fn expand(
593594

594595
/// Recursively calculate the size of a cluster. A cluster's size is the maximum
595596
/// end position of its recursive children.
596-
fn cluster_size_in_bits(info: &ClusterInfo, defs: &RegisterProperties) -> Result<u32> {
597+
fn cluster_size_in_bits(
598+
info: &ClusterInfo,
599+
defs: &RegisterProperties,
600+
config: &Config,
601+
) -> Result<u32> {
597602
let mut size = 0;
598603

599604
for c in &info.children {
600605
let end = match c {
601606
RegisterCluster::Register(reg) => {
602-
let reg_size: u32 = expand_register(reg, defs, None)?
607+
let reg_size: u32 = expand_register(reg, defs, None, config)?
603608
.iter()
604609
.map(|rbf| rbf.size)
605610
.sum();
606611

607612
(reg.address_offset * BITS_PER_BYTE) + reg_size
608613
}
609614
RegisterCluster::Cluster(clust) => {
610-
(clust.address_offset * BITS_PER_BYTE) + cluster_size_in_bits(clust, defs)?
615+
(clust.address_offset * BITS_PER_BYTE) + cluster_size_in_bits(clust, defs, config)?
611616
}
612617
};
613618

@@ -621,12 +626,13 @@ fn expand_cluster(
621626
cluster: &Cluster,
622627
defs: &RegisterProperties,
623628
name: Option<&str>,
629+
config: &Config,
624630
) -> Result<Vec<RegisterBlockField>> {
625631
let mut cluster_expanded = vec![];
626632

627633
let defs = cluster.default_register_properties.derive_from(defs);
628634

629-
let cluster_size = cluster_size_in_bits(cluster, &defs)
635+
let cluster_size = cluster_size_in_bits(cluster, &defs, config)
630636
.with_context(|| format!("Cluster {} has no determinable `size` field", cluster.name))?;
631637

632638
match cluster {
@@ -678,6 +684,7 @@ fn expand_register(
678684
register: &Register,
679685
defs: &RegisterProperties,
680686
name: Option<&str>,
687+
config: &Config,
681688
) -> Result<Vec<RegisterBlockField>> {
682689
let mut register_expanded = vec![];
683690

@@ -688,7 +695,7 @@ fn expand_register(
688695

689696
match register {
690697
Register::Single(info) => register_expanded.push(RegisterBlockField {
691-
field: convert_svd_register(register, name)?,
698+
field: convert_svd_register(register, name, config.ignore_groups)?,
692699
description: info.description.clone().unwrap_or_default(),
693700
offset: info.address_offset,
694701
size: register_size,
@@ -708,13 +715,16 @@ fn expand_register(
708715

709716
if array_convertible {
710717
register_expanded.push(RegisterBlockField {
711-
field: convert_svd_register(&register, name)?,
718+
field: convert_svd_register(&register, name, config.ignore_groups)?,
712719
description: info.description.clone().unwrap_or_default(),
713720
offset: info.address_offset,
714721
size: register_size * array_info.dim,
715722
});
716723
} else {
717-
for (field_num, field) in expand_svd_register(register, name)?.iter().enumerate() {
724+
for (field_num, field) in expand_svd_register(register, name, config.ignore_groups)?
725+
.iter()
726+
.enumerate()
727+
{
718728
register_expanded.push(RegisterBlockField {
719729
field: field.clone(),
720730
description: info.description.clone().unwrap_or_default(),
@@ -792,11 +802,12 @@ fn cluster_block(
792802
fn expand_svd_register(
793803
register: &Register,
794804
name: Option<&str>,
805+
ignore_group: bool,
795806
) -> Result<Vec<syn::Field>, syn::Error> {
796807
let mut out = vec![];
797808

798809
match register {
799-
Register::Single(_info) => out.push(convert_svd_register(register, name)?),
810+
Register::Single(_info) => out.push(convert_svd_register(register, name, ignore_group)?),
800811
Register::Array(info, array_info) => {
801812
let indices = array_info
802813
.dim_index
@@ -810,10 +821,10 @@ fn expand_svd_register(
810821
)
811822
});
812823

813-
let ty_name = util::replace_suffix(&info.fullname(), "");
824+
let ty_name = util::replace_suffix(&info.fullname(ignore_group), "");
814825

815826
for (idx, _i) in indices.iter().zip(0..) {
816-
let nb_name = util::replace_suffix(&info.fullname(), idx);
827+
let nb_name = util::replace_suffix(&info.fullname(ignore_group), idx);
817828

818829
let ty = name_to_wrapped_ty(&ty_name, name)?;
819830

@@ -825,17 +836,21 @@ fn expand_svd_register(
825836
}
826837

827838
/// Convert a parsed `Register` into its `Field` equivalent
828-
fn convert_svd_register(register: &Register, name: Option<&str>) -> Result<syn::Field, syn::Error> {
839+
fn convert_svd_register(
840+
register: &Register,
841+
name: Option<&str>,
842+
ignore_group: bool,
843+
) -> Result<syn::Field, syn::Error> {
829844
Ok(match register {
830845
Register::Single(info) => {
831-
let info_name = info.fullname();
846+
let info_name = info.fullname(ignore_group);
832847
new_syn_field(
833848
&info_name.to_sanitized_snake_case(),
834849
name_to_wrapped_ty(&info_name, name)?,
835850
)
836851
}
837852
Register::Array(info, array_info) => {
838-
let nb_name = util::replace_suffix(&info.fullname(), "");
853+
let nb_name = util::replace_suffix(&info.fullname(ignore_group), "");
839854
let ty = syn::Type::Array(parse_str::<syn::TypeArray>(&format!(
840855
"[{};{}]",
841856
name_to_wrapped_ty_str(&nb_name, name),

src/generate/register.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ pub fn render(
2020
config: &Config,
2121
) -> Result<TokenStream> {
2222
let access = util::access_of(register);
23-
let name = util::name_of(register);
23+
let name = util::name_of(register, config.ignore_groups);
2424
let span = Span::call_site();
2525
let name_pc = Ident::new(&name.to_sanitized_upper_case(), span);
2626
let name_uc_spec = Ident::new(&format!("{}_SPEC", &name.to_sanitized_upper_case()), span);

src/main.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ fn run() -> Result<()> {
4343
.arg(Arg::with_name("const_generic").long("const_generic").help(
4444
"Use const generics to generate writers for same fields with different offsets",
4545
))
46+
.arg(
47+
Arg::with_name("ignore_groups")
48+
.long("ignore_groups")
49+
.help("Don't add alternateGroup name as prefix to register name"),
50+
)
4651
.arg(
4752
Arg::with_name("generic_mod")
4853
.long("generic_mod")
@@ -106,6 +111,7 @@ fn run() -> Result<()> {
106111
generic_mod: matches.is_present("generic_mod"),
107112
make_mod,
108113
const_generic: matches.is_present("const_generic"),
114+
ignore_groups: matches.is_present("ignore_groups"),
109115
};
110116

111117
let mut device_x = String::new();

src/util.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ pub struct Config {
2020
pub generic_mod: bool,
2121
pub make_mod: bool,
2222
pub const_generic: bool,
23+
pub ignore_groups: bool,
2324
}
2425

2526
#[allow(clippy::upper_case_acronyms)]
@@ -154,10 +155,10 @@ pub fn escape_brackets(s: &str) -> String {
154155
})
155156
}
156157

157-
pub fn name_of(register: &Register) -> Cow<str> {
158+
pub fn name_of(register: &Register, ignore_group: bool) -> Cow<str> {
158159
match register {
159-
Register::Single(info) => info.fullname(),
160-
Register::Array(info, _) => replace_suffix(&info.fullname(), "").into(),
160+
Register::Single(info) => info.fullname(ignore_group),
161+
Register::Array(info, _) => replace_suffix(&info.fullname(ignore_group), "").into(),
161162
}
162163
}
163164

@@ -343,15 +344,14 @@ pub fn build_rs() -> TokenStream {
343344
}
344345

345346
pub trait FullName {
346-
fn fullname(&self) -> Cow<str>;
347+
fn fullname(&self, ignore_group: bool) -> Cow<str>;
347348
}
348349

349350
impl FullName for RegisterInfo {
350-
fn fullname(&self) -> Cow<str> {
351-
if let Some(group) = &self.alternate_group {
352-
format!("{}_{}", group, self.name).into()
353-
} else {
354-
self.name.as_str().into()
351+
fn fullname(&self, ignore_group: bool) -> Cow<str> {
352+
match &self.alternate_group {
353+
Some(group) if !ignore_group => format!("{}_{}", group, self.name).into(),
354+
_ => self.name.as_str().into(),
355355
}
356356
}
357357
}

0 commit comments

Comments
 (0)