Skip to content

Commit 220ea14

Browse files
committed
enum descriptions
1 parent 0840ace commit 220ea14

File tree

2 files changed

+33
-26
lines changed

2 files changed

+33
-26
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
1111

1212
- Handling of missing register description (optional field)
1313

14+
- Improve field enum docs
15+
1416
## [v0.16.0] - 2019-08-05
1517

1618
### Added

src/generate/register.rs

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -59,17 +59,17 @@ pub fn render(
5959
methods.push("read");
6060
}
6161

62+
let res_val = register
63+
.reset_value
64+
.or(defs.reset_value)
65+
.map(|v| v as u64);
6266
if can_write {
6367
let desc = format!("Writer for register {}", register.name);
6468
mod_items.push(quote! {
6569
#[doc = #desc]
6670
pub type W = crate::W<#rty, super::#name_pc>;
6771
});
68-
let res_val = register
69-
.reset_value
70-
.or(defs.reset_value)
71-
.map(|v| util::hex(v as u64));
72-
if let Some(rv) = res_val {
72+
if let Some(rv) = res_val.map(util::hex) {
7373
let doc = format!("Register {} `reset()`'s with value {}", register.name, &rv);
7474
mod_items.push(quote! {
7575
#[doc = #doc]
@@ -106,6 +106,7 @@ pub fn render(
106106
peripheral,
107107
all_peripherals,
108108
&rty,
109+
res_val,
109110
access,
110111
&mut mod_items,
111112
&mut r_impl_items,
@@ -206,6 +207,7 @@ pub fn fields(
206207
peripheral: &Peripheral,
207208
all_peripherals: &[Peripheral],
208209
rty: &Ident,
210+
reset_value: Option<u64>,
209211
access: Access,
210212
mod_items: &mut Vec<Tokens>,
211213
r_impl_items: &mut Vec<Tokens>,
@@ -240,6 +242,7 @@ pub fn fields(
240242
description.push_str(" - ");
241243
description.push_str(&*util::respace(&util::escape_brackets(d)));
242244
}
245+
243246
Ok(F {
244247
_pc_w,
245248
_sc,
@@ -252,9 +255,9 @@ pub fn fields(
252255
access: f.access,
253256
evs: &f.enumerated_values,
254257
sc: Ident::from(&*sc),
255-
mask: util::hex(1u64.wrapping_neg() >> (64-width)),
258+
mask: 1u64.wrapping_neg() >> (64-width),
256259
name: &f.name,
257-
offset: util::unsuffixed(u64::from(f.bit_range.offset)),
260+
offset: u64::from(offset),
258261
ty: width.to_ty()?,
259262
write_constraint: f.write_constraint.as_ref(),
260263
})
@@ -272,8 +275,9 @@ pub fn fields(
272275
let can_write = (access != Access::ReadOnly) && (f.access != Some(Access::ReadOnly));
273276

274277
let bits = &f.bits;
275-
let mask = &f.mask;
276-
let offset: usize = f.offset.parse().unwrap();
278+
let mask = &util::hex(f.mask);
279+
let offset = f.offset;
280+
let rv = reset_value.map(|rv| (rv >> offset) & f.mask);
277281
let fty = &f.ty;
278282

279283
let lookup_results = lookup(
@@ -294,6 +298,7 @@ pub fn fields(
294298

295299
let _pc_r = &f._pc_r;
296300
let _pc_w = &f._pc_w;
301+
let description = &util::escape_brackets(&f.description);
297302

298303
if can_read {
299304
let cast = if f.width == 1 {
@@ -302,7 +307,7 @@ pub fn fields(
302307
quote! { as #fty }
303308
};
304309
let value = if offset != 0 {
305-
let offset = &f.offset;
310+
let offset = &util::unsuffixed(offset);
306311
quote! {
307312
((self.bits >> #offset) & #mask) #cast
308313
}
@@ -315,7 +320,6 @@ pub fn fields(
315320
if let Some((evs, base)) = lookup_filter(&lookup_results, Usage::Read) {
316321
evs_r = Some(evs.clone());
317322

318-
let description = &util::escape_brackets(&f.description);
319323
let sc = &f.sc;
320324
r_impl_items.push(quote! {
321325
#[doc = #description]
@@ -328,7 +332,7 @@ pub fn fields(
328332
base_pc_w = base.as_ref().map(|base| {
329333
let pc = base.field.to_sanitized_upper_case();
330334
let base_pc_r = Ident::from(&*format!("{}_A", pc));
331-
let base_pc_r = derive_from_base(mod_items, &base, &pc_r, &base_pc_r, f.name);
335+
let base_pc_r = derive_from_base(mod_items, &base, &pc_r, &base_pc_r, description);
332336

333337
let doc = format!("Reader of field `{}`", f.name);
334338
mod_items.push(quote! {
@@ -343,7 +347,7 @@ pub fn fields(
343347
let has_reserved_variant = evs.values.len() != (1 << f.width);
344348
let variants = Variant::from_enumerated_values(evs)?;
345349

346-
add_from_variants(mod_items, &variants, pc_r, &f);
350+
add_from_variants(mod_items, &variants, pc_r, &f, description, rv);
347351

348352
let mut enum_items = vec![];
349353

@@ -425,7 +429,6 @@ pub fn fields(
425429
}
426430

427431
} else {
428-
let description = &util::escape_brackets(&f.description);
429432
let sc = &f.sc;
430433
r_impl_items.push(quote! {
431434
#[doc = #description]
@@ -463,11 +466,11 @@ pub fn fields(
463466
base_pc_w = base.as_ref().map(|base| {
464467
let pc = base.field.to_sanitized_upper_case();
465468
let base_pc_w = Ident::from(&*format!("{}_AW", pc));
466-
derive_from_base(mod_items, &base, &pc_w, &base_pc_w, f.name)
469+
derive_from_base(mod_items, &base, &pc_w, &base_pc_w, description)
467470
});
468471

469472
if base.is_none() {
470-
add_from_variants(mod_items, &variants, pc_w, &f);
473+
add_from_variants(mod_items, &variants, pc_w, &f, description, rv);
471474
}
472475
}
473476

@@ -523,7 +526,7 @@ pub fn fields(
523526
}
524527

525528
proxy_items.push(if offset != 0 {
526-
let offset = &f.offset;
529+
let offset = &util::unsuffixed(offset);
527530
quote! {
528531
///Writes raw bits to the field
529532
#[inline(always)]
@@ -555,7 +558,6 @@ pub fn fields(
555558
}
556559
});
557560

558-
let description = &util::escape_brackets(&f.description);
559561
let sc = &f.sc;
560562
w_impl_items.push(quote! {
561563
#[doc = #description]
@@ -622,14 +624,13 @@ impl Variant {
622624
}
623625
}
624626

625-
fn add_from_variants(mod_items: &mut Vec<Tokens>, variants: &Vec<Variant>, pc: &Ident, f: &F) {
627+
fn add_from_variants(mod_items: &mut Vec<Tokens>, variants: &Vec<Variant>, pc: &Ident, f: &F, desc: &str, reset_value: Option<u64>) {
626628
let fty = &f.ty;
627-
let desc = format!("Possible values of the field `{}`", f.name);
628629

629630
let vars = variants
630631
.iter()
631632
.map(|v| {
632-
let desc = util::escape_brackets(&v.doc);
633+
let desc = util::escape_brackets(&format!("{}: {}", v.value, v.doc));
633634
let pcv = &v.pc;
634635
quote! {
635636
#[doc = #desc]
@@ -638,6 +639,12 @@ fn add_from_variants(mod_items: &mut Vec<Tokens>, variants: &Vec<Variant>, pc: &
638639
})
639640
.collect::<Vec<_>>();
640641

642+
let desc = if let Some(rv) = reset_value {
643+
format!("{}\n\nValue on reset: {}", desc, rv)
644+
} else {
645+
desc.to_owned()
646+
};
647+
641648
mod_items.push(quote! {
642649
#[doc = #desc]
643650
#[derive(Clone, Copy, Debug, PartialEq)]
@@ -667,9 +674,7 @@ fn add_from_variants(mod_items: &mut Vec<Tokens>, variants: &Vec<Variant>, pc: &
667674
});
668675
}
669676

670-
fn derive_from_base(mod_items: &mut Vec<Tokens>, base: &Base, pc: &Ident, base_pc: &Ident, fname: &str) -> quote::Tokens {
671-
let desc = format!("Possible values of the field `{}`", fname,);
672-
677+
fn derive_from_base(mod_items: &mut Vec<Tokens>, base: &Base, pc: &Ident, base_pc: &Ident, desc: &str) -> quote::Tokens {
673678
if let (Some(peripheral), Some(register)) = (&base.peripheral, &base.register) {
674679
let pmod_ = peripheral.to_sanitized_snake_case();
675680
let rmod_ = register.to_sanitized_snake_case();
@@ -716,9 +721,9 @@ struct F<'a> {
716721
access: Option<Access>,
717722
description: String,
718723
evs: &'a [EnumeratedValues],
719-
mask: Tokens,
724+
mask: u64,
720725
name: &'a str,
721-
offset: Tokens,
726+
offset: u64,
722727
pc_r: Ident,
723728
_pc_r: Ident,
724729
pc_w: Ident,

0 commit comments

Comments
 (0)