(WIP) hand written types (error at parsing u32 (0xXXX))

This commit is contained in:
Wataru Otsubo 2025-01-29 16:22:53 +09:00
parent 8a7991bfb2
commit f4b1af740e
8 changed files with 170 additions and 180 deletions

49
Cargo.lock generated
View file

@ -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"

View file

@ -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"] }

View file

@ -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();
}

View file

@ -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<String>,
pub block: Vec<ModuleBlock>,
use serde::Deserializer;
pub(crate) fn deserialize_u32<'de, D>(deserializer: D) -> Result<u32, D::Error>
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<String>,
pub block: Vec<ModuleBlockBlock>,
}
#[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<String>,
pub block: Vec<ModuleBlockBlockBlock>,
pub register: Vec<ModuleBlockBlockRegister>,
}
#[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<String>,
#[serde(rename = "$text")]
pub text: Option<String>,
pub register: Vec<ModuleBlockBlockBlockRegister>,
pub block: Vec<ModuleBlockBlockBlockBlock>,
}
#[derive(Serialize, Deserialize)]
pub struct ModuleBlockBlockBlockRegister {
#[serde(rename = "@name")]
pub name: String,
#[serde(rename = "@addr")]
pub addr: String,
#[serde(rename = "@mask")]
pub mask: Option<String>,
#[serde(rename = "@offset")]
pub offset: Option<String>,
#[serde(rename = "@multiple")]
pub multiple: Option<String>,
#[serde(rename = "@default")]
pub default: Option<String>,
#[serde(rename = "$text")]
pub text: Option<String>,
pub field: Vec<ModuleBlockBlockBlockRegisterField>,
}
#[derive(Serialize, Deserialize)]
pub struct ModuleBlockBlockBlockRegisterField {
#[serde(rename = "@name")]
pub name: String,
#[serde(rename = "@mask")]
pub mask: String,
#[serde(rename = "@offset")]
pub offset: Option<String>,
#[serde(rename = "@multiple")]
pub multiple: Option<String>,
#[serde(rename = "@default")]
pub default: Option<String>,
#[serde(rename = "$text")]
pub text: Option<String>,
pub value: Vec<Value>,
}
#[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<String>,
pub register: Vec<ModuleBlockBlockBlockBlockRegister>,
}
#[derive(Serialize, Deserialize)]
pub struct ModuleBlockBlockBlockBlockRegister {
#[serde(rename = "@name")]
pub name: String,
#[serde(rename = "@addr")]
pub addr: String,
#[serde(rename = "@offset")]
pub offset: Option<String>,
#[serde(rename = "@multiple")]
pub multiple: Option<String>,
#[serde(rename = "@mask")]
pub mask: Option<String>,
#[serde(rename = "$text")]
pub text: Option<String>,
pub field: Vec<BlockBlockBlockBlockRegisterField>,
}
#[derive(Serialize, Deserialize)]
pub struct BlockBlockBlockBlockRegisterField {
#[serde(rename = "@name")]
pub name: String,
#[serde(rename = "@mask")]
pub mask: String,
#[serde(rename = "@multiple")]
pub multiple: Option<String>,
#[serde(rename = "@offset")]
pub offset: Option<String>,
}
#[derive(Serialize, Deserialize)]
pub struct ModuleBlockBlockRegister {
#[serde(rename = "@name")]
pub name: String,
#[serde(rename = "@addr")]
pub addr: String,
#[serde(rename = "@mask")]
pub mask: String,
}

View file

@ -1 +1,3 @@
pub mod deserialize;
// pub mod deserialize;
pub mod types;
mod deserialize;

View file

@ -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(())
}

87
src/types.rs Normal file
View file

@ -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::<CompactPfx>")]
pub addr: u32,
#[serde(rename = "@size")]
pub size: String,
#[serde(rename = "@amod")]
pub amod: Option<ModuleAmodValue>,
#[serde(rename = "@type")]
pub r#type: Option<DataType>,
#[serde(default)]
pub child_bitstring: Vec<BitString>,
#[serde(rename = "$value")]
pub child_elements: Vec<ModuleElements>,
}
#[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<usize>,
#[serde(rename = "@type")]
pub r#type: Option<DataType>,
#[serde(rename = "@modf")]
pub modf: Option<RwSpecifier>,
#[serde(rename = "@size")]
pub size: String,
#[serde(rename = "@amod")]
pub amod: Option<ModuleAmodValue>,
#[serde(default)]
pub child_bitstring: Vec<BitString>,
#[serde(rename = "$value")]
pub child_elements: Vec<ModuleElements>,
// 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 {}

11
tests/parse.rs Normal file
View file

@ -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);
}