Add NCHW data layout support to GROUPED_CONV_2D.

Add a parameter data_layout to GROUPED_CONV_2D op for NCHW
data layout support. Create testcases and generate test.

Provide reference CPU implementation for NCHW support. The native layout
for CPU implementation is still NHWC. Appropriate transpositions are
applied for NCHW input/output.

Bug: 113562731

Test: NeuralNetworksTest_static
Change-Id: Ic2a4b2ac27fdd5bead7721a563fdddc43bd85aac
Merged-In: Ic2a4b2ac27fdd5bead7721a563fdddc43bd85aac
(cherry picked from commit c510d397d608c94351911eca07521d3211a537bc)
diff --git a/common/CpuExecutor.cpp b/common/CpuExecutor.cpp
index 7948aca..324b36c 100644
--- a/common/CpuExecutor.cpp
+++ b/common/CpuExecutor.cpp
@@ -1895,7 +1895,7 @@
         } break;
         case OperationType::GROUPED_CONV_2D: {
             const size_t inCount = ins.size();
-            if ((inCount != 11 && inCount != 8) || !allParametersPresent(inCount, 1)) {
+            if ((inCount != 12 && inCount != 9) || !allParametersPresent(inCount, 1)) {
                 return ANEURALNETWORKS_BAD_DATA;
             }
             const RunTimeOperandInfo& input = mOperands[ins[0]];
@@ -1904,11 +1904,13 @@
 
             int32_t padding_left, padding_right;
             int32_t padding_top, padding_bottom;
+            int32_t padding_implicit = 0;
             int32_t stride_width, stride_height;
             int32_t numGroups;
             int32_t activation;
+            bool data_layout = false;
 
-            if (inCount == 11) {
+            if (inCount == 12) {
                 padding_left = getScalarData<int32_t>(mOperands[ins[3]]);
                 padding_right = getScalarData<int32_t>(mOperands[ins[4]]);
                 padding_top = getScalarData<int32_t>(mOperands[ins[5]]);
@@ -1917,14 +1919,30 @@
                 stride_height = getScalarData<int32_t>(mOperands[ins[8]]);
                 numGroups = getScalarData<int32_t>(mOperands[ins[9]]);
                 activation = getScalarData<int32_t>(mOperands[ins[10]]);
+                data_layout = getScalarData<bool>(mOperands[ins[11]]);
             } else {
-                int32_t padding_implicit = getScalarData<int32_t>(mOperands[ins[3]]);
+                padding_implicit = getScalarData<int32_t>(mOperands[ins[3]]);
                 stride_width = getScalarData<int32_t>(mOperands[ins[4]]);
                 stride_height = getScalarData<int32_t>(mOperands[ins[5]]);
                 numGroups = getScalarData<int32_t>(mOperands[ins[6]]);
                 activation = getScalarData<int32_t>(mOperands[ins[7]]);
+                data_layout = getScalarData<bool>(mOperands[ins[8]]);
+            }
 
-                Shape inputShape = input.shape();
+            RunTimeOperandInfo& output = mOperands[outs[0]];
+            Shape outShape = output.shape();
+
+            RunTimeOperandInfo input_tmp, output_tmp;
+            std::unique_ptr<uint8_t[]> input_tmp_guard, output_tmp_guard;
+            if (!convertToNhwc(input_tmp, input, input_tmp_guard, data_layout)) {
+                success = false;
+                break;
+            }
+            output_tmp.lifetime = OperandLifeTime::TEMPORARY_VARIABLE;
+            output_tmp.buffer = data_layout ? nullptr : output.buffer;
+
+            if (inCount == 9) {
+                Shape inputShape = input_tmp.shape();
                 Shape filterShape = filter.shape();
                 int32_t input_width = getSizeOfDimension(inputShape, 2);
                 int32_t input_height = getSizeOfDimension(inputShape, 1);
@@ -1936,35 +1954,38 @@
                                          padding_implicit, &padding_top, &padding_bottom);
             }
 
-            RunTimeOperandInfo& output = mOperands[outs[0]];
-            Shape outShape = output.shape();
+            if (!groupedConvPrepare(input_tmp.shape(), filter.shape(), bias.shape(), padding_left,
+                                    padding_right, padding_top, padding_bottom, stride_width,
+                                    stride_height, numGroups, &outShape) ||
+                !setInfoAndAllocateIfNeeded(&output_tmp, outShape)) {
+                success = false;
+                break;
+            }
 
-            if (input.type == OperandType::TENSOR_FLOAT32) {
-                success =
-                        groupedConvPrepare(input.shape(), filter.shape(), bias.shape(),
-                                           padding_left, padding_right, padding_top, padding_bottom,
-                                           stride_width, stride_height, numGroups, &outShape) &&
-                        setInfoAndAllocateIfNeeded(&output, outShape) &&
-                        groupedConvFloat32(
-                                reinterpret_cast<const float*>(input.buffer), input.shape(),
-                                reinterpret_cast<const float*>(filter.buffer), filter.shape(),
-                                reinterpret_cast<const float*>(bias.buffer), bias.shape(),
-                                padding_left, padding_right, padding_top, padding_bottom,
-                                stride_width, stride_height, numGroups, activation,
-                                reinterpret_cast<float*>(output.buffer), outShape);
-            } else if (input.type == OperandType::TENSOR_QUANT8_ASYMM) {
-                success =
-                        groupedConvPrepare(input.shape(), filter.shape(), bias.shape(),
-                                           padding_left, padding_right, padding_top, padding_bottom,
-                                           stride_width, stride_height, numGroups, &outShape) &&
-                        setInfoAndAllocateIfNeeded(&output, outShape) &&
-                        groupedConvQuant8(
-                                reinterpret_cast<const uint8_t*>(input.buffer), input.shape(),
-                                reinterpret_cast<const uint8_t*>(filter.buffer), filter.shape(),
-                                reinterpret_cast<const int32_t*>(bias.buffer), bias.shape(),
-                                padding_left, padding_right, padding_top, padding_bottom,
-                                stride_width, stride_height, numGroups, activation,
-                                reinterpret_cast<uint8_t*>(output.buffer), outShape);
+            if (input_tmp.type == OperandType::TENSOR_FLOAT32) {
+                success = groupedConvFloat32(
+                        reinterpret_cast<const float*>(input_tmp.buffer), input_tmp.shape(),
+                        reinterpret_cast<const float*>(filter.buffer), filter.shape(),
+                        reinterpret_cast<const float*>(bias.buffer), bias.shape(), padding_left,
+                        padding_right, padding_top, padding_bottom, stride_width, stride_height,
+                        numGroups, activation, reinterpret_cast<float*>(output_tmp.buffer),
+                        outShape);
+            } else if (input_tmp.type == OperandType::TENSOR_QUANT8_ASYMM) {
+                success = groupedConvQuant8(
+                        reinterpret_cast<const uint8_t*>(input_tmp.buffer), input_tmp.shape(),
+                        reinterpret_cast<const uint8_t*>(filter.buffer), filter.shape(),
+                        reinterpret_cast<const int32_t*>(bias.buffer), bias.shape(), padding_left,
+                        padding_right, padding_top, padding_bottom, stride_width, stride_height,
+                        numGroups, activation, reinterpret_cast<uint8_t*>(output_tmp.buffer),
+                        outShape);
+            }
+
+            if (data_layout) {
+                output_tmp_guard.reset(output_tmp.buffer);
+            }
+            if (!success || !convertFromNhwc(output, output_tmp, data_layout)) {
+                success = false;
+                break;
             }
         } break;
         case OperationType::CHANNEL_SHUFFLE: {
diff --git a/common/Utils.cpp b/common/Utils.cpp
index 870f837..c3aaaa4 100644
--- a/common/Utils.cpp
+++ b/common/Utils.cpp
@@ -1769,9 +1769,9 @@
                                                  outExpectedTypes);
         }
         case ANEURALNETWORKS_GROUPED_CONV_2D: {
-            if ((inputCount != 11 && inputCount != 8) || outputCount != 1) {
+            if ((inputCount != 12 && inputCount != 9) || outputCount != 1) {
                 LOG(ERROR) << "Invalid number of input operands (" << inputCount
-                           << ", expected 11 or 8) or output operands (" << outputCount
+                           << ", expected 12 or 9) or output operands (" << outputCount
                            << ", expected 1) for operation " << kOperationNames[opType];
                 return ANEURALNETWORKS_BAD_DATA;
             }
@@ -1800,11 +1800,12 @@
                 return ANEURALNETWORKS_BAD_DATA;
             }
 
-            if (inputCount == 11) {
+            if (inputCount == 12) {
                 std::vector<OperandType> explicitScalarTypes(3, OperandType::INT32);
                 inExpectedTypes.insert(inExpectedTypes.end(), explicitScalarTypes.begin(),
                                        explicitScalarTypes.end());
             }
+            inExpectedTypes.push_back(OperandType::BOOL);
             *minSupportedHalVersion = HalVersion::V1_2;
             return validateOperationOperandTypes(operands, inputCount, inputIndexes,
                                                  inExpectedTypes, outputCount, outputIndexes,
diff --git a/runtime/include/NeuralNetworks.h b/runtime/include/NeuralNetworks.h
index c7e18f4..c721f2f 100644
--- a/runtime/include/NeuralNetworks.h
+++ b/runtime/include/NeuralNetworks.h
@@ -2098,7 +2098,10 @@
      * * {@link ANEURALNETWORKS_TENSOR_FLOAT32}
      * * {@link ANEURALNETWORKS_TENSOR_QUANT8_ASYMM}
      *
-     * Supported tensor rank: 4, with "NHWC" data layout.
+     * Supported tensor rank: 4, with "NHWC" or "NCHW" data layout.
+     * With the default data layout NHWC, the data is stored in the order of:
+     * [batch, height, width, channels]. Alternatively, the data layout could
+     * be NCHW, the data storage order of: [batch, channels, height, width].
      *
      * Both explicit padding and implicit padding are supported.
      *
@@ -2131,6 +2134,8 @@
      * * 10: An {@link ANEURALNETWORKS_INT32} scalar, and has to be one of the
      *       {@link FuseCode} values. Specifies the activation to
      *       invoke on the result.
+     * * 11: An {@link ANEURALNETWORKS_BOOL} scalar, set to true to specify
+     *       NCHW data layout for input0 and output0. Set to false for NHWC.
      *
      * Inputs (implicit padding):
      * * 0: A 4-D tensor, of shape [batches, height, width, depth_in],
@@ -2156,6 +2161,8 @@
      * * 7: An {@link ANEURALNETWORKS_INT32} scalar, and has to be one of the
      *      {@link FuseCode} values. Specifies the activation to
      *      invoke on the result.
+     * * 8: An {@link ANEURALNETWORKS_BOOL} scalar, set to true to specify
+     *      NCHW data layout for input0 and output0. Set to false for NHWC.
      *
      * Outputs:
      * * 0: The output 4-D tensor, of shape
diff --git a/runtime/test/TestValidateOperations.cpp b/runtime/test/TestValidateOperations.cpp
index b133807..d2067e3 100644
--- a/runtime/test/TestValidateOperations.cpp
+++ b/runtime/test/TestValidateOperations.cpp
@@ -1277,11 +1277,12 @@
                                               ? getOpType(ANEURALNETWORKS_TENSOR_INT32, 1, biasDim)
                                               : getOpType(operandCode, 1, biasDim);
     ANeuralNetworksOperandType scalar = getOpType(ANEURALNETWORKS_INT32);
+    ANeuralNetworksOperandType layout = getOpType(ANEURALNETWORKS_BOOL);
 
     OperationTestBase explicitGroupedConvTest(
             ANEURALNETWORKS_GROUPED_CONV_2D,
             {getOpType(operandCode, 4, inDim), getOpType(operandCode, 4, weightDim), bias, scalar,
-             scalar, scalar, scalar, scalar, scalar, scalar, scalar},
+             scalar, scalar, scalar, scalar, scalar, scalar, scalar, layout},
             {getOpType(operandCode, 4, outDim)});
 
     EXPECT_TRUE(explicitGroupedConvTest.testMutatingInputOperandCode());
@@ -1292,7 +1293,7 @@
     OperationTestBase implicitGroupedConvTest(
             ANEURALNETWORKS_GROUPED_CONV_2D,
             {getOpType(operandCode, 4, inDim), getOpType(operandCode, 4, weightDim), bias, scalar,
-             scalar, scalar, scalar, scalar},
+             scalar, scalar, scalar, scalar, layout},
             {getOpType(operandCode, 4, outDim)});
 
     EXPECT_TRUE(implicitGroupedConvTest.testMutatingInputOperandCode());
diff --git a/runtime/test/generated/all_generated_V1_2_vts_tests.cpp b/runtime/test/generated/all_generated_V1_2_vts_tests.cpp
index db5d8f0..ec05e84 100644
--- a/runtime/test/generated/all_generated_V1_2_vts_tests.cpp
+++ b/runtime/test/generated/all_generated_V1_2_vts_tests.cpp
@@ -1693,130 +1693,508 @@
 #include "vts_models/grouped_conv2d.model.cpp"
 } // namespace grouped_conv2d
 
-TEST_F(NeuralnetworksHidlTest, grouped_conv2d) {
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nhwc_none) {
   generated_tests::Execute(device,
-                           grouped_conv2d::createTestModel,
-                           grouped_conv2d::is_ignored,
-                           grouped_conv2d::examples);
+                           grouped_conv2d::createTestModel_nhwc_none,
+                           grouped_conv2d::is_ignored_nhwc_none,
+                           grouped_conv2d::examples_nhwc_none);
 }
 
-TEST_F(NeuralnetworksHidlTest, grouped_conv2d_weight_as_input) {
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nhwc_none_weight_as_input) {
   generated_tests::Execute(device,
-                           grouped_conv2d::createTestModel_weight_as_input,
-                           grouped_conv2d::is_ignored_weight_as_input,
-                           grouped_conv2d::examples_weight_as_input);
+                           grouped_conv2d::createTestModel_nhwc_none_weight_as_input,
+                           grouped_conv2d::is_ignored_nhwc_none_weight_as_input,
+                           grouped_conv2d::examples_nhwc_none_weight_as_input);
 }
 
-TEST_F(NeuralnetworksHidlTest, grouped_conv2d_relaxed) {
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nhwc_none_relaxed) {
   generated_tests::Execute(device,
-                           grouped_conv2d::createTestModel_relaxed,
-                           grouped_conv2d::is_ignored_relaxed,
-                           grouped_conv2d::examples_relaxed);
+                           grouped_conv2d::createTestModel_nhwc_none_relaxed,
+                           grouped_conv2d::is_ignored_nhwc_none_relaxed,
+                           grouped_conv2d::examples_nhwc_none_relaxed);
 }
 
-TEST_F(NeuralnetworksHidlTest, grouped_conv2d_relaxed_weight_as_input) {
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nhwc_none_relaxed_weight_as_input) {
   generated_tests::Execute(device,
-                           grouped_conv2d::createTestModel_relaxed_weight_as_input,
-                           grouped_conv2d::is_ignored_relaxed_weight_as_input,
-                           grouped_conv2d::examples_relaxed_weight_as_input);
+                           grouped_conv2d::createTestModel_nhwc_none_relaxed_weight_as_input,
+                           grouped_conv2d::is_ignored_nhwc_none_relaxed_weight_as_input,
+                           grouped_conv2d::examples_nhwc_none_relaxed_weight_as_input);
 }
 
-TEST_F(NeuralnetworksHidlTest, grouped_conv2d_quant8) {
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nhwc_none_quant8) {
   generated_tests::Execute(device,
-                           grouped_conv2d::createTestModel_quant8,
-                           grouped_conv2d::is_ignored_quant8,
-                           grouped_conv2d::examples_quant8);
+                           grouped_conv2d::createTestModel_nhwc_none_quant8,
+                           grouped_conv2d::is_ignored_nhwc_none_quant8,
+                           grouped_conv2d::examples_nhwc_none_quant8);
 }
 
-TEST_F(NeuralnetworksHidlTest, grouped_conv2d_quant8_weight_as_input) {
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nhwc_none_quant8_weight_as_input) {
   generated_tests::Execute(device,
-                           grouped_conv2d::createTestModel_quant8_weight_as_input,
-                           grouped_conv2d::is_ignored_quant8_weight_as_input,
-                           grouped_conv2d::examples_quant8_weight_as_input);
+                           grouped_conv2d::createTestModel_nhwc_none_quant8_weight_as_input,
+                           grouped_conv2d::is_ignored_nhwc_none_quant8_weight_as_input,
+                           grouped_conv2d::examples_nhwc_none_quant8_weight_as_input);
 }
 
-TEST_F(NeuralnetworksHidlTest, grouped_conv2d_large) {
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nhwc_relu) {
   generated_tests::Execute(device,
-                           grouped_conv2d::createTestModel_large,
-                           grouped_conv2d::is_ignored_large,
-                           grouped_conv2d::examples_large);
+                           grouped_conv2d::createTestModel_nhwc_relu,
+                           grouped_conv2d::is_ignored_nhwc_relu,
+                           grouped_conv2d::examples_nhwc_relu);
 }
 
-TEST_F(NeuralnetworksHidlTest, grouped_conv2d_large_weight_as_input) {
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nhwc_relu_weight_as_input) {
   generated_tests::Execute(device,
-                           grouped_conv2d::createTestModel_large_weight_as_input,
-                           grouped_conv2d::is_ignored_large_weight_as_input,
-                           grouped_conv2d::examples_large_weight_as_input);
+                           grouped_conv2d::createTestModel_nhwc_relu_weight_as_input,
+                           grouped_conv2d::is_ignored_nhwc_relu_weight_as_input,
+                           grouped_conv2d::examples_nhwc_relu_weight_as_input);
 }
 
-TEST_F(NeuralnetworksHidlTest, grouped_conv2d_large_relaxed) {
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nhwc_relu_relaxed) {
   generated_tests::Execute(device,
-                           grouped_conv2d::createTestModel_large_relaxed,
-                           grouped_conv2d::is_ignored_large_relaxed,
-                           grouped_conv2d::examples_large_relaxed);
+                           grouped_conv2d::createTestModel_nhwc_relu_relaxed,
+                           grouped_conv2d::is_ignored_nhwc_relu_relaxed,
+                           grouped_conv2d::examples_nhwc_relu_relaxed);
 }
 
-TEST_F(NeuralnetworksHidlTest, grouped_conv2d_large_relaxed_weight_as_input) {
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nhwc_relu_relaxed_weight_as_input) {
   generated_tests::Execute(device,
-                           grouped_conv2d::createTestModel_large_relaxed_weight_as_input,
-                           grouped_conv2d::is_ignored_large_relaxed_weight_as_input,
-                           grouped_conv2d::examples_large_relaxed_weight_as_input);
+                           grouped_conv2d::createTestModel_nhwc_relu_relaxed_weight_as_input,
+                           grouped_conv2d::is_ignored_nhwc_relu_relaxed_weight_as_input,
+                           grouped_conv2d::examples_nhwc_relu_relaxed_weight_as_input);
 }
 
-TEST_F(NeuralnetworksHidlTest, grouped_conv2d_large_quant8) {
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nhwc_relu_quant8) {
   generated_tests::Execute(device,
-                           grouped_conv2d::createTestModel_large_quant8,
-                           grouped_conv2d::is_ignored_large_quant8,
-                           grouped_conv2d::examples_large_quant8);
+                           grouped_conv2d::createTestModel_nhwc_relu_quant8,
+                           grouped_conv2d::is_ignored_nhwc_relu_quant8,
+                           grouped_conv2d::examples_nhwc_relu_quant8);
 }
 
-TEST_F(NeuralnetworksHidlTest, grouped_conv2d_large_quant8_weight_as_input) {
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nhwc_relu_quant8_weight_as_input) {
   generated_tests::Execute(device,
-                           grouped_conv2d::createTestModel_large_quant8_weight_as_input,
-                           grouped_conv2d::is_ignored_large_quant8_weight_as_input,
-                           grouped_conv2d::examples_large_quant8_weight_as_input);
+                           grouped_conv2d::createTestModel_nhwc_relu_quant8_weight_as_input,
+                           grouped_conv2d::is_ignored_nhwc_relu_quant8_weight_as_input,
+                           grouped_conv2d::examples_nhwc_relu_quant8_weight_as_input);
 }
 
-TEST_F(NeuralnetworksHidlTest, grouped_conv2d_channel) {
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nhwc_relu1) {
   generated_tests::Execute(device,
-                           grouped_conv2d::createTestModel_channel,
-                           grouped_conv2d::is_ignored_channel,
-                           grouped_conv2d::examples_channel);
+                           grouped_conv2d::createTestModel_nhwc_relu1,
+                           grouped_conv2d::is_ignored_nhwc_relu1,
+                           grouped_conv2d::examples_nhwc_relu1);
 }
 
-TEST_F(NeuralnetworksHidlTest, grouped_conv2d_channel_weight_as_input) {
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nhwc_relu1_weight_as_input) {
   generated_tests::Execute(device,
-                           grouped_conv2d::createTestModel_channel_weight_as_input,
-                           grouped_conv2d::is_ignored_channel_weight_as_input,
-                           grouped_conv2d::examples_channel_weight_as_input);
+                           grouped_conv2d::createTestModel_nhwc_relu1_weight_as_input,
+                           grouped_conv2d::is_ignored_nhwc_relu1_weight_as_input,
+                           grouped_conv2d::examples_nhwc_relu1_weight_as_input);
 }
 
-TEST_F(NeuralnetworksHidlTest, grouped_conv2d_channel_relaxed) {
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nhwc_relu1_relaxed) {
   generated_tests::Execute(device,
-                           grouped_conv2d::createTestModel_channel_relaxed,
-                           grouped_conv2d::is_ignored_channel_relaxed,
-                           grouped_conv2d::examples_channel_relaxed);
+                           grouped_conv2d::createTestModel_nhwc_relu1_relaxed,
+                           grouped_conv2d::is_ignored_nhwc_relu1_relaxed,
+                           grouped_conv2d::examples_nhwc_relu1_relaxed);
 }
 
-TEST_F(NeuralnetworksHidlTest, grouped_conv2d_channel_relaxed_weight_as_input) {
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nhwc_relu1_relaxed_weight_as_input) {
   generated_tests::Execute(device,
-                           grouped_conv2d::createTestModel_channel_relaxed_weight_as_input,
-                           grouped_conv2d::is_ignored_channel_relaxed_weight_as_input,
-                           grouped_conv2d::examples_channel_relaxed_weight_as_input);
+                           grouped_conv2d::createTestModel_nhwc_relu1_relaxed_weight_as_input,
+                           grouped_conv2d::is_ignored_nhwc_relu1_relaxed_weight_as_input,
+                           grouped_conv2d::examples_nhwc_relu1_relaxed_weight_as_input);
 }
 
-TEST_F(NeuralnetworksHidlTest, grouped_conv2d_channel_quant8) {
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nhwc_relu1_quant8) {
   generated_tests::Execute(device,
-                           grouped_conv2d::createTestModel_channel_quant8,
-                           grouped_conv2d::is_ignored_channel_quant8,
-                           grouped_conv2d::examples_channel_quant8);
+                           grouped_conv2d::createTestModel_nhwc_relu1_quant8,
+                           grouped_conv2d::is_ignored_nhwc_relu1_quant8,
+                           grouped_conv2d::examples_nhwc_relu1_quant8);
 }
 
-TEST_F(NeuralnetworksHidlTest, grouped_conv2d_channel_quant8_weight_as_input) {
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nhwc_relu1_quant8_weight_as_input) {
   generated_tests::Execute(device,
-                           grouped_conv2d::createTestModel_channel_quant8_weight_as_input,
-                           grouped_conv2d::is_ignored_channel_quant8_weight_as_input,
-                           grouped_conv2d::examples_channel_quant8_weight_as_input);
+                           grouped_conv2d::createTestModel_nhwc_relu1_quant8_weight_as_input,
+                           grouped_conv2d::is_ignored_nhwc_relu1_quant8_weight_as_input,
+                           grouped_conv2d::examples_nhwc_relu1_quant8_weight_as_input);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nhwc_relu6) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nhwc_relu6,
+                           grouped_conv2d::is_ignored_nhwc_relu6,
+                           grouped_conv2d::examples_nhwc_relu6);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nhwc_relu6_weight_as_input) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nhwc_relu6_weight_as_input,
+                           grouped_conv2d::is_ignored_nhwc_relu6_weight_as_input,
+                           grouped_conv2d::examples_nhwc_relu6_weight_as_input);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nhwc_relu6_relaxed) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nhwc_relu6_relaxed,
+                           grouped_conv2d::is_ignored_nhwc_relu6_relaxed,
+                           grouped_conv2d::examples_nhwc_relu6_relaxed);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nhwc_relu6_relaxed_weight_as_input) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nhwc_relu6_relaxed_weight_as_input,
+                           grouped_conv2d::is_ignored_nhwc_relu6_relaxed_weight_as_input,
+                           grouped_conv2d::examples_nhwc_relu6_relaxed_weight_as_input);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nhwc_relu6_quant8) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nhwc_relu6_quant8,
+                           grouped_conv2d::is_ignored_nhwc_relu6_quant8,
+                           grouped_conv2d::examples_nhwc_relu6_quant8);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nhwc_relu6_quant8_weight_as_input) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nhwc_relu6_quant8_weight_as_input,
+                           grouped_conv2d::is_ignored_nhwc_relu6_quant8_weight_as_input,
+                           grouped_conv2d::examples_nhwc_relu6_quant8_weight_as_input);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nchw_none) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nchw_none,
+                           grouped_conv2d::is_ignored_nchw_none,
+                           grouped_conv2d::examples_nchw_none);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nchw_none_weight_as_input) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nchw_none_weight_as_input,
+                           grouped_conv2d::is_ignored_nchw_none_weight_as_input,
+                           grouped_conv2d::examples_nchw_none_weight_as_input);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nchw_none_relaxed) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nchw_none_relaxed,
+                           grouped_conv2d::is_ignored_nchw_none_relaxed,
+                           grouped_conv2d::examples_nchw_none_relaxed);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nchw_none_relaxed_weight_as_input) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nchw_none_relaxed_weight_as_input,
+                           grouped_conv2d::is_ignored_nchw_none_relaxed_weight_as_input,
+                           grouped_conv2d::examples_nchw_none_relaxed_weight_as_input);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nchw_none_quant8) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nchw_none_quant8,
+                           grouped_conv2d::is_ignored_nchw_none_quant8,
+                           grouped_conv2d::examples_nchw_none_quant8);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nchw_none_quant8_weight_as_input) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nchw_none_quant8_weight_as_input,
+                           grouped_conv2d::is_ignored_nchw_none_quant8_weight_as_input,
+                           grouped_conv2d::examples_nchw_none_quant8_weight_as_input);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nchw_relu) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nchw_relu,
+                           grouped_conv2d::is_ignored_nchw_relu,
+                           grouped_conv2d::examples_nchw_relu);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nchw_relu_weight_as_input) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nchw_relu_weight_as_input,
+                           grouped_conv2d::is_ignored_nchw_relu_weight_as_input,
+                           grouped_conv2d::examples_nchw_relu_weight_as_input);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nchw_relu_relaxed) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nchw_relu_relaxed,
+                           grouped_conv2d::is_ignored_nchw_relu_relaxed,
+                           grouped_conv2d::examples_nchw_relu_relaxed);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nchw_relu_relaxed_weight_as_input) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nchw_relu_relaxed_weight_as_input,
+                           grouped_conv2d::is_ignored_nchw_relu_relaxed_weight_as_input,
+                           grouped_conv2d::examples_nchw_relu_relaxed_weight_as_input);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nchw_relu_quant8) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nchw_relu_quant8,
+                           grouped_conv2d::is_ignored_nchw_relu_quant8,
+                           grouped_conv2d::examples_nchw_relu_quant8);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nchw_relu_quant8_weight_as_input) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nchw_relu_quant8_weight_as_input,
+                           grouped_conv2d::is_ignored_nchw_relu_quant8_weight_as_input,
+                           grouped_conv2d::examples_nchw_relu_quant8_weight_as_input);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nchw_relu1) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nchw_relu1,
+                           grouped_conv2d::is_ignored_nchw_relu1,
+                           grouped_conv2d::examples_nchw_relu1);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nchw_relu1_weight_as_input) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nchw_relu1_weight_as_input,
+                           grouped_conv2d::is_ignored_nchw_relu1_weight_as_input,
+                           grouped_conv2d::examples_nchw_relu1_weight_as_input);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nchw_relu1_relaxed) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nchw_relu1_relaxed,
+                           grouped_conv2d::is_ignored_nchw_relu1_relaxed,
+                           grouped_conv2d::examples_nchw_relu1_relaxed);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nchw_relu1_relaxed_weight_as_input) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nchw_relu1_relaxed_weight_as_input,
+                           grouped_conv2d::is_ignored_nchw_relu1_relaxed_weight_as_input,
+                           grouped_conv2d::examples_nchw_relu1_relaxed_weight_as_input);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nchw_relu1_quant8) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nchw_relu1_quant8,
+                           grouped_conv2d::is_ignored_nchw_relu1_quant8,
+                           grouped_conv2d::examples_nchw_relu1_quant8);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nchw_relu1_quant8_weight_as_input) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nchw_relu1_quant8_weight_as_input,
+                           grouped_conv2d::is_ignored_nchw_relu1_quant8_weight_as_input,
+                           grouped_conv2d::examples_nchw_relu1_quant8_weight_as_input);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nchw_relu6) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nchw_relu6,
+                           grouped_conv2d::is_ignored_nchw_relu6,
+                           grouped_conv2d::examples_nchw_relu6);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nchw_relu6_weight_as_input) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nchw_relu6_weight_as_input,
+                           grouped_conv2d::is_ignored_nchw_relu6_weight_as_input,
+                           grouped_conv2d::examples_nchw_relu6_weight_as_input);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nchw_relu6_relaxed) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nchw_relu6_relaxed,
+                           grouped_conv2d::is_ignored_nchw_relu6_relaxed,
+                           grouped_conv2d::examples_nchw_relu6_relaxed);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nchw_relu6_relaxed_weight_as_input) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nchw_relu6_relaxed_weight_as_input,
+                           grouped_conv2d::is_ignored_nchw_relu6_relaxed_weight_as_input,
+                           grouped_conv2d::examples_nchw_relu6_relaxed_weight_as_input);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nchw_relu6_quant8) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nchw_relu6_quant8,
+                           grouped_conv2d::is_ignored_nchw_relu6_quant8,
+                           grouped_conv2d::examples_nchw_relu6_quant8);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_nchw_relu6_quant8_weight_as_input) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_nchw_relu6_quant8_weight_as_input,
+                           grouped_conv2d::is_ignored_nchw_relu6_quant8_weight_as_input,
+                           grouped_conv2d::examples_nchw_relu6_quant8_weight_as_input);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_large_nhwc) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_large_nhwc,
+                           grouped_conv2d::is_ignored_large_nhwc,
+                           grouped_conv2d::examples_large_nhwc);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_large_nhwc_weight_as_input) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_large_nhwc_weight_as_input,
+                           grouped_conv2d::is_ignored_large_nhwc_weight_as_input,
+                           grouped_conv2d::examples_large_nhwc_weight_as_input);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_large_nhwc_relaxed) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_large_nhwc_relaxed,
+                           grouped_conv2d::is_ignored_large_nhwc_relaxed,
+                           grouped_conv2d::examples_large_nhwc_relaxed);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_large_nhwc_relaxed_weight_as_input) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_large_nhwc_relaxed_weight_as_input,
+                           grouped_conv2d::is_ignored_large_nhwc_relaxed_weight_as_input,
+                           grouped_conv2d::examples_large_nhwc_relaxed_weight_as_input);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_large_nhwc_quant8) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_large_nhwc_quant8,
+                           grouped_conv2d::is_ignored_large_nhwc_quant8,
+                           grouped_conv2d::examples_large_nhwc_quant8);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_large_nhwc_quant8_weight_as_input) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_large_nhwc_quant8_weight_as_input,
+                           grouped_conv2d::is_ignored_large_nhwc_quant8_weight_as_input,
+                           grouped_conv2d::examples_large_nhwc_quant8_weight_as_input);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_large_nchw) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_large_nchw,
+                           grouped_conv2d::is_ignored_large_nchw,
+                           grouped_conv2d::examples_large_nchw);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_large_nchw_weight_as_input) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_large_nchw_weight_as_input,
+                           grouped_conv2d::is_ignored_large_nchw_weight_as_input,
+                           grouped_conv2d::examples_large_nchw_weight_as_input);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_large_nchw_relaxed) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_large_nchw_relaxed,
+                           grouped_conv2d::is_ignored_large_nchw_relaxed,
+                           grouped_conv2d::examples_large_nchw_relaxed);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_large_nchw_relaxed_weight_as_input) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_large_nchw_relaxed_weight_as_input,
+                           grouped_conv2d::is_ignored_large_nchw_relaxed_weight_as_input,
+                           grouped_conv2d::examples_large_nchw_relaxed_weight_as_input);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_large_nchw_quant8) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_large_nchw_quant8,
+                           grouped_conv2d::is_ignored_large_nchw_quant8,
+                           grouped_conv2d::examples_large_nchw_quant8);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_large_nchw_quant8_weight_as_input) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_large_nchw_quant8_weight_as_input,
+                           grouped_conv2d::is_ignored_large_nchw_quant8_weight_as_input,
+                           grouped_conv2d::examples_large_nchw_quant8_weight_as_input);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_channel_nhwc) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_channel_nhwc,
+                           grouped_conv2d::is_ignored_channel_nhwc,
+                           grouped_conv2d::examples_channel_nhwc);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_channel_nhwc_weight_as_input) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_channel_nhwc_weight_as_input,
+                           grouped_conv2d::is_ignored_channel_nhwc_weight_as_input,
+                           grouped_conv2d::examples_channel_nhwc_weight_as_input);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_channel_nhwc_relaxed) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_channel_nhwc_relaxed,
+                           grouped_conv2d::is_ignored_channel_nhwc_relaxed,
+                           grouped_conv2d::examples_channel_nhwc_relaxed);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_channel_nhwc_relaxed_weight_as_input) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_channel_nhwc_relaxed_weight_as_input,
+                           grouped_conv2d::is_ignored_channel_nhwc_relaxed_weight_as_input,
+                           grouped_conv2d::examples_channel_nhwc_relaxed_weight_as_input);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_channel_nhwc_quant8) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_channel_nhwc_quant8,
+                           grouped_conv2d::is_ignored_channel_nhwc_quant8,
+                           grouped_conv2d::examples_channel_nhwc_quant8);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_channel_nhwc_quant8_weight_as_input) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_channel_nhwc_quant8_weight_as_input,
+                           grouped_conv2d::is_ignored_channel_nhwc_quant8_weight_as_input,
+                           grouped_conv2d::examples_channel_nhwc_quant8_weight_as_input);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_channel_nchw) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_channel_nchw,
+                           grouped_conv2d::is_ignored_channel_nchw,
+                           grouped_conv2d::examples_channel_nchw);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_channel_nchw_weight_as_input) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_channel_nchw_weight_as_input,
+                           grouped_conv2d::is_ignored_channel_nchw_weight_as_input,
+                           grouped_conv2d::examples_channel_nchw_weight_as_input);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_channel_nchw_relaxed) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_channel_nchw_relaxed,
+                           grouped_conv2d::is_ignored_channel_nchw_relaxed,
+                           grouped_conv2d::examples_channel_nchw_relaxed);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_channel_nchw_relaxed_weight_as_input) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_channel_nchw_relaxed_weight_as_input,
+                           grouped_conv2d::is_ignored_channel_nchw_relaxed_weight_as_input,
+                           grouped_conv2d::examples_channel_nchw_relaxed_weight_as_input);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_channel_nchw_quant8) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_channel_nchw_quant8,
+                           grouped_conv2d::is_ignored_channel_nchw_quant8,
+                           grouped_conv2d::examples_channel_nchw_quant8);
+}
+
+TEST_F(NeuralnetworksHidlTest, grouped_conv2d_channel_nchw_quant8_weight_as_input) {
+  generated_tests::Execute(device,
+                           grouped_conv2d::createTestModel_channel_nchw_quant8_weight_as_input,
+                           grouped_conv2d::is_ignored_channel_nchw_quant8_weight_as_input,
+                           grouped_conv2d::examples_channel_nchw_quant8_weight_as_input);
 }
 
 // Generated from: heatmap_max_keypoint.mod.py.
