diff --git a/Cargo.lock b/Cargo.lock index 8e575b4..15316d4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -52,6 +52,21 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "anyhow" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" + +[[package]] +name = "array-init" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23589ecb866b460d3a0f1278834750268c607e8e28a1b982c907219f3178cd72" +dependencies = [ + "nodrop", +] + [[package]] name = "clap" version = "4.5.27" @@ -108,8 +123,10 @@ checksum = "a9b537177af81d27b407c2f8d679181f51ce2fe2bf33d38b64efed1d9c6f9749" name = "endcap-sl-register-interface-generator" version = "0.1.0" dependencies = [ + "anyhow", "quick-xml", "serde", + "serde-hex", "xml_schema_generator", ] @@ -131,12 +148,24 @@ version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" +[[package]] +name = "maybe-uninit" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" + [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + [[package]] name = "once_cell" version = "1.20.2" @@ -180,6 +209,17 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-hex" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca37e3e4d1b39afd7ff11ee4e947efae85adfddf4841787bfa47c470e96dc26d" +dependencies = [ + "array-init", + "serde", + "smallvec", +] + [[package]] name = "serde_derive" version = "1.0.217" @@ -191,6 +231,15 @@ dependencies = [ "syn", ] +[[package]] +name = "smallvec" +version = "0.6.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97fcaeba89edba30f044a10c6a3cc39df9c3f17d7cd829dd1446cab35f890e0" +dependencies = [ + "maybe-uninit", +] + [[package]] name = "strsim" version = "0.11.1" diff --git a/Cargo.toml b/Cargo.toml index 0485f56..3b67e8e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,6 @@ name = "endcap-sl-register-interface-generator" version = "0.1.0" edition = "2021" -build = "build.rs" [[bin]] name = "ri-generate" @@ -11,8 +10,10 @@ path = "src/main.rs" [lib] [dependencies] +anyhow = "1.0.95" quick-xml = { version = "0.37.2", features = ["serialize"] } serde = { version = "1.0.217", features = ["derive"] } +serde-hex = "0.1.0" [build-dependencies] quick-xml = { version = "0.37.2", features = ["serialize"] } diff --git a/build.rs b/build.rs deleted file mode 100644 index 277d608..0000000 --- a/build.rs +++ /dev/null @@ -1,18 +0,0 @@ -use std::{fs::File, io::BufWriter, io::Write}; - -use quick_xml::{self, Reader}; -use xml_schema_generator::{self, Options}; - -const OUTFILEPATH: &str = "src/deserialize.rs"; - -fn main() { - eprintln!("Build script starts"); - let mut reader = Reader::from_file("./csr.xml").expect("Failed to open xml"); - let root = xml_schema_generator::into_struct(&mut reader).expect("Failed to parse xml"); - let struct_as_string = root.to_serde_struct(&Options::quick_xml_de()); - println!("{}", struct_as_string); - let outfile = File::create(OUTFILEPATH).expect("Failed to create out file"); - let mut writer = BufWriter::new(outfile); - writeln!(writer, "use serde::{{Serialize, Deserialize}};").unwrap(); - writeln!(writer, "{}", struct_as_string).unwrap(); -} diff --git a/src/deserialize.rs b/src/deserialize.rs index cbe665e..ec557e0 100644 --- a/src/deserialize.rs +++ b/src/deserialize.rs @@ -1,160 +1,8 @@ -use serde::{Serialize, Deserialize}; -#[derive(Serialize, Deserialize)] -pub struct Module { - #[serde(rename = "@name")] - pub name: String, - #[serde(rename = "@addr")] - pub addr: String, - #[serde(rename = "@size")] - pub size: String, - #[serde(rename = "@amod")] - pub amod: String, - #[serde(rename = "@type")] - pub module_type: String, - #[serde(rename = "@desc")] - pub desc: String, - #[serde(rename = "$text")] - pub text: Option, - pub block: Vec, +use serde::Deserializer; + +pub(crate) fn deserialize_u32<'de, D>(deserializer: D) -> Result +where + D: Deserializer<'de>, +{ + todo!() } - -#[derive(Serialize, Deserialize)] -pub struct ModuleBlock { - #[serde(rename = "@name")] - pub name: String, - #[serde(rename = "@addr")] - pub addr: String, - #[serde(rename = "@size")] - pub size: String, - #[serde(rename = "@decoder")] - pub decoder: String, - #[serde(rename = "$text")] - pub text: Option, - pub block: Vec, -} - -#[derive(Serialize, Deserialize)] -pub struct ModuleBlockBlock { - #[serde(rename = "@name")] - pub name: String, - #[serde(rename = "@addr")] - pub addr: String, - #[serde(rename = "@size")] - pub size: String, - #[serde(rename = "@modf")] - pub modf: String, - #[serde(rename = "$text")] - pub text: Option, - pub block: Vec, - pub register: Vec, -} - -#[derive(Serialize, Deserialize)] -pub struct ModuleBlockBlockBlock { - #[serde(rename = "@name")] - pub name: String, - #[serde(rename = "@addr")] - pub addr: String, - #[serde(rename = "@size")] - pub size: String, - #[serde(rename = "@desc")] - pub desc: Option, - #[serde(rename = "$text")] - pub text: Option, - pub register: Vec, - pub block: Vec, -} - -#[derive(Serialize, Deserialize)] -pub struct ModuleBlockBlockBlockRegister { - #[serde(rename = "@name")] - pub name: String, - #[serde(rename = "@addr")] - pub addr: String, - #[serde(rename = "@mask")] - pub mask: Option, - #[serde(rename = "@offset")] - pub offset: Option, - #[serde(rename = "@multiple")] - pub multiple: Option, - #[serde(rename = "@default")] - pub default: Option, - #[serde(rename = "$text")] - pub text: Option, - pub field: Vec, -} - -#[derive(Serialize, Deserialize)] -pub struct ModuleBlockBlockBlockRegisterField { - #[serde(rename = "@name")] - pub name: String, - #[serde(rename = "@mask")] - pub mask: String, - #[serde(rename = "@offset")] - pub offset: Option, - #[serde(rename = "@multiple")] - pub multiple: Option, - #[serde(rename = "@default")] - pub default: Option, - #[serde(rename = "$text")] - pub text: Option, - pub value: Vec, -} - -#[derive(Serialize, Deserialize)] -pub struct Value { - #[serde(rename = "@name")] - pub name: String, - #[serde(rename = "@data")] - pub data: String, -} - -#[derive(Serialize, Deserialize)] -pub struct ModuleBlockBlockBlockBlock { - #[serde(rename = "@name")] - pub name: String, - #[serde(rename = "$text")] - pub text: Option, - pub register: Vec, -} - -#[derive(Serialize, Deserialize)] -pub struct ModuleBlockBlockBlockBlockRegister { - #[serde(rename = "@name")] - pub name: String, - #[serde(rename = "@addr")] - pub addr: String, - #[serde(rename = "@offset")] - pub offset: Option, - #[serde(rename = "@multiple")] - pub multiple: Option, - #[serde(rename = "@mask")] - pub mask: Option, - #[serde(rename = "$text")] - pub text: Option, - pub field: Vec, -} - -#[derive(Serialize, Deserialize)] -pub struct BlockBlockBlockBlockRegisterField { - #[serde(rename = "@name")] - pub name: String, - #[serde(rename = "@mask")] - pub mask: String, - #[serde(rename = "@multiple")] - pub multiple: Option, - #[serde(rename = "@offset")] - pub offset: Option, -} - -#[derive(Serialize, Deserialize)] -pub struct ModuleBlockBlockRegister { - #[serde(rename = "@name")] - pub name: String, - #[serde(rename = "@addr")] - pub addr: String, - #[serde(rename = "@mask")] - pub mask: String, -} - - diff --git a/src/lib.rs b/src/lib.rs index 6339d95..54cb2eb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1 +1,3 @@ -pub mod deserialize; +// pub mod deserialize; +pub mod types; +mod deserialize; diff --git a/src/main.rs b/src/main.rs index e7a11a9..5e95b0a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,13 @@ -fn main() { +use std::{fs::File, io::BufReader}; + +use endcap_sl_register_interface_generator::types; +use quick_xml::de::from_reader; + +fn main() -> Result<(), anyhow::Error> { println!("Hello, world!"); + let reader = BufReader::new(File::open("./csr.xml").unwrap()); + let csr_def: types::Module = from_reader(reader)?; + println!("Parsed: {:?}", csr_def); + + Ok(()) } diff --git a/src/types.rs b/src/types.rs new file mode 100644 index 0000000..8c52ca3 --- /dev/null +++ b/src/types.rs @@ -0,0 +1,87 @@ +use serde::Deserialize; +use serde_hex::{CompactPfx, SerHex, StrictPfx}; + +/// Register group. +#[derive(Debug, Deserialize)] +pub struct Module { + #[serde(rename = "@name")] + pub name: String, + #[serde(rename = "@addr", with = "SerHex::")] + pub addr: u32, + #[serde(rename = "@size")] + pub size: String, + #[serde(rename = "@amod")] + pub amod: Option, + #[serde(rename = "@type")] + pub r#type: Option, + #[serde(default)] + pub child_bitstring: Vec, + #[serde(rename = "$value")] + pub child_elements: Vec, +} + +#[derive(Debug, Deserialize)] +pub enum ModuleAmodValue { + A16, + A24, + A32, + CRCSR, + USER1, + USER2, +} + +#[derive(Debug, Deserialize)] +pub enum DataType { + /// 32bit data type + D32, +} + +#[derive(Debug, Deserialize)] +pub struct BitString { + // TODO +} + +#[derive(Debug, Deserialize)] +pub struct Block { + #[serde(rename = "@name")] + pub name: String, + #[serde(rename = "@addr")] + pub addr: Option, + #[serde(rename = "@type")] + pub r#type: Option, + #[serde(rename = "@modf")] + pub modf: Option, + #[serde(rename = "@size")] + pub size: String, + #[serde(rename = "@amod")] + pub amod: Option, + #[serde(default)] + pub child_bitstring: Vec, + #[serde(rename = "$value")] + pub child_elements: Vec, + // TODO +} +#[derive(Debug, Deserialize)] +pub struct Memory { + // TODO +} +#[derive(Debug, Deserialize)] +pub struct Register { + // TODO +} +#[derive(Debug, Deserialize)] +pub struct Fifo { + // TODO +} + +#[derive(Debug, Deserialize)] +pub enum ModuleElements { + #[serde(rename = "block")] + Block(Block), + Memory(Memory), + Register(Register), + Fifo(Fifo), +} + +#[derive(Debug, Deserialize)] +pub enum RwSpecifier {} diff --git a/tests/parse.rs b/tests/parse.rs new file mode 100644 index 0000000..c6d4762 --- /dev/null +++ b/tests/parse.rs @@ -0,0 +1,11 @@ +use std::{fs::File, io::BufReader}; + +use endcap_sl_register_interface_generator::{self, types}; +use quick_xml::de::from_reader; + +#[test] +fn test() { + let reader = BufReader::new(File::open("./csr.xml").unwrap()); + let csr_def: types::Module = from_reader(reader).unwrap(); + println!("Parsed: {:?}", csr_def); +}