Skip to content

Commit 25c35b6

Browse files
authored
Merge pull request #814 from rust-embedded/enum_read_name
add enum_read_name
2 parents d8f1468 + 9a87eae commit 25c35b6

File tree

6 files changed

+67
-96
lines changed

6 files changed

+67
-96
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
1111
- generic unsafe `W::bits` + safe `W::set`
1212
- Add `base-address-shift` config flag
1313
- Use `PascalCase` for type idents, fix case changing bugs, add `--ident-format` (`-f`) option flag
14+
- Add `enum_read_name` for `read-only` enums
1415

1516
## [v0.31.5] - 2024-01-04
1617

Cargo.lock

Lines changed: 30 additions & 49 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ yaml = ["dep:serde_yaml"]
4545
[dependencies]
4646
clap = { version = "4.0", optional = true }
4747
irx-config = { version = "=3.3.0", features = ["cmd", "toml-parser"], optional = true }
48-
env_logger = { version = "0.10", optional = true }
48+
env_logger = { version = "0.11", optional = true }
4949
inflections = "1.1"
5050
log = { version = "~0.4", features = ["std"] }
5151
quote = "1.0"
@@ -55,7 +55,7 @@ thiserror = "1.0"
5555
serde = { version = "1.0", optional = true }
5656
serde_json = { version = "1.0.85", optional = true }
5757
serde_yaml = { version = "0.9.11", optional = true }
58-
regex = "1.9.0"
58+
regex = "1.10.0"
5959
html-escape = "0.2"
6060

6161
[dependencies.svd-parser]
@@ -64,7 +64,7 @@ version = "0.14.5"
6464

6565
[dependencies.svd-rs]
6666
features = ["serde"]
67-
version = "0.14.7"
67+
version = "0.14.8"
6868

6969
[dependencies.syn]
7070
version = "2.0"

