import re import xml.etree.ElementTree as ET class TOSAOperatorArgumentCategory: def __init__(self, name, profiles=None): self.name = name self.profiles = profiles class TOSAOperatorArgument: def __init__(self, name, description, categories, ty, shape): self.name = name self.description = description self.categories = categories self.type = ty self.shape = shape class TOSAOperatorDataTypeSupport: def __init__(self, mode, tymap, profiles=None): self.mode = mode self.tymap = tymap self.profiles = profiles class TOSAOperator: def __init__(self, name, arguments, types, typesupports): self.name = name self.arguments = arguments self.types = types self.typesupports = typesupports class TOSAOperatorGroup: def __init__(self, name, operators): self.name = name self.operators = operators class TOSASpec: def __init__(self, xmlpath): tree = ET.parse(xmlpath) self.xmlroot = tree.getroot() self.operatorgroups = [] self.__load_spec() def __load_spec(self): for group in self.xmlroot.findall("./operators/operatorgroup"): self.operatorgroups.append(self.__load_operator_group(group)) def __load_operator_group(self, group): name = group.get("name") operators = [] for op in group.findall("operator"): operators.append(self.__load_operator(op)) return TOSAOperatorGroup(name, operators) def __load_operator(self, op): name = op.find("name").text args = [] types = [] typesupports = [] for arg in op.findall("arguments/argument"): args.append(self.__load_operator_argument(arg)) # TODO add pseudo-code to operator object? for ty in op.findall("types/type"): types.append(ty.get("name")) for tysup in op.findall("typesupport"): tsmode = tysup.get("mode") tsmap = {} profiles = tysup.findall("profile") tsprofiles = [] for p in profiles: tsprofiles.append(p.get("name")) for ty in types: tsmap[ty] = tysup.get(ty) typesupports.append(TOSAOperatorDataTypeSupport(tsmode, tsmap, tsprofiles)) return TOSAOperator(name, args, types, typesupports) def __load_operator_argument(self, arg): name = arg.get("name") desc = arg.find("description").text.strip() argcats = [] argtype = arg.get("type") shape = arg.get("shape") cats = re.findall( r"(input|output|attribute)\(?([A-Z,]+)?\)?", arg.get("category") ) for cat in cats: argcats.append(TOSAOperatorArgumentCategory(cat[0], cat[1].split(","))) return TOSAOperatorArgument(name, desc, argcats, argtype, shape)