diff --git a/runtime/test/generated/examples/grouped_conv2d.example.cpp b/runtime/test/generated/examples/grouped_conv2d.example.cpp
index 7679b4b..0c549bf 100644
--- a/runtime/test/generated/examples/grouped_conv2d.example.cpp
+++ b/runtime/test/generated/examples/grouped_conv2d.example.cpp
@@ -1,6 +1,6 @@
 // clang-format off
 // Generated file (from: grouped_conv2d.mod.py). Do not edit
-std::vector<MixedTypedExample> examples = {
+std::vector<MixedTypedExample> examples_nhwc_none = {
 // Begin of an example
 {
 //Input(s)
@@ -15,7 +15,7 @@
 //Output(s)
 { // See tools/test_generator/include/TestHarness.h:MixedTyped
   // int -> FLOAT32 map
-  {{0, {33.0f, 0.0f, 33.0f, 6.0f, 31.0f, 3.0f, 27.0f, 0.0f}}},
+  {{0, {33.0f, -0.5f, 33.0f, 7.5f, 31.0f, 4.5f, 27.0f, -9.5f}}},
   // int -> INT32 map
   {},
   // int -> QUANT8_ASYMM map
@@ -24,13 +24,13 @@
 }, // End of an example
 };
 
-std::vector<MixedTypedExample> examples_weight_as_input = {
+std::vector<MixedTypedExample> examples_nhwc_none_weight_as_input = {
 // Begin of an example
 {
 //Input(s)
 { // See tools/test_generator/include/TestHarness.h:MixedTyped
   // int -> FLOAT32 map
-  {{0, {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f, 2.0f, 3.0f, 3.0f, 3.0f, 3.0f, 3.0f}}, {1, {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f}}, {2, {10.0f, -35.0f}}},
+  {{0, {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f, 2.0f, 3.0f, 3.0f, 3.0f, 3.0f, 3.0f}}, {1, {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f}}, {2, {10.0f, -33.5f}}},
   // int -> INT32 map
   {},
   // int -> QUANT8_ASYMM map
@@ -39,7 +39,7 @@
 //Output(s)
 { // See tools/test_generator/include/TestHarness.h:MixedTyped
   // int -> FLOAT32 map
-  {{0, {33.0f, 0.0f, 33.0f, 6.0f, 31.0f, 3.0f, 27.0f, 0.0f}}},
+  {{0, {33.0f, -0.5f, 33.0f, 7.5f, 31.0f, 4.5f, 27.0f, -9.5f}}},
   // int -> INT32 map
   {},
   // int -> QUANT8_ASYMM map
@@ -48,7 +48,7 @@
 }, // End of an example
 };
 
-std::vector<MixedTypedExample> examples_relaxed = {
+std::vector<MixedTypedExample> examples_nhwc_none_relaxed = {
 // Begin of an example
 {
 //Input(s)
@@ -63,7 +63,7 @@
 //Output(s)
 { // See tools/test_generator/include/TestHarness.h:MixedTyped
   // int -> FLOAT32 map
-  {{0, {33.0f, 0.0f, 33.0f, 6.0f, 31.0f, 3.0f, 27.0f, 0.0f}}},
+  {{0, {33.0f, -0.5f, 33.0f, 7.5f, 31.0f, 4.5f, 27.0f, -9.5f}}},
   // int -> INT32 map
   {},
   // int -> QUANT8_ASYMM map
@@ -72,13 +72,13 @@
 }, // End of an example
 };
 
-std::vector<MixedTypedExample> examples_relaxed_weight_as_input = {
+std::vector<MixedTypedExample> examples_nhwc_none_relaxed_weight_as_input = {
 // Begin of an example
 {
 //Input(s)
 { // See tools/test_generator/include/TestHarness.h:MixedTyped
   // int -> FLOAT32 map
-  {{0, {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f, 2.0f, 3.0f, 3.0f, 3.0f, 3.0f, 3.0f}}, {1, {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f}}, {2, {10.0f, -35.0f}}},
+  {{0, {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f, 2.0f, 3.0f, 3.0f, 3.0f, 3.0f, 3.0f}}, {1, {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f}}, {2, {10.0f, -33.5f}}},
   // int -> INT32 map
   {},
   // int -> QUANT8_ASYMM map
@@ -87,7 +87,7 @@
 //Output(s)
 { // See tools/test_generator/include/TestHarness.h:MixedTyped
   // int -> FLOAT32 map
-  {{0, {33.0f, 0.0f, 33.0f, 6.0f, 31.0f, 3.0f, 27.0f, 0.0f}}},
+  {{0, {33.0f, -0.5f, 33.0f, 7.5f, 31.0f, 4.5f, 27.0f, -9.5f}}},
   // int -> INT32 map
   {},
   // int -> QUANT8_ASYMM map
@@ -96,7 +96,7 @@
 }, // End of an example
 };
 
-std::vector<MixedTypedExample> examples_quant8 = {
+std::vector<MixedTypedExample> examples_nhwc_none_quant8 = {
 // Begin of an example
 {
 //Input(s)
@@ -115,12 +115,12 @@
   // int -> INT32 map
   {},
   // int -> QUANT8_ASYMM map
-  {{0, {146, 80, 146, 92, 142, 86, 134, 80}}}
+  {{0, {146, 79, 146, 95, 142, 89, 134, 61}}}
 }
 }, // End of an example
 };
 
-std::vector<MixedTypedExample> examples_quant8_weight_as_input = {
+std::vector<MixedTypedExample> examples_nhwc_none_quant8_weight_as_input = {
 // Begin of an example
 {
 //Input(s)
@@ -128,7 +128,7 @@
   // int -> FLOAT32 map
   {},
   // int -> INT32 map
-  {{2, {160, -560}}},
+  {{2, {160, -536}}},
   // int -> QUANT8_ASYMM map
   {{0, {104, 108, 112, 116, 120, 124, 124, 120, 116, 112, 108, 104, 108, 112, 112, 112, 112, 112}}, {1, {132, 136, 136, 132, 144, 140, 136, 132}}}
 },
@@ -139,12 +139,1020 @@
   // int -> INT32 map
   {},
   // int -> QUANT8_ASYMM map
-  {{0, {146, 80, 146, 92, 142, 86, 134, 80}}}
+  {{0, {146, 79, 146, 95, 142, 89, 134, 61}}}
 }
 }, // End of an example
 };
 
-std::vector<MixedTypedExample> examples_large = {
+std::vector<MixedTypedExample> examples_nhwc_relu = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f, 2.0f, 3.0f, 3.0f, 3.0f, 3.0f, 3.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {33.0f, 0.0f, 33.0f, 7.5f, 31.0f, 4.5f, 27.0f, 0.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nhwc_relu_weight_as_input = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f, 2.0f, 3.0f, 3.0f, 3.0f, 3.0f, 3.0f}}, {1, {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f}}, {2, {10.0f, -33.5f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {33.0f, 0.0f, 33.0f, 7.5f, 31.0f, 4.5f, 27.0f, 0.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nhwc_relu_relaxed = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f, 2.0f, 3.0f, 3.0f, 3.0f, 3.0f, 3.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {33.0f, 0.0f, 33.0f, 7.5f, 31.0f, 4.5f, 27.0f, 0.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nhwc_relu_relaxed_weight_as_input = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f, 2.0f, 3.0f, 3.0f, 3.0f, 3.0f, 3.0f}}, {1, {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f}}, {2, {10.0f, -33.5f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {33.0f, 0.0f, 33.0f, 7.5f, 31.0f, 4.5f, 27.0f, 0.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nhwc_relu_quant8 = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {{0, {104, 108, 112, 116, 120, 124, 124, 120, 116, 112, 108, 104, 108, 112, 112, 112, 112, 112}}}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {{0, {146, 80, 146, 95, 142, 89, 134, 80}}}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nhwc_relu_quant8_weight_as_input = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {{2, {160, -536}}},
+  // int -> QUANT8_ASYMM map
+  {{0, {104, 108, 112, 116, 120, 124, 124, 120, 116, 112, 108, 104, 108, 112, 112, 112, 112, 112}}, {1, {132, 136, 136, 132, 144, 140, 136, 132}}}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {{0, {146, 80, 146, 95, 142, 89, 134, 80}}}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nhwc_relu1 = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f, 2.0f, 3.0f, 3.0f, 3.0f, 3.0f, 3.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, -0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nhwc_relu1_weight_as_input = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f, 2.0f, 3.0f, 3.0f, 3.0f, 3.0f, 3.0f}}, {1, {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f}}, {2, {10.0f, -33.5f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, -0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nhwc_relu1_relaxed = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f, 2.0f, 3.0f, 3.0f, 3.0f, 3.0f, 3.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, -0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nhwc_relu1_relaxed_weight_as_input = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f, 2.0f, 3.0f, 3.0f, 3.0f, 3.0f, 3.0f}}, {1, {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f}}, {2, {10.0f, -33.5f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, -0.5f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nhwc_relu1_quant8 = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {{0, {104, 108, 112, 116, 120, 124, 124, 120, 116, 112, 108, 104, 108, 112, 112, 112, 112, 112}}}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {{0, {82, 79, 82, 82, 82, 82, 82, 78}}}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nhwc_relu1_quant8_weight_as_input = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {{2, {160, -536}}},
+  // int -> QUANT8_ASYMM map
+  {{0, {104, 108, 112, 116, 120, 124, 124, 120, 116, 112, 108, 104, 108, 112, 112, 112, 112, 112}}, {1, {132, 136, 136, 132, 144, 140, 136, 132}}}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {{0, {82, 79, 82, 82, 82, 82, 82, 78}}}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nhwc_relu6 = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f, 2.0f, 3.0f, 3.0f, 3.0f, 3.0f, 3.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {6.0f, 0.0f, 6.0f, 6.0f, 6.0f, 4.5f, 6.0f, 0.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nhwc_relu6_weight_as_input = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f, 2.0f, 3.0f, 3.0f, 3.0f, 3.0f, 3.0f}}, {1, {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f}}, {2, {10.0f, -33.5f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {6.0f, 0.0f, 6.0f, 6.0f, 6.0f, 4.5f, 6.0f, 0.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nhwc_relu6_relaxed = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f, 2.0f, 3.0f, 3.0f, 3.0f, 3.0f, 3.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {6.0f, 0.0f, 6.0f, 6.0f, 6.0f, 4.5f, 6.0f, 0.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nhwc_relu6_relaxed_weight_as_input = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f, 2.0f, 3.0f, 3.0f, 3.0f, 3.0f, 3.0f}}, {1, {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f}}, {2, {10.0f, -33.5f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {6.0f, 0.0f, 6.0f, 6.0f, 6.0f, 4.5f, 6.0f, 0.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nhwc_relu6_quant8 = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {{0, {104, 108, 112, 116, 120, 124, 124, 120, 116, 112, 108, 104, 108, 112, 112, 112, 112, 112}}}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {{0, {92, 80, 92, 92, 92, 89, 92, 80}}}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nhwc_relu6_quant8_weight_as_input = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {{2, {160, -536}}},
+  // int -> QUANT8_ASYMM map
+  {{0, {104, 108, 112, 116, 120, 124, 124, 120, 116, 112, 108, 104, 108, 112, 112, 112, 112, 112}}, {1, {132, 136, 136, 132, 144, 140, 136, 132}}}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {{0, {92, 80, 92, 92, 92, 89, 92, 80}}}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nchw_none = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 3.0f, 5.0f, 6.0f, 4.0f, 2.0f, 2.0f, 3.0f, 3.0f, 2.0f, 4.0f, 6.0f, 5.0f, 3.0f, 1.0f, 3.0f, 3.0f, 3.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {33.0f, 33.0f, 31.0f, 27.0f, -0.5f, 7.5f, 4.5f, -9.5f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nchw_none_weight_as_input = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 3.0f, 5.0f, 6.0f, 4.0f, 2.0f, 2.0f, 3.0f, 3.0f, 2.0f, 4.0f, 6.0f, 5.0f, 3.0f, 1.0f, 3.0f, 3.0f, 3.0f}}, {1, {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f}}, {2, {10.0f, -33.5f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {33.0f, 33.0f, 31.0f, 27.0f, -0.5f, 7.5f, 4.5f, -9.5f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nchw_none_relaxed = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 3.0f, 5.0f, 6.0f, 4.0f, 2.0f, 2.0f, 3.0f, 3.0f, 2.0f, 4.0f, 6.0f, 5.0f, 3.0f, 1.0f, 3.0f, 3.0f, 3.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {33.0f, 33.0f, 31.0f, 27.0f, -0.5f, 7.5f, 4.5f, -9.5f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nchw_none_relaxed_weight_as_input = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 3.0f, 5.0f, 6.0f, 4.0f, 2.0f, 2.0f, 3.0f, 3.0f, 2.0f, 4.0f, 6.0f, 5.0f, 3.0f, 1.0f, 3.0f, 3.0f, 3.0f}}, {1, {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f}}, {2, {10.0f, -33.5f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {33.0f, 33.0f, 31.0f, 27.0f, -0.5f, 7.5f, 4.5f, -9.5f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nchw_none_quant8 = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {{0, {104, 112, 120, 124, 116, 108, 108, 112, 112, 108, 116, 124, 120, 112, 104, 112, 112, 112}}}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {{0, {146, 146, 142, 134, 79, 95, 89, 61}}}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nchw_none_quant8_weight_as_input = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {{2, {160, -536}}},
+  // int -> QUANT8_ASYMM map
+  {{0, {104, 112, 120, 124, 116, 108, 108, 112, 112, 108, 116, 124, 120, 112, 104, 112, 112, 112}}, {1, {132, 136, 136, 132, 144, 140, 136, 132}}}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {{0, {146, 146, 142, 134, 79, 95, 89, 61}}}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nchw_relu = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 3.0f, 5.0f, 6.0f, 4.0f, 2.0f, 2.0f, 3.0f, 3.0f, 2.0f, 4.0f, 6.0f, 5.0f, 3.0f, 1.0f, 3.0f, 3.0f, 3.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {33.0f, 33.0f, 31.0f, 27.0f, 0.0f, 7.5f, 4.5f, 0.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nchw_relu_weight_as_input = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 3.0f, 5.0f, 6.0f, 4.0f, 2.0f, 2.0f, 3.0f, 3.0f, 2.0f, 4.0f, 6.0f, 5.0f, 3.0f, 1.0f, 3.0f, 3.0f, 3.0f}}, {1, {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f}}, {2, {10.0f, -33.5f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {33.0f, 33.0f, 31.0f, 27.0f, 0.0f, 7.5f, 4.5f, 0.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nchw_relu_relaxed = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 3.0f, 5.0f, 6.0f, 4.0f, 2.0f, 2.0f, 3.0f, 3.0f, 2.0f, 4.0f, 6.0f, 5.0f, 3.0f, 1.0f, 3.0f, 3.0f, 3.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {33.0f, 33.0f, 31.0f, 27.0f, 0.0f, 7.5f, 4.5f, 0.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nchw_relu_relaxed_weight_as_input = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 3.0f, 5.0f, 6.0f, 4.0f, 2.0f, 2.0f, 3.0f, 3.0f, 2.0f, 4.0f, 6.0f, 5.0f, 3.0f, 1.0f, 3.0f, 3.0f, 3.0f}}, {1, {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f}}, {2, {10.0f, -33.5f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {33.0f, 33.0f, 31.0f, 27.0f, 0.0f, 7.5f, 4.5f, 0.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nchw_relu_quant8 = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {{0, {104, 112, 120, 124, 116, 108, 108, 112, 112, 108, 116, 124, 120, 112, 104, 112, 112, 112}}}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {{0, {146, 146, 142, 134, 80, 95, 89, 80}}}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nchw_relu_quant8_weight_as_input = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {{2, {160, -536}}},
+  // int -> QUANT8_ASYMM map
+  {{0, {104, 112, 120, 124, 116, 108, 108, 112, 112, 108, 116, 124, 120, 112, 104, 112, 112, 112}}, {1, {132, 136, 136, 132, 144, 140, 136, 132}}}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {{0, {146, 146, 142, 134, 80, 95, 89, 80}}}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nchw_relu1 = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 3.0f, 5.0f, 6.0f, 4.0f, 2.0f, 2.0f, 3.0f, 3.0f, 2.0f, 4.0f, 6.0f, 5.0f, 3.0f, 1.0f, 3.0f, 3.0f, 3.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 1.0f, 1.0f, 1.0f, -0.5f, 1.0f, 1.0f, -1.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nchw_relu1_weight_as_input = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 3.0f, 5.0f, 6.0f, 4.0f, 2.0f, 2.0f, 3.0f, 3.0f, 2.0f, 4.0f, 6.0f, 5.0f, 3.0f, 1.0f, 3.0f, 3.0f, 3.0f}}, {1, {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f}}, {2, {10.0f, -33.5f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 1.0f, 1.0f, 1.0f, -0.5f, 1.0f, 1.0f, -1.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nchw_relu1_relaxed = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 3.0f, 5.0f, 6.0f, 4.0f, 2.0f, 2.0f, 3.0f, 3.0f, 2.0f, 4.0f, 6.0f, 5.0f, 3.0f, 1.0f, 3.0f, 3.0f, 3.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 1.0f, 1.0f, 1.0f, -0.5f, 1.0f, 1.0f, -1.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nchw_relu1_relaxed_weight_as_input = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 3.0f, 5.0f, 6.0f, 4.0f, 2.0f, 2.0f, 3.0f, 3.0f, 2.0f, 4.0f, 6.0f, 5.0f, 3.0f, 1.0f, 3.0f, 3.0f, 3.0f}}, {1, {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f}}, {2, {10.0f, -33.5f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 1.0f, 1.0f, 1.0f, -0.5f, 1.0f, 1.0f, -1.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nchw_relu1_quant8 = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {{0, {104, 112, 120, 124, 116, 108, 108, 112, 112, 108, 116, 124, 120, 112, 104, 112, 112, 112}}}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {{0, {82, 82, 82, 82, 79, 82, 82, 78}}}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nchw_relu1_quant8_weight_as_input = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {{2, {160, -536}}},
+  // int -> QUANT8_ASYMM map
+  {{0, {104, 112, 120, 124, 116, 108, 108, 112, 112, 108, 116, 124, 120, 112, 104, 112, 112, 112}}, {1, {132, 136, 136, 132, 144, 140, 136, 132}}}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {{0, {82, 82, 82, 82, 79, 82, 82, 78}}}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nchw_relu6 = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 3.0f, 5.0f, 6.0f, 4.0f, 2.0f, 2.0f, 3.0f, 3.0f, 2.0f, 4.0f, 6.0f, 5.0f, 3.0f, 1.0f, 3.0f, 3.0f, 3.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {6.0f, 6.0f, 6.0f, 6.0f, 0.0f, 6.0f, 4.5f, 0.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nchw_relu6_weight_as_input = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 3.0f, 5.0f, 6.0f, 4.0f, 2.0f, 2.0f, 3.0f, 3.0f, 2.0f, 4.0f, 6.0f, 5.0f, 3.0f, 1.0f, 3.0f, 3.0f, 3.0f}}, {1, {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f}}, {2, {10.0f, -33.5f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {6.0f, 6.0f, 6.0f, 6.0f, 0.0f, 6.0f, 4.5f, 0.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nchw_relu6_relaxed = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 3.0f, 5.0f, 6.0f, 4.0f, 2.0f, 2.0f, 3.0f, 3.0f, 2.0f, 4.0f, 6.0f, 5.0f, 3.0f, 1.0f, 3.0f, 3.0f, 3.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {6.0f, 6.0f, 6.0f, 6.0f, 0.0f, 6.0f, 4.5f, 0.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nchw_relu6_relaxed_weight_as_input = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 3.0f, 5.0f, 6.0f, 4.0f, 2.0f, 2.0f, 3.0f, 3.0f, 2.0f, 4.0f, 6.0f, 5.0f, 3.0f, 1.0f, 3.0f, 3.0f, 3.0f}}, {1, {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f}}, {2, {10.0f, -33.5f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {6.0f, 6.0f, 6.0f, 6.0f, 0.0f, 6.0f, 4.5f, 0.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nchw_relu6_quant8 = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {{0, {104, 112, 120, 124, 116, 108, 108, 112, 112, 108, 116, 124, 120, 112, 104, 112, 112, 112}}}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {{0, {92, 92, 92, 92, 80, 92, 89, 80}}}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_nchw_relu6_quant8_weight_as_input = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {{2, {160, -536}}},
+  // int -> QUANT8_ASYMM map
+  {{0, {104, 112, 120, 124, 116, 108, 108, 112, 112, 108, 116, 124, 120, 112, 104, 112, 112, 112}}, {1, {132, 136, 136, 132, 144, 140, 136, 132}}}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {{0, {92, 92, 92, 92, 80, 92, 89, 80}}}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_large_nhwc = {
 // Begin of an example
 {
 //Input(s)
@@ -168,7 +1176,7 @@
 }, // End of an example
 };
 
-std::vector<MixedTypedExample> examples_large_weight_as_input = {
+std::vector<MixedTypedExample> examples_large_nhwc_weight_as_input = {
 // Begin of an example
 {
 //Input(s)
@@ -192,7 +1200,7 @@
 }, // End of an example
 };
 
-std::vector<MixedTypedExample> examples_large_relaxed = {
+std::vector<MixedTypedExample> examples_large_nhwc_relaxed = {
 // Begin of an example
 {
 //Input(s)
@@ -216,7 +1224,7 @@
 }, // End of an example
 };
 
-std::vector<MixedTypedExample> examples_large_relaxed_weight_as_input = {
+std::vector<MixedTypedExample> examples_large_nhwc_relaxed_weight_as_input = {
 // Begin of an example
 {
 //Input(s)
@@ -240,7 +1248,7 @@
 }, // End of an example
 };
 
-std::vector<MixedTypedExample> examples_large_quant8 = {
+std::vector<MixedTypedExample> examples_large_nhwc_quant8 = {
 // Begin of an example
 {
 //Input(s)
@@ -264,7 +1272,7 @@
 }, // End of an example
 };
 
-std::vector<MixedTypedExample> examples_large_quant8_weight_as_input = {
+std::vector<MixedTypedExample> examples_large_nhwc_quant8_weight_as_input = {
 // Begin of an example
 {
 //Input(s)
@@ -288,7 +1296,151 @@
 }, // End of an example
 };
 
-std::vector<MixedTypedExample> examples_channel = {
+std::vector<MixedTypedExample> examples_large_nchw = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 3.0f, 4.0f, 2.0f, 2.0f, 3.0f, 2.0f, 4.0f, 3.0f, 1.0f, 3.0f, 3.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {567.0f, 1480.0f, 608.0f, 1370.0f, 543.0f, 760.0f, -873.0f, -160.0f, -840.0f, -10.0f, -907.0f, -310.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_large_nchw_weight_as_input = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 3.0f, 4.0f, 2.0f, 2.0f, 3.0f, 2.0f, 4.0f, 3.0f, 1.0f, 3.0f, 3.0f}}, {1, {100.0f, 20.0f, 1.0f, 200.0f, 10.0f, 2.0f, 200.0f, 30.0f, 1.0f, 100.0f, 20.0f, 3.0f}}, {2, {500.0f, -1000.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {567.0f, 1480.0f, 608.0f, 1370.0f, 543.0f, 760.0f, -873.0f, -160.0f, -840.0f, -10.0f, -907.0f, -310.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_large_nchw_relaxed = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 3.0f, 4.0f, 2.0f, 2.0f, 3.0f, 2.0f, 4.0f, 3.0f, 1.0f, 3.0f, 3.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {567.0f, 1480.0f, 608.0f, 1370.0f, 543.0f, 760.0f, -873.0f, -160.0f, -840.0f, -10.0f, -907.0f, -310.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_large_nchw_relaxed_weight_as_input = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 3.0f, 4.0f, 2.0f, 2.0f, 3.0f, 2.0f, 4.0f, 3.0f, 1.0f, 3.0f, 3.0f}}, {1, {100.0f, 20.0f, 1.0f, 200.0f, 10.0f, 2.0f, 200.0f, 30.0f, 1.0f, 100.0f, 20.0f, 3.0f}}, {2, {500.0f, -1000.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {567.0f, 1480.0f, 608.0f, 1370.0f, 543.0f, 760.0f, -873.0f, -160.0f, -840.0f, -10.0f, -907.0f, -310.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_large_nchw_quant8 = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {{0, {132, 140, 144, 136, 136, 140, 136, 144, 140, 132, 140, 140}}}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {{0, {157, 248, 161, 237, 154, 176, 13, 84, 16, 99, 9, 69}}}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_large_nchw_quant8_weight_as_input = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {{2, {2000, -4000}}},
+  // int -> QUANT8_ASYMM map
+  {{0, {132, 140, 144, 136, 136, 140, 136, 144, 140, 132, 140, 140}}, {1, {100, 20, 1, 200, 10, 2, 200, 30, 1, 100, 20, 3}}}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {{0, {157, 248, 161, 237, 154, 176, 13, 84, 16, 99, 9, 69}}}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_channel_nhwc = {
 // Begin of an example
 {
 //Input(s)
@@ -312,7 +1464,7 @@
 }, // End of an example
 };
 
-std::vector<MixedTypedExample> examples_channel_weight_as_input = {
+std::vector<MixedTypedExample> examples_channel_nhwc_weight_as_input = {
 // Begin of an example
 {
 //Input(s)
@@ -336,7 +1488,7 @@
 }, // End of an example
 };
 
-std::vector<MixedTypedExample> examples_channel_relaxed = {
+std::vector<MixedTypedExample> examples_channel_nhwc_relaxed = {
 // Begin of an example
 {
 //Input(s)
@@ -360,7 +1512,7 @@
 }, // End of an example
 };
 
-std::vector<MixedTypedExample> examples_channel_relaxed_weight_as_input = {
+std::vector<MixedTypedExample> examples_channel_nhwc_relaxed_weight_as_input = {
 // Begin of an example
 {
 //Input(s)
@@ -384,7 +1536,7 @@
 }, // End of an example
 };
 
-std::vector<MixedTypedExample> examples_channel_quant8 = {
+std::vector<MixedTypedExample> examples_channel_nhwc_quant8 = {
 // Begin of an example
 {
 //Input(s)
@@ -408,7 +1560,7 @@
 }, // End of an example
 };
 
-std::vector<MixedTypedExample> examples_channel_quant8_weight_as_input = {
+std::vector<MixedTypedExample> examples_channel_nhwc_quant8_weight_as_input = {
 // Begin of an example
 {
 //Input(s)
@@ -432,3 +1584,147 @@
 }, // End of an example
 };
 
+std::vector<MixedTypedExample> examples_channel_nchw = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 5.0f, 2.0f, 1.0f, 2.0f, 4.0f, 3.0f, 0.0f, 3.0f, 3.0f, 2.0f, 2.0f, 4.0f, 2.0f, 3.0f, 1.0f, 55.0f, 11.0f, 22.0f, 33.0f, 4.0f, 2.0f, 3.0f, 1.0f, 3.0f, 3.0f, 2.0f, 2.0f, 2.0f, 4.0f, 3.0f, 0.0f, 1.0f, 5.0f, 2.0f, 1.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {24.0f, 32.0f, 24.0f, 17.0f, -16.0f, -6.0f, -13.0f, -18.0f, 215.0f, 73.0f, 111.0f, 134.0f, 338.0f, 50.0f, 128.0f, 170.0f, 98.0f, 134.0f, 102.0f, 73.0f, -51.0f, -45.0f, -51.0f, -55.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_channel_nchw_weight_as_input = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 5.0f, 2.0f, 1.0f, 2.0f, 4.0f, 3.0f, 0.0f, 3.0f, 3.0f, 2.0f, 2.0f, 4.0f, 2.0f, 3.0f, 1.0f, 55.0f, 11.0f, 22.0f, 33.0f, 4.0f, 2.0f, 3.0f, 1.0f, 3.0f, 3.0f, 2.0f, 2.0f, 2.0f, 4.0f, 3.0f, 0.0f, 1.0f, 5.0f, 2.0f, 1.0f}}, {1, {1.0f, 2.0f, 3.0f, 2.0f, 1.0f, 0.0f, 2.0f, 3.0f, 3.0f, 6.0f, 6.0f, 6.0f, 9.0f, 8.0f, 5.0f, 2.0f, 1.0f, 1.0f}}, {2, {10.0f, -20.0f, 30.0f, -40.0f, 50.0f, -60.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {24.0f, 32.0f, 24.0f, 17.0f, -16.0f, -6.0f, -13.0f, -18.0f, 215.0f, 73.0f, 111.0f, 134.0f, 338.0f, 50.0f, 128.0f, 170.0f, 98.0f, 134.0f, 102.0f, 73.0f, -51.0f, -45.0f, -51.0f, -55.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_channel_nchw_relaxed = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 5.0f, 2.0f, 1.0f, 2.0f, 4.0f, 3.0f, 0.0f, 3.0f, 3.0f, 2.0f, 2.0f, 4.0f, 2.0f, 3.0f, 1.0f, 55.0f, 11.0f, 22.0f, 33.0f, 4.0f, 2.0f, 3.0f, 1.0f, 3.0f, 3.0f, 2.0f, 2.0f, 2.0f, 4.0f, 3.0f, 0.0f, 1.0f, 5.0f, 2.0f, 1.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {24.0f, 32.0f, 24.0f, 17.0f, -16.0f, -6.0f, -13.0f, -18.0f, 215.0f, 73.0f, 111.0f, 134.0f, 338.0f, 50.0f, 128.0f, 170.0f, 98.0f, 134.0f, 102.0f, 73.0f, -51.0f, -45.0f, -51.0f, -55.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_channel_nchw_relaxed_weight_as_input = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {1.0f, 5.0f, 2.0f, 1.0f, 2.0f, 4.0f, 3.0f, 0.0f, 3.0f, 3.0f, 2.0f, 2.0f, 4.0f, 2.0f, 3.0f, 1.0f, 55.0f, 11.0f, 22.0f, 33.0f, 4.0f, 2.0f, 3.0f, 1.0f, 3.0f, 3.0f, 2.0f, 2.0f, 2.0f, 4.0f, 3.0f, 0.0f, 1.0f, 5.0f, 2.0f, 1.0f}}, {1, {1.0f, 2.0f, 3.0f, 2.0f, 1.0f, 0.0f, 2.0f, 3.0f, 3.0f, 6.0f, 6.0f, 6.0f, 9.0f, 8.0f, 5.0f, 2.0f, 1.0f, 1.0f}}, {2, {10.0f, -20.0f, 30.0f, -40.0f, 50.0f, -60.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {{0, {24.0f, 32.0f, 24.0f, 17.0f, -16.0f, -6.0f, -13.0f, -18.0f, 215.0f, 73.0f, 111.0f, 134.0f, 338.0f, 50.0f, 128.0f, 170.0f, 98.0f, 134.0f, 102.0f, 73.0f, -51.0f, -45.0f, -51.0f, -55.0f}}},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_channel_nchw_quant8 = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {{0, {2, 10, 4, 2, 4, 8, 6, 0, 6, 6, 4, 4, 8, 4, 6, 2, 110, 22, 44, 66, 8, 4, 6, 2, 6, 6, 4, 4, 4, 8, 6, 0, 2, 10, 4, 2}}}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {{0, {72, 76, 72, 68, 52, 57, 54, 51, 168, 96, 116, 127, 229, 85, 124, 145, 109, 127, 111, 96, 34, 38, 34, 32}}}
+}
+}, // End of an example
+};
+
+std::vector<MixedTypedExample> examples_channel_nchw_quant8_weight_as_input = {
+// Begin of an example
+{
+//Input(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {{2, {80, -160, 240, -320, 400, -480}}},
+  // int -> QUANT8_ASYMM map
+  {{0, {2, 10, 4, 2, 4, 8, 6, 0, 6, 6, 4, 4, 8, 4, 6, 2, 110, 22, 44, 66, 8, 4, 6, 2, 6, 6, 4, 4, 4, 8, 6, 0, 2, 10, 4, 2}}, {1, {4, 8, 12, 8, 4, 0, 8, 12, 12, 24, 24, 24, 36, 32, 20, 8, 4, 4}}}
+},
+//Output(s)
+{ // See tools/test_generator/include/TestHarness.h:MixedTyped
+  // int -> FLOAT32 map
+  {},
+  // int -> INT32 map
+  {},
+  // int -> QUANT8_ASYMM map
+  {{0, {72, 76, 72, 68, 52, 57, 54, 51, 168, 96, 116, 127, 229, 85, 124, 145, 109, 127, 111, 96, 34, 38, 34, 32}}}
+}
+}, // End of an example
+};
+
diff --git a/runtime/test/generated/models/grouped_conv2d.model.cpp b/runtime/test/generated/models/grouped_conv2d.model.cpp
index 9c472f4..65c6a7d 100644
--- a/runtime/test/generated/models/grouped_conv2d.model.cpp
+++ b/runtime/test/generated/models/grouped_conv2d.model.cpp
@@ -1,21 +1,22 @@
 // clang-format off
 // Generated file (from: grouped_conv2d.mod.py). Do not edit
-void CreateModel(Model *model) {
-  OperandType type0(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
-  OperandType type1(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
-  OperandType type10(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
-  OperandType type2(Type::TENSOR_FLOAT32, {2});
-  OperandType type3(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+void CreateModel_nhwc_none(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
   OperandType type4(Type::INT32, {});
-  OperandType type5(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
-  OperandType type6(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
-  OperandType type7(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
-  OperandType type8(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
-  OperandType type9(Type::TENSOR_FLOAT32, {6});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
   // Phase 1, operands
-  auto op1 = model->addOperand(&type0);
-  auto op2 = model->addOperand(&type1);
-  auto op3 = model->addOperand(&type2);
+  auto op1 = model->addOperand(&type1);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
   auto param = model->addOperand(&type4);
   auto param1 = model->addOperand(&type4);
   auto param2 = model->addOperand(&type4);
@@ -23,12 +24,13 @@
   auto param4 = model->addOperand(&type4);
   auto param5 = model->addOperand(&type4);
   auto param6 = model->addOperand(&type4);
-  auto param7 = model->addOperand(&type4);
-  auto op4 = model->addOperand(&type3);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
   // Phase 2, operations
   static float op2_init[] = {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f};
   model->setOperandValue(op2, op2_init, sizeof(float) * 8);
-  static float op3_init[] = {10.0f, -35.0f};
+  static float op3_init[] = {10.0f, -33.5f};
   model->setOperandValue(op3, op3_init, sizeof(float) * 2);
   static int32_t param_init[] = {0};
   model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
@@ -44,9 +46,11 @@
   model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
   static int32_t param6_init[] = {2};
   model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
-  static int32_t param7_init[] = {1};
-  model->setOperandValue(param7, param7_init, sizeof(int32_t) * 1);
-  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, param7}, {op4});
+  static int32_t act_init[] = {0};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
   // Phase 3, inputs and outputs
   model->identifyInputsAndOutputs(
     {op1},
@@ -54,27 +58,28 @@
   assert(model->isValid());
 }
 
-inline bool is_ignored(int i) {
+inline bool is_ignored_nhwc_none(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
-void CreateModel_weight_as_input(Model *model) {
-  OperandType type0(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
-  OperandType type1(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
-  OperandType type10(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
-  OperandType type2(Type::TENSOR_FLOAT32, {2});
-  OperandType type3(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+void CreateModel_nhwc_none_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
   OperandType type4(Type::INT32, {});
-  OperandType type5(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
-  OperandType type6(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
-  OperandType type7(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
-  OperandType type8(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
-  OperandType type9(Type::TENSOR_FLOAT32, {6});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
   // Phase 1, operands
-  auto op1 = model->addOperand(&type0);
-  auto op2 = model->addOperand(&type1);
-  auto op3 = model->addOperand(&type2);
+  auto op1 = model->addOperand(&type1);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
   auto param = model->addOperand(&type4);
   auto param1 = model->addOperand(&type4);
   auto param2 = model->addOperand(&type4);
@@ -82,8 +87,9 @@
   auto param4 = model->addOperand(&type4);
   auto param5 = model->addOperand(&type4);
   auto param6 = model->addOperand(&type4);
-  auto param7 = model->addOperand(&type4);
-  auto op4 = model->addOperand(&type3);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
   // Phase 2, operations
   static int32_t param_init[] = {0};
   model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
@@ -99,9 +105,11 @@
   model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
   static int32_t param6_init[] = {2};
   model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
-  static int32_t param7_init[] = {1};
-  model->setOperandValue(param7, param7_init, sizeof(int32_t) * 1);
-  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, param7}, {op4});
+  static int32_t act_init[] = {0};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
   // Phase 3, inputs and outputs
   model->identifyInputsAndOutputs(
     {op1, op2, op3},
@@ -109,27 +117,28 @@
   assert(model->isValid());
 }
 
-inline bool is_ignored_weight_as_input(int i) {
+inline bool is_ignored_nhwc_none_weight_as_input(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
-void CreateModel_relaxed(Model *model) {
-  OperandType type0(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
-  OperandType type1(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
-  OperandType type10(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
-  OperandType type2(Type::TENSOR_FLOAT32, {2});
-  OperandType type3(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+void CreateModel_nhwc_none_relaxed(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
   OperandType type4(Type::INT32, {});
-  OperandType type5(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
-  OperandType type6(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
-  OperandType type7(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
-  OperandType type8(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
-  OperandType type9(Type::TENSOR_FLOAT32, {6});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
   // Phase 1, operands
-  auto op1 = model->addOperand(&type0);
-  auto op2 = model->addOperand(&type1);
-  auto op3 = model->addOperand(&type2);
+  auto op1 = model->addOperand(&type1);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
   auto param = model->addOperand(&type4);
   auto param1 = model->addOperand(&type4);
   auto param2 = model->addOperand(&type4);
@@ -137,12 +146,13 @@
   auto param4 = model->addOperand(&type4);
   auto param5 = model->addOperand(&type4);
   auto param6 = model->addOperand(&type4);
-  auto param7 = model->addOperand(&type4);
-  auto op4 = model->addOperand(&type3);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
   // Phase 2, operations
   static float op2_init[] = {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f};
   model->setOperandValue(op2, op2_init, sizeof(float) * 8);
-  static float op3_init[] = {10.0f, -35.0f};
+  static float op3_init[] = {10.0f, -33.5f};
   model->setOperandValue(op3, op3_init, sizeof(float) * 2);
   static int32_t param_init[] = {0};
   model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
@@ -158,9 +168,11 @@
   model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
   static int32_t param6_init[] = {2};
   model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
-  static int32_t param7_init[] = {1};
-  model->setOperandValue(param7, param7_init, sizeof(int32_t) * 1);
-  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, param7}, {op4});
+  static int32_t act_init[] = {0};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
   // Phase 3, inputs and outputs
   model->identifyInputsAndOutputs(
     {op1},
@@ -170,27 +182,28 @@
   assert(model->isValid());
 }
 
-inline bool is_ignored_relaxed(int i) {
+inline bool is_ignored_nhwc_none_relaxed(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
-void CreateModel_relaxed_weight_as_input(Model *model) {
-  OperandType type0(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
-  OperandType type1(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
-  OperandType type10(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
-  OperandType type2(Type::TENSOR_FLOAT32, {2});
-  OperandType type3(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+void CreateModel_nhwc_none_relaxed_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
   OperandType type4(Type::INT32, {});
-  OperandType type5(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
-  OperandType type6(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
-  OperandType type7(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
-  OperandType type8(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
-  OperandType type9(Type::TENSOR_FLOAT32, {6});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
   // Phase 1, operands
-  auto op1 = model->addOperand(&type0);
-  auto op2 = model->addOperand(&type1);
-  auto op3 = model->addOperand(&type2);
+  auto op1 = model->addOperand(&type1);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
   auto param = model->addOperand(&type4);
   auto param1 = model->addOperand(&type4);
   auto param2 = model->addOperand(&type4);
@@ -198,8 +211,9 @@
   auto param4 = model->addOperand(&type4);
   auto param5 = model->addOperand(&type4);
   auto param6 = model->addOperand(&type4);
-  auto param7 = model->addOperand(&type4);
-  auto op4 = model->addOperand(&type3);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
   // Phase 2, operations
   static int32_t param_init[] = {0};
   model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
@@ -215,9 +229,11 @@
   model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
   static int32_t param6_init[] = {2};
   model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
-  static int32_t param7_init[] = {1};
-  model->setOperandValue(param7, param7_init, sizeof(int32_t) * 1);
-  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, param7}, {op4});
+  static int32_t act_init[] = {0};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
   // Phase 3, inputs and outputs
   model->identifyInputsAndOutputs(
     {op1, op2, op3},
@@ -227,31 +243,32 @@
   assert(model->isValid());
 }
 
-inline bool is_ignored_relaxed_weight_as_input(int i) {
+inline bool is_ignored_nhwc_none_relaxed_weight_as_input(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
-void CreateModel_quant8(Model *model) {
-  OperandType type0(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
-  OperandType type1(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
-  OperandType type10(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
-  OperandType type11(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
-  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
-  OperandType type13(Type::TENSOR_INT32, {2}, 0.0625f, 0);
-  OperandType type14(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
-  OperandType type2(Type::TENSOR_FLOAT32, {2});
-  OperandType type3(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+void CreateModel_nhwc_none_quant8(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
   OperandType type4(Type::INT32, {});
-  OperandType type5(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
-  OperandType type6(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
-  OperandType type7(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
-  OperandType type8(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
-  OperandType type9(Type::TENSOR_FLOAT32, {6});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
   // Phase 1, operands
-  auto op1 = model->addOperand(&type11);
-  auto op2 = model->addOperand(&type12);
-  auto op3 = model->addOperand(&type13);
+  auto op1 = model->addOperand(&type12);
+  auto op2 = model->addOperand(&type13);
+  auto op3 = model->addOperand(&type14);
   auto param = model->addOperand(&type4);
   auto param1 = model->addOperand(&type4);
   auto param2 = model->addOperand(&type4);
@@ -259,12 +276,13 @@
   auto param4 = model->addOperand(&type4);
   auto param5 = model->addOperand(&type4);
   auto param6 = model->addOperand(&type4);
-  auto param7 = model->addOperand(&type4);
-  auto op4 = model->addOperand(&type14);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type15);
   // Phase 2, operations
   static uint8_t op2_init[] = {132, 136, 136, 132, 144, 140, 136, 132};
   model->setOperandValue(op2, op2_init, sizeof(uint8_t) * 8);
-  static int32_t op3_init[] = {160, -560};
+  static int32_t op3_init[] = {160, -536};
   model->setOperandValue(op3, op3_init, sizeof(int32_t) * 2);
   static int32_t param_init[] = {0};
   model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
@@ -280,9 +298,11 @@
   model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
   static int32_t param6_init[] = {2};
   model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
-  static int32_t param7_init[] = {1};
-  model->setOperandValue(param7, param7_init, sizeof(int32_t) * 1);
-  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, param7}, {op4});
+  static int32_t act_init[] = {0};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
   // Phase 3, inputs and outputs
   model->identifyInputsAndOutputs(
     {op1},
@@ -290,31 +310,32 @@
   assert(model->isValid());
 }
 
-inline bool is_ignored_quant8(int i) {
+inline bool is_ignored_nhwc_none_quant8(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
-void CreateModel_quant8_weight_as_input(Model *model) {
-  OperandType type0(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
-  OperandType type1(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
-  OperandType type10(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
-  OperandType type11(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
-  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
-  OperandType type13(Type::TENSOR_INT32, {2}, 0.0625f, 0);
-  OperandType type14(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
-  OperandType type2(Type::TENSOR_FLOAT32, {2});
-  OperandType type3(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+void CreateModel_nhwc_none_quant8_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
   OperandType type4(Type::INT32, {});
-  OperandType type5(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
-  OperandType type6(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
-  OperandType type7(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
-  OperandType type8(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
-  OperandType type9(Type::TENSOR_FLOAT32, {6});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
   // Phase 1, operands
-  auto op1 = model->addOperand(&type11);
-  auto op2 = model->addOperand(&type12);
-  auto op3 = model->addOperand(&type13);
+  auto op1 = model->addOperand(&type12);
+  auto op2 = model->addOperand(&type13);
+  auto op3 = model->addOperand(&type14);
   auto param = model->addOperand(&type4);
   auto param1 = model->addOperand(&type4);
   auto param2 = model->addOperand(&type4);
@@ -322,8 +343,9 @@
   auto param4 = model->addOperand(&type4);
   auto param5 = model->addOperand(&type4);
   auto param6 = model->addOperand(&type4);
-  auto param7 = model->addOperand(&type4);
-  auto op4 = model->addOperand(&type14);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type15);
   // Phase 2, operations
   static int32_t param_init[] = {0};
   model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
@@ -339,9 +361,11 @@
   model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
   static int32_t param6_init[] = {2};
   model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
-  static int32_t param7_init[] = {1};
-  model->setOperandValue(param7, param7_init, sizeof(int32_t) * 1);
-  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, param7}, {op4});
+  static int32_t act_init[] = {0};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
   // Phase 3, inputs and outputs
   model->identifyInputsAndOutputs(
     {op1, op2, op3},
@@ -349,53 +373,2861 @@
   assert(model->isValid());
 }
 
-inline bool is_ignored_quant8_weight_as_input(int i) {
+inline bool is_ignored_nhwc_none_quant8_weight_as_input(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
-void CreateModel_large(Model *model) {
-  OperandType type0(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
-  OperandType type1(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
-  OperandType type10(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
-  OperandType type11(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
-  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
-  OperandType type13(Type::TENSOR_INT32, {2}, 0.0625f, 0);
-  OperandType type14(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
-  OperandType type2(Type::TENSOR_FLOAT32, {2});
-  OperandType type3(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+void CreateModel_nhwc_relu(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
   OperandType type4(Type::INT32, {});
-  OperandType type5(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
-  OperandType type6(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
-  OperandType type7(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
-  OperandType type8(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
-  OperandType type9(Type::TENSOR_FLOAT32, {6});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
   // Phase 1, operands
-  auto op11 = model->addOperand(&type5);
-  auto op21 = model->addOperand(&type6);
-  auto op31 = model->addOperand(&type2);
+  auto op1 = model->addOperand(&type1);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
+  // Phase 2, operations
+  static float op2_init[] = {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f};
+  model->setOperandValue(op2, op2_init, sizeof(float) * 8);
+  static float op3_init[] = {10.0f, -33.5f};
+  model->setOperandValue(op3, op3_init, sizeof(float) * 2);
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {1};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1},
+    {op4});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nhwc_relu(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nhwc_relu_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type1);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
+  // Phase 2, operations
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {1};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1, op2, op3},
+    {op4});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nhwc_relu_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nhwc_relu_relaxed(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type1);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
+  // Phase 2, operations
+  static float op2_init[] = {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f};
+  model->setOperandValue(op2, op2_init, sizeof(float) * 8);
+  static float op3_init[] = {10.0f, -33.5f};
+  model->setOperandValue(op3, op3_init, sizeof(float) * 2);
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {1};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1},
+    {op4});
+  // Phase 4: set relaxed execution
+  model->relaxComputationFloat32toFloat16(true);
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nhwc_relu_relaxed(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nhwc_relu_relaxed_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type1);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
+  // Phase 2, operations
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {1};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1, op2, op3},
+    {op4});
+  // Phase 4: set relaxed execution
+  model->relaxComputationFloat32toFloat16(true);
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nhwc_relu_relaxed_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nhwc_relu_quant8(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type12);
+  auto op2 = model->addOperand(&type13);
+  auto op3 = model->addOperand(&type14);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type15);
+  // Phase 2, operations
+  static uint8_t op2_init[] = {132, 136, 136, 132, 144, 140, 136, 132};
+  model->setOperandValue(op2, op2_init, sizeof(uint8_t) * 8);
+  static int32_t op3_init[] = {160, -536};
+  model->setOperandValue(op3, op3_init, sizeof(int32_t) * 2);
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {1};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1},
+    {op4});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nhwc_relu_quant8(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nhwc_relu_quant8_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type12);
+  auto op2 = model->addOperand(&type13);
+  auto op3 = model->addOperand(&type14);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type15);
+  // Phase 2, operations
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {1};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1, op2, op3},
+    {op4});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nhwc_relu_quant8_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nhwc_relu1(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type1);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
+  // Phase 2, operations
+  static float op2_init[] = {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f};
+  model->setOperandValue(op2, op2_init, sizeof(float) * 8);
+  static float op3_init[] = {10.0f, -33.5f};
+  model->setOperandValue(op3, op3_init, sizeof(float) * 2);
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {2};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1},
+    {op4});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nhwc_relu1(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nhwc_relu1_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type1);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
+  // Phase 2, operations
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {2};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1, op2, op3},
+    {op4});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nhwc_relu1_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nhwc_relu1_relaxed(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type1);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
+  // Phase 2, operations
+  static float op2_init[] = {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f};
+  model->setOperandValue(op2, op2_init, sizeof(float) * 8);
+  static float op3_init[] = {10.0f, -33.5f};
+  model->setOperandValue(op3, op3_init, sizeof(float) * 2);
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {2};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1},
+    {op4});
+  // Phase 4: set relaxed execution
+  model->relaxComputationFloat32toFloat16(true);
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nhwc_relu1_relaxed(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nhwc_relu1_relaxed_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type1);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
+  // Phase 2, operations
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {2};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1, op2, op3},
+    {op4});
+  // Phase 4: set relaxed execution
+  model->relaxComputationFloat32toFloat16(true);
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nhwc_relu1_relaxed_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nhwc_relu1_quant8(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type12);
+  auto op2 = model->addOperand(&type13);
+  auto op3 = model->addOperand(&type14);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type15);
+  // Phase 2, operations
+  static uint8_t op2_init[] = {132, 136, 136, 132, 144, 140, 136, 132};
+  model->setOperandValue(op2, op2_init, sizeof(uint8_t) * 8);
+  static int32_t op3_init[] = {160, -536};
+  model->setOperandValue(op3, op3_init, sizeof(int32_t) * 2);
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {2};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1},
+    {op4});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nhwc_relu1_quant8(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nhwc_relu1_quant8_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type12);
+  auto op2 = model->addOperand(&type13);
+  auto op3 = model->addOperand(&type14);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type15);
+  // Phase 2, operations
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {2};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1, op2, op3},
+    {op4});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nhwc_relu1_quant8_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nhwc_relu6(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type1);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
+  // Phase 2, operations
+  static float op2_init[] = {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f};
+  model->setOperandValue(op2, op2_init, sizeof(float) * 8);
+  static float op3_init[] = {10.0f, -33.5f};
+  model->setOperandValue(op3, op3_init, sizeof(float) * 2);
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {3};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1},
+    {op4});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nhwc_relu6(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nhwc_relu6_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type1);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
+  // Phase 2, operations
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {3};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1, op2, op3},
+    {op4});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nhwc_relu6_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nhwc_relu6_relaxed(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type1);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
+  // Phase 2, operations
+  static float op2_init[] = {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f};
+  model->setOperandValue(op2, op2_init, sizeof(float) * 8);
+  static float op3_init[] = {10.0f, -33.5f};
+  model->setOperandValue(op3, op3_init, sizeof(float) * 2);
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {3};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1},
+    {op4});
+  // Phase 4: set relaxed execution
+  model->relaxComputationFloat32toFloat16(true);
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nhwc_relu6_relaxed(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nhwc_relu6_relaxed_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type1);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
+  // Phase 2, operations
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {3};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1, op2, op3},
+    {op4});
+  // Phase 4: set relaxed execution
+  model->relaxComputationFloat32toFloat16(true);
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nhwc_relu6_relaxed_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nhwc_relu6_quant8(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type12);
+  auto op2 = model->addOperand(&type13);
+  auto op3 = model->addOperand(&type14);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type15);
+  // Phase 2, operations
+  static uint8_t op2_init[] = {132, 136, 136, 132, 144, 140, 136, 132};
+  model->setOperandValue(op2, op2_init, sizeof(uint8_t) * 8);
+  static int32_t op3_init[] = {160, -536};
+  model->setOperandValue(op3, op3_init, sizeof(int32_t) * 2);
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {3};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1},
+    {op4});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nhwc_relu6_quant8(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nhwc_relu6_quant8_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type12);
+  auto op2 = model->addOperand(&type13);
+  auto op3 = model->addOperand(&type14);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type15);
+  // Phase 2, operations
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {3};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1, op2, op3},
+    {op4});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nhwc_relu6_quant8_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nchw_none(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type16);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
+  // Phase 2, operations
+  static float op2_init[] = {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f};
+  model->setOperandValue(op2, op2_init, sizeof(float) * 8);
+  static float op3_init[] = {10.0f, -33.5f};
+  model->setOperandValue(op3, op3_init, sizeof(float) * 2);
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {0};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1},
+    {op4});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nchw_none(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nchw_none_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type16);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
+  // Phase 2, operations
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {0};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1, op2, op3},
+    {op4});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nchw_none_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nchw_none_relaxed(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type16);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
+  // Phase 2, operations
+  static float op2_init[] = {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f};
+  model->setOperandValue(op2, op2_init, sizeof(float) * 8);
+  static float op3_init[] = {10.0f, -33.5f};
+  model->setOperandValue(op3, op3_init, sizeof(float) * 2);
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {0};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1},
+    {op4});
+  // Phase 4: set relaxed execution
+  model->relaxComputationFloat32toFloat16(true);
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nchw_none_relaxed(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nchw_none_relaxed_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type16);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
+  // Phase 2, operations
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {0};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1, op2, op3},
+    {op4});
+  // Phase 4: set relaxed execution
+  model->relaxComputationFloat32toFloat16(true);
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nchw_none_relaxed_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nchw_none_quant8(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type17);
+  auto op2 = model->addOperand(&type13);
+  auto op3 = model->addOperand(&type14);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type15);
+  // Phase 2, operations
+  static uint8_t op2_init[] = {132, 136, 136, 132, 144, 140, 136, 132};
+  model->setOperandValue(op2, op2_init, sizeof(uint8_t) * 8);
+  static int32_t op3_init[] = {160, -536};
+  model->setOperandValue(op3, op3_init, sizeof(int32_t) * 2);
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {0};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1},
+    {op4});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nchw_none_quant8(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nchw_none_quant8_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type17);
+  auto op2 = model->addOperand(&type13);
+  auto op3 = model->addOperand(&type14);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type15);
+  // Phase 2, operations
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {0};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1, op2, op3},
+    {op4});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nchw_none_quant8_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nchw_relu(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type16);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
+  // Phase 2, operations
+  static float op2_init[] = {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f};
+  model->setOperandValue(op2, op2_init, sizeof(float) * 8);
+  static float op3_init[] = {10.0f, -33.5f};
+  model->setOperandValue(op3, op3_init, sizeof(float) * 2);
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {1};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1},
+    {op4});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nchw_relu(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nchw_relu_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type16);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
+  // Phase 2, operations
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {1};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1, op2, op3},
+    {op4});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nchw_relu_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nchw_relu_relaxed(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type16);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
+  // Phase 2, operations
+  static float op2_init[] = {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f};
+  model->setOperandValue(op2, op2_init, sizeof(float) * 8);
+  static float op3_init[] = {10.0f, -33.5f};
+  model->setOperandValue(op3, op3_init, sizeof(float) * 2);
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {1};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1},
+    {op4});
+  // Phase 4: set relaxed execution
+  model->relaxComputationFloat32toFloat16(true);
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nchw_relu_relaxed(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nchw_relu_relaxed_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type16);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
+  // Phase 2, operations
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {1};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1, op2, op3},
+    {op4});
+  // Phase 4: set relaxed execution
+  model->relaxComputationFloat32toFloat16(true);
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nchw_relu_relaxed_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nchw_relu_quant8(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type17);
+  auto op2 = model->addOperand(&type13);
+  auto op3 = model->addOperand(&type14);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type15);
+  // Phase 2, operations
+  static uint8_t op2_init[] = {132, 136, 136, 132, 144, 140, 136, 132};
+  model->setOperandValue(op2, op2_init, sizeof(uint8_t) * 8);
+  static int32_t op3_init[] = {160, -536};
+  model->setOperandValue(op3, op3_init, sizeof(int32_t) * 2);
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {1};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1},
+    {op4});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nchw_relu_quant8(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nchw_relu_quant8_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type17);
+  auto op2 = model->addOperand(&type13);
+  auto op3 = model->addOperand(&type14);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type15);
+  // Phase 2, operations
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {1};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1, op2, op3},
+    {op4});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nchw_relu_quant8_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nchw_relu1(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type16);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
+  // Phase 2, operations
+  static float op2_init[] = {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f};
+  model->setOperandValue(op2, op2_init, sizeof(float) * 8);
+  static float op3_init[] = {10.0f, -33.5f};
+  model->setOperandValue(op3, op3_init, sizeof(float) * 2);
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {2};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1},
+    {op4});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nchw_relu1(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nchw_relu1_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type16);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
+  // Phase 2, operations
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {2};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1, op2, op3},
+    {op4});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nchw_relu1_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nchw_relu1_relaxed(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type16);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
+  // Phase 2, operations
+  static float op2_init[] = {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f};
+  model->setOperandValue(op2, op2_init, sizeof(float) * 8);
+  static float op3_init[] = {10.0f, -33.5f};
+  model->setOperandValue(op3, op3_init, sizeof(float) * 2);
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {2};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1},
+    {op4});
+  // Phase 4: set relaxed execution
+  model->relaxComputationFloat32toFloat16(true);
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nchw_relu1_relaxed(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nchw_relu1_relaxed_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type16);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
+  // Phase 2, operations
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {2};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1, op2, op3},
+    {op4});
+  // Phase 4: set relaxed execution
+  model->relaxComputationFloat32toFloat16(true);
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nchw_relu1_relaxed_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nchw_relu1_quant8(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type17);
+  auto op2 = model->addOperand(&type13);
+  auto op3 = model->addOperand(&type14);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type15);
+  // Phase 2, operations
+  static uint8_t op2_init[] = {132, 136, 136, 132, 144, 140, 136, 132};
+  model->setOperandValue(op2, op2_init, sizeof(uint8_t) * 8);
+  static int32_t op3_init[] = {160, -536};
+  model->setOperandValue(op3, op3_init, sizeof(int32_t) * 2);
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {2};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1},
+    {op4});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nchw_relu1_quant8(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nchw_relu1_quant8_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type17);
+  auto op2 = model->addOperand(&type13);
+  auto op3 = model->addOperand(&type14);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type15);
+  // Phase 2, operations
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {2};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1, op2, op3},
+    {op4});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nchw_relu1_quant8_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nchw_relu6(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type16);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
+  // Phase 2, operations
+  static float op2_init[] = {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f};
+  model->setOperandValue(op2, op2_init, sizeof(float) * 8);
+  static float op3_init[] = {10.0f, -33.5f};
+  model->setOperandValue(op3, op3_init, sizeof(float) * 2);
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {3};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1},
+    {op4});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nchw_relu6(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nchw_relu6_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type16);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
+  // Phase 2, operations
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {3};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1, op2, op3},
+    {op4});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nchw_relu6_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nchw_relu6_relaxed(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type16);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
+  // Phase 2, operations
+  static float op2_init[] = {1.0f, 2.0f, 2.0f, 1.0f, 4.0f, 3.0f, 2.0f, 1.0f};
+  model->setOperandValue(op2, op2_init, sizeof(float) * 8);
+  static float op3_init[] = {10.0f, -33.5f};
+  model->setOperandValue(op3, op3_init, sizeof(float) * 2);
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {3};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1},
+    {op4});
+  // Phase 4: set relaxed execution
+  model->relaxComputationFloat32toFloat16(true);
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nchw_relu6_relaxed(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nchw_relu6_relaxed_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type16);
+  auto op2 = model->addOperand(&type2);
+  auto op3 = model->addOperand(&type3);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type5);
+  // Phase 2, operations
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {3};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1, op2, op3},
+    {op4});
+  // Phase 4: set relaxed execution
+  model->relaxComputationFloat32toFloat16(true);
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nchw_relu6_relaxed_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nchw_relu6_quant8(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type17);
+  auto op2 = model->addOperand(&type13);
+  auto op3 = model->addOperand(&type14);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type15);
+  // Phase 2, operations
+  static uint8_t op2_init[] = {132, 136, 136, 132, 144, 140, 136, 132};
+  model->setOperandValue(op2, op2_init, sizeof(uint8_t) * 8);
+  static int32_t op3_init[] = {160, -536};
+  model->setOperandValue(op3, op3_init, sizeof(int32_t) * 2);
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {3};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1},
+    {op4});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nchw_relu6_quant8(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_nchw_relu6_quant8_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op1 = model->addOperand(&type17);
+  auto op2 = model->addOperand(&type13);
+  auto op3 = model->addOperand(&type14);
+  auto param = model->addOperand(&type4);
+  auto param1 = model->addOperand(&type4);
+  auto param2 = model->addOperand(&type4);
+  auto param3 = model->addOperand(&type4);
+  auto param4 = model->addOperand(&type4);
+  auto param5 = model->addOperand(&type4);
+  auto param6 = model->addOperand(&type4);
+  auto act = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op4 = model->addOperand(&type15);
+  // Phase 2, operations
+  static int32_t param_init[] = {0};
+  model->setOperandValue(param, param_init, sizeof(int32_t) * 1);
+  static int32_t param1_init[] = {0};
+  model->setOperandValue(param1, param1_init, sizeof(int32_t) * 1);
+  static int32_t param2_init[] = {0};
+  model->setOperandValue(param2, param2_init, sizeof(int32_t) * 1);
+  static int32_t param3_init[] = {0};
+  model->setOperandValue(param3, param3_init, sizeof(int32_t) * 1);
+  static int32_t param4_init[] = {1};
+  model->setOperandValue(param4, param4_init, sizeof(int32_t) * 1);
+  static int32_t param5_init[] = {1};
+  model->setOperandValue(param5, param5_init, sizeof(int32_t) * 1);
+  static int32_t param6_init[] = {2};
+  model->setOperandValue(param6, param6_init, sizeof(int32_t) * 1);
+  static int32_t act_init[] = {3};
+  model->setOperandValue(act, act_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op1, op2, op3, param, param1, param2, param3, param4, param5, param6, act, layout}, {op4});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op1, op2, op3},
+    {op4});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_nchw_relu6_quant8_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_large_nhwc(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op11 = model->addOperand(&type6);
+  auto op21 = model->addOperand(&type7);
+  auto op31 = model->addOperand(&type3);
+  auto param7 = model->addOperand(&type4);
   auto param8 = model->addOperand(&type4);
   auto param9 = model->addOperand(&type4);
   auto param10 = model->addOperand(&type4);
   auto param11 = model->addOperand(&type4);
-  auto param12 = model->addOperand(&type4);
-  auto op41 = model->addOperand(&type5);
+  auto layout = model->addOperand(&type0);
+  auto op41 = model->addOperand(&type6);
   // Phase 2, operations
   static float op21_init[] = {100.0f, 20.0f, 1.0f, 200.0f, 10.0f, 2.0f, 200.0f, 30.0f, 1.0f, 100.0f, 20.0f, 3.0f};
   model->setOperandValue(op21, op21_init, sizeof(float) * 12);
   static float op31_init[] = {500.0f, -1000.0f};
   model->setOperandValue(op31, op31_init, sizeof(float) * 2);
+  static int32_t param7_init[] = {1};
+  model->setOperandValue(param7, param7_init, sizeof(int32_t) * 1);
   static int32_t param8_init[] = {1};
   model->setOperandValue(param8, param8_init, sizeof(int32_t) * 1);
   static int32_t param9_init[] = {1};
   model->setOperandValue(param9, param9_init, sizeof(int32_t) * 1);
-  static int32_t param10_init[] = {1};
+  static int32_t param10_init[] = {2};
   model->setOperandValue(param10, param10_init, sizeof(int32_t) * 1);
-  static int32_t param11_init[] = {2};
+  static int32_t param11_init[] = {0};
   model->setOperandValue(param11, param11_init, sizeof(int32_t) * 1);
-  static int32_t param12_init[] = {0};
-  model->setOperandValue(param12, param12_init, sizeof(int32_t) * 1);
-  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op11, op21, op31, param8, param9, param10, param11, param12}, {op41});
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op11, op21, op31, param7, param8, param9, param10, param11, layout}, {op41});
   // Phase 3, inputs and outputs
   model->identifyInputsAndOutputs(
     {op11},
@@ -403,49 +3235,55 @@
   assert(model->isValid());
 }
 
-inline bool is_ignored_large(int i) {
+inline bool is_ignored_large_nhwc(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
-void CreateModel_large_weight_as_input(Model *model) {
-  OperandType type0(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
-  OperandType type1(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
-  OperandType type10(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
-  OperandType type11(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
-  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
-  OperandType type13(Type::TENSOR_INT32, {2}, 0.0625f, 0);
-  OperandType type14(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
-  OperandType type2(Type::TENSOR_FLOAT32, {2});
-  OperandType type3(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+void CreateModel_large_nhwc_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
   OperandType type4(Type::INT32, {});
-  OperandType type5(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
-  OperandType type6(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
-  OperandType type7(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
-  OperandType type8(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
-  OperandType type9(Type::TENSOR_FLOAT32, {6});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
   // Phase 1, operands
-  auto op11 = model->addOperand(&type5);
-  auto op21 = model->addOperand(&type6);
-  auto op31 = model->addOperand(&type2);
+  auto op11 = model->addOperand(&type6);
+  auto op21 = model->addOperand(&type7);
+  auto op31 = model->addOperand(&type3);
+  auto param7 = model->addOperand(&type4);
   auto param8 = model->addOperand(&type4);
   auto param9 = model->addOperand(&type4);
   auto param10 = model->addOperand(&type4);
   auto param11 = model->addOperand(&type4);
-  auto param12 = model->addOperand(&type4);
-  auto op41 = model->addOperand(&type5);
+  auto layout = model->addOperand(&type0);
+  auto op41 = model->addOperand(&type6);
   // Phase 2, operations
+  static int32_t param7_init[] = {1};
+  model->setOperandValue(param7, param7_init, sizeof(int32_t) * 1);
   static int32_t param8_init[] = {1};
   model->setOperandValue(param8, param8_init, sizeof(int32_t) * 1);
   static int32_t param9_init[] = {1};
   model->setOperandValue(param9, param9_init, sizeof(int32_t) * 1);
-  static int32_t param10_init[] = {1};
+  static int32_t param10_init[] = {2};
   model->setOperandValue(param10, param10_init, sizeof(int32_t) * 1);
-  static int32_t param11_init[] = {2};
+  static int32_t param11_init[] = {0};
   model->setOperandValue(param11, param11_init, sizeof(int32_t) * 1);
-  static int32_t param12_init[] = {0};
-  model->setOperandValue(param12, param12_init, sizeof(int32_t) * 1);
-  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op11, op21, op31, param8, param9, param10, param11, param12}, {op41});
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op11, op21, op31, param7, param8, param9, param10, param11, layout}, {op41});
   // Phase 3, inputs and outputs
   model->identifyInputsAndOutputs(
     {op11, op21, op31},
@@ -453,53 +3291,59 @@
   assert(model->isValid());
 }
 
-inline bool is_ignored_large_weight_as_input(int i) {
+inline bool is_ignored_large_nhwc_weight_as_input(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
-void CreateModel_large_relaxed(Model *model) {
-  OperandType type0(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
-  OperandType type1(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
-  OperandType type10(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
-  OperandType type11(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
-  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
-  OperandType type13(Type::TENSOR_INT32, {2}, 0.0625f, 0);
-  OperandType type14(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
-  OperandType type2(Type::TENSOR_FLOAT32, {2});
-  OperandType type3(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+void CreateModel_large_nhwc_relaxed(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
   OperandType type4(Type::INT32, {});
-  OperandType type5(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
-  OperandType type6(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
-  OperandType type7(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
-  OperandType type8(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
-  OperandType type9(Type::TENSOR_FLOAT32, {6});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
   // Phase 1, operands
-  auto op11 = model->addOperand(&type5);
-  auto op21 = model->addOperand(&type6);
-  auto op31 = model->addOperand(&type2);
+  auto op11 = model->addOperand(&type6);
+  auto op21 = model->addOperand(&type7);
+  auto op31 = model->addOperand(&type3);
+  auto param7 = model->addOperand(&type4);
   auto param8 = model->addOperand(&type4);
   auto param9 = model->addOperand(&type4);
   auto param10 = model->addOperand(&type4);
   auto param11 = model->addOperand(&type4);
-  auto param12 = model->addOperand(&type4);
-  auto op41 = model->addOperand(&type5);
+  auto layout = model->addOperand(&type0);
+  auto op41 = model->addOperand(&type6);
   // Phase 2, operations
   static float op21_init[] = {100.0f, 20.0f, 1.0f, 200.0f, 10.0f, 2.0f, 200.0f, 30.0f, 1.0f, 100.0f, 20.0f, 3.0f};
   model->setOperandValue(op21, op21_init, sizeof(float) * 12);
   static float op31_init[] = {500.0f, -1000.0f};
   model->setOperandValue(op31, op31_init, sizeof(float) * 2);
+  static int32_t param7_init[] = {1};
+  model->setOperandValue(param7, param7_init, sizeof(int32_t) * 1);
   static int32_t param8_init[] = {1};
   model->setOperandValue(param8, param8_init, sizeof(int32_t) * 1);
   static int32_t param9_init[] = {1};
   model->setOperandValue(param9, param9_init, sizeof(int32_t) * 1);
-  static int32_t param10_init[] = {1};
+  static int32_t param10_init[] = {2};
   model->setOperandValue(param10, param10_init, sizeof(int32_t) * 1);
-  static int32_t param11_init[] = {2};
+  static int32_t param11_init[] = {0};
   model->setOperandValue(param11, param11_init, sizeof(int32_t) * 1);
-  static int32_t param12_init[] = {0};
-  model->setOperandValue(param12, param12_init, sizeof(int32_t) * 1);
-  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op11, op21, op31, param8, param9, param10, param11, param12}, {op41});
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op11, op21, op31, param7, param8, param9, param10, param11, layout}, {op41});
   // Phase 3, inputs and outputs
   model->identifyInputsAndOutputs(
     {op11},
@@ -509,49 +3353,55 @@
   assert(model->isValid());
 }
 
-inline bool is_ignored_large_relaxed(int i) {
+inline bool is_ignored_large_nhwc_relaxed(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
-void CreateModel_large_relaxed_weight_as_input(Model *model) {
-  OperandType type0(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
-  OperandType type1(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
-  OperandType type10(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
-  OperandType type11(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
-  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
-  OperandType type13(Type::TENSOR_INT32, {2}, 0.0625f, 0);
-  OperandType type14(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
-  OperandType type2(Type::TENSOR_FLOAT32, {2});
-  OperandType type3(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+void CreateModel_large_nhwc_relaxed_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
   OperandType type4(Type::INT32, {});
-  OperandType type5(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
-  OperandType type6(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
-  OperandType type7(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
-  OperandType type8(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
-  OperandType type9(Type::TENSOR_FLOAT32, {6});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
   // Phase 1, operands
-  auto op11 = model->addOperand(&type5);
-  auto op21 = model->addOperand(&type6);
-  auto op31 = model->addOperand(&type2);
+  auto op11 = model->addOperand(&type6);
+  auto op21 = model->addOperand(&type7);
+  auto op31 = model->addOperand(&type3);
+  auto param7 = model->addOperand(&type4);
   auto param8 = model->addOperand(&type4);
   auto param9 = model->addOperand(&type4);
   auto param10 = model->addOperand(&type4);
   auto param11 = model->addOperand(&type4);
-  auto param12 = model->addOperand(&type4);
-  auto op41 = model->addOperand(&type5);
+  auto layout = model->addOperand(&type0);
+  auto op41 = model->addOperand(&type6);
   // Phase 2, operations
+  static int32_t param7_init[] = {1};
+  model->setOperandValue(param7, param7_init, sizeof(int32_t) * 1);
   static int32_t param8_init[] = {1};
   model->setOperandValue(param8, param8_init, sizeof(int32_t) * 1);
   static int32_t param9_init[] = {1};
   model->setOperandValue(param9, param9_init, sizeof(int32_t) * 1);
-  static int32_t param10_init[] = {1};
+  static int32_t param10_init[] = {2};
   model->setOperandValue(param10, param10_init, sizeof(int32_t) * 1);
-  static int32_t param11_init[] = {2};
+  static int32_t param11_init[] = {0};
   model->setOperandValue(param11, param11_init, sizeof(int32_t) * 1);
-  static int32_t param12_init[] = {0};
-  model->setOperandValue(param12, param12_init, sizeof(int32_t) * 1);
-  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op11, op21, op31, param8, param9, param10, param11, param12}, {op41});
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op11, op21, op31, param7, param8, param9, param10, param11, layout}, {op41});
   // Phase 3, inputs and outputs
   model->identifyInputsAndOutputs(
     {op11, op21, op31},
@@ -561,57 +3411,63 @@
   assert(model->isValid());
 }
 
-inline bool is_ignored_large_relaxed_weight_as_input(int i) {
+inline bool is_ignored_large_nhwc_relaxed_weight_as_input(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
-void CreateModel_large_quant8(Model *model) {
-  OperandType type0(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
-  OperandType type1(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
-  OperandType type10(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
-  OperandType type11(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
-  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
-  OperandType type13(Type::TENSOR_INT32, {2}, 0.0625f, 0);
-  OperandType type14(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
-  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 0.25f, 128);
-  OperandType type16(Type::TENSOR_QUANT8_ASYMM, {2, 2, 3, 1}, 1.0f, 0);
-  OperandType type17(Type::TENSOR_INT32, {2}, 0.25f, 0);
-  OperandType type18(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 10.0f, 100);
-  OperandType type2(Type::TENSOR_FLOAT32, {2});
-  OperandType type3(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+void CreateModel_large_nhwc_quant8(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type18(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 0.25f, 128);
+  OperandType type19(Type::TENSOR_QUANT8_ASYMM, {2, 2, 3, 1}, 1.0f, 0);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type20(Type::TENSOR_INT32, {2}, 0.25f, 0);
+  OperandType type21(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 10.0f, 100);
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
   OperandType type4(Type::INT32, {});
-  OperandType type5(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
-  OperandType type6(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
-  OperandType type7(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
-  OperandType type8(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
-  OperandType type9(Type::TENSOR_FLOAT32, {6});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
   // Phase 1, operands
-  auto op11 = model->addOperand(&type15);
-  auto op21 = model->addOperand(&type16);
-  auto op31 = model->addOperand(&type17);
+  auto op11 = model->addOperand(&type18);
+  auto op21 = model->addOperand(&type19);
+  auto op31 = model->addOperand(&type20);
+  auto param7 = model->addOperand(&type4);
   auto param8 = model->addOperand(&type4);
   auto param9 = model->addOperand(&type4);
   auto param10 = model->addOperand(&type4);
   auto param11 = model->addOperand(&type4);
-  auto param12 = model->addOperand(&type4);
-  auto op41 = model->addOperand(&type18);
+  auto layout = model->addOperand(&type0);
+  auto op41 = model->addOperand(&type21);
   // Phase 2, operations
   static uint8_t op21_init[] = {100, 20, 1, 200, 10, 2, 200, 30, 1, 100, 20, 3};
   model->setOperandValue(op21, op21_init, sizeof(uint8_t) * 12);
   static int32_t op31_init[] = {2000, -4000};
   model->setOperandValue(op31, op31_init, sizeof(int32_t) * 2);
+  static int32_t param7_init[] = {1};
+  model->setOperandValue(param7, param7_init, sizeof(int32_t) * 1);
   static int32_t param8_init[] = {1};
   model->setOperandValue(param8, param8_init, sizeof(int32_t) * 1);
   static int32_t param9_init[] = {1};
   model->setOperandValue(param9, param9_init, sizeof(int32_t) * 1);
-  static int32_t param10_init[] = {1};
+  static int32_t param10_init[] = {2};
   model->setOperandValue(param10, param10_init, sizeof(int32_t) * 1);
-  static int32_t param11_init[] = {2};
+  static int32_t param11_init[] = {0};
   model->setOperandValue(param11, param11_init, sizeof(int32_t) * 1);
-  static int32_t param12_init[] = {0};
-  model->setOperandValue(param12, param12_init, sizeof(int32_t) * 1);
-  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op11, op21, op31, param8, param9, param10, param11, param12}, {op41});
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op11, op21, op31, param7, param8, param9, param10, param11, layout}, {op41});
   // Phase 3, inputs and outputs
   model->identifyInputsAndOutputs(
     {op11},
@@ -619,53 +3475,59 @@
   assert(model->isValid());
 }
 
-inline bool is_ignored_large_quant8(int i) {
+inline bool is_ignored_large_nhwc_quant8(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
-void CreateModel_large_quant8_weight_as_input(Model *model) {
-  OperandType type0(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
-  OperandType type1(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
-  OperandType type10(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
-  OperandType type11(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
-  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
-  OperandType type13(Type::TENSOR_INT32, {2}, 0.0625f, 0);
-  OperandType type14(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
-  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 0.25f, 128);
-  OperandType type16(Type::TENSOR_QUANT8_ASYMM, {2, 2, 3, 1}, 1.0f, 0);
-  OperandType type17(Type::TENSOR_INT32, {2}, 0.25f, 0);
-  OperandType type18(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 10.0f, 100);
-  OperandType type2(Type::TENSOR_FLOAT32, {2});
-  OperandType type3(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+void CreateModel_large_nhwc_quant8_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type18(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 0.25f, 128);
+  OperandType type19(Type::TENSOR_QUANT8_ASYMM, {2, 2, 3, 1}, 1.0f, 0);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type20(Type::TENSOR_INT32, {2}, 0.25f, 0);
+  OperandType type21(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 10.0f, 100);
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
   OperandType type4(Type::INT32, {});
-  OperandType type5(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
-  OperandType type6(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
-  OperandType type7(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
-  OperandType type8(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
-  OperandType type9(Type::TENSOR_FLOAT32, {6});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
   // Phase 1, operands
-  auto op11 = model->addOperand(&type15);
-  auto op21 = model->addOperand(&type16);
-  auto op31 = model->addOperand(&type17);
+  auto op11 = model->addOperand(&type18);
+  auto op21 = model->addOperand(&type19);
+  auto op31 = model->addOperand(&type20);
+  auto param7 = model->addOperand(&type4);
   auto param8 = model->addOperand(&type4);
   auto param9 = model->addOperand(&type4);
   auto param10 = model->addOperand(&type4);
   auto param11 = model->addOperand(&type4);
-  auto param12 = model->addOperand(&type4);
-  auto op41 = model->addOperand(&type18);
+  auto layout = model->addOperand(&type0);
+  auto op41 = model->addOperand(&type21);
   // Phase 2, operations
+  static int32_t param7_init[] = {1};
+  model->setOperandValue(param7, param7_init, sizeof(int32_t) * 1);
   static int32_t param8_init[] = {1};
   model->setOperandValue(param8, param8_init, sizeof(int32_t) * 1);
   static int32_t param9_init[] = {1};
   model->setOperandValue(param9, param9_init, sizeof(int32_t) * 1);
-  static int32_t param10_init[] = {1};
+  static int32_t param10_init[] = {2};
   model->setOperandValue(param10, param10_init, sizeof(int32_t) * 1);
-  static int32_t param11_init[] = {2};
+  static int32_t param11_init[] = {0};
   model->setOperandValue(param11, param11_init, sizeof(int32_t) * 1);
-  static int32_t param12_init[] = {0};
-  model->setOperandValue(param12, param12_init, sizeof(int32_t) * 1);
-  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op11, op21, op31, param8, param9, param10, param11, param12}, {op41});
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op11, op21, op31, param7, param8, param9, param10, param11, layout}, {op41});
   // Phase 3, inputs and outputs
   model->identifyInputsAndOutputs(
     {op11, op21, op31},
@@ -673,57 +3535,452 @@
   assert(model->isValid());
 }
 
-inline bool is_ignored_large_quant8_weight_as_input(int i) {
+inline bool is_ignored_large_nhwc_quant8_weight_as_input(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
-void CreateModel_channel(Model *model) {
-  OperandType type0(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
-  OperandType type1(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
-  OperandType type10(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
-  OperandType type11(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
-  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
-  OperandType type13(Type::TENSOR_INT32, {2}, 0.0625f, 0);
-  OperandType type14(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
-  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 0.25f, 128);
-  OperandType type16(Type::TENSOR_QUANT8_ASYMM, {2, 2, 3, 1}, 1.0f, 0);
-  OperandType type17(Type::TENSOR_INT32, {2}, 0.25f, 0);
-  OperandType type18(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 10.0f, 100);
-  OperandType type2(Type::TENSOR_FLOAT32, {2});
-  OperandType type3(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+void CreateModel_large_nchw(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type18(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 0.25f, 128);
+  OperandType type19(Type::TENSOR_QUANT8_ASYMM, {2, 2, 3, 1}, 1.0f, 0);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type20(Type::TENSOR_INT32, {2}, 0.25f, 0);
+  OperandType type21(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 10.0f, 100);
+  OperandType type22(Type::TENSOR_FLOAT32, {1, 2, 3, 2});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
   OperandType type4(Type::INT32, {});
-  OperandType type5(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
-  OperandType type6(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
-  OperandType type7(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
-  OperandType type8(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
-  OperandType type9(Type::TENSOR_FLOAT32, {6});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
   // Phase 1, operands
-  auto op12 = model->addOperand(&type7);
-  auto op22 = model->addOperand(&type8);
-  auto op32 = model->addOperand(&type9);
+  auto op11 = model->addOperand(&type22);
+  auto op21 = model->addOperand(&type7);
+  auto op31 = model->addOperand(&type3);
+  auto param7 = model->addOperand(&type4);
+  auto param8 = model->addOperand(&type4);
+  auto param9 = model->addOperand(&type4);
+  auto param10 = model->addOperand(&type4);
+  auto param11 = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op41 = model->addOperand(&type22);
+  // Phase 2, operations
+  static float op21_init[] = {100.0f, 20.0f, 1.0f, 200.0f, 10.0f, 2.0f, 200.0f, 30.0f, 1.0f, 100.0f, 20.0f, 3.0f};
+  model->setOperandValue(op21, op21_init, sizeof(float) * 12);
+  static float op31_init[] = {500.0f, -1000.0f};
+  model->setOperandValue(op31, op31_init, sizeof(float) * 2);
+  static int32_t param7_init[] = {1};
+  model->setOperandValue(param7, param7_init, sizeof(int32_t) * 1);
+  static int32_t param8_init[] = {1};
+  model->setOperandValue(param8, param8_init, sizeof(int32_t) * 1);
+  static int32_t param9_init[] = {1};
+  model->setOperandValue(param9, param9_init, sizeof(int32_t) * 1);
+  static int32_t param10_init[] = {2};
+  model->setOperandValue(param10, param10_init, sizeof(int32_t) * 1);
+  static int32_t param11_init[] = {0};
+  model->setOperandValue(param11, param11_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op11, op21, op31, param7, param8, param9, param10, param11, layout}, {op41});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op11},
+    {op41});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_large_nchw(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_large_nchw_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type18(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 0.25f, 128);
+  OperandType type19(Type::TENSOR_QUANT8_ASYMM, {2, 2, 3, 1}, 1.0f, 0);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type20(Type::TENSOR_INT32, {2}, 0.25f, 0);
+  OperandType type21(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 10.0f, 100);
+  OperandType type22(Type::TENSOR_FLOAT32, {1, 2, 3, 2});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op11 = model->addOperand(&type22);
+  auto op21 = model->addOperand(&type7);
+  auto op31 = model->addOperand(&type3);
+  auto param7 = model->addOperand(&type4);
+  auto param8 = model->addOperand(&type4);
+  auto param9 = model->addOperand(&type4);
+  auto param10 = model->addOperand(&type4);
+  auto param11 = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op41 = model->addOperand(&type22);
+  // Phase 2, operations
+  static int32_t param7_init[] = {1};
+  model->setOperandValue(param7, param7_init, sizeof(int32_t) * 1);
+  static int32_t param8_init[] = {1};
+  model->setOperandValue(param8, param8_init, sizeof(int32_t) * 1);
+  static int32_t param9_init[] = {1};
+  model->setOperandValue(param9, param9_init, sizeof(int32_t) * 1);
+  static int32_t param10_init[] = {2};
+  model->setOperandValue(param10, param10_init, sizeof(int32_t) * 1);
+  static int32_t param11_init[] = {0};
+  model->setOperandValue(param11, param11_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op11, op21, op31, param7, param8, param9, param10, param11, layout}, {op41});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op11, op21, op31},
+    {op41});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_large_nchw_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_large_nchw_relaxed(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type18(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 0.25f, 128);
+  OperandType type19(Type::TENSOR_QUANT8_ASYMM, {2, 2, 3, 1}, 1.0f, 0);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type20(Type::TENSOR_INT32, {2}, 0.25f, 0);
+  OperandType type21(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 10.0f, 100);
+  OperandType type22(Type::TENSOR_FLOAT32, {1, 2, 3, 2});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op11 = model->addOperand(&type22);
+  auto op21 = model->addOperand(&type7);
+  auto op31 = model->addOperand(&type3);
+  auto param7 = model->addOperand(&type4);
+  auto param8 = model->addOperand(&type4);
+  auto param9 = model->addOperand(&type4);
+  auto param10 = model->addOperand(&type4);
+  auto param11 = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op41 = model->addOperand(&type22);
+  // Phase 2, operations
+  static float op21_init[] = {100.0f, 20.0f, 1.0f, 200.0f, 10.0f, 2.0f, 200.0f, 30.0f, 1.0f, 100.0f, 20.0f, 3.0f};
+  model->setOperandValue(op21, op21_init, sizeof(float) * 12);
+  static float op31_init[] = {500.0f, -1000.0f};
+  model->setOperandValue(op31, op31_init, sizeof(float) * 2);
+  static int32_t param7_init[] = {1};
+  model->setOperandValue(param7, param7_init, sizeof(int32_t) * 1);
+  static int32_t param8_init[] = {1};
+  model->setOperandValue(param8, param8_init, sizeof(int32_t) * 1);
+  static int32_t param9_init[] = {1};
+  model->setOperandValue(param9, param9_init, sizeof(int32_t) * 1);
+  static int32_t param10_init[] = {2};
+  model->setOperandValue(param10, param10_init, sizeof(int32_t) * 1);
+  static int32_t param11_init[] = {0};
+  model->setOperandValue(param11, param11_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op11, op21, op31, param7, param8, param9, param10, param11, layout}, {op41});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op11},
+    {op41});
+  // Phase 4: set relaxed execution
+  model->relaxComputationFloat32toFloat16(true);
+  assert(model->isValid());
+}
+
+inline bool is_ignored_large_nchw_relaxed(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_large_nchw_relaxed_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type18(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 0.25f, 128);
+  OperandType type19(Type::TENSOR_QUANT8_ASYMM, {2, 2, 3, 1}, 1.0f, 0);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type20(Type::TENSOR_INT32, {2}, 0.25f, 0);
+  OperandType type21(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 10.0f, 100);
+  OperandType type22(Type::TENSOR_FLOAT32, {1, 2, 3, 2});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op11 = model->addOperand(&type22);
+  auto op21 = model->addOperand(&type7);
+  auto op31 = model->addOperand(&type3);
+  auto param7 = model->addOperand(&type4);
+  auto param8 = model->addOperand(&type4);
+  auto param9 = model->addOperand(&type4);
+  auto param10 = model->addOperand(&type4);
+  auto param11 = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op41 = model->addOperand(&type22);
+  // Phase 2, operations
+  static int32_t param7_init[] = {1};
+  model->setOperandValue(param7, param7_init, sizeof(int32_t) * 1);
+  static int32_t param8_init[] = {1};
+  model->setOperandValue(param8, param8_init, sizeof(int32_t) * 1);
+  static int32_t param9_init[] = {1};
+  model->setOperandValue(param9, param9_init, sizeof(int32_t) * 1);
+  static int32_t param10_init[] = {2};
+  model->setOperandValue(param10, param10_init, sizeof(int32_t) * 1);
+  static int32_t param11_init[] = {0};
+  model->setOperandValue(param11, param11_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op11, op21, op31, param7, param8, param9, param10, param11, layout}, {op41});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op11, op21, op31},
+    {op41});
+  // Phase 4: set relaxed execution
+  model->relaxComputationFloat32toFloat16(true);
+  assert(model->isValid());
+}
+
+inline bool is_ignored_large_nchw_relaxed_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_large_nchw_quant8(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type18(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 0.25f, 128);
+  OperandType type19(Type::TENSOR_QUANT8_ASYMM, {2, 2, 3, 1}, 1.0f, 0);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type20(Type::TENSOR_INT32, {2}, 0.25f, 0);
+  OperandType type21(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 10.0f, 100);
+  OperandType type22(Type::TENSOR_FLOAT32, {1, 2, 3, 2});
+  OperandType type23(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 2}, 0.25f, 128);
+  OperandType type24(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 2}, 10.0f, 100);
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op11 = model->addOperand(&type23);
+  auto op21 = model->addOperand(&type19);
+  auto op31 = model->addOperand(&type20);
+  auto param7 = model->addOperand(&type4);
+  auto param8 = model->addOperand(&type4);
+  auto param9 = model->addOperand(&type4);
+  auto param10 = model->addOperand(&type4);
+  auto param11 = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op41 = model->addOperand(&type24);
+  // Phase 2, operations
+  static uint8_t op21_init[] = {100, 20, 1, 200, 10, 2, 200, 30, 1, 100, 20, 3};
+  model->setOperandValue(op21, op21_init, sizeof(uint8_t) * 12);
+  static int32_t op31_init[] = {2000, -4000};
+  model->setOperandValue(op31, op31_init, sizeof(int32_t) * 2);
+  static int32_t param7_init[] = {1};
+  model->setOperandValue(param7, param7_init, sizeof(int32_t) * 1);
+  static int32_t param8_init[] = {1};
+  model->setOperandValue(param8, param8_init, sizeof(int32_t) * 1);
+  static int32_t param9_init[] = {1};
+  model->setOperandValue(param9, param9_init, sizeof(int32_t) * 1);
+  static int32_t param10_init[] = {2};
+  model->setOperandValue(param10, param10_init, sizeof(int32_t) * 1);
+  static int32_t param11_init[] = {0};
+  model->setOperandValue(param11, param11_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op11, op21, op31, param7, param8, param9, param10, param11, layout}, {op41});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op11},
+    {op41});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_large_nchw_quant8(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_large_nchw_quant8_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type18(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 0.25f, 128);
+  OperandType type19(Type::TENSOR_QUANT8_ASYMM, {2, 2, 3, 1}, 1.0f, 0);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type20(Type::TENSOR_INT32, {2}, 0.25f, 0);
+  OperandType type21(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 10.0f, 100);
+  OperandType type22(Type::TENSOR_FLOAT32, {1, 2, 3, 2});
+  OperandType type23(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 2}, 0.25f, 128);
+  OperandType type24(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 2}, 10.0f, 100);
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op11 = model->addOperand(&type23);
+  auto op21 = model->addOperand(&type19);
+  auto op31 = model->addOperand(&type20);
+  auto param7 = model->addOperand(&type4);
+  auto param8 = model->addOperand(&type4);
+  auto param9 = model->addOperand(&type4);
+  auto param10 = model->addOperand(&type4);
+  auto param11 = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op41 = model->addOperand(&type24);
+  // Phase 2, operations
+  static int32_t param7_init[] = {1};
+  model->setOperandValue(param7, param7_init, sizeof(int32_t) * 1);
+  static int32_t param8_init[] = {1};
+  model->setOperandValue(param8, param8_init, sizeof(int32_t) * 1);
+  static int32_t param9_init[] = {1};
+  model->setOperandValue(param9, param9_init, sizeof(int32_t) * 1);
+  static int32_t param10_init[] = {2};
+  model->setOperandValue(param10, param10_init, sizeof(int32_t) * 1);
+  static int32_t param11_init[] = {0};
+  model->setOperandValue(param11, param11_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op11, op21, op31, param7, param8, param9, param10, param11, layout}, {op41});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op11, op21, op31},
+    {op41});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_large_nchw_quant8_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_channel_nhwc(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type18(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 0.25f, 128);
+  OperandType type19(Type::TENSOR_QUANT8_ASYMM, {2, 2, 3, 1}, 1.0f, 0);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type20(Type::TENSOR_INT32, {2}, 0.25f, 0);
+  OperandType type21(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 10.0f, 100);
+  OperandType type22(Type::TENSOR_FLOAT32, {1, 2, 3, 2});
+  OperandType type23(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 2}, 0.25f, 128);
+  OperandType type24(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 2}, 10.0f, 100);
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op12 = model->addOperand(&type8);
+  auto op22 = model->addOperand(&type9);
+  auto op32 = model->addOperand(&type10);
+  auto param12 = model->addOperand(&type4);
   auto param13 = model->addOperand(&type4);
   auto param14 = model->addOperand(&type4);
   auto param15 = model->addOperand(&type4);
   auto param16 = model->addOperand(&type4);
-  auto param17 = model->addOperand(&type4);
-  auto op42 = model->addOperand(&type10);
+  auto layout = model->addOperand(&type0);
+  auto op42 = model->addOperand(&type11);
   // Phase 2, operations
   static float op22_init[] = {1.0f, 2.0f, 3.0f, 2.0f, 1.0f, 0.0f, 2.0f, 3.0f, 3.0f, 6.0f, 6.0f, 6.0f, 9.0f, 8.0f, 5.0f, 2.0f, 1.0f, 1.0f};
   model->setOperandValue(op22, op22_init, sizeof(float) * 18);
   static float op32_init[] = {10.0f, -20.0f, 30.0f, -40.0f, 50.0f, -60.0f};
   model->setOperandValue(op32, op32_init, sizeof(float) * 6);
+  static int32_t param12_init[] = {1};
+  model->setOperandValue(param12, param12_init, sizeof(int32_t) * 1);
   static int32_t param13_init[] = {1};
   model->setOperandValue(param13, param13_init, sizeof(int32_t) * 1);
   static int32_t param14_init[] = {1};
   model->setOperandValue(param14, param14_init, sizeof(int32_t) * 1);
-  static int32_t param15_init[] = {1};
+  static int32_t param15_init[] = {3};
   model->setOperandValue(param15, param15_init, sizeof(int32_t) * 1);
-  static int32_t param16_init[] = {3};
+  static int32_t param16_init[] = {0};
   model->setOperandValue(param16, param16_init, sizeof(int32_t) * 1);
-  static int32_t param17_init[] = {0};
-  model->setOperandValue(param17, param17_init, sizeof(int32_t) * 1);
-  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op12, op22, op32, param13, param14, param15, param16, param17}, {op42});
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op12, op22, op32, param12, param13, param14, param15, param16, layout}, {op42});
   // Phase 3, inputs and outputs
   model->identifyInputsAndOutputs(
     {op12},
@@ -731,53 +3988,62 @@
   assert(model->isValid());
 }
 
-inline bool is_ignored_channel(int i) {
+inline bool is_ignored_channel_nhwc(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
-void CreateModel_channel_weight_as_input(Model *model) {
-  OperandType type0(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
-  OperandType type1(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
-  OperandType type10(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
-  OperandType type11(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
-  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
-  OperandType type13(Type::TENSOR_INT32, {2}, 0.0625f, 0);
-  OperandType type14(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
-  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 0.25f, 128);
-  OperandType type16(Type::TENSOR_QUANT8_ASYMM, {2, 2, 3, 1}, 1.0f, 0);
-  OperandType type17(Type::TENSOR_INT32, {2}, 0.25f, 0);
-  OperandType type18(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 10.0f, 100);
-  OperandType type2(Type::TENSOR_FLOAT32, {2});
-  OperandType type3(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+void CreateModel_channel_nhwc_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type18(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 0.25f, 128);
+  OperandType type19(Type::TENSOR_QUANT8_ASYMM, {2, 2, 3, 1}, 1.0f, 0);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type20(Type::TENSOR_INT32, {2}, 0.25f, 0);
+  OperandType type21(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 10.0f, 100);
+  OperandType type22(Type::TENSOR_FLOAT32, {1, 2, 3, 2});
+  OperandType type23(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 2}, 0.25f, 128);
+  OperandType type24(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 2}, 10.0f, 100);
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
   OperandType type4(Type::INT32, {});
-  OperandType type5(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
-  OperandType type6(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
-  OperandType type7(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
-  OperandType type8(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
-  OperandType type9(Type::TENSOR_FLOAT32, {6});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
   // Phase 1, operands
-  auto op12 = model->addOperand(&type7);
-  auto op22 = model->addOperand(&type8);
-  auto op32 = model->addOperand(&type9);
+  auto op12 = model->addOperand(&type8);
+  auto op22 = model->addOperand(&type9);
+  auto op32 = model->addOperand(&type10);
+  auto param12 = model->addOperand(&type4);
   auto param13 = model->addOperand(&type4);
   auto param14 = model->addOperand(&type4);
   auto param15 = model->addOperand(&type4);
   auto param16 = model->addOperand(&type4);
-  auto param17 = model->addOperand(&type4);
-  auto op42 = model->addOperand(&type10);
+  auto layout = model->addOperand(&type0);
+  auto op42 = model->addOperand(&type11);
   // Phase 2, operations
+  static int32_t param12_init[] = {1};
+  model->setOperandValue(param12, param12_init, sizeof(int32_t) * 1);
   static int32_t param13_init[] = {1};
   model->setOperandValue(param13, param13_init, sizeof(int32_t) * 1);
   static int32_t param14_init[] = {1};
   model->setOperandValue(param14, param14_init, sizeof(int32_t) * 1);
-  static int32_t param15_init[] = {1};
+  static int32_t param15_init[] = {3};
   model->setOperandValue(param15, param15_init, sizeof(int32_t) * 1);
-  static int32_t param16_init[] = {3};
+  static int32_t param16_init[] = {0};
   model->setOperandValue(param16, param16_init, sizeof(int32_t) * 1);
-  static int32_t param17_init[] = {0};
-  model->setOperandValue(param17, param17_init, sizeof(int32_t) * 1);
-  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op12, op22, op32, param13, param14, param15, param16, param17}, {op42});
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op12, op22, op32, param12, param13, param14, param15, param16, layout}, {op42});
   // Phase 3, inputs and outputs
   model->identifyInputsAndOutputs(
     {op12, op22, op32},
@@ -785,57 +4051,66 @@
   assert(model->isValid());
 }
 
-inline bool is_ignored_channel_weight_as_input(int i) {
+inline bool is_ignored_channel_nhwc_weight_as_input(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
-void CreateModel_channel_relaxed(Model *model) {
-  OperandType type0(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
-  OperandType type1(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
-  OperandType type10(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
-  OperandType type11(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
-  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
-  OperandType type13(Type::TENSOR_INT32, {2}, 0.0625f, 0);
-  OperandType type14(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
-  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 0.25f, 128);
-  OperandType type16(Type::TENSOR_QUANT8_ASYMM, {2, 2, 3, 1}, 1.0f, 0);
-  OperandType type17(Type::TENSOR_INT32, {2}, 0.25f, 0);
-  OperandType type18(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 10.0f, 100);
-  OperandType type2(Type::TENSOR_FLOAT32, {2});
-  OperandType type3(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+void CreateModel_channel_nhwc_relaxed(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type18(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 0.25f, 128);
+  OperandType type19(Type::TENSOR_QUANT8_ASYMM, {2, 2, 3, 1}, 1.0f, 0);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type20(Type::TENSOR_INT32, {2}, 0.25f, 0);
+  OperandType type21(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 10.0f, 100);
+  OperandType type22(Type::TENSOR_FLOAT32, {1, 2, 3, 2});
+  OperandType type23(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 2}, 0.25f, 128);
+  OperandType type24(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 2}, 10.0f, 100);
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
   OperandType type4(Type::INT32, {});
-  OperandType type5(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
-  OperandType type6(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
-  OperandType type7(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
-  OperandType type8(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
-  OperandType type9(Type::TENSOR_FLOAT32, {6});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
   // Phase 1, operands
-  auto op12 = model->addOperand(&type7);
-  auto op22 = model->addOperand(&type8);
-  auto op32 = model->addOperand(&type9);
+  auto op12 = model->addOperand(&type8);
+  auto op22 = model->addOperand(&type9);
+  auto op32 = model->addOperand(&type10);
+  auto param12 = model->addOperand(&type4);
   auto param13 = model->addOperand(&type4);
   auto param14 = model->addOperand(&type4);
   auto param15 = model->addOperand(&type4);
   auto param16 = model->addOperand(&type4);
-  auto param17 = model->addOperand(&type4);
-  auto op42 = model->addOperand(&type10);
+  auto layout = model->addOperand(&type0);
+  auto op42 = model->addOperand(&type11);
   // Phase 2, operations
   static float op22_init[] = {1.0f, 2.0f, 3.0f, 2.0f, 1.0f, 0.0f, 2.0f, 3.0f, 3.0f, 6.0f, 6.0f, 6.0f, 9.0f, 8.0f, 5.0f, 2.0f, 1.0f, 1.0f};
   model->setOperandValue(op22, op22_init, sizeof(float) * 18);
   static float op32_init[] = {10.0f, -20.0f, 30.0f, -40.0f, 50.0f, -60.0f};
   model->setOperandValue(op32, op32_init, sizeof(float) * 6);
+  static int32_t param12_init[] = {1};
+  model->setOperandValue(param12, param12_init, sizeof(int32_t) * 1);
   static int32_t param13_init[] = {1};
   model->setOperandValue(param13, param13_init, sizeof(int32_t) * 1);
   static int32_t param14_init[] = {1};
   model->setOperandValue(param14, param14_init, sizeof(int32_t) * 1);
-  static int32_t param15_init[] = {1};
+  static int32_t param15_init[] = {3};
   model->setOperandValue(param15, param15_init, sizeof(int32_t) * 1);
-  static int32_t param16_init[] = {3};
+  static int32_t param16_init[] = {0};
   model->setOperandValue(param16, param16_init, sizeof(int32_t) * 1);
-  static int32_t param17_init[] = {0};
-  model->setOperandValue(param17, param17_init, sizeof(int32_t) * 1);
-  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op12, op22, op32, param13, param14, param15, param16, param17}, {op42});
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op12, op22, op32, param12, param13, param14, param15, param16, layout}, {op42});
   // Phase 3, inputs and outputs
   model->identifyInputsAndOutputs(
     {op12},
@@ -845,53 +4120,62 @@
   assert(model->isValid());
 }
 
-inline bool is_ignored_channel_relaxed(int i) {
+inline bool is_ignored_channel_nhwc_relaxed(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
-void CreateModel_channel_relaxed_weight_as_input(Model *model) {
-  OperandType type0(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
-  OperandType type1(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
-  OperandType type10(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
-  OperandType type11(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
-  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
-  OperandType type13(Type::TENSOR_INT32, {2}, 0.0625f, 0);
-  OperandType type14(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
-  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 0.25f, 128);
-  OperandType type16(Type::TENSOR_QUANT8_ASYMM, {2, 2, 3, 1}, 1.0f, 0);
-  OperandType type17(Type::TENSOR_INT32, {2}, 0.25f, 0);
-  OperandType type18(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 10.0f, 100);
-  OperandType type2(Type::TENSOR_FLOAT32, {2});
-  OperandType type3(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+void CreateModel_channel_nhwc_relaxed_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type18(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 0.25f, 128);
+  OperandType type19(Type::TENSOR_QUANT8_ASYMM, {2, 2, 3, 1}, 1.0f, 0);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type20(Type::TENSOR_INT32, {2}, 0.25f, 0);
+  OperandType type21(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 10.0f, 100);
+  OperandType type22(Type::TENSOR_FLOAT32, {1, 2, 3, 2});
+  OperandType type23(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 2}, 0.25f, 128);
+  OperandType type24(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 2}, 10.0f, 100);
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
   OperandType type4(Type::INT32, {});
-  OperandType type5(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
-  OperandType type6(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
-  OperandType type7(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
-  OperandType type8(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
-  OperandType type9(Type::TENSOR_FLOAT32, {6});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
   // Phase 1, operands
-  auto op12 = model->addOperand(&type7);
-  auto op22 = model->addOperand(&type8);
-  auto op32 = model->addOperand(&type9);
+  auto op12 = model->addOperand(&type8);
+  auto op22 = model->addOperand(&type9);
+  auto op32 = model->addOperand(&type10);
+  auto param12 = model->addOperand(&type4);
   auto param13 = model->addOperand(&type4);
   auto param14 = model->addOperand(&type4);
   auto param15 = model->addOperand(&type4);
   auto param16 = model->addOperand(&type4);
-  auto param17 = model->addOperand(&type4);
-  auto op42 = model->addOperand(&type10);
+  auto layout = model->addOperand(&type0);
+  auto op42 = model->addOperand(&type11);
   // Phase 2, operations
+  static int32_t param12_init[] = {1};
+  model->setOperandValue(param12, param12_init, sizeof(int32_t) * 1);
   static int32_t param13_init[] = {1};
   model->setOperandValue(param13, param13_init, sizeof(int32_t) * 1);
   static int32_t param14_init[] = {1};
   model->setOperandValue(param14, param14_init, sizeof(int32_t) * 1);
-  static int32_t param15_init[] = {1};
+  static int32_t param15_init[] = {3};
   model->setOperandValue(param15, param15_init, sizeof(int32_t) * 1);
-  static int32_t param16_init[] = {3};
+  static int32_t param16_init[] = {0};
   model->setOperandValue(param16, param16_init, sizeof(int32_t) * 1);
-  static int32_t param17_init[] = {0};
-  model->setOperandValue(param17, param17_init, sizeof(int32_t) * 1);
-  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op12, op22, op32, param13, param14, param15, param16, param17}, {op42});
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op12, op22, op32, param12, param13, param14, param15, param16, layout}, {op42});
   // Phase 3, inputs and outputs
   model->identifyInputsAndOutputs(
     {op12, op22, op32},
@@ -901,61 +4185,70 @@
   assert(model->isValid());
 }
 
-inline bool is_ignored_channel_relaxed_weight_as_input(int i) {
+inline bool is_ignored_channel_nhwc_relaxed_weight_as_input(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
-void CreateModel_channel_quant8(Model *model) {
-  OperandType type0(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
-  OperandType type1(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
-  OperandType type10(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
-  OperandType type11(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
-  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
-  OperandType type13(Type::TENSOR_INT32, {2}, 0.0625f, 0);
-  OperandType type14(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
-  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 0.25f, 128);
-  OperandType type16(Type::TENSOR_QUANT8_ASYMM, {2, 2, 3, 1}, 1.0f, 0);
-  OperandType type17(Type::TENSOR_INT32, {2}, 0.25f, 0);
-  OperandType type18(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 10.0f, 100);
-  OperandType type19(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 9}, 0.5f, 0);
-  OperandType type2(Type::TENSOR_FLOAT32, {2});
-  OperandType type20(Type::TENSOR_QUANT8_ASYMM, {6, 1, 1, 3}, 0.25f, 0);
-  OperandType type21(Type::TENSOR_INT32, {6}, 0.125f, 0);
-  OperandType type22(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 6}, 2.0f, 60);
-  OperandType type3(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+void CreateModel_channel_nhwc_quant8(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type18(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 0.25f, 128);
+  OperandType type19(Type::TENSOR_QUANT8_ASYMM, {2, 2, 3, 1}, 1.0f, 0);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type20(Type::TENSOR_INT32, {2}, 0.25f, 0);
+  OperandType type21(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 10.0f, 100);
+  OperandType type22(Type::TENSOR_FLOAT32, {1, 2, 3, 2});
+  OperandType type23(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 2}, 0.25f, 128);
+  OperandType type24(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 2}, 10.0f, 100);
+  OperandType type25(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 9}, 0.5f, 0);
+  OperandType type26(Type::TENSOR_QUANT8_ASYMM, {6, 1, 1, 3}, 0.25f, 0);
+  OperandType type27(Type::TENSOR_INT32, {6}, 0.125f, 0);
+  OperandType type28(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 6}, 2.0f, 60);
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
   OperandType type4(Type::INT32, {});
-  OperandType type5(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
-  OperandType type6(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
-  OperandType type7(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
-  OperandType type8(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
-  OperandType type9(Type::TENSOR_FLOAT32, {6});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
   // Phase 1, operands
-  auto op12 = model->addOperand(&type19);
-  auto op22 = model->addOperand(&type20);
-  auto op32 = model->addOperand(&type21);
+  auto op12 = model->addOperand(&type25);
+  auto op22 = model->addOperand(&type26);
+  auto op32 = model->addOperand(&type27);
+  auto param12 = model->addOperand(&type4);
   auto param13 = model->addOperand(&type4);
   auto param14 = model->addOperand(&type4);
   auto param15 = model->addOperand(&type4);
   auto param16 = model->addOperand(&type4);
-  auto param17 = model->addOperand(&type4);
-  auto op42 = model->addOperand(&type22);
+  auto layout = model->addOperand(&type0);
+  auto op42 = model->addOperand(&type28);
   // Phase 2, operations
   static uint8_t op22_init[] = {4, 8, 12, 8, 4, 0, 8, 12, 12, 24, 24, 24, 36, 32, 20, 8, 4, 4};
   model->setOperandValue(op22, op22_init, sizeof(uint8_t) * 18);
   static int32_t op32_init[] = {80, -160, 240, -320, 400, -480};
   model->setOperandValue(op32, op32_init, sizeof(int32_t) * 6);
+  static int32_t param12_init[] = {1};
+  model->setOperandValue(param12, param12_init, sizeof(int32_t) * 1);
   static int32_t param13_init[] = {1};
   model->setOperandValue(param13, param13_init, sizeof(int32_t) * 1);
   static int32_t param14_init[] = {1};
   model->setOperandValue(param14, param14_init, sizeof(int32_t) * 1);
-  static int32_t param15_init[] = {1};
+  static int32_t param15_init[] = {3};
   model->setOperandValue(param15, param15_init, sizeof(int32_t) * 1);
-  static int32_t param16_init[] = {3};
+  static int32_t param16_init[] = {0};
   model->setOperandValue(param16, param16_init, sizeof(int32_t) * 1);
-  static int32_t param17_init[] = {0};
-  model->setOperandValue(param17, param17_init, sizeof(int32_t) * 1);
-  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op12, op22, op32, param13, param14, param15, param16, param17}, {op42});
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op12, op22, op32, param12, param13, param14, param15, param16, layout}, {op42});
   // Phase 3, inputs and outputs
   model->identifyInputsAndOutputs(
     {op12},
@@ -963,57 +4256,66 @@
   assert(model->isValid());
 }
 
-inline bool is_ignored_channel_quant8(int i) {
+inline bool is_ignored_channel_nhwc_quant8(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
-void CreateModel_channel_quant8_weight_as_input(Model *model) {
-  OperandType type0(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
-  OperandType type1(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
-  OperandType type10(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
-  OperandType type11(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
-  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
-  OperandType type13(Type::TENSOR_INT32, {2}, 0.0625f, 0);
-  OperandType type14(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
-  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 0.25f, 128);
-  OperandType type16(Type::TENSOR_QUANT8_ASYMM, {2, 2, 3, 1}, 1.0f, 0);
-  OperandType type17(Type::TENSOR_INT32, {2}, 0.25f, 0);
-  OperandType type18(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 10.0f, 100);
-  OperandType type19(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 9}, 0.5f, 0);
-  OperandType type2(Type::TENSOR_FLOAT32, {2});
-  OperandType type20(Type::TENSOR_QUANT8_ASYMM, {6, 1, 1, 3}, 0.25f, 0);
-  OperandType type21(Type::TENSOR_INT32, {6}, 0.125f, 0);
-  OperandType type22(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 6}, 2.0f, 60);
-  OperandType type3(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+void CreateModel_channel_nhwc_quant8_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type18(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 0.25f, 128);
+  OperandType type19(Type::TENSOR_QUANT8_ASYMM, {2, 2, 3, 1}, 1.0f, 0);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type20(Type::TENSOR_INT32, {2}, 0.25f, 0);
+  OperandType type21(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 10.0f, 100);
+  OperandType type22(Type::TENSOR_FLOAT32, {1, 2, 3, 2});
+  OperandType type23(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 2}, 0.25f, 128);
+  OperandType type24(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 2}, 10.0f, 100);
+  OperandType type25(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 9}, 0.5f, 0);
+  OperandType type26(Type::TENSOR_QUANT8_ASYMM, {6, 1, 1, 3}, 0.25f, 0);
+  OperandType type27(Type::TENSOR_INT32, {6}, 0.125f, 0);
+  OperandType type28(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 6}, 2.0f, 60);
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
   OperandType type4(Type::INT32, {});
-  OperandType type5(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
-  OperandType type6(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
-  OperandType type7(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
-  OperandType type8(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
-  OperandType type9(Type::TENSOR_FLOAT32, {6});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
   // Phase 1, operands
-  auto op12 = model->addOperand(&type19);
-  auto op22 = model->addOperand(&type20);
-  auto op32 = model->addOperand(&type21);
+  auto op12 = model->addOperand(&type25);
+  auto op22 = model->addOperand(&type26);
+  auto op32 = model->addOperand(&type27);
+  auto param12 = model->addOperand(&type4);
   auto param13 = model->addOperand(&type4);
   auto param14 = model->addOperand(&type4);
   auto param15 = model->addOperand(&type4);
   auto param16 = model->addOperand(&type4);
-  auto param17 = model->addOperand(&type4);
-  auto op42 = model->addOperand(&type22);
+  auto layout = model->addOperand(&type0);
+  auto op42 = model->addOperand(&type28);
   // Phase 2, operations
+  static int32_t param12_init[] = {1};
+  model->setOperandValue(param12, param12_init, sizeof(int32_t) * 1);
   static int32_t param13_init[] = {1};
   model->setOperandValue(param13, param13_init, sizeof(int32_t) * 1);
   static int32_t param14_init[] = {1};
   model->setOperandValue(param14, param14_init, sizeof(int32_t) * 1);
-  static int32_t param15_init[] = {1};
+  static int32_t param15_init[] = {3};
   model->setOperandValue(param15, param15_init, sizeof(int32_t) * 1);
-  static int32_t param16_init[] = {3};
+  static int32_t param16_init[] = {0};
   model->setOperandValue(param16, param16_init, sizeof(int32_t) * 1);
-  static int32_t param17_init[] = {0};
-  model->setOperandValue(param17, param17_init, sizeof(int32_t) * 1);
-  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op12, op22, op32, param13, param14, param15, param16, param17}, {op42});
+  static bool layout_init[] = {false};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op12, op22, op32, param12, param13, param14, param15, param16, layout}, {op42});
   // Phase 3, inputs and outputs
   model->identifyInputsAndOutputs(
     {op12, op22, op32},
@@ -1021,7 +4323,441 @@
   assert(model->isValid());
 }
 
-inline bool is_ignored_channel_quant8_weight_as_input(int i) {
+inline bool is_ignored_channel_nhwc_quant8_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_channel_nchw(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type18(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 0.25f, 128);
+  OperandType type19(Type::TENSOR_QUANT8_ASYMM, {2, 2, 3, 1}, 1.0f, 0);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type20(Type::TENSOR_INT32, {2}, 0.25f, 0);
+  OperandType type21(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 10.0f, 100);
+  OperandType type22(Type::TENSOR_FLOAT32, {1, 2, 3, 2});
+  OperandType type23(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 2}, 0.25f, 128);
+  OperandType type24(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 2}, 10.0f, 100);
+  OperandType type25(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 9}, 0.5f, 0);
+  OperandType type26(Type::TENSOR_QUANT8_ASYMM, {6, 1, 1, 3}, 0.25f, 0);
+  OperandType type27(Type::TENSOR_INT32, {6}, 0.125f, 0);
+  OperandType type28(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 6}, 2.0f, 60);
+  OperandType type29(Type::TENSOR_FLOAT32, {1, 9, 2, 2});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type30(Type::TENSOR_FLOAT32, {1, 6, 2, 2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op12 = model->addOperand(&type29);
+  auto op22 = model->addOperand(&type9);
+  auto op32 = model->addOperand(&type10);
+  auto param12 = model->addOperand(&type4);
+  auto param13 = model->addOperand(&type4);
+  auto param14 = model->addOperand(&type4);
+  auto param15 = model->addOperand(&type4);
+  auto param16 = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op42 = model->addOperand(&type30);
+  // Phase 2, operations
+  static float op22_init[] = {1.0f, 2.0f, 3.0f, 2.0f, 1.0f, 0.0f, 2.0f, 3.0f, 3.0f, 6.0f, 6.0f, 6.0f, 9.0f, 8.0f, 5.0f, 2.0f, 1.0f, 1.0f};
+  model->setOperandValue(op22, op22_init, sizeof(float) * 18);
+  static float op32_init[] = {10.0f, -20.0f, 30.0f, -40.0f, 50.0f, -60.0f};
+  model->setOperandValue(op32, op32_init, sizeof(float) * 6);
+  static int32_t param12_init[] = {1};
+  model->setOperandValue(param12, param12_init, sizeof(int32_t) * 1);
+  static int32_t param13_init[] = {1};
+  model->setOperandValue(param13, param13_init, sizeof(int32_t) * 1);
+  static int32_t param14_init[] = {1};
+  model->setOperandValue(param14, param14_init, sizeof(int32_t) * 1);
+  static int32_t param15_init[] = {3};
+  model->setOperandValue(param15, param15_init, sizeof(int32_t) * 1);
+  static int32_t param16_init[] = {0};
+  model->setOperandValue(param16, param16_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op12, op22, op32, param12, param13, param14, param15, param16, layout}, {op42});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op12},
+    {op42});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_channel_nchw(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_channel_nchw_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type18(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 0.25f, 128);
+  OperandType type19(Type::TENSOR_QUANT8_ASYMM, {2, 2, 3, 1}, 1.0f, 0);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type20(Type::TENSOR_INT32, {2}, 0.25f, 0);
+  OperandType type21(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 10.0f, 100);
+  OperandType type22(Type::TENSOR_FLOAT32, {1, 2, 3, 2});
+  OperandType type23(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 2}, 0.25f, 128);
+  OperandType type24(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 2}, 10.0f, 100);
+  OperandType type25(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 9}, 0.5f, 0);
+  OperandType type26(Type::TENSOR_QUANT8_ASYMM, {6, 1, 1, 3}, 0.25f, 0);
+  OperandType type27(Type::TENSOR_INT32, {6}, 0.125f, 0);
+  OperandType type28(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 6}, 2.0f, 60);
+  OperandType type29(Type::TENSOR_FLOAT32, {1, 9, 2, 2});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type30(Type::TENSOR_FLOAT32, {1, 6, 2, 2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op12 = model->addOperand(&type29);
+  auto op22 = model->addOperand(&type9);
+  auto op32 = model->addOperand(&type10);
+  auto param12 = model->addOperand(&type4);
+  auto param13 = model->addOperand(&type4);
+  auto param14 = model->addOperand(&type4);
+  auto param15 = model->addOperand(&type4);
+  auto param16 = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op42 = model->addOperand(&type30);
+  // Phase 2, operations
+  static int32_t param12_init[] = {1};
+  model->setOperandValue(param12, param12_init, sizeof(int32_t) * 1);
+  static int32_t param13_init[] = {1};
+  model->setOperandValue(param13, param13_init, sizeof(int32_t) * 1);
+  static int32_t param14_init[] = {1};
+  model->setOperandValue(param14, param14_init, sizeof(int32_t) * 1);
+  static int32_t param15_init[] = {3};
+  model->setOperandValue(param15, param15_init, sizeof(int32_t) * 1);
+  static int32_t param16_init[] = {0};
+  model->setOperandValue(param16, param16_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op12, op22, op32, param12, param13, param14, param15, param16, layout}, {op42});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op12, op22, op32},
+    {op42});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_channel_nchw_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_channel_nchw_relaxed(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type18(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 0.25f, 128);
+  OperandType type19(Type::TENSOR_QUANT8_ASYMM, {2, 2, 3, 1}, 1.0f, 0);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type20(Type::TENSOR_INT32, {2}, 0.25f, 0);
+  OperandType type21(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 10.0f, 100);
+  OperandType type22(Type::TENSOR_FLOAT32, {1, 2, 3, 2});
+  OperandType type23(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 2}, 0.25f, 128);
+  OperandType type24(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 2}, 10.0f, 100);
+  OperandType type25(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 9}, 0.5f, 0);
+  OperandType type26(Type::TENSOR_QUANT8_ASYMM, {6, 1, 1, 3}, 0.25f, 0);
+  OperandType type27(Type::TENSOR_INT32, {6}, 0.125f, 0);
+  OperandType type28(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 6}, 2.0f, 60);
+  OperandType type29(Type::TENSOR_FLOAT32, {1, 9, 2, 2});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type30(Type::TENSOR_FLOAT32, {1, 6, 2, 2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op12 = model->addOperand(&type29);
+  auto op22 = model->addOperand(&type9);
+  auto op32 = model->addOperand(&type10);
+  auto param12 = model->addOperand(&type4);
+  auto param13 = model->addOperand(&type4);
+  auto param14 = model->addOperand(&type4);
+  auto param15 = model->addOperand(&type4);
+  auto param16 = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op42 = model->addOperand(&type30);
+  // Phase 2, operations
+  static float op22_init[] = {1.0f, 2.0f, 3.0f, 2.0f, 1.0f, 0.0f, 2.0f, 3.0f, 3.0f, 6.0f, 6.0f, 6.0f, 9.0f, 8.0f, 5.0f, 2.0f, 1.0f, 1.0f};
+  model->setOperandValue(op22, op22_init, sizeof(float) * 18);
+  static float op32_init[] = {10.0f, -20.0f, 30.0f, -40.0f, 50.0f, -60.0f};
+  model->setOperandValue(op32, op32_init, sizeof(float) * 6);
+  static int32_t param12_init[] = {1};
+  model->setOperandValue(param12, param12_init, sizeof(int32_t) * 1);
+  static int32_t param13_init[] = {1};
+  model->setOperandValue(param13, param13_init, sizeof(int32_t) * 1);
+  static int32_t param14_init[] = {1};
+  model->setOperandValue(param14, param14_init, sizeof(int32_t) * 1);
+  static int32_t param15_init[] = {3};
+  model->setOperandValue(param15, param15_init, sizeof(int32_t) * 1);
+  static int32_t param16_init[] = {0};
+  model->setOperandValue(param16, param16_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op12, op22, op32, param12, param13, param14, param15, param16, layout}, {op42});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op12},
+    {op42});
+  // Phase 4: set relaxed execution
+  model->relaxComputationFloat32toFloat16(true);
+  assert(model->isValid());
+}
+
+inline bool is_ignored_channel_nchw_relaxed(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_channel_nchw_relaxed_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type18(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 0.25f, 128);
+  OperandType type19(Type::TENSOR_QUANT8_ASYMM, {2, 2, 3, 1}, 1.0f, 0);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type20(Type::TENSOR_INT32, {2}, 0.25f, 0);
+  OperandType type21(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 10.0f, 100);
+  OperandType type22(Type::TENSOR_FLOAT32, {1, 2, 3, 2});
+  OperandType type23(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 2}, 0.25f, 128);
+  OperandType type24(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 2}, 10.0f, 100);
+  OperandType type25(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 9}, 0.5f, 0);
+  OperandType type26(Type::TENSOR_QUANT8_ASYMM, {6, 1, 1, 3}, 0.25f, 0);
+  OperandType type27(Type::TENSOR_INT32, {6}, 0.125f, 0);
+  OperandType type28(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 6}, 2.0f, 60);
+  OperandType type29(Type::TENSOR_FLOAT32, {1, 9, 2, 2});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type30(Type::TENSOR_FLOAT32, {1, 6, 2, 2});
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op12 = model->addOperand(&type29);
+  auto op22 = model->addOperand(&type9);
+  auto op32 = model->addOperand(&type10);
+  auto param12 = model->addOperand(&type4);
+  auto param13 = model->addOperand(&type4);
+  auto param14 = model->addOperand(&type4);
+  auto param15 = model->addOperand(&type4);
+  auto param16 = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op42 = model->addOperand(&type30);
+  // Phase 2, operations
+  static int32_t param12_init[] = {1};
+  model->setOperandValue(param12, param12_init, sizeof(int32_t) * 1);
+  static int32_t param13_init[] = {1};
+  model->setOperandValue(param13, param13_init, sizeof(int32_t) * 1);
+  static int32_t param14_init[] = {1};
+  model->setOperandValue(param14, param14_init, sizeof(int32_t) * 1);
+  static int32_t param15_init[] = {3};
+  model->setOperandValue(param15, param15_init, sizeof(int32_t) * 1);
+  static int32_t param16_init[] = {0};
+  model->setOperandValue(param16, param16_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op12, op22, op32, param12, param13, param14, param15, param16, layout}, {op42});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op12, op22, op32},
+    {op42});
+  // Phase 4: set relaxed execution
+  model->relaxComputationFloat32toFloat16(true);
+  assert(model->isValid());
+}
+
+inline bool is_ignored_channel_nchw_relaxed_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_channel_nchw_quant8(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type18(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 0.25f, 128);
+  OperandType type19(Type::TENSOR_QUANT8_ASYMM, {2, 2, 3, 1}, 1.0f, 0);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type20(Type::TENSOR_INT32, {2}, 0.25f, 0);
+  OperandType type21(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 10.0f, 100);
+  OperandType type22(Type::TENSOR_FLOAT32, {1, 2, 3, 2});
+  OperandType type23(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 2}, 0.25f, 128);
+  OperandType type24(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 2}, 10.0f, 100);
+  OperandType type25(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 9}, 0.5f, 0);
+  OperandType type26(Type::TENSOR_QUANT8_ASYMM, {6, 1, 1, 3}, 0.25f, 0);
+  OperandType type27(Type::TENSOR_INT32, {6}, 0.125f, 0);
+  OperandType type28(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 6}, 2.0f, 60);
+  OperandType type29(Type::TENSOR_FLOAT32, {1, 9, 2, 2});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type30(Type::TENSOR_FLOAT32, {1, 6, 2, 2});
+  OperandType type31(Type::TENSOR_QUANT8_ASYMM, {1, 9, 2, 2}, 0.5f, 0);
+  OperandType type32(Type::TENSOR_QUANT8_ASYMM, {1, 6, 2, 2}, 2.0f, 60);
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op12 = model->addOperand(&type31);
+  auto op22 = model->addOperand(&type26);
+  auto op32 = model->addOperand(&type27);
+  auto param12 = model->addOperand(&type4);
+  auto param13 = model->addOperand(&type4);
+  auto param14 = model->addOperand(&type4);
+  auto param15 = model->addOperand(&type4);
+  auto param16 = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op42 = model->addOperand(&type32);
+  // Phase 2, operations
+  static uint8_t op22_init[] = {4, 8, 12, 8, 4, 0, 8, 12, 12, 24, 24, 24, 36, 32, 20, 8, 4, 4};
+  model->setOperandValue(op22, op22_init, sizeof(uint8_t) * 18);
+  static int32_t op32_init[] = {80, -160, 240, -320, 400, -480};
+  model->setOperandValue(op32, op32_init, sizeof(int32_t) * 6);
+  static int32_t param12_init[] = {1};
+  model->setOperandValue(param12, param12_init, sizeof(int32_t) * 1);
+  static int32_t param13_init[] = {1};
+  model->setOperandValue(param13, param13_init, sizeof(int32_t) * 1);
+  static int32_t param14_init[] = {1};
+  model->setOperandValue(param14, param14_init, sizeof(int32_t) * 1);
+  static int32_t param15_init[] = {3};
+  model->setOperandValue(param15, param15_init, sizeof(int32_t) * 1);
+  static int32_t param16_init[] = {0};
+  model->setOperandValue(param16, param16_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op12, op22, op32, param12, param13, param14, param15, param16, layout}, {op42});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op12},
+    {op42});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_channel_nchw_quant8(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+void CreateModel_channel_nchw_quant8_weight_as_input(Model *model) {
+  OperandType type0(Type::BOOL, {});
+  OperandType type1(Type::TENSOR_FLOAT32, {1, 3, 3, 2});
+  OperandType type10(Type::TENSOR_FLOAT32, {6});
+  OperandType type11(Type::TENSOR_FLOAT32, {1, 2, 2, 6});
+  OperandType type12(Type::TENSOR_QUANT8_ASYMM, {1, 3, 3, 2}, 0.25f, 100);
+  OperandType type13(Type::TENSOR_QUANT8_ASYMM, {2, 2, 2, 1}, 0.25f, 128);
+  OperandType type14(Type::TENSOR_INT32, {2}, 0.0625f, 0);
+  OperandType type15(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 2}, 0.5f, 80);
+  OperandType type16(Type::TENSOR_FLOAT32, {1, 2, 3, 3});
+  OperandType type17(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 3}, 0.25f, 100);
+  OperandType type18(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 0.25f, 128);
+  OperandType type19(Type::TENSOR_QUANT8_ASYMM, {2, 2, 3, 1}, 1.0f, 0);
+  OperandType type2(Type::TENSOR_FLOAT32, {2, 2, 2, 1});
+  OperandType type20(Type::TENSOR_INT32, {2}, 0.25f, 0);
+  OperandType type21(Type::TENSOR_QUANT8_ASYMM, {1, 3, 2, 2}, 10.0f, 100);
+  OperandType type22(Type::TENSOR_FLOAT32, {1, 2, 3, 2});
+  OperandType type23(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 2}, 0.25f, 128);
+  OperandType type24(Type::TENSOR_QUANT8_ASYMM, {1, 2, 3, 2}, 10.0f, 100);
+  OperandType type25(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 9}, 0.5f, 0);
+  OperandType type26(Type::TENSOR_QUANT8_ASYMM, {6, 1, 1, 3}, 0.25f, 0);
+  OperandType type27(Type::TENSOR_INT32, {6}, 0.125f, 0);
+  OperandType type28(Type::TENSOR_QUANT8_ASYMM, {1, 2, 2, 6}, 2.0f, 60);
+  OperandType type29(Type::TENSOR_FLOAT32, {1, 9, 2, 2});
+  OperandType type3(Type::TENSOR_FLOAT32, {2});
+  OperandType type30(Type::TENSOR_FLOAT32, {1, 6, 2, 2});
+  OperandType type31(Type::TENSOR_QUANT8_ASYMM, {1, 9, 2, 2}, 0.5f, 0);
+  OperandType type32(Type::TENSOR_QUANT8_ASYMM, {1, 6, 2, 2}, 2.0f, 60);
+  OperandType type4(Type::INT32, {});
+  OperandType type5(Type::TENSOR_FLOAT32, {1, 2, 2, 2});
+  OperandType type6(Type::TENSOR_FLOAT32, {1, 3, 2, 2});
+  OperandType type7(Type::TENSOR_FLOAT32, {2, 2, 3, 1});
+  OperandType type8(Type::TENSOR_FLOAT32, {1, 2, 2, 9});
+  OperandType type9(Type::TENSOR_FLOAT32, {6, 1, 1, 3});
+  // Phase 1, operands
+  auto op12 = model->addOperand(&type31);
+  auto op22 = model->addOperand(&type26);
+  auto op32 = model->addOperand(&type27);
+  auto param12 = model->addOperand(&type4);
+  auto param13 = model->addOperand(&type4);
+  auto param14 = model->addOperand(&type4);
+  auto param15 = model->addOperand(&type4);
+  auto param16 = model->addOperand(&type4);
+  auto layout = model->addOperand(&type0);
+  auto op42 = model->addOperand(&type32);
+  // Phase 2, operations
+  static int32_t param12_init[] = {1};
+  model->setOperandValue(param12, param12_init, sizeof(int32_t) * 1);
+  static int32_t param13_init[] = {1};
+  model->setOperandValue(param13, param13_init, sizeof(int32_t) * 1);
+  static int32_t param14_init[] = {1};
+  model->setOperandValue(param14, param14_init, sizeof(int32_t) * 1);
+  static int32_t param15_init[] = {3};
+  model->setOperandValue(param15, param15_init, sizeof(int32_t) * 1);
+  static int32_t param16_init[] = {0};
+  model->setOperandValue(param16, param16_init, sizeof(int32_t) * 1);
+  static bool layout_init[] = {true};
+  model->setOperandValue(layout, layout_init, sizeof(bool) * 1);
+  model->addOperation(ANEURALNETWORKS_GROUPED_CONV_2D, {op12, op22, op32, param12, param13, param14, param15, param16, layout}, {op42});
+  // Phase 3, inputs and outputs
+  model->identifyInputsAndOutputs(
+    {op12, op22, op32},
+    {op42});
+  assert(model->isValid());
+}
+
+inline bool is_ignored_channel_nchw_quant8_weight_as_input(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
diff --git a/runtime/test/generated/tests/grouped_conv2d.mod.py.cpp b/runtime/test/generated/tests/grouped_conv2d.mod.py.cpp
index 324e7f6..b2bb071 100644
--- a/runtime/test/generated/tests/grouped_conv2d.mod.py.cpp
+++ b/runtime/test/generated/tests/grouped_conv2d.mod.py.cpp
@@ -9,111 +9,435 @@
 #include "generated/models/grouped_conv2d.model.cpp"
 } // namespace grouped_conv2d
 
-TEST_F(GeneratedTests, grouped_conv2d) {
-    execute(grouped_conv2d::CreateModel,
-            grouped_conv2d::is_ignored,
-            grouped_conv2d::examples);
+TEST_F(GeneratedTests, grouped_conv2d_nhwc_none) {
+    execute(grouped_conv2d::CreateModel_nhwc_none,
+            grouped_conv2d::is_ignored_nhwc_none,
+            grouped_conv2d::examples_nhwc_none);
 }
 
-TEST_F(GeneratedTests, grouped_conv2d_weight_as_input) {
-    execute(grouped_conv2d::CreateModel_weight_as_input,
-            grouped_conv2d::is_ignored_weight_as_input,
-            grouped_conv2d::examples_weight_as_input);
+TEST_F(GeneratedTests, grouped_conv2d_nhwc_none_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_nhwc_none_weight_as_input,
+            grouped_conv2d::is_ignored_nhwc_none_weight_as_input,
+            grouped_conv2d::examples_nhwc_none_weight_as_input);
 }
 
-TEST_F(GeneratedTests, grouped_conv2d_relaxed) {
-    execute(grouped_conv2d::CreateModel_relaxed,
-            grouped_conv2d::is_ignored_relaxed,
-            grouped_conv2d::examples_relaxed);
+TEST_F(GeneratedTests, grouped_conv2d_nhwc_none_relaxed) {
+    execute(grouped_conv2d::CreateModel_nhwc_none_relaxed,
+            grouped_conv2d::is_ignored_nhwc_none_relaxed,
+            grouped_conv2d::examples_nhwc_none_relaxed);
 }
 
-TEST_F(GeneratedTests, grouped_conv2d_relaxed_weight_as_input) {
-    execute(grouped_conv2d::CreateModel_relaxed_weight_as_input,
-            grouped_conv2d::is_ignored_relaxed_weight_as_input,
-            grouped_conv2d::examples_relaxed_weight_as_input);
+TEST_F(GeneratedTests, grouped_conv2d_nhwc_none_relaxed_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_nhwc_none_relaxed_weight_as_input,
+            grouped_conv2d::is_ignored_nhwc_none_relaxed_weight_as_input,
+            grouped_conv2d::examples_nhwc_none_relaxed_weight_as_input);
 }
 
-TEST_F(GeneratedTests, grouped_conv2d_quant8) {
-    execute(grouped_conv2d::CreateModel_quant8,
-            grouped_conv2d::is_ignored_quant8,
-            grouped_conv2d::examples_quant8);
+TEST_F(GeneratedTests, grouped_conv2d_nhwc_none_quant8) {
+    execute(grouped_conv2d::CreateModel_nhwc_none_quant8,
+            grouped_conv2d::is_ignored_nhwc_none_quant8,
+            grouped_conv2d::examples_nhwc_none_quant8);
 }
 
-TEST_F(GeneratedTests, grouped_conv2d_quant8_weight_as_input) {
-    execute(grouped_conv2d::CreateModel_quant8_weight_as_input,
-            grouped_conv2d::is_ignored_quant8_weight_as_input,
-            grouped_conv2d::examples_quant8_weight_as_input);
+TEST_F(GeneratedTests, grouped_conv2d_nhwc_none_quant8_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_nhwc_none_quant8_weight_as_input,
+            grouped_conv2d::is_ignored_nhwc_none_quant8_weight_as_input,
+            grouped_conv2d::examples_nhwc_none_quant8_weight_as_input);
 }
 
-TEST_F(GeneratedTests, grouped_conv2d_large) {
-    execute(grouped_conv2d::CreateModel_large,
-            grouped_conv2d::is_ignored_large,
-            grouped_conv2d::examples_large);
+TEST_F(GeneratedTests, grouped_conv2d_nhwc_relu) {
+    execute(grouped_conv2d::CreateModel_nhwc_relu,
+            grouped_conv2d::is_ignored_nhwc_relu,
+            grouped_conv2d::examples_nhwc_relu);
 }
 
-TEST_F(GeneratedTests, grouped_conv2d_large_weight_as_input) {
-    execute(grouped_conv2d::CreateModel_large_weight_as_input,
-            grouped_conv2d::is_ignored_large_weight_as_input,
-            grouped_conv2d::examples_large_weight_as_input);
+TEST_F(GeneratedTests, grouped_conv2d_nhwc_relu_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_nhwc_relu_weight_as_input,
+            grouped_conv2d::is_ignored_nhwc_relu_weight_as_input,
+            grouped_conv2d::examples_nhwc_relu_weight_as_input);
 }
 
-TEST_F(GeneratedTests, grouped_conv2d_large_relaxed) {
-    execute(grouped_conv2d::CreateModel_large_relaxed,
-            grouped_conv2d::is_ignored_large_relaxed,
-            grouped_conv2d::examples_large_relaxed);
+TEST_F(GeneratedTests, grouped_conv2d_nhwc_relu_relaxed) {
+    execute(grouped_conv2d::CreateModel_nhwc_relu_relaxed,
+            grouped_conv2d::is_ignored_nhwc_relu_relaxed,
+            grouped_conv2d::examples_nhwc_relu_relaxed);
 }
 
-TEST_F(GeneratedTests, grouped_conv2d_large_relaxed_weight_as_input) {
-    execute(grouped_conv2d::CreateModel_large_relaxed_weight_as_input,
-            grouped_conv2d::is_ignored_large_relaxed_weight_as_input,
-            grouped_conv2d::examples_large_relaxed_weight_as_input);
+TEST_F(GeneratedTests, grouped_conv2d_nhwc_relu_relaxed_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_nhwc_relu_relaxed_weight_as_input,
+            grouped_conv2d::is_ignored_nhwc_relu_relaxed_weight_as_input,
+            grouped_conv2d::examples_nhwc_relu_relaxed_weight_as_input);
 }
 
-TEST_F(GeneratedTests, grouped_conv2d_large_quant8) {
-    execute(grouped_conv2d::CreateModel_large_quant8,
-            grouped_conv2d::is_ignored_large_quant8,
-            grouped_conv2d::examples_large_quant8);
+TEST_F(GeneratedTests, grouped_conv2d_nhwc_relu_quant8) {
+    execute(grouped_conv2d::CreateModel_nhwc_relu_quant8,
+            grouped_conv2d::is_ignored_nhwc_relu_quant8,
+            grouped_conv2d::examples_nhwc_relu_quant8);
 }
 
-TEST_F(GeneratedTests, grouped_conv2d_large_quant8_weight_as_input) {
-    execute(grouped_conv2d::CreateModel_large_quant8_weight_as_input,
-            grouped_conv2d::is_ignored_large_quant8_weight_as_input,
-            grouped_conv2d::examples_large_quant8_weight_as_input);
+TEST_F(GeneratedTests, grouped_conv2d_nhwc_relu_quant8_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_nhwc_relu_quant8_weight_as_input,
+            grouped_conv2d::is_ignored_nhwc_relu_quant8_weight_as_input,
+            grouped_conv2d::examples_nhwc_relu_quant8_weight_as_input);
 }
 
-TEST_F(GeneratedTests, grouped_conv2d_channel) {
-    execute(grouped_conv2d::CreateModel_channel,
-            grouped_conv2d::is_ignored_channel,
-            grouped_conv2d::examples_channel);
+TEST_F(GeneratedTests, grouped_conv2d_nhwc_relu1) {
+    execute(grouped_conv2d::CreateModel_nhwc_relu1,
+            grouped_conv2d::is_ignored_nhwc_relu1,
+            grouped_conv2d::examples_nhwc_relu1);
 }
 
-TEST_F(GeneratedTests, grouped_conv2d_channel_weight_as_input) {
-    execute(grouped_conv2d::CreateModel_channel_weight_as_input,
-            grouped_conv2d::is_ignored_channel_weight_as_input,
-            grouped_conv2d::examples_channel_weight_as_input);
+TEST_F(GeneratedTests, grouped_conv2d_nhwc_relu1_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_nhwc_relu1_weight_as_input,
+            grouped_conv2d::is_ignored_nhwc_relu1_weight_as_input,
+            grouped_conv2d::examples_nhwc_relu1_weight_as_input);
 }
 
-TEST_F(GeneratedTests, grouped_conv2d_channel_relaxed) {
-    execute(grouped_conv2d::CreateModel_channel_relaxed,
-            grouped_conv2d::is_ignored_channel_relaxed,
-            grouped_conv2d::examples_channel_relaxed);
+TEST_F(GeneratedTests, grouped_conv2d_nhwc_relu1_relaxed) {
+    execute(grouped_conv2d::CreateModel_nhwc_relu1_relaxed,
+            grouped_conv2d::is_ignored_nhwc_relu1_relaxed,
+            grouped_conv2d::examples_nhwc_relu1_relaxed);
 }
 
-TEST_F(GeneratedTests, grouped_conv2d_channel_relaxed_weight_as_input) {
-    execute(grouped_conv2d::CreateModel_channel_relaxed_weight_as_input,
-            grouped_conv2d::is_ignored_channel_relaxed_weight_as_input,
-            grouped_conv2d::examples_channel_relaxed_weight_as_input);
+TEST_F(GeneratedTests, grouped_conv2d_nhwc_relu1_relaxed_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_nhwc_relu1_relaxed_weight_as_input,
+            grouped_conv2d::is_ignored_nhwc_relu1_relaxed_weight_as_input,
+            grouped_conv2d::examples_nhwc_relu1_relaxed_weight_as_input);
 }
 
-TEST_F(GeneratedTests, grouped_conv2d_channel_quant8) {
-    execute(grouped_conv2d::CreateModel_channel_quant8,
-            grouped_conv2d::is_ignored_channel_quant8,
-            grouped_conv2d::examples_channel_quant8);
+TEST_F(GeneratedTests, grouped_conv2d_nhwc_relu1_quant8) {
+    execute(grouped_conv2d::CreateModel_nhwc_relu1_quant8,
+            grouped_conv2d::is_ignored_nhwc_relu1_quant8,
+            grouped_conv2d::examples_nhwc_relu1_quant8);
 }
 
-TEST_F(GeneratedTests, grouped_conv2d_channel_quant8_weight_as_input) {
-    execute(grouped_conv2d::CreateModel_channel_quant8_weight_as_input,
-            grouped_conv2d::is_ignored_channel_quant8_weight_as_input,
-            grouped_conv2d::examples_channel_quant8_weight_as_input);
+TEST_F(GeneratedTests, grouped_conv2d_nhwc_relu1_quant8_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_nhwc_relu1_quant8_weight_as_input,
+            grouped_conv2d::is_ignored_nhwc_relu1_quant8_weight_as_input,
+            grouped_conv2d::examples_nhwc_relu1_quant8_weight_as_input);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nhwc_relu6) {
+    execute(grouped_conv2d::CreateModel_nhwc_relu6,
+            grouped_conv2d::is_ignored_nhwc_relu6,
+            grouped_conv2d::examples_nhwc_relu6);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nhwc_relu6_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_nhwc_relu6_weight_as_input,
+            grouped_conv2d::is_ignored_nhwc_relu6_weight_as_input,
+            grouped_conv2d::examples_nhwc_relu6_weight_as_input);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nhwc_relu6_relaxed) {
+    execute(grouped_conv2d::CreateModel_nhwc_relu6_relaxed,
+            grouped_conv2d::is_ignored_nhwc_relu6_relaxed,
+            grouped_conv2d::examples_nhwc_relu6_relaxed);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nhwc_relu6_relaxed_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_nhwc_relu6_relaxed_weight_as_input,
+            grouped_conv2d::is_ignored_nhwc_relu6_relaxed_weight_as_input,
+            grouped_conv2d::examples_nhwc_relu6_relaxed_weight_as_input);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nhwc_relu6_quant8) {
+    execute(grouped_conv2d::CreateModel_nhwc_relu6_quant8,
+            grouped_conv2d::is_ignored_nhwc_relu6_quant8,
+            grouped_conv2d::examples_nhwc_relu6_quant8);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nhwc_relu6_quant8_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_nhwc_relu6_quant8_weight_as_input,
+            grouped_conv2d::is_ignored_nhwc_relu6_quant8_weight_as_input,
+            grouped_conv2d::examples_nhwc_relu6_quant8_weight_as_input);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nchw_none) {
+    execute(grouped_conv2d::CreateModel_nchw_none,
+            grouped_conv2d::is_ignored_nchw_none,
+            grouped_conv2d::examples_nchw_none);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nchw_none_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_nchw_none_weight_as_input,
+            grouped_conv2d::is_ignored_nchw_none_weight_as_input,
+            grouped_conv2d::examples_nchw_none_weight_as_input);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nchw_none_relaxed) {
+    execute(grouped_conv2d::CreateModel_nchw_none_relaxed,
+            grouped_conv2d::is_ignored_nchw_none_relaxed,
+            grouped_conv2d::examples_nchw_none_relaxed);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nchw_none_relaxed_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_nchw_none_relaxed_weight_as_input,
+            grouped_conv2d::is_ignored_nchw_none_relaxed_weight_as_input,
+            grouped_conv2d::examples_nchw_none_relaxed_weight_as_input);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nchw_none_quant8) {
+    execute(grouped_conv2d::CreateModel_nchw_none_quant8,
+            grouped_conv2d::is_ignored_nchw_none_quant8,
+            grouped_conv2d::examples_nchw_none_quant8);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nchw_none_quant8_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_nchw_none_quant8_weight_as_input,
+            grouped_conv2d::is_ignored_nchw_none_quant8_weight_as_input,
+            grouped_conv2d::examples_nchw_none_quant8_weight_as_input);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nchw_relu) {
+    execute(grouped_conv2d::CreateModel_nchw_relu,
+            grouped_conv2d::is_ignored_nchw_relu,
+            grouped_conv2d::examples_nchw_relu);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nchw_relu_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_nchw_relu_weight_as_input,
+            grouped_conv2d::is_ignored_nchw_relu_weight_as_input,
+            grouped_conv2d::examples_nchw_relu_weight_as_input);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nchw_relu_relaxed) {
+    execute(grouped_conv2d::CreateModel_nchw_relu_relaxed,
+            grouped_conv2d::is_ignored_nchw_relu_relaxed,
+            grouped_conv2d::examples_nchw_relu_relaxed);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nchw_relu_relaxed_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_nchw_relu_relaxed_weight_as_input,
+            grouped_conv2d::is_ignored_nchw_relu_relaxed_weight_as_input,
+            grouped_conv2d::examples_nchw_relu_relaxed_weight_as_input);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nchw_relu_quant8) {
+    execute(grouped_conv2d::CreateModel_nchw_relu_quant8,
+            grouped_conv2d::is_ignored_nchw_relu_quant8,
+            grouped_conv2d::examples_nchw_relu_quant8);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nchw_relu_quant8_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_nchw_relu_quant8_weight_as_input,
+            grouped_conv2d::is_ignored_nchw_relu_quant8_weight_as_input,
+            grouped_conv2d::examples_nchw_relu_quant8_weight_as_input);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nchw_relu1) {
+    execute(grouped_conv2d::CreateModel_nchw_relu1,
+            grouped_conv2d::is_ignored_nchw_relu1,
+            grouped_conv2d::examples_nchw_relu1);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nchw_relu1_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_nchw_relu1_weight_as_input,
+            grouped_conv2d::is_ignored_nchw_relu1_weight_as_input,
+            grouped_conv2d::examples_nchw_relu1_weight_as_input);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nchw_relu1_relaxed) {
+    execute(grouped_conv2d::CreateModel_nchw_relu1_relaxed,
+            grouped_conv2d::is_ignored_nchw_relu1_relaxed,
+            grouped_conv2d::examples_nchw_relu1_relaxed);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nchw_relu1_relaxed_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_nchw_relu1_relaxed_weight_as_input,
+            grouped_conv2d::is_ignored_nchw_relu1_relaxed_weight_as_input,
+            grouped_conv2d::examples_nchw_relu1_relaxed_weight_as_input);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nchw_relu1_quant8) {
+    execute(grouped_conv2d::CreateModel_nchw_relu1_quant8,
+            grouped_conv2d::is_ignored_nchw_relu1_quant8,
+            grouped_conv2d::examples_nchw_relu1_quant8);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nchw_relu1_quant8_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_nchw_relu1_quant8_weight_as_input,
+            grouped_conv2d::is_ignored_nchw_relu1_quant8_weight_as_input,
+            grouped_conv2d::examples_nchw_relu1_quant8_weight_as_input);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nchw_relu6) {
+    execute(grouped_conv2d::CreateModel_nchw_relu6,
+            grouped_conv2d::is_ignored_nchw_relu6,
+            grouped_conv2d::examples_nchw_relu6);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nchw_relu6_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_nchw_relu6_weight_as_input,
+            grouped_conv2d::is_ignored_nchw_relu6_weight_as_input,
+            grouped_conv2d::examples_nchw_relu6_weight_as_input);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nchw_relu6_relaxed) {
+    execute(grouped_conv2d::CreateModel_nchw_relu6_relaxed,
+            grouped_conv2d::is_ignored_nchw_relu6_relaxed,
+            grouped_conv2d::examples_nchw_relu6_relaxed);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nchw_relu6_relaxed_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_nchw_relu6_relaxed_weight_as_input,
+            grouped_conv2d::is_ignored_nchw_relu6_relaxed_weight_as_input,
+            grouped_conv2d::examples_nchw_relu6_relaxed_weight_as_input);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nchw_relu6_quant8) {
+    execute(grouped_conv2d::CreateModel_nchw_relu6_quant8,
+            grouped_conv2d::is_ignored_nchw_relu6_quant8,
+            grouped_conv2d::examples_nchw_relu6_quant8);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_nchw_relu6_quant8_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_nchw_relu6_quant8_weight_as_input,
+            grouped_conv2d::is_ignored_nchw_relu6_quant8_weight_as_input,
+            grouped_conv2d::examples_nchw_relu6_quant8_weight_as_input);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_large_nhwc) {
+    execute(grouped_conv2d::CreateModel_large_nhwc,
+            grouped_conv2d::is_ignored_large_nhwc,
+            grouped_conv2d::examples_large_nhwc);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_large_nhwc_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_large_nhwc_weight_as_input,
+            grouped_conv2d::is_ignored_large_nhwc_weight_as_input,
+            grouped_conv2d::examples_large_nhwc_weight_as_input);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_large_nhwc_relaxed) {
+    execute(grouped_conv2d::CreateModel_large_nhwc_relaxed,
+            grouped_conv2d::is_ignored_large_nhwc_relaxed,
+            grouped_conv2d::examples_large_nhwc_relaxed);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_large_nhwc_relaxed_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_large_nhwc_relaxed_weight_as_input,
+            grouped_conv2d::is_ignored_large_nhwc_relaxed_weight_as_input,
+            grouped_conv2d::examples_large_nhwc_relaxed_weight_as_input);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_large_nhwc_quant8) {
+    execute(grouped_conv2d::CreateModel_large_nhwc_quant8,
+            grouped_conv2d::is_ignored_large_nhwc_quant8,
+            grouped_conv2d::examples_large_nhwc_quant8);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_large_nhwc_quant8_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_large_nhwc_quant8_weight_as_input,
+            grouped_conv2d::is_ignored_large_nhwc_quant8_weight_as_input,
+            grouped_conv2d::examples_large_nhwc_quant8_weight_as_input);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_large_nchw) {
+    execute(grouped_conv2d::CreateModel_large_nchw,
+            grouped_conv2d::is_ignored_large_nchw,
+            grouped_conv2d::examples_large_nchw);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_large_nchw_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_large_nchw_weight_as_input,
+            grouped_conv2d::is_ignored_large_nchw_weight_as_input,
+            grouped_conv2d::examples_large_nchw_weight_as_input);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_large_nchw_relaxed) {
+    execute(grouped_conv2d::CreateModel_large_nchw_relaxed,
+            grouped_conv2d::is_ignored_large_nchw_relaxed,
+            grouped_conv2d::examples_large_nchw_relaxed);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_large_nchw_relaxed_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_large_nchw_relaxed_weight_as_input,
+            grouped_conv2d::is_ignored_large_nchw_relaxed_weight_as_input,
+            grouped_conv2d::examples_large_nchw_relaxed_weight_as_input);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_large_nchw_quant8) {
+    execute(grouped_conv2d::CreateModel_large_nchw_quant8,
+            grouped_conv2d::is_ignored_large_nchw_quant8,
+            grouped_conv2d::examples_large_nchw_quant8);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_large_nchw_quant8_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_large_nchw_quant8_weight_as_input,
+            grouped_conv2d::is_ignored_large_nchw_quant8_weight_as_input,
+            grouped_conv2d::examples_large_nchw_quant8_weight_as_input);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_channel_nhwc) {
+    execute(grouped_conv2d::CreateModel_channel_nhwc,
+            grouped_conv2d::is_ignored_channel_nhwc,
+            grouped_conv2d::examples_channel_nhwc);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_channel_nhwc_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_channel_nhwc_weight_as_input,
+            grouped_conv2d::is_ignored_channel_nhwc_weight_as_input,
+            grouped_conv2d::examples_channel_nhwc_weight_as_input);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_channel_nhwc_relaxed) {
+    execute(grouped_conv2d::CreateModel_channel_nhwc_relaxed,
+            grouped_conv2d::is_ignored_channel_nhwc_relaxed,
+            grouped_conv2d::examples_channel_nhwc_relaxed);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_channel_nhwc_relaxed_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_channel_nhwc_relaxed_weight_as_input,
+            grouped_conv2d::is_ignored_channel_nhwc_relaxed_weight_as_input,
+            grouped_conv2d::examples_channel_nhwc_relaxed_weight_as_input);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_channel_nhwc_quant8) {
+    execute(grouped_conv2d::CreateModel_channel_nhwc_quant8,
+            grouped_conv2d::is_ignored_channel_nhwc_quant8,
+            grouped_conv2d::examples_channel_nhwc_quant8);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_channel_nhwc_quant8_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_channel_nhwc_quant8_weight_as_input,
+            grouped_conv2d::is_ignored_channel_nhwc_quant8_weight_as_input,
+            grouped_conv2d::examples_channel_nhwc_quant8_weight_as_input);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_channel_nchw) {
+    execute(grouped_conv2d::CreateModel_channel_nchw,
+            grouped_conv2d::is_ignored_channel_nchw,
+            grouped_conv2d::examples_channel_nchw);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_channel_nchw_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_channel_nchw_weight_as_input,
+            grouped_conv2d::is_ignored_channel_nchw_weight_as_input,
+            grouped_conv2d::examples_channel_nchw_weight_as_input);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_channel_nchw_relaxed) {
+    execute(grouped_conv2d::CreateModel_channel_nchw_relaxed,
+            grouped_conv2d::is_ignored_channel_nchw_relaxed,
+            grouped_conv2d::examples_channel_nchw_relaxed);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_channel_nchw_relaxed_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_channel_nchw_relaxed_weight_as_input,
+            grouped_conv2d::is_ignored_channel_nchw_relaxed_weight_as_input,
+            grouped_conv2d::examples_channel_nchw_relaxed_weight_as_input);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_channel_nchw_quant8) {
+    execute(grouped_conv2d::CreateModel_channel_nchw_quant8,
+            grouped_conv2d::is_ignored_channel_nchw_quant8,
+            grouped_conv2d::examples_channel_nchw_quant8);
+}
+
+TEST_F(GeneratedTests, grouped_conv2d_channel_nchw_quant8_weight_as_input) {
+    execute(grouped_conv2d::CreateModel_channel_nchw_quant8_weight_as_input,
+            grouped_conv2d::is_ignored_channel_nchw_quant8_weight_as_input,
+            grouped_conv2d::examples_channel_nchw_quant8_weight_as_input);
 }
 
diff --git a/runtime/test/generated/vts_models/grouped_conv2d.model.cpp b/runtime/test/generated/vts_models/grouped_conv2d.model.cpp
index 8ae47d9..cf9144b 100644
--- a/runtime/test/generated/vts_models/grouped_conv2d.model.cpp
+++ b/runtime/test/generated/vts_models/grouped_conv2d.model.cpp
@@ -1,7 +1,7 @@
 // clang-format off
 // Generated file (from: grouped_conv2d.mod.py). Do not edit
 // Create the model
-Model createTestModel() {
+Model createTestModel_nhwc_none() {
     const std::vector<Operand> operands = {
         {
             .type = OperandType::TENSOR_FLOAT32,
@@ -103,6 +103,15 @@
             .location = {.poolIndex = 0, .offset = 68, .length = 4},
         },
         {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 72, .length = 1},
+        },
+        {
             .type = OperandType::TENSOR_FLOAT32,
             .dimensions = {1, 2, 2, 2},
             .numberOfConsumers = 0,
@@ -116,15 +125,15 @@
     const std::vector<Operation> operations = {
         {
             .type = OperationType::GROUPED_CONV_2D,
-            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
-            .outputs = {11},
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
         }
     };
 
     const std::vector<uint32_t> inputIndexes = {0};
-    const std::vector<uint32_t> outputIndexes = {11};
+    const std::vector<uint32_t> outputIndexes = {12};
     std::vector<uint8_t> operandValues = {
-      0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 128, 64, 0, 0, 64, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 32, 65, 0, 0, 12, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0
+      0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 128, 64, 0, 0, 64, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 32, 65, 0, 0, 6, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0
     };
     const std::vector<hidl_memory> pools = {};
 
@@ -138,13 +147,13 @@
     };
 }
 
-inline bool is_ignored(int i) {
+inline bool is_ignored_nhwc_none(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
 // Create the model
-Model createTestModel_weight_as_input() {
+Model createTestModel_nhwc_none_weight_as_input() {
     const std::vector<Operand> operands = {
         {
             .type = OperandType::TENSOR_FLOAT32,
@@ -246,6 +255,15 @@
             .location = {.poolIndex = 0, .offset = 28, .length = 4},
         },
         {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 1},
+        },
+        {
             .type = OperandType::TENSOR_FLOAT32,
             .dimensions = {1, 2, 2, 2},
             .numberOfConsumers = 0,
@@ -259,15 +277,15 @@
     const std::vector<Operation> operations = {
         {
             .type = OperationType::GROUPED_CONV_2D,
-            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
-            .outputs = {11},
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
         }
     };
 
     const std::vector<uint32_t> inputIndexes = {0, 1, 2};
-    const std::vector<uint32_t> outputIndexes = {11};
+    const std::vector<uint32_t> outputIndexes = {12};
     std::vector<uint8_t> operandValues = {
-      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0
     };
     const std::vector<hidl_memory> pools = {};
 
@@ -281,13 +299,13 @@
     };
 }
 
-inline bool is_ignored_weight_as_input(int i) {
+inline bool is_ignored_nhwc_none_weight_as_input(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
 // Create the model
-Model createTestModel_relaxed() {
+Model createTestModel_nhwc_none_relaxed() {
     const std::vector<Operand> operands = {
         {
             .type = OperandType::TENSOR_FLOAT32,
@@ -389,6 +407,15 @@
             .location = {.poolIndex = 0, .offset = 68, .length = 4},
         },
         {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 72, .length = 1},
+        },
+        {
             .type = OperandType::TENSOR_FLOAT32,
             .dimensions = {1, 2, 2, 2},
             .numberOfConsumers = 0,
@@ -402,15 +429,15 @@
     const std::vector<Operation> operations = {
         {
             .type = OperationType::GROUPED_CONV_2D,
-            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
-            .outputs = {11},
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
         }
     };
 
     const std::vector<uint32_t> inputIndexes = {0};
-    const std::vector<uint32_t> outputIndexes = {11};
+    const std::vector<uint32_t> outputIndexes = {12};
     std::vector<uint8_t> operandValues = {
-      0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 128, 64, 0, 0, 64, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 32, 65, 0, 0, 12, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0
+      0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 128, 64, 0, 0, 64, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 32, 65, 0, 0, 6, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0
     };
     const std::vector<hidl_memory> pools = {};
 
@@ -425,13 +452,13 @@
     };
 }
 
-inline bool is_ignored_relaxed(int i) {
+inline bool is_ignored_nhwc_none_relaxed(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
 // Create the model
-Model createTestModel_relaxed_weight_as_input() {
+Model createTestModel_nhwc_none_relaxed_weight_as_input() {
     const std::vector<Operand> operands = {
         {
             .type = OperandType::TENSOR_FLOAT32,
@@ -533,6 +560,15 @@
             .location = {.poolIndex = 0, .offset = 28, .length = 4},
         },
         {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 1},
+        },
+        {
             .type = OperandType::TENSOR_FLOAT32,
             .dimensions = {1, 2, 2, 2},
             .numberOfConsumers = 0,
@@ -546,15 +582,15 @@
     const std::vector<Operation> operations = {
         {
             .type = OperationType::GROUPED_CONV_2D,
-            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
-            .outputs = {11},
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
         }
     };
 
     const std::vector<uint32_t> inputIndexes = {0, 1, 2};
-    const std::vector<uint32_t> outputIndexes = {11};
+    const std::vector<uint32_t> outputIndexes = {12};
     std::vector<uint8_t> operandValues = {
-      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0
     };
     const std::vector<hidl_memory> pools = {};
 
@@ -569,13 +605,13 @@
     };
 }
 
-inline bool is_ignored_relaxed_weight_as_input(int i) {
+inline bool is_ignored_nhwc_none_relaxed_weight_as_input(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
 // Create the model
-Model createTestModel_quant8() {
+Model createTestModel_nhwc_none_quant8() {
     const std::vector<Operand> operands = {
         {
             .type = OperandType::TENSOR_QUANT8_ASYMM,
@@ -677,6 +713,15 @@
             .location = {.poolIndex = 0, .offset = 44, .length = 4},
         },
         {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 48, .length = 1},
+        },
+        {
             .type = OperandType::TENSOR_QUANT8_ASYMM,
             .dimensions = {1, 2, 2, 2},
             .numberOfConsumers = 0,
@@ -690,15 +735,15 @@
     const std::vector<Operation> operations = {
         {
             .type = OperationType::GROUPED_CONV_2D,
-            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
-            .outputs = {11},
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
         }
     };
 
     const std::vector<uint32_t> inputIndexes = {0};
-    const std::vector<uint32_t> outputIndexes = {11};
+    const std::vector<uint32_t> outputIndexes = {12};
     std::vector<uint8_t> operandValues = {
-      132, 136, 136, 132, 144, 140, 136, 132, 160, 0, 0, 0, 208, 253, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0
+      132, 136, 136, 132, 144, 140, 136, 132, 160, 0, 0, 0, 232, 253, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0
     };
     const std::vector<hidl_memory> pools = {};
 
@@ -712,13 +757,13 @@
     };
 }
 
-inline bool is_ignored_quant8(int i) {
+inline bool is_ignored_nhwc_none_quant8(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
 // Create the model
-Model createTestModel_quant8_weight_as_input() {
+Model createTestModel_nhwc_none_quant8_weight_as_input() {
     const std::vector<Operand> operands = {
         {
             .type = OperandType::TENSOR_QUANT8_ASYMM,
@@ -820,6 +865,15 @@
             .location = {.poolIndex = 0, .offset = 28, .length = 4},
         },
         {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 1},
+        },
+        {
             .type = OperandType::TENSOR_QUANT8_ASYMM,
             .dimensions = {1, 2, 2, 2},
             .numberOfConsumers = 0,
@@ -833,15 +887,15 @@
     const std::vector<Operation> operations = {
         {
             .type = OperationType::GROUPED_CONV_2D,
-            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
-            .outputs = {11},
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
         }
     };
 
     const std::vector<uint32_t> inputIndexes = {0, 1, 2};
-    const std::vector<uint32_t> outputIndexes = {11};
+    const std::vector<uint32_t> outputIndexes = {12};
     std::vector<uint8_t> operandValues = {
-      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0
     };
     const std::vector<hidl_memory> pools = {};
 
@@ -855,13 +909,6411 @@
     };
 }
 
-inline bool is_ignored_quant8_weight_as_input(int i) {
+inline bool is_ignored_nhwc_none_quant8_weight_as_input(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
 // Create the model
-Model createTestModel_large() {
+Model createTestModel_nhwc_relu() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 3, 3, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 32},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 8},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 40, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 44, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 48, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 52, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 56, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 60, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 64, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 68, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 72, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 128, 64, 0, 0, 64, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 32, 65, 0, 0, 6, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_nhwc_relu(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nhwc_relu_weight_as_input() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 3, 3, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 4, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 12, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0, 1, 2};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_nhwc_relu_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nhwc_relu_relaxed() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 3, 3, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 32},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 8},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 40, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 44, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 48, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 52, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 56, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 60, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 64, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 68, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 72, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 128, 64, 0, 0, 64, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 32, 65, 0, 0, 6, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+        .relaxComputationFloat32toFloat16 = true,
+    };
+}
+
+inline bool is_ignored_nhwc_relu_relaxed(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nhwc_relu_relaxed_weight_as_input() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 3, 3, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 4, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 12, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0, 1, 2};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+        .relaxComputationFloat32toFloat16 = true,
+    };
+}
+
+inline bool is_ignored_nhwc_relu_relaxed_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nhwc_relu_quant8() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 3, 3, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.25f,
+            .zeroPoint = 100,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 1,
+            .scale = 0.25f,
+            .zeroPoint = 128,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 8},
+        },
+        {
+            .type = OperandType::TENSOR_INT32,
+            .dimensions = {2},
+            .numberOfConsumers = 1,
+            .scale = 0.0625f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 8},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 36, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 40, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 44, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 48, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.5f,
+            .zeroPoint = 80,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      132, 136, 136, 132, 144, 140, 136, 132, 160, 0, 0, 0, 232, 253, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_nhwc_relu_quant8(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nhwc_relu_quant8_weight_as_input() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 3, 3, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.25f,
+            .zeroPoint = 100,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 0,
+            .scale = 0.25f,
+            .zeroPoint = 128,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_INT32,
+            .dimensions = {2},
+            .numberOfConsumers = 0,
+            .scale = 0.0625f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 4, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 12, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.5f,
+            .zeroPoint = 80,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0, 1, 2};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_nhwc_relu_quant8_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nhwc_relu1() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 3, 3, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 32},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 8},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 40, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 44, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 48, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 52, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 56, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 60, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 64, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 68, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 72, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 128, 64, 0, 0, 64, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 32, 65, 0, 0, 6, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_nhwc_relu1(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nhwc_relu1_weight_as_input() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 3, 3, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 4, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 12, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0, 1, 2};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_nhwc_relu1_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nhwc_relu1_relaxed() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 3, 3, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 32},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 8},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 40, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 44, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 48, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 52, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 56, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 60, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 64, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 68, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 72, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 128, 64, 0, 0, 64, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 32, 65, 0, 0, 6, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+        .relaxComputationFloat32toFloat16 = true,
+    };
+}
+
+inline bool is_ignored_nhwc_relu1_relaxed(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nhwc_relu1_relaxed_weight_as_input() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 3, 3, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 4, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 12, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0, 1, 2};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+        .relaxComputationFloat32toFloat16 = true,
+    };
+}
+
+inline bool is_ignored_nhwc_relu1_relaxed_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nhwc_relu1_quant8() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 3, 3, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.25f,
+            .zeroPoint = 100,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 1,
+            .scale = 0.25f,
+            .zeroPoint = 128,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 8},
+        },
+        {
+            .type = OperandType::TENSOR_INT32,
+            .dimensions = {2},
+            .numberOfConsumers = 1,
+            .scale = 0.0625f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 8},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 36, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 40, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 44, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 48, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.5f,
+            .zeroPoint = 80,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      132, 136, 136, 132, 144, 140, 136, 132, 160, 0, 0, 0, 232, 253, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_nhwc_relu1_quant8(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nhwc_relu1_quant8_weight_as_input() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 3, 3, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.25f,
+            .zeroPoint = 100,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 0,
+            .scale = 0.25f,
+            .zeroPoint = 128,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_INT32,
+            .dimensions = {2},
+            .numberOfConsumers = 0,
+            .scale = 0.0625f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 4, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 12, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.5f,
+            .zeroPoint = 80,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0, 1, 2};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_nhwc_relu1_quant8_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nhwc_relu6() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 3, 3, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 32},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 8},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 40, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 44, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 48, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 52, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 56, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 60, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 64, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 68, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 72, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 128, 64, 0, 0, 64, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 32, 65, 0, 0, 6, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_nhwc_relu6(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nhwc_relu6_weight_as_input() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 3, 3, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 4, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 12, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0, 1, 2};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_nhwc_relu6_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nhwc_relu6_relaxed() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 3, 3, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 32},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 8},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 40, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 44, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 48, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 52, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 56, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 60, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 64, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 68, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 72, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 128, 64, 0, 0, 64, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 32, 65, 0, 0, 6, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+        .relaxComputationFloat32toFloat16 = true,
+    };
+}
+
+inline bool is_ignored_nhwc_relu6_relaxed(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nhwc_relu6_relaxed_weight_as_input() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 3, 3, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 4, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 12, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0, 1, 2};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+        .relaxComputationFloat32toFloat16 = true,
+    };
+}
+
+inline bool is_ignored_nhwc_relu6_relaxed_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nhwc_relu6_quant8() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 3, 3, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.25f,
+            .zeroPoint = 100,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 1,
+            .scale = 0.25f,
+            .zeroPoint = 128,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 8},
+        },
+        {
+            .type = OperandType::TENSOR_INT32,
+            .dimensions = {2},
+            .numberOfConsumers = 1,
+            .scale = 0.0625f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 8},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 36, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 40, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 44, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 48, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.5f,
+            .zeroPoint = 80,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      132, 136, 136, 132, 144, 140, 136, 132, 160, 0, 0, 0, 232, 253, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_nhwc_relu6_quant8(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nhwc_relu6_quant8_weight_as_input() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 3, 3, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.25f,
+            .zeroPoint = 100,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 0,
+            .scale = 0.25f,
+            .zeroPoint = 128,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_INT32,
+            .dimensions = {2},
+            .numberOfConsumers = 0,
+            .scale = 0.0625f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 4, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 12, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.5f,
+            .zeroPoint = 80,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0, 1, 2};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_nhwc_relu6_quant8_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nchw_none() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 3, 3},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 32},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 8},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 40, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 44, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 48, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 52, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 56, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 60, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 64, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 68, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 72, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 128, 64, 0, 0, 64, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 32, 65, 0, 0, 6, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_nchw_none(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nchw_none_weight_as_input() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 3, 3},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 4, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 12, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0, 1, 2};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_nchw_none_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nchw_none_relaxed() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 3, 3},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 32},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 8},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 40, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 44, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 48, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 52, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 56, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 60, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 64, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 68, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 72, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 128, 64, 0, 0, 64, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 32, 65, 0, 0, 6, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+        .relaxComputationFloat32toFloat16 = true,
+    };
+}
+
+inline bool is_ignored_nchw_none_relaxed(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nchw_none_relaxed_weight_as_input() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 3, 3},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 4, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 12, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0, 1, 2};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+        .relaxComputationFloat32toFloat16 = true,
+    };
+}
+
+inline bool is_ignored_nchw_none_relaxed_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nchw_none_quant8() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 2, 3, 3},
+            .numberOfConsumers = 1,
+            .scale = 0.25f,
+            .zeroPoint = 100,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 1,
+            .scale = 0.25f,
+            .zeroPoint = 128,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 8},
+        },
+        {
+            .type = OperandType::TENSOR_INT32,
+            .dimensions = {2},
+            .numberOfConsumers = 1,
+            .scale = 0.0625f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 8},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 36, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 40, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 44, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 48, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.5f,
+            .zeroPoint = 80,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      132, 136, 136, 132, 144, 140, 136, 132, 160, 0, 0, 0, 232, 253, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_nchw_none_quant8(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nchw_none_quant8_weight_as_input() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 2, 3, 3},
+            .numberOfConsumers = 1,
+            .scale = 0.25f,
+            .zeroPoint = 100,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 0,
+            .scale = 0.25f,
+            .zeroPoint = 128,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_INT32,
+            .dimensions = {2},
+            .numberOfConsumers = 0,
+            .scale = 0.0625f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 4, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 12, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.5f,
+            .zeroPoint = 80,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0, 1, 2};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_nchw_none_quant8_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nchw_relu() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 3, 3},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 32},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 8},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 40, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 44, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 48, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 52, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 56, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 60, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 64, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 68, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 72, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 128, 64, 0, 0, 64, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 32, 65, 0, 0, 6, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_nchw_relu(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nchw_relu_weight_as_input() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 3, 3},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 4, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 12, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0, 1, 2};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_nchw_relu_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nchw_relu_relaxed() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 3, 3},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 32},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 8},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 40, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 44, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 48, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 52, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 56, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 60, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 64, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 68, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 72, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 128, 64, 0, 0, 64, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 32, 65, 0, 0, 6, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+        .relaxComputationFloat32toFloat16 = true,
+    };
+}
+
+inline bool is_ignored_nchw_relu_relaxed(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nchw_relu_relaxed_weight_as_input() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 3, 3},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 4, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 12, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0, 1, 2};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+        .relaxComputationFloat32toFloat16 = true,
+    };
+}
+
+inline bool is_ignored_nchw_relu_relaxed_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nchw_relu_quant8() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 2, 3, 3},
+            .numberOfConsumers = 1,
+            .scale = 0.25f,
+            .zeroPoint = 100,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 1,
+            .scale = 0.25f,
+            .zeroPoint = 128,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 8},
+        },
+        {
+            .type = OperandType::TENSOR_INT32,
+            .dimensions = {2},
+            .numberOfConsumers = 1,
+            .scale = 0.0625f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 8},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 36, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 40, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 44, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 48, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.5f,
+            .zeroPoint = 80,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      132, 136, 136, 132, 144, 140, 136, 132, 160, 0, 0, 0, 232, 253, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_nchw_relu_quant8(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nchw_relu_quant8_weight_as_input() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 2, 3, 3},
+            .numberOfConsumers = 1,
+            .scale = 0.25f,
+            .zeroPoint = 100,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 0,
+            .scale = 0.25f,
+            .zeroPoint = 128,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_INT32,
+            .dimensions = {2},
+            .numberOfConsumers = 0,
+            .scale = 0.0625f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 4, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 12, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.5f,
+            .zeroPoint = 80,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0, 1, 2};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_nchw_relu_quant8_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nchw_relu1() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 3, 3},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 32},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 8},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 40, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 44, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 48, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 52, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 56, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 60, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 64, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 68, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 72, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 128, 64, 0, 0, 64, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 32, 65, 0, 0, 6, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_nchw_relu1(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nchw_relu1_weight_as_input() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 3, 3},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 4, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 12, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0, 1, 2};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_nchw_relu1_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nchw_relu1_relaxed() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 3, 3},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 32},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 8},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 40, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 44, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 48, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 52, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 56, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 60, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 64, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 68, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 72, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 128, 64, 0, 0, 64, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 32, 65, 0, 0, 6, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+        .relaxComputationFloat32toFloat16 = true,
+    };
+}
+
+inline bool is_ignored_nchw_relu1_relaxed(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nchw_relu1_relaxed_weight_as_input() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 3, 3},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 4, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 12, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0, 1, 2};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+        .relaxComputationFloat32toFloat16 = true,
+    };
+}
+
+inline bool is_ignored_nchw_relu1_relaxed_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nchw_relu1_quant8() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 2, 3, 3},
+            .numberOfConsumers = 1,
+            .scale = 0.25f,
+            .zeroPoint = 100,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 1,
+            .scale = 0.25f,
+            .zeroPoint = 128,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 8},
+        },
+        {
+            .type = OperandType::TENSOR_INT32,
+            .dimensions = {2},
+            .numberOfConsumers = 1,
+            .scale = 0.0625f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 8},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 36, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 40, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 44, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 48, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.5f,
+            .zeroPoint = 80,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      132, 136, 136, 132, 144, 140, 136, 132, 160, 0, 0, 0, 232, 253, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_nchw_relu1_quant8(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nchw_relu1_quant8_weight_as_input() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 2, 3, 3},
+            .numberOfConsumers = 1,
+            .scale = 0.25f,
+            .zeroPoint = 100,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 0,
+            .scale = 0.25f,
+            .zeroPoint = 128,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_INT32,
+            .dimensions = {2},
+            .numberOfConsumers = 0,
+            .scale = 0.0625f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 4, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 12, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.5f,
+            .zeroPoint = 80,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0, 1, 2};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_nchw_relu1_quant8_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nchw_relu6() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 3, 3},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 32},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 8},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 40, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 44, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 48, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 52, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 56, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 60, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 64, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 68, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 72, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 128, 64, 0, 0, 64, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 32, 65, 0, 0, 6, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_nchw_relu6(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nchw_relu6_weight_as_input() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 3, 3},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 4, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 12, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0, 1, 2};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_nchw_relu6_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nchw_relu6_relaxed() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 3, 3},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 32},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 8},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 40, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 44, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 48, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 52, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 56, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 60, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 64, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 68, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 72, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 128, 64, 0, 0, 64, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 32, 65, 0, 0, 6, 194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+        .relaxComputationFloat32toFloat16 = true,
+    };
+}
+
+inline bool is_ignored_nchw_relu6_relaxed(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nchw_relu6_relaxed_weight_as_input() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 3, 3},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 4, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 12, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0, 1, 2};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+        .relaxComputationFloat32toFloat16 = true,
+    };
+}
+
+inline bool is_ignored_nchw_relu6_relaxed_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nchw_relu6_quant8() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 2, 3, 3},
+            .numberOfConsumers = 1,
+            .scale = 0.25f,
+            .zeroPoint = 100,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 1,
+            .scale = 0.25f,
+            .zeroPoint = 128,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 8},
+        },
+        {
+            .type = OperandType::TENSOR_INT32,
+            .dimensions = {2},
+            .numberOfConsumers = 1,
+            .scale = 0.0625f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 8},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 36, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 40, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 44, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 48, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.5f,
+            .zeroPoint = 80,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      132, 136, 136, 132, 144, 140, 136, 132, 160, 0, 0, 0, 232, 253, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_nchw_relu6_quant8(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_nchw_relu6_quant8_weight_as_input() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 2, 3, 3},
+            .numberOfConsumers = 1,
+            .scale = 0.25f,
+            .zeroPoint = 100,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {2, 2, 2, 1},
+            .numberOfConsumers = 0,
+            .scale = 0.25f,
+            .zeroPoint = 128,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_INT32,
+            .dimensions = {2},
+            .numberOfConsumers = 0,
+            .scale = 0.0625f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 4, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 12, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 2, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.5f,
+            .zeroPoint = 80,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11},
+            .outputs = {12},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0, 1, 2};
+    const std::vector<uint32_t> outputIndexes = {12};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_nchw_relu6_quant8_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_large_nhwc() {
     const std::vector<Operand> operands = {
         {
             .type = OperandType::TENSOR_FLOAT32,
@@ -936,6 +7388,15 @@
             .location = {.poolIndex = 0, .offset = 72, .length = 4},
         },
         {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 76, .length = 1},
+        },
+        {
             .type = OperandType::TENSOR_FLOAT32,
             .dimensions = {1, 3, 2, 2},
             .numberOfConsumers = 0,
@@ -949,15 +7410,15 @@
     const std::vector<Operation> operations = {
         {
             .type = OperationType::GROUPED_CONV_2D,
-            .inputs = {0, 1, 2, 3, 4, 5, 6, 7},
-            .outputs = {8},
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8},
+            .outputs = {9},
         }
     };
 
     const std::vector<uint32_t> inputIndexes = {0};
-    const std::vector<uint32_t> outputIndexes = {8};
+    const std::vector<uint32_t> outputIndexes = {9};
     std::vector<uint8_t> operandValues = {
-      0, 0, 200, 66, 0, 0, 160, 65, 0, 0, 128, 63, 0, 0, 72, 67, 0, 0, 32, 65, 0, 0, 0, 64, 0, 0, 72, 67, 0, 0, 240, 65, 0, 0, 128, 63, 0, 0, 200, 66, 0, 0, 160, 65, 0, 0, 64, 64, 0, 0, 250, 67, 0, 0, 122, 196, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0
+      0, 0, 200, 66, 0, 0, 160, 65, 0, 0, 128, 63, 0, 0, 72, 67, 0, 0, 32, 65, 0, 0, 0, 64, 0, 0, 72, 67, 0, 0, 240, 65, 0, 0, 128, 63, 0, 0, 200, 66, 0, 0, 160, 65, 0, 0, 64, 64, 0, 0, 250, 67, 0, 0, 122, 196, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0
     };
     const std::vector<hidl_memory> pools = {};
 
@@ -971,13 +7432,13 @@
     };
 }
 
