184 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			184 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use yaserde_derive::YaSerialize;
 | |
| 
 | |
| #[derive(Default, PartialEq, Debug, YaSerialize)]
 | |
| struct CpuDef {
 | |
|     #[yaserde(child)]
 | |
|     name: String,
 | |
|     #[yaserde(child)]
 | |
|     revision: String,
 | |
|     #[yaserde(child)]
 | |
|     endian: String, // enum {LE, BE, ME}
 | |
|     #[yaserde(child)]
 | |
|     mpupresent: bool,
 | |
|     #[yaserde(child)]
 | |
|     fpupresent: bool,
 | |
|     //#[yaserde(child)]
 | |
|     //nvicpriobits: enum {8, 16, 32, 64, 128},
 | |
|     #[yaserde(child)]
 | |
|     vendorsystickconfig: bool
 | |
| }
 | |
| 
 | |
| #[derive(Default, PartialEq, Debug, YaSerialize)]
 | |
| struct Field {
 | |
|     name: String,
 | |
|     #[yaserde(child)]
 | |
|     description: String,
 | |
|     #[yaserde(child)]
 | |
|     bitrange: String,
 | |
|     #[yaserde(child)]
 | |
|     access: String,
 | |
| }
 | |
| 
 | |
| #[derive(Default, PartialEq, Debug, YaSerialize)]
 | |
| struct Register {
 | |
|     #[yaserde(child)]
 | |
|     name: String,
 | |
|     #[yaserde(child)]
 | |
|     description: String,
 | |
|     #[yaserde(child)]
 | |
|     addressoffset: String,
 | |
|     #[yaserde(child)]
 | |
|     size: u8,
 | |
|     #[yaserde(child)]
 | |
|     access: String,
 | |
|     #[yaserde(child)]
 | |
|     resetvalue: String,
 | |
|     #[yaserde(child)]
 | |
|     resetmask: String,
 | |
|     #[yaserde(child)]
 | |
|     fields: Vec<Field>
 | |
| }
 | |
| 
 | |
| #[derive(Default, PartialEq, Debug, YaSerialize)]
 | |
| struct Peripheral {
 | |
|     #[yaserde(child)]
 | |
|     name: String,
 | |
|     #[yaserde(child)]
 | |
|     version: String,
 | |
|     #[yaserde(child)]
 | |
|     description: String,
 | |
|     #[yaserde(child)]
 | |
|     groupname: String,
 | |
|     #[yaserde(child)]
 | |
|     baseaddress: String,
 | |
|     #[yaserde(child)]
 | |
|     size: u8,
 | |
|     #[yaserde(child)]
 | |
|     access: String,
 | |
|     #[yaserde(child)]
 | |
|     registers: Vec<Register>
 | |
| }
 | |
| 
 | |
| #[derive(Default, PartialEq, Debug, YaSerialize)]
 | |
| struct DevAttrs {
 | |
|     #[yaserde(child)]
 | |
|     vendor: String,
 | |
|     #[yaserde(child)]
 | |
|     vendorid: String,
 | |
|     #[yaserde(child)]
 | |
|     name: String,
 | |
|     #[yaserde(child)]
 | |
|     series: String,
 | |
|     #[yaserde(child)]
 | |
|     version: String,
 | |
|     #[yaserde(child)]
 | |
|     description: String,
 | |
|     #[yaserde(child)]
 | |
|     licensetext: String,
 | |
|     #[yaserde(child)]
 | |
|     cpu: CpuDef,
 | |
|     #[yaserde(child)]
 | |
|     addressunitbits: u8,
 | |
|     #[yaserde(child)]
 | |
|     width: u8,
 | |
|     #[yaserde(child)]
 | |
|     size: u8,
 | |
|     #[yaserde(child)]
 | |
|     access: String,
 | |
|     #[yaserde(child)]
 | |
|     resetvalue: String,
 | |
|     #[yaserde(child)]
 | |
|     resetmask: String,
 | |
|     #[yaserde(child)]
 | |
|     peripherals: Vec<Peripheral>
 | |
| }
 | |
