use svd_parser as svd;
use svd_parser::svd::registercluster::RegisterCluster;
use log::*;
use serde::Deserialize;
use std::fs::File;
use std::io::Read;
use serde::Serialize;
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Field {
name: String,
lsb: u32,
msb: u32,
enumerations: Option<Vec<crate::info::Enumeration>>,
}
impl From<Field> for crate::info::Field {
fn from(field: Field) -> Self {
Self {
name: field.name,
lsb: field.lsb,
msb: field.msb,
enumerations: match field.enumerations {
Some(enums) => enums,
None => vec![],
},
}
}
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Register {
name: String,
offset: u64,
#[serde(default)]
is_word: bool,
fields: Option<Vec<Field>>,
}
impl From<Register> for crate::info::Register {
fn from(reg: Register) -> Self {
Self {
name: reg.name,
offset: reg.offset,
is_raw: reg.is_word,
fields: if reg.is_word {
vec![]
} else {
reg.fields
.unwrap()
.iter()
.map(|f| f.clone().into())
.collect()
},
}
}
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Peripheral {
name: String,
word_size: usize,
regs: Vec<Register>,
}
impl From<Peripheral> for crate::info::Peripheral {
fn from(peripheral: Peripheral) -> Self {
Self {
name: peripheral.name,
word_size: peripheral.word_size,
regs: peripheral.regs.iter().map(|r| r.clone().into()).collect(),
}
}
}
#[derive(Deserialize)]
pub struct Config {}
pub fn parse_yaml(filename: &str, config: &Config) -> Vec<crate::info::Peripheral> {
let yaml = &mut String::new();
File::open(filename).unwrap().read_to_string(yaml).unwrap();
let peripherals: Vec<Peripheral> = serde_yaml::from_str(&yaml).unwrap();
peripherals.iter().map(|p| p.clone().into()).collect()
}