-inline bool is_ignored_large(int i) {
+inline bool is_ignored_large_nhwc(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
 // Create the model
-Model createTestModel_large_weight_as_input() {
+Model createTestModel_large_nhwc_weight_as_input() {
     const std::vector<Operand> operands = {
         {
             .type = OperandType::TENSOR_FLOAT32,
@@ -1052,6 +7513,15 @@
             .location = {.poolIndex = 0, .offset = 16, .length = 4},
         },
         {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 1},
+        },
+        {
             .type = OperandType::TENSOR_FLOAT32,
             .dimensions = {1, 3, 2, 2},
             .numberOfConsumers = 0,
@@ -1065,15 +7535,15 @@
     const std::vector<Operation> operations = {
         {
             .type = OperationType::GROUPED_CONV_2D,
-            .inputs = {0, 1, 2, 3, 4, 5, 6, 7},
-            .outputs = {8},
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8},
+            .outputs = {9},
         }
     };
 
     const std::vector<uint32_t> inputIndexes = {0, 1, 2};
-    const std::vector<uint32_t> outputIndexes = {8};
+    const std::vector<uint32_t> outputIndexes = {9};
     std::vector<uint8_t> operandValues = {
-      1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0
+      1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0
     };
     const std::vector<hidl_memory> pools = {};
 
@@ -1087,13 +7557,13 @@
     };
 }
 
-inline bool is_ignored_large_weight_as_input(int i) {
+inline bool is_ignored_large_nhwc_weight_as_input(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
 // Create the model
-Model createTestModel_large_relaxed() {
+Model createTestModel_large_nhwc_relaxed() {
     const std::vector<Operand> operands = {
         {
             .type = OperandType::TENSOR_FLOAT32,
@@ -1168,6 +7638,15 @@
             .location = {.poolIndex = 0, .offset = 72, .length = 4},
         },
         {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 76, .length = 1},
+        },
+        {
             .type = OperandType::TENSOR_FLOAT32,
             .dimensions = {1, 3, 2, 2},
             .numberOfConsumers = 0,
@@ -1181,15 +7660,15 @@
     const std::vector<Operation> operations = {
         {
             .type = OperationType::GROUPED_CONV_2D,
-            .inputs = {0, 1, 2, 3, 4, 5, 6, 7},
-            .outputs = {8},
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8},
+            .outputs = {9},
         }
     };
 
     const std::vector<uint32_t> inputIndexes = {0};
-    const std::vector<uint32_t> outputIndexes = {8};
+    const std::vector<uint32_t> outputIndexes = {9};
     std::vector<uint8_t> operandValues = {
-      0, 0, 200, 66, 0, 0, 160, 65, 0, 0, 128, 63, 0, 0, 72, 67, 0, 0, 32, 65, 0, 0, 0, 64, 0, 0, 72, 67, 0, 0, 240, 65, 0, 0, 128, 63, 0, 0, 200, 66, 0, 0, 160, 65, 0, 0, 64, 64, 0, 0, 250, 67, 0, 0, 122, 196, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0
+      0, 0, 200, 66, 0, 0, 160, 65, 0, 0, 128, 63, 0, 0, 72, 67, 0, 0, 32, 65, 0, 0, 0, 64, 0, 0, 72, 67, 0, 0, 240, 65, 0, 0, 128, 63, 0, 0, 200, 66, 0, 0, 160, 65, 0, 0, 64, 64, 0, 0, 250, 67, 0, 0, 122, 196, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0
     };
     const std::vector<hidl_memory> pools = {};
 
@@ -1204,13 +7683,13 @@
     };
 }
 
-inline bool is_ignored_large_relaxed(int i) {
+inline bool is_ignored_large_nhwc_relaxed(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
 // Create the model
-Model createTestModel_large_relaxed_weight_as_input() {
+Model createTestModel_large_nhwc_relaxed_weight_as_input() {
     const std::vector<Operand> operands = {
         {
             .type = OperandType::TENSOR_FLOAT32,
@@ -1285,6 +7764,15 @@
             .location = {.poolIndex = 0, .offset = 16, .length = 4},
         },
         {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 1},
+        },
+        {
             .type = OperandType::TENSOR_FLOAT32,
             .dimensions = {1, 3, 2, 2},
             .numberOfConsumers = 0,
@@ -1298,15 +7786,15 @@
     const std::vector<Operation> operations = {
         {
             .type = OperationType::GROUPED_CONV_2D,
-            .inputs = {0, 1, 2, 3, 4, 5, 6, 7},
-            .outputs = {8},
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8},
+            .outputs = {9},
         }
     };
 
     const std::vector<uint32_t> inputIndexes = {0, 1, 2};
-    const std::vector<uint32_t> outputIndexes = {8};
+    const std::vector<uint32_t> outputIndexes = {9};
     std::vector<uint8_t> operandValues = {
-      1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0
+      1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0
     };
     const std::vector<hidl_memory> pools = {};
 
@@ -1321,13 +7809,13 @@
     };
 }
 
-inline bool is_ignored_large_relaxed_weight_as_input(int i) {
+inline bool is_ignored_large_nhwc_relaxed_weight_as_input(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
 // Create the model
-Model createTestModel_large_quant8() {
+Model createTestModel_large_nhwc_quant8() {
     const std::vector<Operand> operands = {
         {
             .type = OperandType::TENSOR_QUANT8_ASYMM,
@@ -1402,6 +7890,15 @@
             .location = {.poolIndex = 0, .offset = 36, .length = 4},
         },
         {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 40, .length = 1},
+        },
+        {
             .type = OperandType::TENSOR_QUANT8_ASYMM,
             .dimensions = {1, 3, 2, 2},
             .numberOfConsumers = 0,
@@ -1415,15 +7912,15 @@
     const std::vector<Operation> operations = {
         {
             .type = OperationType::GROUPED_CONV_2D,
-            .inputs = {0, 1, 2, 3, 4, 5, 6, 7},
-            .outputs = {8},
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8},
+            .outputs = {9},
         }
     };
 
     const std::vector<uint32_t> inputIndexes = {0};
-    const std::vector<uint32_t> outputIndexes = {8};
+    const std::vector<uint32_t> outputIndexes = {9};
     std::vector<uint8_t> operandValues = {
-      100, 20, 1, 200, 10, 2, 200, 30, 1, 100, 20, 3, 208, 7, 0, 0, 96, 240, 255, 255, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0
+      100, 20, 1, 200, 10, 2, 200, 30, 1, 100, 20, 3, 208, 7, 0, 0, 96, 240, 255, 255, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0
     };
     const std::vector<hidl_memory> pools = {};
 
@@ -1437,13 +7934,13 @@
     };
 }
 
-inline bool is_ignored_large_quant8(int i) {
+inline bool is_ignored_large_nhwc_quant8(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
 // Create the model
-Model createTestModel_large_quant8_weight_as_input() {
+Model createTestModel_large_nhwc_quant8_weight_as_input() {
     const std::vector<Operand> operands = {
         {
             .type = OperandType::TENSOR_QUANT8_ASYMM,
@@ -1518,6 +8015,15 @@
             .location = {.poolIndex = 0, .offset = 16, .length = 4},
         },
         {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 1},
+        },
+        {
             .type = OperandType::TENSOR_QUANT8_ASYMM,
             .dimensions = {1, 3, 2, 2},
             .numberOfConsumers = 0,
@@ -1531,15 +8037,15 @@
     const std::vector<Operation> operations = {
         {
             .type = OperationType::GROUPED_CONV_2D,
-            .inputs = {0, 1, 2, 3, 4, 5, 6, 7},
-            .outputs = {8},
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8},
+            .outputs = {9},
         }
     };
 
     const std::vector<uint32_t> inputIndexes = {0, 1, 2};
-    const std::vector<uint32_t> outputIndexes = {8};
+    const std::vector<uint32_t> outputIndexes = {9};
     std::vector<uint8_t> operandValues = {
-      1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0
+      1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0
     };
     const std::vector<hidl_memory> pools = {};
 
@@ -1553,13 +8059,765 @@
     };
 }
 
-inline bool is_ignored_large_quant8_weight_as_input(int i) {
+inline bool is_ignored_large_nhwc_quant8_weight_as_input(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
 // Create the model
-Model createTestModel_channel() {
+Model createTestModel_large_nchw() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 3, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 3, 1},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 48},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 48, .length = 8},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 56, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 60, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 64, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 68, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 72, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 76, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 3, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8},
+            .outputs = {9},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0};
+    const std::vector<uint32_t> outputIndexes = {9};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 200, 66, 0, 0, 160, 65, 0, 0, 128, 63, 0, 0, 72, 67, 0, 0, 32, 65, 0, 0, 0, 64, 0, 0, 72, 67, 0, 0, 240, 65, 0, 0, 128, 63, 0, 0, 200, 66, 0, 0, 160, 65, 0, 0, 64, 64, 0, 0, 250, 67, 0, 0, 122, 196, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_large_nchw(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_large_nchw_weight_as_input() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 3, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 3, 1},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 4, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 12, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 3, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8},
+            .outputs = {9},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0, 1, 2};
+    const std::vector<uint32_t> outputIndexes = {9};
+    std::vector<uint8_t> operandValues = {
+      1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_large_nchw_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_large_nchw_relaxed() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 3, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 3, 1},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 48},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 48, .length = 8},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 56, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 60, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 64, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 68, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 72, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 76, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 3, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8},
+            .outputs = {9},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0};
+    const std::vector<uint32_t> outputIndexes = {9};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 200, 66, 0, 0, 160, 65, 0, 0, 128, 63, 0, 0, 72, 67, 0, 0, 32, 65, 0, 0, 0, 64, 0, 0, 72, 67, 0, 0, 240, 65, 0, 0, 128, 63, 0, 0, 200, 66, 0, 0, 160, 65, 0, 0, 64, 64, 0, 0, 250, 67, 0, 0, 122, 196, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+        .relaxComputationFloat32toFloat16 = true,
+    };
+}
+
+inline bool is_ignored_large_nchw_relaxed(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_large_nchw_relaxed_weight_as_input() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 3, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2, 2, 3, 1},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 4, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 12, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 2, 3, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8},
+            .outputs = {9},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0, 1, 2};
+    const std::vector<uint32_t> outputIndexes = {9};
+    std::vector<uint8_t> operandValues = {
+      1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+        .relaxComputationFloat32toFloat16 = true,
+    };
+}
+
+inline bool is_ignored_large_nchw_relaxed_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_large_nchw_quant8() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 2, 3, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.25f,
+            .zeroPoint = 128,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {2, 2, 3, 1},
+            .numberOfConsumers = 1,
+            .scale = 1.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 12},
+        },
+        {
+            .type = OperandType::TENSOR_INT32,
+            .dimensions = {2},
+            .numberOfConsumers = 1,
+            .scale = 0.25f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 12, .length = 8},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 24, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 28, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 32, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 36, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 40, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 2, 3, 2},
+            .numberOfConsumers = 0,
+            .scale = 10.0f,
+            .zeroPoint = 100,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8},
+            .outputs = {9},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0};
+    const std::vector<uint32_t> outputIndexes = {9};
+    std::vector<uint8_t> operandValues = {
+      100, 20, 1, 200, 10, 2, 200, 30, 1, 100, 20, 3, 208, 7, 0, 0, 96, 240, 255, 255, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_large_nchw_quant8(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_large_nchw_quant8_weight_as_input() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 2, 3, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.25f,
+            .zeroPoint = 128,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {2, 2, 3, 1},
+            .numberOfConsumers = 0,
+            .scale = 1.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_INT32,
+            .dimensions = {2},
+            .numberOfConsumers = 0,
+            .scale = 0.25f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 4, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 12, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 2, 3, 2},
+            .numberOfConsumers = 0,
+            .scale = 10.0f,
+            .zeroPoint = 100,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8},
+            .outputs = {9},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0, 1, 2};
+    const std::vector<uint32_t> outputIndexes = {9};
+    std::vector<uint8_t> operandValues = {
+      1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_large_nchw_quant8_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_channel_nhwc() {
     const std::vector<Operand> operands = {
         {
             .type = OperandType::TENSOR_FLOAT32,
@@ -1634,6 +8892,15 @@
             .location = {.poolIndex = 0, .offset = 112, .length = 4},
         },
         {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 116, .length = 1},
+        },
+        {
             .type = OperandType::TENSOR_FLOAT32,
             .dimensions = {1, 2, 2, 6},
             .numberOfConsumers = 0,
@@ -1647,15 +8914,15 @@
     const std::vector<Operation> operations = {
         {
             .type = OperationType::GROUPED_CONV_2D,
-            .inputs = {0, 1, 2, 3, 4, 5, 6, 7},
-            .outputs = {8},
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8},
+            .outputs = {9},
         }
     };
 
     const std::vector<uint32_t> inputIndexes = {0};
-    const std::vector<uint32_t> outputIndexes = {8};
+    const std::vector<uint32_t> outputIndexes = {9};
     std::vector<uint8_t> operandValues = {
-      0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 64, 64, 0, 0, 192, 64, 0, 0, 192, 64, 0, 0, 192, 64, 0, 0, 16, 65, 0, 0, 0, 65, 0, 0, 160, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 32, 65, 0, 0, 160, 193, 0, 0, 240, 65, 0, 0, 32, 194, 0, 0, 72, 66, 0, 0, 112, 194, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0
+      0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 64, 64, 0, 0, 192, 64, 0, 0, 192, 64, 0, 0, 192, 64, 0, 0, 16, 65, 0, 0, 0, 65, 0, 0, 160, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 32, 65, 0, 0, 160, 193, 0, 0, 240, 65, 0, 0, 32, 194, 0, 0, 72, 66, 0, 0, 112, 194, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0
     };
     const std::vector<hidl_memory> pools = {};
 
@@ -1669,13 +8936,13 @@
     };
 }
 
