mirror of
https://gitlab.cern.ch/wotsubo/endcap-sl-software-ri-generator.git
synced 2025-02-23 00:57:08 +09:00
(WIP) hand written types (error at parsing u32 (0xXXX))
This commit is contained in:
parent
8a7991bfb2
commit
f4b1af740e
8 changed files with 170 additions and 180 deletions
49
Cargo.lock
generated
49
Cargo.lock
generated
|
@ -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"
|
||||
|
|
|
@ -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"] }
|
||||
|
|
18
build.rs
18
build.rs
|
@ -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();
|
||||
}
|
|
@ -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,
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1 +1,3 @@
|
|||
pub mod deserialize;
|
||||
// pub mod deserialize;
|
||||
pub mod types;
|
||||
mod deserialize;
|
||||
|
|
12
src/main.rs
12
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(())
|
||||
}
|
||||
|
|
87
src/types.rs
Normal file
87
src/types.rs
Normal 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
11
tests/parse.rs
Normal 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);
|
||||
}
|
Loading…
Reference in a new issue