use crate::chip;
use crate::svd::restriction::generate_access;
pub fn generate(r: &chip::Register, base: u32) -> crate::Result<svd_rs::Register> {
let (write_constraint, _) =
crate::svd::restriction::generate(&r.restriction, u32::try_from(r.size).unwrap() * 8)?;
let register = svd_rs::RegisterInfo::builder()
.name(r.name.clone())
.description(r.description.clone().or_else(|| {
log::warn!("Description missing for register \"{}\"", r.name);
Some("No Description.".to_owned())
}))
.address_offset(u32::try_from(r.address).unwrap() - base)
.size(if r.size != 0 {
Some(u32::try_from(r.size).unwrap() * 8)
} else {
None
})
.access(generate_access(r.access))
.write_constraint(write_constraint)
.alternate_group(r.mode.clone());
let mut fields = r.fields.values().collect::<Vec<_>>();
fields.sort_by(|a, b| a.range.0.cmp(&b.range.0));
let fields = fields
.into_iter()
.map(crate::svd::field::generate)
.collect::<Result<Vec<_>, _>>()?;
register
.fields(if !fields.is_empty() {
Some(fields)
} else {
None
})
.build(svd_rs::ValidateLevel::Strict)
.map(svd_rs::Register::Single)
.map_err(crate::Error::from)
}