-inline bool is_ignored_channel(int i) {
+inline bool is_ignored_channel_nhwc(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
 // Create the model
-Model createTestModel_channel_weight_as_input() {
+Model createTestModel_channel_nhwc_weight_as_input() {
     const std::vector<Operand> operands = {
         {
             .type = OperandType::TENSOR_FLOAT32,
@@ -1750,6 +9017,15 @@
             .location = {.poolIndex = 0, .offset = 16, .length = 4},
         },
         {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 1},
+        },
+        {
             .type = OperandType::TENSOR_FLOAT32,
             .dimensions = {1, 2, 2, 6},
             .numberOfConsumers = 0,
@@ -1763,15 +9039,15 @@
     const std::vector<Operation> operations = {
         {
             .type = OperationType::GROUPED_CONV_2D,
-            .inputs = {0, 1, 2, 3, 4, 5, 6, 7},
-            .outputs = {8},
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8},
+            .outputs = {9},
         }
     };
 
     const std::vector<uint32_t> inputIndexes = {0, 1, 2};
-    const std::vector<uint32_t> outputIndexes = {8};
+    const std::vector<uint32_t> outputIndexes = {9};
     std::vector<uint8_t> operandValues = {
-      1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0
+      1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0
     };
     const std::vector<hidl_memory> pools = {};
 
@@ -1785,13 +9061,13 @@
     };
 }
 
-inline bool is_ignored_channel_weight_as_input(int i) {
+inline bool is_ignored_channel_nhwc_weight_as_input(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
 // Create the model
-Model createTestModel_channel_relaxed() {
+Model createTestModel_channel_nhwc_relaxed() {
     const std::vector<Operand> operands = {
         {
             .type = OperandType::TENSOR_FLOAT32,
@@ -1866,6 +9142,15 @@
             .location = {.poolIndex = 0, .offset = 112, .length = 4},
         },
         {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 116, .length = 1},
+        },
+        {
             .type = OperandType::TENSOR_FLOAT32,
             .dimensions = {1, 2, 2, 6},
             .numberOfConsumers = 0,
@@ -1879,15 +9164,15 @@
     const std::vector<Operation> operations = {
         {
             .type = OperationType::GROUPED_CONV_2D,
-            .inputs = {0, 1, 2, 3, 4, 5, 6, 7},
-            .outputs = {8},
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8},
+            .outputs = {9},
         }
     };
 
     const std::vector<uint32_t> inputIndexes = {0};
-    const std::vector<uint32_t> outputIndexes = {8};
+    const std::vector<uint32_t> outputIndexes = {9};
     std::vector<uint8_t> operandValues = {
-      0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 64, 64, 0, 0, 192, 64, 0, 0, 192, 64, 0, 0, 192, 64, 0, 0, 16, 65, 0, 0, 0, 65, 0, 0, 160, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 32, 65, 0, 0, 160, 193, 0, 0, 240, 65, 0, 0, 32, 194, 0, 0, 72, 66, 0, 0, 112, 194, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0
+      0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 64, 64, 0, 0, 192, 64, 0, 0, 192, 64, 0, 0, 192, 64, 0, 0, 16, 65, 0, 0, 0, 65, 0, 0, 160, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 32, 65, 0, 0, 160, 193, 0, 0, 240, 65, 0, 0, 32, 194, 0, 0, 72, 66, 0, 0, 112, 194, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0
     };
     const std::vector<hidl_memory> pools = {};
 
@@ -1902,13 +9187,13 @@
     };
 }
 
-inline bool is_ignored_channel_relaxed(int i) {
+inline bool is_ignored_channel_nhwc_relaxed(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
 // Create the model
-Model createTestModel_channel_relaxed_weight_as_input() {
+Model createTestModel_channel_nhwc_relaxed_weight_as_input() {
     const std::vector<Operand> operands = {
         {
             .type = OperandType::TENSOR_FLOAT32,
@@ -1983,6 +9268,15 @@
             .location = {.poolIndex = 0, .offset = 16, .length = 4},
         },
         {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 1},
+        },
+        {
             .type = OperandType::TENSOR_FLOAT32,
             .dimensions = {1, 2, 2, 6},
             .numberOfConsumers = 0,
@@ -1996,15 +9290,15 @@
     const std::vector<Operation> operations = {
         {
             .type = OperationType::GROUPED_CONV_2D,
-            .inputs = {0, 1, 2, 3, 4, 5, 6, 7},
-            .outputs = {8},
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8},
+            .outputs = {9},
         }
     };
 
     const std::vector<uint32_t> inputIndexes = {0, 1, 2};
-    const std::vector<uint32_t> outputIndexes = {8};
+    const std::vector<uint32_t> outputIndexes = {9};
     std::vector<uint8_t> operandValues = {
-      1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0
+      1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0
     };
     const std::vector<hidl_memory> pools = {};
 
@@ -2019,13 +9313,13 @@
     };
 }
 
-inline bool is_ignored_channel_relaxed_weight_as_input(int i) {
+inline bool is_ignored_channel_nhwc_relaxed_weight_as_input(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
 // Create the model
-Model createTestModel_channel_quant8() {
+Model createTestModel_channel_nhwc_quant8() {
     const std::vector<Operand> operands = {
         {
             .type = OperandType::TENSOR_QUANT8_ASYMM,
@@ -2100,6 +9394,15 @@
             .location = {.poolIndex = 0, .offset = 58, .length = 4},
         },
         {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 62, .length = 1},
+        },
+        {
             .type = OperandType::TENSOR_QUANT8_ASYMM,
             .dimensions = {1, 2, 2, 6},
             .numberOfConsumers = 0,
@@ -2113,15 +9416,15 @@
     const std::vector<Operation> operations = {
         {
             .type = OperationType::GROUPED_CONV_2D,
-            .inputs = {0, 1, 2, 3, 4, 5, 6, 7},
-            .outputs = {8},
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8},
+            .outputs = {9},
         }
     };
 
     const std::vector<uint32_t> inputIndexes = {0};
-    const std::vector<uint32_t> outputIndexes = {8};
+    const std::vector<uint32_t> outputIndexes = {9};
     std::vector<uint8_t> operandValues = {
-      4, 8, 12, 8, 4, 0, 8, 12, 12, 24, 24, 24, 36, 32, 20, 8, 4, 4, 80, 0, 0, 0, 96, 255, 255, 255, 240, 0, 0, 0, 192, 254, 255, 255, 144, 1, 0, 0, 32, 254, 255, 255, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0
+      4, 8, 12, 8, 4, 0, 8, 12, 12, 24, 24, 24, 36, 32, 20, 8, 4, 4, 80, 0, 0, 0, 96, 255, 255, 255, 240, 0, 0, 0, 192, 254, 255, 255, 144, 1, 0, 0, 32, 254, 255, 255, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0
     };
     const std::vector<hidl_memory> pools = {};
 
@@ -2135,13 +9438,13 @@
     };
 }
 
-inline bool is_ignored_channel_quant8(int i) {
+inline bool is_ignored_channel_nhwc_quant8(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
 
 // Create the model
-Model createTestModel_channel_quant8_weight_as_input() {
+Model createTestModel_channel_nhwc_quant8_weight_as_input() {
     const std::vector<Operand> operands = {
         {
             .type = OperandType::TENSOR_QUANT8_ASYMM,
@@ -2216,6 +9519,15 @@
             .location = {.poolIndex = 0, .offset = 16, .length = 4},
         },
         {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 1},
+        },
+        {
             .type = OperandType::TENSOR_QUANT8_ASYMM,
             .dimensions = {1, 2, 2, 6},
             .numberOfConsumers = 0,
@@ -2229,15 +9541,15 @@
     const std::vector<Operation> operations = {
         {
             .type = OperationType::GROUPED_CONV_2D,
-            .inputs = {0, 1, 2, 3, 4, 5, 6, 7},
-            .outputs = {8},
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8},
+            .outputs = {9},
         }
     };
 
     const std::vector<uint32_t> inputIndexes = {0, 1, 2};
-    const std::vector<uint32_t> outputIndexes = {8};
+    const std::vector<uint32_t> outputIndexes = {9};
     std::vector<uint8_t> operandValues = {
-      1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0
+      1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0
     };
     const std::vector<hidl_memory> pools = {};
 
@@ -2251,7 +9563,759 @@
     };
 }
 
-inline bool is_ignored_channel_quant8_weight_as_input(int i) {
+inline bool is_ignored_channel_nhwc_quant8_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_channel_nchw() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 9, 2, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {6, 1, 1, 3},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 72},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {6},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 72, .length = 24},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 96, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 100, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 104, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 108, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 112, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 116, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 6, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8},
+            .outputs = {9},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0};
+    const std::vector<uint32_t> outputIndexes = {9};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 64, 64, 0, 0, 192, 64, 0, 0, 192, 64, 0, 0, 192, 64, 0, 0, 16, 65, 0, 0, 0, 65, 0, 0, 160, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 32, 65, 0, 0, 160, 193, 0, 0, 240, 65, 0, 0, 32, 194, 0, 0, 72, 66, 0, 0, 112, 194, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_channel_nchw(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_channel_nchw_weight_as_input() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 9, 2, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {6, 1, 1, 3},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {6},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 4, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 12, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 6, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8},
+            .outputs = {9},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0, 1, 2};
+    const std::vector<uint32_t> outputIndexes = {9};
+    std::vector<uint8_t> operandValues = {
+      1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_channel_nchw_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_channel_nchw_relaxed() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 9, 2, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {6, 1, 1, 3},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 72},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {6},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 72, .length = 24},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 96, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 100, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 104, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 108, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 112, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 116, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 6, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8},
+            .outputs = {9},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0};
+    const std::vector<uint32_t> outputIndexes = {9};
+    std::vector<uint8_t> operandValues = {
+      0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 64, 64, 0, 0, 192, 64, 0, 0, 192, 64, 0, 0, 192, 64, 0, 0, 16, 65, 0, 0, 0, 65, 0, 0, 160, 64, 0, 0, 0, 64, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 32, 65, 0, 0, 160, 193, 0, 0, 240, 65, 0, 0, 32, 194, 0, 0, 72, 66, 0, 0, 112, 194, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+        .relaxComputationFloat32toFloat16 = true,
+    };
+}
+
+inline bool is_ignored_channel_nchw_relaxed(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_channel_nchw_relaxed_weight_as_input() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 9, 2, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {6, 1, 1, 3},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {6},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 4, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 12, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_FLOAT32,
+            .dimensions = {1, 6, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8},
+            .outputs = {9},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0, 1, 2};
+    const std::vector<uint32_t> outputIndexes = {9};
+    std::vector<uint8_t> operandValues = {
+      1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+        .relaxComputationFloat32toFloat16 = true,
+    };
+}
+
+inline bool is_ignored_channel_nchw_relaxed_weight_as_input(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_channel_nchw_quant8() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 9, 2, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.5f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {6, 1, 1, 3},
+            .numberOfConsumers = 1,
+            .scale = 0.25f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 18},
+        },
+        {
+            .type = OperandType::TENSOR_INT32,
+            .dimensions = {6},
+            .numberOfConsumers = 1,
+            .scale = 0.125f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 18, .length = 24},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 42, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 46, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 50, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 54, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 58, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 62, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 6, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 2.0f,
+            .zeroPoint = 60,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8},
+            .outputs = {9},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0};
+    const std::vector<uint32_t> outputIndexes = {9};
+    std::vector<uint8_t> operandValues = {
+      4, 8, 12, 8, 4, 0, 8, 12, 12, 24, 24, 24, 36, 32, 20, 8, 4, 4, 80, 0, 0, 0, 96, 255, 255, 255, 240, 0, 0, 0, 192, 254, 255, 255, 144, 1, 0, 0, 32, 254, 255, 255, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_channel_nchw_quant8(int i) {
+  static std::set<int> ignore = {};
+  return ignore.find(i) != ignore.end();
+}
+
+// Create the model
+Model createTestModel_channel_nchw_quant8_weight_as_input() {
+    const std::vector<Operand> operands = {
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 9, 2, 2},
+            .numberOfConsumers = 1,
+            .scale = 0.5f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {6, 1, 1, 3},
+            .numberOfConsumers = 0,
+            .scale = 0.25f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::TENSOR_INT32,
+            .dimensions = {6},
+            .numberOfConsumers = 0,
+            .scale = 0.125f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::MODEL_INPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 0, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 4, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 8, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 12, .length = 4},
+        },
+        {
+            .type = OperandType::INT32,
+            .dimensions = {},
+            .numberOfConsumers = 1,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 16, .length = 4},
+        },
+        {
+            .type = OperandType::BOOL,
+            .dimensions = {},
+            .numberOfConsumers = 3,
+            .scale = 0.0f,
+            .zeroPoint = 0,
+            .lifetime = OperandLifeTime::CONSTANT_COPY,
+            .location = {.poolIndex = 0, .offset = 20, .length = 1},
+        },
+        {
+            .type = OperandType::TENSOR_QUANT8_ASYMM,
+            .dimensions = {1, 6, 2, 2},
+            .numberOfConsumers = 0,
+            .scale = 2.0f,
+            .zeroPoint = 60,
+            .lifetime = OperandLifeTime::MODEL_OUTPUT,
+            .location = {.poolIndex = 0, .offset = 0, .length = 0},
+        }
+    };
+
+    const std::vector<Operation> operations = {
+        {
+            .type = OperationType::GROUPED_CONV_2D,
+            .inputs = {0, 1, 2, 3, 4, 5, 6, 7, 8},
+            .outputs = {9},
+        }
+    };
+
+    const std::vector<uint32_t> inputIndexes = {0, 1, 2};
+    const std::vector<uint32_t> outputIndexes = {9};
+    std::vector<uint8_t> operandValues = {
+      1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1
+    };
+    const std::vector<hidl_memory> pools = {};
+
+    return {
+        .operands = operands,
+        .operations = operations,
+        .inputIndexes = inputIndexes,
+        .outputIndexes = outputIndexes,
+        .operandValues = operandValues,
+        .pools = pools,
+    };
+}
+
+inline bool is_ignored_channel_nchw_quant8_weight_as_input(int i) {
   static std::set<int> ignore = {};
   return ignore.find(i) != ignore.end();
 }
