mirror of
https://gitlab.cern.ch/wotsubo/endcap-sl-software-ri-generator.git
synced 2025-02-23 00:57:08 +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 desc = self.desc.unwrap_or("".to_string());
|
||||
|
||||
let accessor_methods = {
|
||||
let mut out = TokenStream::new();
|
||||
for e in self.elements.iter() {
|
||||
let accessors_methods = self.elements.iter().map(|e| {
|
||||
let child_name = e.get_name();
|
||||
let snake_case_name = util::parse_to_ident(&child_name.to_snake_case())?;
|
||||
let child_type_name = match e {
|
||||
ModuleBlockElements::Block(_) => &child_name.to_upper_camel_case(),
|
||||
ModuleBlockElements::Register(_) => {
|
||||
&format!("Reg{}", child_name.to_upper_camel_case())
|
||||
}
|
||||
ModuleBlockElements::Memory(_) => todo!(),
|
||||
ModuleBlockElements::Fifo(_) => todo!(),
|
||||
};
|
||||
let child_upper_camel_name = util::parse_to_ident(child_type_name)?;
|
||||
|
||||
out.extend(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
|
||||
};
|
||||
match e {
|
||||
ModuleBlockElements::Block(_) => {
|
||||
let child_upper_camel_name = util::parse_to_ident(&child_name.to_upper_camel_case())?;
|
||||
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)
|
||||
}
|
||||
})
|
||||
},
|
||||
ModuleBlockElements::Register(register) => {
|
||||
let child_upper_camel_name = util::parse_to_ident(&format!("Reg{}", child_name.to_upper_camel_case()))?;
|
||||
match ®ister.multiple {
|
||||
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)
|
||||
}
|
||||
})
|
||||
},
|
||||
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() {
|
||||
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);
|
||||
|
|
Loading…
Reference in a new issue