Skip to content

Commit 241b3f7

Browse files
committed
EV enum
1 parent 17092f3 commit 241b3f7

File tree

1 file changed

+63
-55
lines changed

1 file changed

+63
-55
lines changed

src/generate/register.rs

Lines changed: 63 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -510,16 +510,38 @@ fn render_register_mod_debug(
510510
Ok(r_debug_impl)
511511
}
512512

513-
type EV = (EnumeratedValues, Option<EnumPath>);
513+
#[derive(Clone, Copy, Debug)]
514+
pub enum EV<'a> {
515+
New(&'a EnumeratedValues),
516+
Derived(&'a EnumeratedValues, &'a EnumPath),
517+
}
518+
519+
impl<'a> EV<'a> {
520+
fn values(&self) -> &EnumeratedValues {
521+
match self {
522+
Self::New(e) | Self::Derived(e, _) => e,
523+
}
524+
}
525+
}
526+
527+
impl<'a> From<&'a (EnumeratedValues, Option<EnumPath>)> for EV<'a> {
528+
fn from(value: &'a (EnumeratedValues, Option<EnumPath>)) -> Self {
529+
match value.1.as_ref() {
530+
Some(base) => Self::Derived(&value.0, &base),
531+
None => Self::New(&value.0),
532+
}
533+
}
534+
}
514535