diff --git a/runtime/test/specs/V1_2/grouped_conv2d.mod.py b/runtime/test/specs/V1_2/grouped_conv2d.mod.py
index f6ea32d..939d9cc 100644
--- a/runtime/test/specs/V1_2/grouped_conv2d.mod.py
+++ b/runtime/test/specs/V1_2/grouped_conv2d.mod.py
@@ -14,12 +14,15 @@
 # limitations under the License.
 #
 
-# TEST 1: GROUPED_CONV2D, pad = 0, stride = 1, numGroups = 2, act = relu
+layout = BoolScalar("layout", False) # NHWC
+
+# TEST 1: GROUPED_CONV2D, pad = 0, stride = 1, numGroups = 2
 i1 = Input("op1", "TENSOR_FLOAT32", "{1, 3, 3, 2}") # input 0
 w1 = Parameter("op2", "TENSOR_FLOAT32", "{2, 2, 2, 1}", [1, 2, 2, 1, 4, 3, 2, 1]) # weight
-b1 = Parameter("op3", "TENSOR_FLOAT32", "{2}", [10, -35]) # bias
+b1 = Parameter("op3", "TENSOR_FLOAT32", "{2}", [10, -33.5]) # bias
+act = Int32Scalar("act", 0) # act = none
 o1 = Output("op4", "TENSOR_FLOAT32", "{1, 2, 2, 2}") # output 0
