Compare commits

...

7 commits

3 changed files with 66 additions and 6 deletions

View file

@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Packagin with Nix flakes (with nixpkgs buildRustPackage) [!16](https://gitlab.cern.ch/wotsubo/endcap-sl-software-ri-generator/-/merge_requests/16) - Packagin with Nix flakes (with nixpkgs buildRustPackage) [!16](https://gitlab.cern.ch/wotsubo/endcap-sl-software-ri-generator/-/merge_requests/16)
- Now xml metadata can be overwritten with corresponding environmental variables. [!17](https://gitlab.cern.ch/wotsubo/endcap-sl-software-ri-generator/-/merge_requests/17) - Now xml metadata can be overwritten with corresponding environmental variables. [!17](https://gitlab.cern.ch/wotsubo/endcap-sl-software-ri-generator/-/merge_requests/17)
- Support value element just under the register element by inserting single field during conversion. [!18](https://gitlab.cern.ch/wotsubo/endcap-sl-software-ri-generator/-/merge_requests/18)
### Changed ### Changed

View file

@ -389,11 +389,23 @@ impl Register {
.transpose()?; .transpose()?;
let desc = node.attribute("desc").map(str::to_string); let desc = node.attribute("desc").map(str::to_string);
let children: Vec<_> = node let children: Vec<_> = {
.children() if node
.filter(|node| node.is_element() && node.tag_name().name().eq("field")) .children()
.map(Field::from_xml_dom) .filter(|node| node.is_element())
.collect::<Result<_, _>>()?; .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 {
node.children()
.filter(|node| node.is_element())
.filter(|node| node.tag_name().name().eq("field"))
.map(Field::from_xml_dom)
.collect::<Result<_, _>>()?
}
};
// Validation // Validation
if default.is_some() && !children.is_empty() { if default.is_some() && !children.is_empty() {
@ -505,6 +517,53 @@ impl Field {
elements: children, elements: children,
}) })
} }
/// Generate virtual Field from Registers node (piracy), guessing a lot of parameters.
pub(crate) fn from_xml_register_dom(node: Node) -> Result<Self, DomConversionError> {
// // Prepend "val_" to avoid name confliction with struct for accessing values
// let name = "val_".to_string() + &util::get_name(node)?;
let name = "field".to_string();
let mask = match node.attribute("mask") {
Some(mask) => mask
.parse_prefixed_u32()
.map_err(|e| DomConversionError::parse_prefixed_u32_error(e, "mask", node))?,
None => 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,
));
}
// Duplicated with parent (register) desc so should be removed, or add some comment?
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 { impl Value {

View file

@ -46,7 +46,7 @@ pub fn generate(xml: &path::Path, out: &path::Path) -> Result<(), Error> {
log::debug!("xml parsed {doc:?}"); log::debug!("xml parsed {doc:?}");
let register_map = types::Module::from_xml_dom(doc.root_element(), xml_git_info)?; let register_map = types::Module::from_xml_dom(doc.root_element(), xml_git_info)?;
log::debug!("converted {register_map:?}"); log::debug!("converted {register_map:#?}");
let (_maps, errors) = register_map.validate(); let (_maps, errors) = register_map.validate();
if !errors.is_empty() { if !errors.is_empty() {