src/config.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@ impl IdentFormats {
250250
("field_reader".into(), pascal.clone().suffix("R")),
251251
("field_writer".into(), pascal.clone().suffix("W")),
252252
("enum_name".into(), pascal.clone()),
253+
("enum_read_name".into(), pascal.clone()),
253254
("enum_write_name".into(), pascal.clone().suffix("WO")),
254255
("enum_value".into(), pascal.clone()),
255256
("interrupt".into(), IdentFormat::default()),
@@ -273,6 +274,7 @@ impl IdentFormats {
273274
("field_reader".into(), constant.clone().suffix("_R")),
274275
("field_writer".into(), constant.clone().suffix("_W")),
275276
("enum_name".into(), constant.clone().suffix("_A")),
277+
("enum_read_name".into(), constant.clone().suffix("_A")),
276278
("enum_write_name".into(), constant.clone().suffix("_AW")),
277279
("enum_value".into(), constant.clone()),
278280
("interrupt".into(), constant.clone()),

src/generate/register.rs

Lines changed: 30 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -612,7 +612,14 @@ pub fn fields(
612612
lookup_results.push((ev, epath));
613613
}
614614

615-
let mut evs_r = None;
615+
let read_enum = lookup_filter(&lookup_results, Usage::Read);
616+
let write_enum = lookup_filter(&lookup_results, Usage::Write);
617+
618+
// does the read and the write value has the same name? If we have the same,
619+
// we can reuse read value type other than generating a new one.
620+
let writer_reader_different_enum = !(can_read
621+
&& can_write
622+
&& matches!((read_enum, write_enum), (Some(e1), Some(e2)) if e1.0 == e2.0));
616623

617624
let brief_suffix = if let Field::Array(_, de) = &f {
618625
if let Some(range) = de.indexes_as_range() {
@@ -652,14 +659,13 @@ pub fn fields(
652659

653660
// get the type of value structure. It can be generated from either name field
654661
// in enumeratedValues if it's an enumeration, or from field name directly if it's not.
655-
let value_read_ty = if let Some((evs, _)) = lookup_filter(&lookup_results, Usage::Read)
656-
{
657-
ident(
658-
evs.name.as_deref().unwrap_or(&name),
659-
config,
660-
"enum_name",
661-
span,
662-
)
662+
let value_read_ty = if let Some((evs, _)) = read_enum {
663+
let fmt = if writer_reader_different_enum {
664+
"enum_read_name"
665+
} else {
666+
"enum_name"
667+
};
668+
ident(evs.name.as_deref().unwrap_or(&name), config, fmt, span)
663669
} else {
664670
// raw_field_value_read_ty
665671
fty.clone()
@@ -674,10 +680,7 @@ pub fn fields(
674680
// information in enumeratedValues;
675681
// if it's not enumeratedValues, always derive the read proxy as we do not need to re-export
676682
// it again from BitReader or FieldReader.
677-
let should_derive_reader = matches!(
678-
lookup_filter(&lookup_results, Usage::Read),
679-
Some((_, None)) | None
680-
);
683+
let should_derive_reader = matches!(read_enum, Some((_, None)) | None);
681684

682685
// derive the read proxy structure if necessary.
683686
if should_derive_reader {
@@ -712,11 +715,7 @@ pub fn fields(
712715

713716
// if this is an enumeratedValues not derived from base, generate the enum structure
714717
// and implement functions for each value in enumeration.
715-
if let Some((evs, None)) = lookup_filter(&lookup_results, Usage::Read) {
716-
// we have enumeration for read, record this. If the enumeration for write operation
717-
// later on is the same as the read enumeration, we reuse and do not generate again.
718-
evs_r = Some(evs);
719-
718+
if let Some((evs, None)) = read_enum {
720719
// parse enum variants from enumeratedValues svd record
721720
let mut variants = Variant::from_enumerated_values(evs, config)?;
722721

@@ -856,9 +855,7 @@ pub fn fields(
856855

857856
// if this value is derived from a base, generate `pub use` code for each read proxy and value
858857
// if necessary.
859-
if let Some((evs, Some(base))) = lookup_filter(&lookup_results, Usage::Read) {
860-
// preserve value; if read type equals write type, writer would not generate value type again
861-
evs_r = Some(evs);
858+
if let Some((_, Some(base))) = read_enum {
862859
// generate pub use field_1 reader as field_2 reader
863860
let base_field = util::replace_suffix(&base.field.name, "");
864861
let base_r = ident(&base_field, config, "field_reader", span);
@@ -969,19 +966,17 @@ pub fn fields(
969966
// gets a brief of write proxy
970967
let field_writer_brief = format!("Field `{name}{brief_suffix}` writer - {description}");
971968

972-
let value_write_ty =
973-
if let Some((evs, _)) = lookup_filter(&lookup_results, Usage::Write) {
974-
let writer_reader_different_enum = evs_r != Some(evs);
975-
let fmt = if writer_reader_different_enum {
976-
"enum_write_name"
977-
} else {
978-
"enum_name"
979-
};
980-
ident(evs.name.as_deref().unwrap_or(&name), config, fmt, span)
969+
let value_write_ty = if let Some((evs, _)) = write_enum {
970+
let fmt = if writer_reader_different_enum {
971+
"enum_write_name"
981972
} else {
982-
// raw_field_value_write_ty
983-
fty.clone()
973+
"enum_name"
984974
};
975+
ident(evs.name.as_deref().unwrap_or(&name), config, fmt, span)
976+
} else {
977+
// raw_field_value_write_ty
978+
fty.clone()
979+
};
985980

986981
// name of write proxy type
987982
let writer_ty = ident(&name, config, "field_writer", span);
@@ -990,7 +985,7 @@ pub fn fields(
990985
let mut unsafety = unsafety(f.write_constraint.as_ref(), width);
991986

992987
// if we writes to enumeratedValues, generate its structure if it differs from read structure.
993-
if let Some((evs, None)) = lookup_filter(&lookup_results, Usage::Write) {
988+
if let Some((evs, None)) = write_enum {
994989
// parse variants from enumeratedValues svd record
995990
let mut variants = Variant::from_enumerated_values(evs, config)?;
996991
let map = enums_to_map(evs);
@@ -1011,10 +1006,6 @@ pub fn fields(
10111006
unsafety = false;
10121007
}
10131008

1014-
// does the read and the write value has the same name? If we have the same,
1015-
// we can reuse read value type other than generating a new one.
1016-
let writer_reader_different_enum = evs_r != Some(evs);
1017-
10181009
// generate write value structure and From conversation if we can't reuse read value structure.
10191010
if writer_reader_different_enum {
10201011
if variants.is_empty() {
@@ -1056,10 +1047,7 @@ pub fn fields(
10561047

10571048
// derive writer. We derive writer if the write proxy is in current register module,
10581049
// or writer in different register have different _SPEC structures
1059-
let should_derive_writer = matches!(
1060-
lookup_filter(&lookup_results, Usage::Write),
1061-
Some((_, None)) | None
1062-
);
1050+
let should_derive_writer = matches!(write_enum, Some((_, None)) | None);
10631051

10641052
// derive writer structure by type alias to generic write proxy structure.
10651053
if should_derive_writer {
@@ -1128,7 +1116,7 @@ pub fn fields(
11281116
});
11291117
}
11301118

1131-
if let Some((evs, Some(base))) = lookup_filter(&lookup_results, Usage::Write) {
1119+
if let Some((_, Some(base))) = write_enum {
11321120
// if base.register == None, derive write from the same module. This is allowed because both
11331121
// the generated and source write proxy are in the same module.
11341122
// we never reuse writer for writer in different module does not have the same _SPEC strcuture,
@@ -1147,7 +1135,6 @@ pub fn fields(
11471135
}
11481136
// if base.register == None, it emits pub use structure from same module.
11491137
if base.register() != fpath.register() {
1150-
let writer_reader_different_enum = evs_r != Some(evs);
11511138
if writer_reader_different_enum {
11521139
// use the same enum structure name
11531140
if !writer_enum_derives.contains(&value_write_ty) {

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -564,7 +564,7 @@
564564
//! |--------------------------------------------------------------------------------|:------:|:---------:|:---------:|:------:|:-----------:|
565565
//! | field_reader | | pascal | constant | R | _R |
566566
//! | field_writer | | pascal | constant | W | _W |
567-
//! | enum_name | | pascal | constant | | _A |
567+
//! | enum_name <br> enum_read_name | | pascal | constant | | _A |
568568
//! | enum_write_name | | pascal | constant | WO | _AW |
569569
//! | enum_value | | pascal | constant | | |
570570
//! | interrupt | | unchanged | constant | | |

0 commit comments

Comments
 (0)