mirror of
https://gitlab.cern.ch/wotsubo/endcap-sl-software-ri-generator.git
synced 2025-04-30 00:26:22 +09:00
add(converter): support value under register, by inserting field during conversion
This commit is contained in:
parent
b8d18b26fc
commit
27f2f75ee2
1 changed files with 52 additions and 5 deletions
|
@ -389,11 +389,19 @@ impl Register {
|
|||
.transpose()?;
|
||||
let desc = node.attribute("desc").map(str::to_string);
|
||||
|
||||
let children: Vec<_> = node
|
||||
.children()
|
||||
.filter(|node| node.is_element() && node.tag_name().name().eq("field"))
|
||||
let children: Vec<_> = {
|
||||
let mut child_elements = node.children().filter(|node| node.is_element());
|
||||
if child_elements.any(|node| node.tag_name().name().eq("value")) {
|
||||
// Generate virtual single field under the register, to absorb difference between
|
||||
// normal format
|
||||
vec![Field::from_xml_register_dom(node)?]
|
||||
} else {
|
||||
child_elements
|
||||
.filter(|node| node.tag_name().name().eq("field"))
|
||||
.map(Field::from_xml_dom)
|
||||
.collect::<Result<_, _>>()?;
|
||||
.collect::<Result<_, _>>()?
|
||||
}
|
||||
};
|
||||
|
||||
// Validation
|
||||
if default.is_some() && !children.is_empty() {
|
||||
|
@ -505,6 +513,45 @@ impl Field {
|
|||
elements: children,
|
||||
})
|
||||
}
|
||||
|
||||
/// Generate Field from Registers (piracy), guessing a lot of parameters.
|
||||
pub(crate) fn from_xml_register_dom(node: Node) -> Result<Self, DomConversionError> {
|
||||
let name = util::get_name(node)?;
|
||||
let mask = node
|
||||
.ancestors()
|
||||
.filter_map(|node| util::get_type(node))
|
||||
.next()
|
||||
.transpose()?
|
||||
.map_or_else(
|
||||
|| Err(DomConversionError::parameter_completion_error("type", node)),
|
||||
|dtype| match dtype {
|
||||
crate::types::DataType::D32 => Ok(u32::MAX),
|
||||
},
|
||||
)?;
|
||||
if node.has_attribute("default") {
|
||||
return Err(DomConversionError::other_error(
|
||||
"unsupported structure: register with @default without field",
|
||||
node,
|
||||
));
|
||||
}
|
||||
let desc = node.attribute("desc").map(str::to_string);
|
||||
let children = node
|
||||
.children()
|
||||
.filter(|node| node.is_element())
|
||||
.map(Value::from_xml_dom)
|
||||
.collect::<Result<_, _>>()?;
|
||||
|
||||
Ok(Field {
|
||||
name,
|
||||
mask,
|
||||
interface: None,
|
||||
multiple: None,
|
||||
default: None,
|
||||
sclr: None,
|
||||
desc,
|
||||
elements: children,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl Value {
|
||||
|
|
Loading…
Add table
Reference in a new issue