Skip to content

Commit efe90b0

Browse files
Support registers without a defined reset value
In case no reset value is defined for a register, we suppress generation of the `write`, `reset`, and `reset_value` functions. Register values can still be safely changed using `modify`.
1 parent 441bd42 commit efe90b0

File tree

1 file changed

+33
-30
lines changed

1 file changed

+33
-30
lines changed

src/generate.rs

Lines changed: 33 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -759,19 +759,6 @@ pub fn register(
759759
}
760760

761761
if access == Access::WriteOnly || access == Access::ReadWrite {
762-
reg_impl_items.push(quote! {
763-
/// Writes to the register
764-
#[inline]
765-
pub fn write<F>(&self, f: F)
766-
where
767-
F: FnOnce(&mut W) -> &mut W
768-
{
769-
let mut w = W::reset_value();
770-
f(&mut w);
771-
self.register.set(w.bits);
772-
}
773-
});
774-
775762
mod_items.push(quote! {
776763
/// Value to write to the register
777764
pub struct W {
@@ -782,16 +769,42 @@ pub fn register(
782769
let rv = register
783770
.reset_value
784771
.or(defs.reset_value)
785-
.map(|rv| util::hex(rv))
786-
.ok_or_else(|| format!("Register {} has no reset value", register.name))?;
772+
.map(|rv| util::hex(rv));
787773

788-
w_impl_items.push(quote! {
789-
/// Reset value of the register
790-
#[inline]
791-
pub fn reset_value() -> W {
792-
W { bits: #rv }
774+
if let Some(rv) = rv {
775+
reg_impl_items.push(quote! {
776+
/// Writes to the register
777+
#[inline]
778+
pub fn write<F>(&self, f: F)
779+
where
780+
F: FnOnce(&mut W) -> &mut W
781+
{
782+
let mut w = W::reset_value();
783+
f(&mut w);
784+
self.register.set(w.bits);
785+
}
786+
});
787+
788+
w_impl_items.push(quote! {
789+
/// Reset value of the register
790+
#[inline]
791+
pub fn reset_value() -> W {
792+
W { bits: #rv }
793+
}
794+
});
795+
796+
if access == Access::ReadWrite {
797+
reg_impl_items.push(quote! {
798+
/// Writes the reset value to the register
799+
#[inline]
800+
pub fn reset(&self) {
801+
self.write(|w| w)
802+
}
803+
})
793804
}
805+
}
794806

807+
w_impl_items.push(quote! {
795808
/// Writes raw bits to the register
796809
#[inline]
797810
pub #unsafety fn bits(&mut self, bits: #rty) -> &mut Self {
@@ -801,16 +814,6 @@ pub fn register(
801814
});
802815
}
803816

804-
if access == Access::ReadWrite {
805-
reg_impl_items.push(quote! {
806-
/// Writes the reset value to the register
807-
#[inline]
808-
pub fn reset(&self) {
809-
self.write(|w| w)
810-
}
811-
})
812-
}
813-
814817
mod_items.push(quote! {
815818
impl super::#name_pc {
816819
#(#reg_impl_items)*

0 commit comments

Comments
 (0)