Generate  an operator configuration file from a list of tflite models

Signed-off-by: Georgios Pinitas <georgios.pinitas@arm.com>
Change-Id: I1b13da6558bd11d49747162d66c81255ccec1498
Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/6166
Tested-by: Arm Jenkins <bsgcomp@arm.com>
Reviewed-by: SiCong Li <sicong.li@arm.com>
Reviewed-by: Sheri Zhang <sheri.zhang@arm.com>
Comments-Addressed: Arm Jenkins <bsgcomp@arm.com>
diff --git a/python/scripts/utils/tflite_helpers.py b/python/scripts/utils/tflite_helpers.py
new file mode 100644
index 0000000..8f8d422
--- /dev/null
+++ b/python/scripts/utils/tflite_helpers.py
@@ -0,0 +1,230 @@
+# Copyright (c) 2021 Arm Limited.
+#
+# SPDX-License-Identifier: MIT
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+_TFLITE_TYPECODE2NAME = {
+    0: "Float32",
+    1: "Float16",
+    2: "Int32",
+    3: "Uint8",
+    4: "Int64",
+    5: "String",
+    6: "Bool",
+    7: "Int16",
+    8: "Complex64",
+    9: "Int8",
+}
+
+_TFLITE_TO_ACL = {
+    "ADD": "Add",  # 0
+    "AVERAGE_POOL_2D": "Pool2d",  # 1
+    "CONCATENATION": "Concatenate",  # 2
+    "CONV_2D": "Conv2d",  # 3
+    "DEPTHWISE_CONV_2D": "DepthwiseConv2d",  # 4
+    "DEPTH_TO_SPACE": "DepthToSpace",  # 5
+    "DEQUANTIZE": "Dequantize",  # 6
+    # "EMBEDDING_LOOKUP" : "Unsupported",                  #7
+    "FLOOR": "Floor",  # 8
+    "FULLY_CONNECTED": "FullyConnected",  # 9
+    # "HASHTABLE_LOOKUP" : "Unsupported",                  #10
+    "L2_NORMALIZATION": "L2Normalize",  # 11
+    "L2_POOL_2D": "Pool2d",  # 12
+    "LOCAL_RESPONSE_NORMALIZATION": "Normalize",  # 13
+    "LOGISTIC": "Activation",  # 14
+    # "LSH_PROJECTION" : "Unsupported",                    #15
+    "LSTM": "LSTM",  # 16
+    "MAX_POOL_2D": "Pool2d",  # 17
+    "MUL": "Mul",  # 18
+    "RELU": "Activation",  # 19
+    "RELU_N1_TO_1": "Activation",  # 20
+    "RELU6": "Activation",  # 21
+    "RESHAPE": "Reshape",  # 22
+    "RESIZE_BILINEAR": "Scale",  # 23
+    "RNN": "RNN",  # 24
+    "SOFTMAX": "Softmax",  # 25
+    "SPACE_TO_DEPTH": "SpaceToDepth",  # 26
+    # "SVDF" : "Unsupported",                              #27
+    "TANH": "Activation",  # 28
+    # "CONCAT_EMBEDDINGS" : "Unsupported",                 #29
+    # "SKIP_GRAM" : "Unsupported",                         #30
+    # "CALL" : "Unsupported",                              #31
+    # "CUSTOM" : "Unsupported",                            #32
+    # "EMBEDDING_LOOKUP_SPARSE" : "Unsupported",           #33
+    "PAD": "Pad",  # 34
+    # "UNIDIRECTIONAL_SEQUENCE_RNN" : "Unsupported",       #35
+    "GATHER": "Gather",  # 36
+    "BATCH_TO_SPACE_ND": "BatchToSpace",  # 37
+    "SPACE_TO_BATCH_ND": "SpaceToBatch",  # 38
+    "TRANSPOSE": "Permute",  # 39
+    "MEAN": "Reduction",  # 40
+    "SUB": "Sub",  # 41
+    "DIV": "Div",  # 42
+    "SQUEEZE": "Reshape",  # 43
+    # "UNIDIRECTIONAL_SEQUENCE_LSTM" : "Unsupported",      #44
+    "STRIDED_SLICE": "StridedSlice",  # 45
+    # "BIDIRECTIONAL_SEQUENCE_RNN" : "Unsupported",        #46
+    "EXP": "ElementwiseUnary",  # 47
+    # "TOPK_V2" : "Unsupported",                           #48
+    "SPLIT": "Split",  # 49
+    "LOG_SOFTMAX": "Softmax",  # 50
+    # "DELEGATE" : "Unuspported",                          #51
+    # "BIDIRECTIONAL_SEQUENCE_LSTM" : "Unsupported",       #52
+    "CAST": "Cast",  # 53
+    "PRELU": "PRelu",  # 54
+    "MAXIMUM": "ElementwiseBinary",  # 55
+    "ARG_MAX": "Reduction",  # 56
+    "MINIMUM": "ElementwiseBinary",  # 57
+    "LESS": "ElementwiseBinary",  # 58
+    "NEG": "ElementwiseUnary",  # 59
+    "PADV2": "Pad",  # 60
+    "GREATER": "ElementwiseBinary",  # 61
+    "GREATER_EQUAL": "ElementwiseBinary",  # 62
+    "LESS_EQUAL": "ElementwiseBinary",  # 63
+    "SELECT": "Select",  # 64
+    "SLICE": "Slice",  # 65
+    "SIN": "ElementwiseUnary",  # 66
+    "TRANSPOSE_CONV": "TransposeConv2d",  # 67
+    # "SPARSE_TO_DENSE" : "Unsupported",                   #68
+    "TILE": "Tile",  # 69
+    "EXPAND_DIMS": "Reshape",  # 70
+    "EQUAL": "ElementwiseBinary",  # 71
+    "NOT_EQUAL": "ElementwiseBinary",  # 72
+    "LOG": "ElementwiseUnary",  # 73
+    "SUM": "Reduction",  # 74
+    "SQRT": "Activation",  # 75
+    "RSQRT": "ElementwiseUnary",  # 76
+    "SHAPE": "",  # 77
+    "POW": "ElementwiseBinary",  # 78
+    "ARG_MIN": "Reduction",  # 79
+    # "FAKE_QUANT" : "Unsupported",                        #80
+    "REDUCE_PROD": "Reduction",  # 81
+    "REDUCE_MAX": "Reduction",  # 82
+    "PACK": "Stack",  # 83
+    "LOGICAL_OR": "ElementwiseBinary",  # 84
+    "ONE_HOT": "Unsupported",  # 85
+    "LOGICAL_AND": "ElementwiseBinary",  # 86
+    "LOGICAL_NOT": "ElementwiseUnary",  # 87
+    "UNPACK": "Unstack",  # 88
+    "REDUCE_MIN": "Reduction",  # 89
+    # "FLOOR_DIV" :  "Unsupported",                        #90
+    # "REDUCE_ANY" :  "Unsupported",                       #91
+    "SQUARE": "Activation",  # 92
+    "ZEROS_LIKE": "",  # 93
+    "FILL": "Fill",  # 94
+    # "FLOOR_MOD" :  "Unsupported",                        #95
+    "RANGE": "",  # 96
+    "RESIZE_NEAREST_NEIGHBOR": "Scale",  # 97
+    "LEAKY_RELU": "Activation",  # 98
+    "SQUARED_DIFFERENCE": "ElementwiseBinary",  # 99
+    "MIRROR_PAD": "Pad",  # 100
+    "ABS": "ElementwiseUnary",  # 101
+    "SPLIT_V": "Split",  # 102
+    # "UNIQUE" :  "Unsupported",                           #103
+    # "CEIL" :  "Unsupported",                             #104
+    "REVERSE_V2": "Reverse",  # 105
+    "ADD_N": "Add",  # 106
+    "GATHER_ND": "Gather",  # 107
+    # "COS" :  "Unsupported",                              #108
+    # "WHERE" :  "Unsupported",                            #109
+    "RANK": "",  # 110
+    "ELU": "Activation",  # 111
+    # "REVERSE_SEQUENCE" : "Unsupported",                  #112
+    # "MATRIX_DIAG" : "Unsupported",                       #113
+    "QUANTIZE": "Quantize",  # 114
+    # "MATRIX_SET_DIAG" :  "Unsupported",                  #115
+    "ROUND": "ElementwiseUnary",  # 116
+    "HARD_SWISH": "Activation",  # 117
+    # "IF" :  "Unsupported",                               #118
+    # "WHILE" :  "Unsupported",                            #119
+    # "NON_MAX_SUPPRESSION_V4" :  "Unsupported",           #120
+    # "NON_MAX_SUPPRESSION_V5" :  "Unsupported",           #121
+    # "SCATTER_ND" :  "Unsupported",                       #122
+    "SELECT_V2": "Select",  # 123
+    "DENSIFY": "Cast",  # 124
+    # "SEGMENT_SUM" : "Unsupported",                       #125
+    "BATCH_MATMUL": "GEMM",  # 126
+    # "PLACEHOLDER_FOR_GREATER_OP_CODES" :  "Unsupported", #127
+    # "CUMSUM" :  "Unsupported",                           #128
+    # "CALL_ONCE" : "Unsupported",                         #129
+    # "BROADCAST_TO" : "Unsupported",                      #130
+    # "RFFT2D" :  "Unsupported",                           #131
+    # "CONV_3D" :  "Unsupported",                          #132
+    # "IMAG" : "Unsupported",                              #133
+    # "REAL" : "Unsupported",                              #134
+    # "COMPLEX_ABS" : "Unsupported",                       #135
+    # "HASHTABLE" :  "Unsupported",                        #136
+    # "HASHTABLE_FIND" :  "Unsupported",                   #137
+    # "HASHTABLE_IMPORT" :  "Unsupported",                 #138
+    # "HASHTABLE_SIZE" :  "Unsupported",                   #139
+    # "REDUCE_ALL" :  "Unsupported",                       #140
+    # "CONV_3D_TRANSPOSE" : "Unsupported",                 #141
+    # "VAR_HANDLE" :  "Unsupported",                       #142
+    # "READ_VARIABLE" :  "Unsupported",                    #143
+    # "ASSIGN_VARIABLE" :  "Unsupported",                  #144
+}
+
+
+def tflite_typecode2name(toc):
+    """Stringify TfLite data-type opcodes
+
+    Parameters:
+    ----------
+    toc: int
+        TfLite type opcode
+
+    Returns
+    ----------
+    str
+        Stringified opcode
+
+    Raises
+    ------
+    ValueError
+        If opcode does not exist in the map
+    """
+    if toc in _TFLITE_TYPECODE2NAME:
+        return _TFLITE_TYPECODE2NAME[toc]
+    else:
+        raise ValueError("Unknown typecode %d" % toc)
+
+
+def tflite_op2acl(top):
+    """Map TfLite operators to ComputeLibrary ones
+
+    Parameters:
+    ----------
+    top: str
+        TfLite operator name
+
+    Returns
+    ----------
+    str
+        Relevant ComputeLibrary operator name
+
+    Raises
+    ------
+    ValueError
+        If operator cannot be mapped
+    """
+    if top in _TFLITE_TO_ACL:
+        return _TFLITE_TO_ACL[top]
+    else:
+        raise ValueError("Operator {} does not exist in ComputeLibrary" % top)