mirror of
https://gitlab.cern.ch/wotsubo/endcap-sl-software-ri-generator.git
synced 2025-02-23 09:07:07 +09:00
new(generator): multiple register
This commit is contained in:
parent
7aba746503
commit
d85642dcec
1 changed files with 41 additions and 23 deletions
|
@ -208,30 +208,48 @@ impl CodeGen for Block {
|
||||||
let addr = util::parse_to_literal(&format!("0x{:x}", self.addr))?;
|
let addr = util::parse_to_literal(&format!("0x{:x}", self.addr))?;
|
||||||
let desc = self.desc.unwrap_or("".to_string());
|
let desc = self.desc.unwrap_or("".to_string());
|
||||||
|
|
||||||
let accessor_methods = {
|
let accessors_methods = self.elements.iter().map(|e| {
|
||||||
let mut out = TokenStream::new();
|
|
||||||
for e in self.elements.iter() {
|
|
||||||
let child_name = e.get_name();
|
let child_name = e.get_name();
|
||||||
let snake_case_name = util::parse_to_ident(&child_name.to_snake_case())?;
|
let snake_case_name = util::parse_to_ident(&child_name.to_snake_case())?;
|
||||||
let child_type_name = match e {
|
match e {
|
||||||
ModuleBlockElements::Block(_) => &child_name.to_upper_camel_case(),
|
ModuleBlockElements::Block(_) => {
|
||||||
ModuleBlockElements::Register(_) => {
|
let child_upper_camel_name = util::parse_to_ident(&child_name.to_upper_camel_case())?;
|
||||||
&format!("Reg{}", child_name.to_upper_camel_case())
|
Ok(quote! {
|
||||||
}
|
pub fn #snake_case_name(&self) -> #snake_case_name::#child_upper_camel_name {
|
||||||
ModuleBlockElements::Memory(_) => todo!(),
|
#snake_case_name::#child_upper_camel_name::new(self.mem_ptr)
|
||||||
ModuleBlockElements::Fifo(_) => todo!(),
|
}
|
||||||
};
|
})
|
||||||
let child_upper_camel_name = util::parse_to_ident(child_type_name)?;
|
},
|
||||||
|
ModuleBlockElements::Register(register) => {
|
||||||
out.extend(quote! {
|
let child_upper_camel_name = util::parse_to_ident(&format!("Reg{}", child_name.to_upper_camel_case()))?;
|
||||||
pub fn #snake_case_name(&self) -> #snake_case_name::#child_upper_camel_name {
|
match ®ister.multiple {
|
||||||
#snake_case_name::#child_upper_camel_name::new(self.mem_ptr)
|
None => {
|
||||||
}
|
Ok(quote! {
|
||||||
});
|
pub fn #snake_case_name(&self) -> #snake_case_name::#child_upper_camel_name {
|
||||||
}
|
#snake_case_name::#child_upper_camel_name::new(self.mem_ptr)
|
||||||
|
}
|
||||||
out
|
})
|
||||||
};
|
},
|
||||||
|
Some(multiple_param) => {
|
||||||
|
let num_multiple = multiple_param.multiple;
|
||||||
|
let elements = (0..num_multiple).map(|i| {
|
||||||
|
let offset = multiple_param.offset * i;
|
||||||
|
quote! {
|
||||||
|
#snake_case_name::#child_upper_camel_name::new(unsafe { self.mem_ptr.add(#offset) } )
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Ok(quote! {
|
||||||
|
pub fn #snake_case_name(&self) -> [#snake_case_name::#child_upper_camel_name; #num_multiple] {
|
||||||
|
[ #(#elements),* ]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
ModuleBlockElements::Memory(_memory) => todo!(),
|
||||||
|
ModuleBlockElements::Fifo(_fifo) => todo!(),
|
||||||
|
}
|
||||||
|
}).collect::<Result<Vec<proc_macro2::TokenStream>, CodeGenError>>()?;
|
||||||
|
|
||||||
let parent_struct = if parent_name == util::parse_to_ident("RegisterInterface").unwrap() {
|
let parent_struct = if parent_name == util::parse_to_ident("RegisterInterface").unwrap() {
|
||||||
quote! {#parent_name}
|
quote! {#parent_name}
|
||||||
|
@ -275,7 +293,7 @@ impl CodeGen for Block {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#accessor_methods
|
#(#accessors_methods)*
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let (out_path, next_parent_path) = mod_file_path(parent_path, &snake_case_name);
|
let (out_path, next_parent_path) = mod_file_path(parent_path, &snake_case_name);
|
||||||
|
|
Loading…
Reference in a new issue