Initial checkin of TOSA reference_model and tests

Change-Id: I2f8e7fa63e2ae40203e57d2cc8814bde3b312cb6
Signed-off-by: Eric Kunze <eric.kunze@arm.com>
diff --git a/serialization/tosa.fbs b/serialization/tosa.fbs
new file mode 100644
index 0000000..841cf3d
--- /dev/null
+++ b/serialization/tosa.fbs
@@ -0,0 +1,318 @@
+
+// Copyright (c) 2020, ARM Limited.
+//
+//    Licensed under the Apache License, Version 2.0 (the "License");
+//    you may not use this file except in compliance with the License.
+//    You may obtain a copy of the License at
+//
+//         http://www.apache.org/licenses/LICENSE-2.0
+//
+//    Unless required by applicable law or agreed to in writing, software
+//    distributed under the License is distributed on an "AS IS" BASIS,
+//    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//    See the License for the specific language governing permissions and
+//    limitations under the License.
+
+namespace tosa;
+
+// This corresponds to the version.
+file_identifier "TOSA";
+// File extension of any written files.
+file_extension "tosa";
+
+enum DType:uint32 {
+  UNKNOWN = 0,
+  BOOL,
+  AINT8,
+  UINT8,
+  INT4,
+  INT8,
+  INT16,
+  INT32,
+  INT48,
+  FLOAT,
+}
+
+enum Format:uint32 {
+  UNKNOWN = 0,
+  NHWC,
+  NDHWC,
+  OHWI,
+  HWIM,
+  DOHWI,
+}
+
+enum Usage:uint32 {
+  UNKNOWN = 0,
+  ACTIVATION,
+  WEIGHT,
+  INDEX,
+}
+
+enum ResizeMode:uint32 {
+  UNKNOWN = 0,
+  NEAREST,
+  BILINEAR,
+}
+
+enum Op:uint32 {
+  UNKNOWN = 0,
+
+  // Tensor Operator
+  ARGMAX,
+  AVG_POOL2D,
+  CONV2D,
+  CONV3D,
+  DEPTHWISE_CONV2D,
+  FULLY_CONNECTED,
+  MATMUL,
+  MAX_POOL2D,
+  TRANSPOSE_CONV2D,
+
+  // Activation
+  CLAMP,
+  RELUN,
+  SIGMOID,
+  TANH,
+
+  // Elementwise-Binary
+  ADD,
+  ARITHMETIC_RIGHT_SHIFT,
+  BITWISE_AND,
+  BITWISE_OR,
+  BITWISE_XOR,
+  LOGICAL_AND,
+  LOGICAL_LEFT_SHIFT,
+  LOGICAL_RIGHT_SHIFT,
+  LOGICAL_OR,
+  LOGICAL_XOR,
+  MAXIMUM,
+  MINIMUM,
+  MUL,
+  POW,
+  SUB,
+  TABLE,
+
+  // Elementwise-Unary
+  ABS,
+  BITWISE_NOT,
+  CEIL,
+  CLZ,
+  EXP,
+  FLOOR,
+  LOG,
+  LOGICAL_NOT,
+  NEGATE,
+  RECIPROCAL,
+  RSQRT,
+
+  // Elementwise-Ternary
+  SELECT,
+
+  // Logical
+  EQUAL,
+  GREATER,
+  GREATER_EQUAL,
+
+  // Reduction
+  REDUCE_ANY,
+  REDUCE_ALL,
+  REDUCE_MAX,
+  REDUCE_MIN,
+  REDUCE_PRODUCT,
+  REDUCE_SUM,
+
+  // Data layout operation
+  CONCAT,
+  PAD,
+  RESHAPE,
+  REVERSE,
+  SLICE,
+  TILE,
+  TRANSPOSE,
+
+  // Gather/scatter operation
+  GATHER,
+
+  // Image
+  RESIZE,
+
+  // Type conversion
+  CAST,
+  RESCALE,
+
+  // Data Nodes
+  CONST,
+  PLACEHOLDER,
+  IDENTITY,
+  IDENTITYN,
+
+  // Custom operations
+  CUSTOM,
+
+  // Control flow operators
+  COND_IF,
+  WHILE_LOOP,
+}
+
+union Attribute {
+  Pool2dAttribute,
+  Conv2dAttribute,
+  TransposeConv2dAttribute,
+  ReluNAttribute,
+  AxisAttribute,
+  ReshapeAttribute,
+  SliceAttribute,
+  TileAttribute,
+  ResizeAttribute,
+  ClampAttribute,
+  RescaleAttribute,
+  CustomAttribute,
+  CondIfAttribute,
+  WhileLoopAttribute,
+}
+
+table Pool2dAttribute {
+  padding: [int32];
+  kernel: [int32];
+  stride: [int32];
+}
+
+table Conv2dAttribute {
+  padding: [int32];
+  stride: [int32];
+  dilation: [int32];
+}
+
+table TransposeConv2dAttribute {
+  outpad: [int32];
+  stride: [int32];
+  dilation: [int32];
+  output_shape: [int32];
+}
+
+table ReluNAttribute {
+  max_int: int32;
+  max_fp: float;
+}
+
+table AxisAttribute {
+  axis: int32;
+}
+
+table ReshapeAttribute {
+  shape: [int32];
+}
+
+table SliceAttribute {
+  begin: [int32];
+  size: [int32];
+}
+
+table TileAttribute {
+  multiples: [int32];
+}
+
+table ResizeAttribute {
+  output_size: [int32];
+  stride: [int32];
+  offset: [int32];
+  shift: int32;
+  mode: ResizeMode;
+}
+
+table ClampAttribute {
+  min_int: int32;
+  max_int: int32;
+  min_fp: float;
+  max_fp: float;
+}
+
+table RescaleAttribute {
+  input_zp: int32;
+  output_zp: int32;
+  multiplier: [int32];
+  shift: [int32];
+  scale32: bool;
+  double_round: bool;
+  per_channel: bool;
+}
+
+table CustomAttribute {
+  identifier: string;
+}
+
+table CondIfAttribute {
+  then_branch: string;
+  else_branch: string;
+}
+
+table WhileLoopAttribute {
+  cond_branch: string;
+  body_branch: string;
+}
+
+union QuantInfo {
+  UnaryQuantInfo,
+  ConvQuantInfo,
+  MatMulQuantInfo,
+  PadQuantInfo,
+}
+
+table UnaryQuantInfo {
+  input_zp: int32;
+  output_zp: int32;
+}
+
+table ConvQuantInfo {
+  input_zp: int32;
+  weight_zp: int32;
+}
+
+table MatMulQuantInfo {
+  a_zp: int32;
+  b_zp: int32;
+}
+
+table PadQuantInfo {
+  input_zp: int32;
+}
+
+table Version {
+  _major: int32 = 0;
+  _minor: int32 = 20;
+  _patch: int32 = 0;
+  _experimental: bool = false;
+}
+
+table TosaTensor {
+  name:string;              // name of the tensor, used for solving dependency
+  shape:[int32];            // shape of the tensor
+  type:DType;               // data type of the tensor
+  usage:[Usage];            // vector of possible usages. for the convenience of debugging only.
+  format:[Format];          // vector of possible formats. for the convenience of debugging only.
+  npy_filename: string;     // numpy array filename
+}
+
+table TosaOperator {
+  op:Op;                    // operator enum
+  attribute: Attribute;     // union structure. operator attribute
+  inputs:[string];          // list of input tensor names
+  outputs:[string];         // list of output tensor names
+  quant_info: QuantInfo;    // op-based quantization information
+}
+
+table TosaBasicBlock {
+  name:string;              // basic block name
+  operators:[TosaOperator]; // operators array
+  tensors:[TosaTensor];     // tensors array
+  inputs:[string];          // name of graph inputs
+  outputs:[string];         // name of graph outputs
+}
+
+table TosaGraph {
+  version: Version;
+  blocks:[TosaBasicBlock];  // basic blocks array
+}
+
+root_type TosaGraph;