-Model().Operation("GROUPED_CONV_2D", i1, w1, b1, 0, 0, 0, 0, 1, 1, 2, 1).To(o1)
+Model().Operation("GROUPED_CONV_2D", i1, w1, b1, 0, 0, 0, 0, 1, 1, 2, act, layout).To(o1)
 
 # Additional data type
 quant8 = DataTypeConverter().Identify({
@@ -29,15 +32,15 @@
     o1: ("TENSOR_QUANT8_ASYMM", 0.5, 80)
 })
 
-Example({
+example = Example({
     i1: [1, 2, 3, 4, 5, 6,
          6, 5, 4, 3, 2, 1,
          2, 3, 3, 3, 3, 3],
-    o1: [33, 0,
-         33, 6,
-         31, 3,
-         27, 0]
-}).AddVariations("relaxed", quant8).AddInput(w1, b1)
+    o1: [33, -0.5,
+         33,  7.5,
+         31,  4.5,
+         27, -9.5]
+}).AddNchw(i1, o1, layout).AddAllActivations(o1, act).AddVariations("relaxed", quant8).AddInput(w1, b1)
 
 
 # TEST 2: GROUPED_CONV2D_LARGE, pad = same, stride = 1, numGroups = 2, act = none
@@ -45,7 +48,7 @@
 w2 = Parameter("op2", "TENSOR_FLOAT32", "{2, 2, 3, 1}", [100, 20, 1, 200, 10, 2, 200, 30, 1, 100, 20, 3]) # weight
 b2 = Parameter("op3", "TENSOR_FLOAT32", "{2}", [500, -1000]) # bias
 o2 = Output("op4", "TENSOR_FLOAT32", "{1, 3, 2, 2}") # output 0