| 
 | |
| #[derive(Default, PartialEq, Debug, YaSerialize)]
 | |
| #[yaserde(rename = "device")]
 | |
| struct Device {
 | |
|     #[yaserde(attribute)]
 | |
|     schemaversion: String,
 | |
|     #[yaserde(attribute)]
 | |
|     xmlns: String,
 | |
|     #[yaserde(attribute)]
 | |
|     xsnonamespaceschemalocation: String,
 | |
|     #[yaserde(child)]
 | |
|     devattributes: DevAttrs
 | |
| }
 | |
| 
 | |
| fn main() {
 | |
| 
 | |
|     let mut vec_peripherals: Vec<Peripheral> = Vec::new();
 | |
|     let mut vec_registers: Vec<Register> =  Vec::new();
 | |
|     let vec_fields: Vec<Field> = Vec::new();
 | |
| 
 | |
|     let register = Register {
 | |
|         name: "PRCMD".to_string(),
 | |
|         description: "This command register (PRCMD) is to protect the registers that may have a significant influence on the application system (PSC, PSM) from an inadvertent write access, so that the system does not stop in case of a program hang-up.".to_string(),
 | |
|         addressoffset: "0xFFFFF1FC".to_string(),
 | |
|         size: 8,
 | |
|         access: "read-write".to_string(),
 | |
|         resetvalue: "0x0000".to_string(),
 | |
|         resetmask: "0xFFFF".to_string(),
 | |
|         fields: vec_fields
 | |
|     };
 | |
|     vec_registers.push(register);
 | |
| 
 | |
|     let peripheral = Peripheral {
 | |
|         name: "Specific Registers".to_string(),
 | |
|         version: "1.0".to_string(),
 | |
|         description: "Specific Registers".to_string(),
 | |
|         groupname: "MCU".to_string(),
 | |
|         baseaddress: "0xFFFFF1FC".to_string(),
 | |
|         size: 16,
 | |
|         access: "read-write".to_string(),
 | |
|         registers: vec_registers
 | |
|     };
 | |
|     vec_peripherals.push(peripheral);
 | |
| 
 | |
|     let cpu_def = CpuDef {
 | |
|         name: "V850".to_string(),
 | |
|         revision: "r1".to_string(),
 | |
|         endian: "LE".to_string(), // enum {LE, BE, ME}
 | |
|         mpupresent: false,
 | |
|         fpupresent: false,
 | |
|         //nvicpriobits: enum {8, 16, 32, 64, 128},
 | |
|         vendorsystickconfig: false    
 | |
|     };
 | |
| 
 | |
|     let dev_attrs = DevAttrs {
 | |
|         vendor: "Renesas".to_string(),
 | |
|         vendorid: "Renesas".to_string(),
 | |
|         name: "V850".to_string(),
 | |
|         series: "E1/E2/CA2".to_string(),
 | |
|         version: "1.2".to_string(),
 | |
|         description: "NEC/Renesas V850 automotive grade ICs".to_string(),
 | |
|         licensetext: "GPLv3".to_string(),
 | |
|         cpu: cpu_def,
 | |
|         addressunitbits: 8,
 | |
|         width: 32,
 | |
|         size: 32,
 | |
|         access: "read-write".to_string(),
 | |
|         resetvalue: "0x00000000".to_string(),
 | |
|         resetmask: "0xFFFFFFFF".to_string(),
 | |
|         peripherals: vec_peripherals
 | |
|     };
 | |
| 
 | |
|     let dev = Device {  schemaversion: "foo".to_string(),
 | |
|                         xmlns: "http://www.w3.org/2001/XMLSchema-instance".to_string(),
 | |
|                         xsnonamespaceschemalocation: "CMSIS-SVD.xsd".to_string(),
 | |
|                         devattributes: dev_attrs
 | |
|                     };
 | |
|     
 | |
|     println!("{:?}", yaserde::ser::to_string(&dev).ok().unwrap());
 | |
| } |