atdf2svd 0.6.0

Tool to convert Atmel's ATDF files to SVD
Documentation
use crate::chip;
use crate::svd;
use std::convert::TryInto;

pub fn generate(f: &chip::Field) -> crate::Result<svd_rs::Field> {
    let (write_constraint, enumerated_values) =
        svd::restriction::generate(&f.restriction, f.width().try_into()?)?;
    let (lsb, msb) = (
        u32::try_from(f.range.0).unwrap(),
        u32::try_from(f.range.1).unwrap(),
    );

    let field = svd_rs::FieldInfo::builder()
        .name(f.name.clone())
        .description(f.description.clone().or_else(|| {
            log::warn!("Description missing for field {:?}", f.name);
            Some("No Description.".to_owned())
        }))
        .bit_range(svd_rs::BitRange {
            offset: lsb,
            width: msb - lsb + 1,
            range_type: svd_rs::BitRangeType::BitRange,
        })
        .access(svd::restriction::generate_access(f.access))
        .write_constraint(write_constraint)
        .enumerated_values(enumerated_values)
        .build(svd_rs::ValidateLevel::Strict)
        .map(svd_rs::Field::Single)?;

    Ok(field)
}