Skip to content

Commit df36464

Browse files
committed
derive_from_base
1 parent c021fbb commit df36464

File tree

1 file changed

+52
-72
lines changed

1 file changed

+52
-72
lines changed

src/generate/register.rs

Lines changed: 52 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -359,37 +359,6 @@ pub fn fields(
359359
let _pc_r = &f._pc_r;
360360

361361
if let Some((evs, base)) = lookup_filter(&lookup_results, Usage::Read) {
362-
if let Some(base) = &base {
363-
let pc = base.field.to_sanitized_upper_case();
364-
let base_pc_r = Ident::from(&*format!("{}_R", pc));
365-
let desc = format!("Possible values of the field `{}`", f.name,);
366-
367-
if let (Some(peripheral), Some(register)) = (&base.peripheral, &base.register) {
368-
let pmod_ = peripheral.to_sanitized_snake_case();
369-
let rmod_ = register.to_sanitized_snake_case();
370-
let pmod_ = Ident::from(&*pmod_);
371-
let rmod_ = Ident::from(&*rmod_);
372-
373-
mod_items.push(quote! {
374-
#[doc = #desc]
375-
pub type #_pc_r = crate::#pmod_::#rmod_::#base_pc_r;
376-
});
377-
} else if let Some(register) = &base.register {
378-
let mod_ = register.to_sanitized_snake_case();
379-
let mod_ = Ident::from(&*mod_);
380-
381-
mod_items.push(quote! {
382-
#[doc = #desc]
383-
pub type #_pc_r = super::#mod_::#base_pc_r;
384-
});
385-
} else {
386-
mod_items.push(quote! {
387-
#[doc = #desc]
388-
pub type #_pc_r = #base_pc_r;
389-
});
390-
}
391-
}
392-
393362
let description = &util::escape_brackets(&f.description);
394363
let sc = &f.sc;
395364
r_impl_items.push(quote! {
@@ -400,8 +369,14 @@ pub fn fields(
400369
}
401370
});
402371

403-
let variants = Variant::from_enumerated_values(evs)?;
372+
if let Some(base) = &base {
373+
let pc = base.field.to_sanitized_upper_case();
374+
let base_pc_r = Ident::from(&*format!("{}_R", pc));
375+
derive_from_base(mod_items, &base, &_pc_r, &base_pc_r, f.name);
376+
}
377+
404378
if base.is_none() {
379+
let variants = Variant::from_enumerated_values(evs)?;
405380
let has_reserved_variant = evs.values.len() != (1 << f.width);
406381
let desc = format!("Possible values of the field `{}`", f.name,);
407382

@@ -522,7 +497,7 @@ pub fn fields(
522497
}
523498
});
524499
}
525-
500+
526501
} else {
527502
let description = &util::escape_brackets(&f.description);
528503
let sc = &f.sc;
@@ -560,45 +535,7 @@ pub fn fields(
560535
let base_pc_w = base.as_ref().map(|base| {
561536
let pc = base.field.to_sanitized_upper_case();
562537
let base_pc_w = Ident::from(&*format!("{}W", pc));
563-
564-
if let (Some(peripheral), Some(register)) = (&base.peripheral, &base.register) {
565-
let pmod_ = peripheral.to_sanitized_snake_case();
566-
let rmod_ = register.to_sanitized_snake_case();
567-
let pmod_ = Ident::from(&*pmod_);
568-
let rmod_ = Ident::from(&*rmod_);
569-
570-
mod_items.push(quote! {
571-
#[doc = #pc_w_doc]
572-
pub type #pc_w =
573-
crate::#pmod_::#rmod_::#base_pc_w;
574-
});
575-
576-
quote! {
577-
crate::#pmod_::#rmod_::#base_pc_w
578-
}
579-
} else if let Some(register) = &base.register {
580-
let mod_ = register.to_sanitized_snake_case();
581-
let mod_ = Ident::from(&*mod_);
582-
583-
mod_items.push(quote! {
584-
#[doc = #pc_w_doc]
585-
pub type #pc_w =
586-
super::#mod_::#base_pc_w;
587-
});
588-
589-
quote! {
590-
super::#mod_::#base_pc_w
591-
}
592-
} else {
593-
mod_items.push(quote! {
594-
#[doc = #pc_w_doc]
595-
pub type #pc_w = #base_pc_w;
596-
});
597-
598-
quote! {
599-
#base_pc_w
600-
}
601-
}
538+
derive_from_base(mod_items, &base, &pc_w, &base_pc_w, f.name)
602539
});
603540

604541
if base.is_none() {
@@ -788,6 +725,49 @@ impl Variant {
788725
}
789726
}
790727

728+
fn derive_from_base(mod_items: &mut Vec<Tokens>, base: &Base, pc: &Ident, base_pc: &Ident, fname: &str) -> quote::Tokens {
729+
let desc = format!("Possible values of the field `{}`", fname,);
730+
731+
if let (Some(peripheral), Some(register)) = (&base.peripheral, &base.register) {
732+
let pmod_ = peripheral.to_sanitized_snake_case();
733+
let rmod_ = register.to_sanitized_snake_case();
734+
let pmod_ = Ident::from(&*pmod_);
735+
let rmod_ = Ident::from(&*rmod_);
736+
737+
mod_items.push(quote! {
738+
#[doc = #desc]
739+
pub type #pc =
740+
crate::#pmod_::#rmod_::#base_pc;
741+
});
742+
743+
quote! {
744+
crate::#pmod_::#rmod_::#base_pc
745+
}
746+
} else if let Some(register) = &base.register {
747+
let mod_ = register.to_sanitized_snake_case();
748+
let mod_ = Ident::from(&*mod_);
749+
750+
mod_items.push(quote! {
751+
#[doc = #desc]
752+
pub type #pc =
753+
super::#mod_::#base_pc;
754+
});
755+
756+
quote! {
757+
super::#mod_::#base_pc
758+
}
759+
} else {
760+
mod_items.push(quote! {
761+
#[doc = #desc]
762+
pub type #pc = #base_pc;
763+
});
764+
765+
quote! {
766+
#base_pc
767+
}
768+
}
769+
}
770+
791771
#[derive(Clone, Debug)]
792772
pub struct Base<'a> {
793773
pub peripheral: Option<&'a str>,

0 commit comments

Comments
 (0)