-Model("large").Operation("GROUPED_CONV_2D", i2, w2, b2, 1, 1, 1, 2, 0).To(o2)
+Model("large").Operation("GROUPED_CONV_2D", i2, w2, b2, 1, 1, 1, 2, 0, layout).To(o2)
 
 # Additional data type
 quant8 = DataTypeConverter().Identify({
@@ -55,7 +58,7 @@
     o2: ("TENSOR_QUANT8_ASYMM", 10.0, 100)
 })
 
-Example({
+example = Example({
     i2: [1, 2, 3, 4,
          4, 3, 2, 1,
          2, 3, 3, 3],
@@ -65,7 +68,7 @@
          1370, -10,
          543, -907,
          760, -310]
-}).AddVariations("relaxed", quant8).AddInput(w2, b2)
+}).AddNchw(i2, o2, layout).AddVariations("relaxed", quant8).AddInput(w2, b2)
 
 
 # TEST 3: GROUPED_CONV2D_CHANNEL, pad = same, stride = 1, numGroups = 3, act = none
@@ -73,7 +76,7 @@
 w3 = Parameter("op2", "TENSOR_FLOAT32", "{6, 1, 1, 3}", [1, 2, 3, 2, 1, 0, 2, 3, 3, 6, 6, 6, 9, 8, 5, 2, 1, 1]) # weight
 b3 = Parameter("op3", "TENSOR_FLOAT32", "{6}", [10, -20, 30, -40, 50, -60]) # bias
 o3 = Output("op4", "TENSOR_FLOAT32", "{1, 2, 2, 6}") # output 0
-Model("channel").Operation("GROUPED_CONV_2D", i3, w3, b3, 1, 1, 1, 3, 0).To(o3)
+Model("channel").Operation("GROUPED_CONV_2D", i3, w3, b3, 1, 1, 1, 3, 0, layout).To(o3)
 
 # Additional data type
 quant8 = DataTypeConverter().Identify({
@@ -83,7 +86,7 @@
     o3: ("TENSOR_QUANT8_ASYMM", 2.0, 60)
 })
 
-Example({
+example = Example({
     i3: [1, 2, 3, 4, 55, 4, 3, 2, 1,
          5, 4, 3, 2, 11, 2, 3, 4, 5,
          2, 3, 2, 3, 22, 3, 2, 3, 2,
@@ -92,4 +95,4 @@
          32,  -6,  73,  50, 134, -45,
          24, -13, 111, 128, 102, -51,
          17, -18, 134, 170,  73, -55]
-}).AddVariations("relaxed", quant8).AddInput(w3, b3)
+}).AddNchw(i3, o3, layout).AddVariations("relaxed", quant8).AddInput(w3, b3)