blob: 87b4f1ad257958c175f22348888bdfef1e8f9b51 [file] [log] [blame]
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)