536+
#[derive(Clone, Copy, Debug)]
515537
pub enum RWEnum<'a> {
516-
ReadAndWriteEnum(&'a EV),
517-
ReadEnumWriteEnum(&'a EV, &'a EV),
518-
ReadEnumWriteRaw(&'a EV),
519-
ReadRawWriteEnum(&'a EV),
520-
ReadEnum(&'a EV),
538+
ReadAndWriteEnum(EV<'a>),
539+
ReadEnumWriteEnum(EV<'a>, EV<'a>),
540+
ReadEnumWriteRaw(EV<'a>),
541+
ReadRawWriteEnum(EV<'a>),
542+
ReadEnum(EV<'a>),
521543
ReadRaw,
522-
WriteEnum(&'a EV),
544+
WriteEnum(EV<'a>),
523545
WriteRaw,
524546
ReadRawWriteRaw,
525547
}
@@ -549,48 +571,24 @@ impl<'a> RWEnum<'a> {
549571
pub fn can_write(&self) -> bool {
550572
self.read_write() || self.write_only()
551573
}
552-
pub fn read_enum(&self) -> Option<&'a EV> {
553-
match *self {
574+
pub fn read_enum(&self) -> Option<EV<'a>> {
575+
match self {
554576
Self::ReadAndWriteEnum(e)
555577
| Self::ReadEnumWriteEnum(e, _)
556578
| Self::ReadEnumWriteRaw(e)
557-
| Self::ReadEnum(e) => Some(e),
579+
| Self::ReadEnum(e) => Some(*e),
558580
_ => None,
559581
}
560582
}
561-
pub fn write_enum(&self) -> Option<&'a EV> {
562-
match *self {
583+
pub fn write_enum(&self) -> Option<EV<'a>> {
584+
match self {
563585
Self::ReadAndWriteEnum(e)
564586
| Self::ReadEnumWriteEnum(_, e)
565587
| Self::ReadRawWriteEnum(e)
566-
| Self::WriteEnum(e) => Some(e),
588+
| Self::WriteEnum(e) => Some(*e),
567589
_ => None,
568590
}
569591
}
570-
pub fn generate_reader(&self) -> bool {
571-
matches!(
572-
self,
573-
Self::ReadAndWriteEnum((_, None))
574-
| Self::ReadEnumWriteEnum((_, None), _)
575-
| Self::ReadEnumWriteRaw((_, None))
576-
| Self::ReadRawWriteEnum(_)
577-
| Self::ReadEnum((_, None))
578-
| Self::ReadRaw
579-
| Self::ReadRawWriteRaw
580-
)
581-
}
582-
pub fn generate_writer(&self) -> bool {
583-
matches!(
584-
self,
585-
Self::ReadAndWriteEnum((_, None))
586-
| Self::ReadEnumWriteEnum(_, (_, None))
587-
| Self::ReadRawWriteEnum((_, None))
588-
| Self::ReadEnumWriteRaw(_)
589-
| Self::WriteEnum((_, None))
590-
| Self::WriteRaw
591-
| Self::ReadRawWriteRaw
592-
)
593-
}
594592
pub fn generate_write_enum(&self) -> bool {
595593
matches!(
596594
self,
@@ -707,13 +705,13 @@ pub fn fields(
707705
can_write,
708706
lookup_filter(&lookup_results, Usage::Write),
709707
) {
710-
(true, Some(e1), true, Some(e2)) if e1.0 == e2.0 => RWEnum::ReadAndWriteEnum(e1),
711-
(true, Some(e1), true, Some(e2)) => RWEnum::ReadEnumWriteEnum(e1, e2),
712-
(true, Some(e), true, None) => RWEnum::ReadEnumWriteRaw(e),
713-
(true, None, true, Some(e)) => RWEnum::ReadRawWriteEnum(e),
714-
(true, Some(e), false, _) => RWEnum::ReadEnum(e),
708+
(true, Some(e1), true, Some(e2)) if e1.0 == e2.0 => RWEnum::ReadAndWriteEnum(e1.into()),
709+
(true, Some(e1), true, Some(e2)) => RWEnum::ReadEnumWriteEnum(e1.into(), e2.into()),
710+
(true, Some(e), true, None) => RWEnum::ReadEnumWriteRaw(e.into()),
711+
(true, None, true, Some(e)) => RWEnum::ReadRawWriteEnum(e.into()),
712+
(true, Some(e), false, _) => RWEnum::ReadEnum(e.into()),
715713
(true, None, false, _) => RWEnum::ReadRaw,
716-
(false, _, true, Some(e)) => RWEnum::WriteEnum(e),
714+
(false, _, true, Some(e)) => RWEnum::WriteEnum(e.into()),
717715
(false, _, true, None) => RWEnum::WriteRaw,
718716
(true, None, true, None) => RWEnum::ReadRawWriteRaw,
719717
(false, _, false, _) => {
@@ -736,13 +734,18 @@ pub fn fields(
736734
if can_read {
737735
// get the type of value structure. It can be generated from either name field
738736
// in enumeratedValues if it's an enumeration, or from field name directly if it's not.
739-
let value_read_ty = if let Some((evs, _)) = rwenum.read_enum() {
737+
let value_read_ty = if let Some(ev) = rwenum.read_enum() {
740738
let fmt = if rwenum.different_enums() {
741739
"enum_read_name"
742740
} else {
743741
"enum_name"
744742
};
745-
ident(evs.name.as_deref().unwrap_or(&name), config, fmt, span)
743+
ident(
744+
ev.values().name.as_deref().unwrap_or(&name),
745+
config,
746+
fmt,
747+
span,
748+
)
746749
} else {
747750
// raw_field_value_read_ty
748751
fty.clone()
@@ -753,7 +756,7 @@ pub fn fields(
753756

754757
// if this is an enumeratedValues not derived from base, generate the enum structure
755758
// and implement functions for each value in enumeration.
756-
if let Some((evs, None)) = rwenum.read_enum() {
759+
if let Some(EV::New(evs)) = rwenum.read_enum() {
757760
// parse enum variants from enumeratedValues svd record
758761
let mut variants = Variant::from_enumerated_values(evs, config)?;
759762

@@ -889,7 +892,7 @@ pub fn fields(
889892
});
890893
}
891894
}
892-
} else if let Some((_, Some(base))) = rwenum.read_enum() {
895+
} else if let Some(EV::Derived(_, base)) = rwenum.read_enum() {
893896
// only pub use enum when derived from another register.
894897
// If field is in the same register it emits
895898
// pub use enum from same module which is not expected
@@ -913,7 +916,7 @@ pub fn fields(
913916
// name of read proxy type
914917
let reader_ty = ident(&name, config, "field_reader", span);
915918

916-
if rwenum.generate_reader() {
919+
if let Some(EV::New(_)) | None = rwenum.read_enum() {
917920
// Generate the read proxy structure if necessary.
918921

919922
let reader = if width == 1 {
@@ -940,7 +943,7 @@ pub fn fields(
940943
#[doc = #readerdoc]
941944
pub type #reader_ty = #reader;
942945
});
943-
} else if let Some((_, Some(base))) = rwenum.read_enum() {
946+
} else if let Some(EV::Derived(_, base)) = rwenum.read_enum() {
944947
// if this value is derived from a base, generate `pub use` code for each read proxy
945948
// and value if necessary.
946949

@@ -1058,13 +1061,18 @@ pub fn fields(
10581061
// If this field can be written, generate write proxy. Generate write value if it differs from
10591062
// the read value, or else we reuse read value.
10601063
if can_write {
1061-
let value_write_ty = if let Some((evs, _)) = rwenum.write_enum() {
1064+
let value_write_ty = if let Some(ev) = rwenum.write_enum() {
10621065
let fmt = if rwenum.different_enums() {
10631066
"enum_write_name"
10641067
} else {
10651068
"enum_name"
10661069
};
1067-
ident(evs.name.as_deref().unwrap_or(&name), config, fmt, span)
1070+
ident(
1071+
ev.values().name.as_deref().unwrap_or(&name),
1072+
config,
1073+
fmt,
1074+
span,
1075+
)
10681076
} else {
10691077
// raw_field_value_write_ty
10701078
fty.clone()
@@ -1074,7 +1082,7 @@ pub fn fields(
10741082
let mut unsafety = unsafety(f.write_constraint.as_ref(), width);
10751083

10761084
// if we writes to enumeratedValues, generate its structure if it differs from read structure.
1077-
if let Some((evs, None)) = rwenum.write_enum() {
1085+
if let Some(EV::New(evs)) = rwenum.write_enum() {
10781086
// parse variants from enumeratedValues svd record
10791087
let mut variants = Variant::from_enumerated_values(evs, config)?;
10801088
let map = enums_to_map(evs);
@@ -1132,7 +1140,7 @@ pub fn fields(
11321140
}
11331141
});
11341142
}
1135-
} else if let Some((_, Some(base))) = rwenum.write_enum() {
1143+
} else if let Some(EV::Derived(_, base)) = rwenum.write_enum() {
11361144
// If field is in the same register it emits pub use structure from same module.
11371145
if base.register() != fpath.register() {
11381146
if rwenum.generate_write_enum() {
@@ -1158,7 +1166,7 @@ pub fn fields(
11581166
let writer_ty = ident(&name, config, "field_writer", span);
11591167

11601168
// Generate writer structure by type alias to generic write proxy structure.
1161-
if rwenum.generate_writer() {
1169+
if let Some(EV::New(_)) | None = rwenum.write_enum() {
11621170
let proxy = if width == 1 {
11631171
use ModifiedWriteValues::*;
11641172
let wproxy = Ident::new(
@@ -1198,7 +1206,7 @@ pub fn fields(
11981206
#[doc = #field_writer_brief]
11991207
pub type #writer_ty<'a, REG> = #proxy;
12001208
});
1201-
} else if let Some((_, Some(base))) = rwenum.write_enum() {
1209+
} else if let Some(EV::Derived(_, base)) = rwenum.write_enum() {
12021210
// if base.register == None, derive write from the same module. This is allowed because both
12031211
// the generated and source write proxy are in the same module.
12041212
// we never reuse writer for writer in different module does not have the same _SPEC strcuture,

0 commit comments

Comments
 (0)