2 * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include "loader/GraphLoader.h"
18 #include "loader/KernelBuilder.h"
20 #include <kernels/Add.h>
21 #include <kernels/ArgMax.h>
22 #include <kernels/AveragePool2D.h>
23 #include <kernels/Concatenation.h>
24 #include <kernels/Conv2D.h>
25 #include <kernels/DepthToSpace.h>
26 #include <kernels/DepthwiseConv2D.h>
27 #include <kernels/Elu.h>
28 #include <kernels/FullyConnected.h>
29 #include <kernels/L2Normalize.h>
30 #include <kernels/L2Pool2D.h>
31 #include <kernels/LeakyRelu.h>
32 #include <kernels/LocalResponseNormalization.h>
33 #include <kernels/Logistic.h>
34 #include <kernels/MaxPool2D.h>
35 #include <kernels/Mean.h>
36 #include <kernels/Mul.h>
37 #include <kernels/Pad.h>
38 #include <kernels/Reshape.h>
39 #include <kernels/Reverse.h>
40 #include <kernels/Rsqrt.h>
41 #include <kernels/Slice.h>
42 #include <kernels/Softmax.h>
43 #include <kernels/SpaceToDepth.h>
44 #include <kernels/Split.h>
45 #include <kernels/Sqrt.h>
46 #include <kernels/Squeeze.h>
47 #include <kernels/StridedSlice.h>
48 #include <kernels/Tanh.h>
49 #include <kernels/Transpose.h>
50 #include <kernels/TransposeConv.h>
51 #include <kernels/Unpack.h>
53 #include <gmock/gmock.h>
55 namespace luci_interpreter
60 using namespace testing;
62 class KernelBuilderTest : public Test
65 luci::CircleInput *createInputNode() { return createNode<luci::CircleInput>(); }
67 template <typename NodeT, typename... Args> NodeT *createNode(Args &&... args)
69 auto *node = _graph.nodes()->create<NodeT>(std::forward<Args>(args)...);
70 // The actual type does not matter for the purpose of the tests.
71 // NOTE The type is meaningless for nodes with multiple outputs (corresponding *Out nodes carry
72 // actual output types).
73 node->dtype(loco::DataType::FLOAT32);
77 template <typename NodeOutT> NodeOutT *createNodeOut(loco::Node *node, int index)
79 auto *node_out = createNode<NodeOutT>();
80 node_out->input(node);
81 node_out->index(index);
85 template <typename KernelT> std::unique_ptr<KernelT> buildKernel(const luci::CircleNode *op)
87 std::unordered_map<const loco::Graph *, RuntimeGraph *> graph_to_runtime_graph;
89 RuntimeGraph runtime_graph(nullptr);
90 RuntimeToIR runtime_to_ir;
91 GraphLoader graph_loader(&_graph, &runtime_graph, runtime_to_ir, graph_to_runtime_graph,
93 graph_loader.loadTensors();
95 KernelBuilder kernel_builder(graph_to_runtime_graph, _node_to_tensor);
97 auto kernel = op->accept(&kernel_builder);
98 return std::unique_ptr<KernelT>(dynamic_cast<KernelT *>(kernel.release()));
101 void checkTensor(const Tensor *tensor, const loco::Node *node)
103 EXPECT_THAT(tensor, Eq(_node_to_tensor.at(node)));
108 std::unordered_map<const loco::Node *, Tensor *> _node_to_tensor;
111 TEST_F(KernelBuilderTest, Add)
113 auto *input1 = createInputNode();
114 auto *input2 = createInputNode();
116 auto *op = createNode<luci::CircleAdd>();
120 op->fusedActivationFunction(luci::FusedActFunc::RELU);
122 auto kernel = buildKernel<kernels::Add>(op);
123 ASSERT_THAT(kernel, NotNull());
125 checkTensor(kernel->input1(), input1);
126 checkTensor(kernel->input2(), input2);
127 checkTensor(kernel->output(), op);
128 EXPECT_THAT(kernel->params().activation, Eq(op->fusedActivationFunction()));
131 TEST_F(KernelBuilderTest, ArgMax)
133 auto *input = createInputNode();
134 auto *axis = createInputNode();
136 auto *op = createNode<luci::CircleArgMax>();
140 op->output_type(loco::DataType::FLOAT32);
142 auto kernel = buildKernel<kernels::ArgMax>(op);
143 ASSERT_THAT(kernel, NotNull());
145 checkTensor(kernel->input(), input);
146 checkTensor(kernel->axis(), axis);
147 checkTensor(kernel->output(), op);
148 EXPECT_THAT(kernel->params().output_type, Eq(op->output_type()));
151 TEST_F(KernelBuilderTest, AveragePool2D)
153 auto *input = createInputNode();
155 auto *op = createNode<luci::CircleAveragePool2D>();
158 op->padding(luci::Padding::SAME);
163 op->fusedActivationFunction(luci::FusedActFunc::RELU);
165 auto kernel = buildKernel<kernels::AveragePool2D>(op);
166 ASSERT_THAT(kernel, NotNull());
168 checkTensor(kernel->input(), input);
169 checkTensor(kernel->output(), op);
170 EXPECT_THAT(kernel->params().padding, Eq(op->padding()));
171 EXPECT_THAT(kernel->params().filter_height, Eq(op->filter()->h()));
172 EXPECT_THAT(kernel->params().filter_width, Eq(op->filter()->w()));
173 EXPECT_THAT(kernel->params().stride_height, Eq(op->stride()->h()));
174 EXPECT_THAT(kernel->params().stride_width, Eq(op->stride()->w()));
175 EXPECT_THAT(kernel->params().activation, Eq(op->fusedActivationFunction()));
178 TEST_F(KernelBuilderTest, Concatenation)
180 auto *input1 = createInputNode();
181 auto *input2 = createInputNode();
183 auto *op = createNode<luci::CircleConcatenation>(2);
184 op->values(0, input1);
185 op->values(1, input2);
188 auto kernel = buildKernel<kernels::Concatenation>(op);
189 ASSERT_THAT(kernel, NotNull());
191 checkTensor(kernel->input(0), input1);
192 checkTensor(kernel->input(1), input2);
193 checkTensor(kernel->output(), op);
194 EXPECT_THAT(kernel->params().axis, Eq(op->axis()));
197 TEST_F(KernelBuilderTest, Conv2D)
199 auto *input = createInputNode();
200 auto *filter = createInputNode();
201 auto *bias = createInputNode();
203 auto *op = createNode<luci::CircleConv2D>();
208 op->padding(luci::Padding::SAME);
211 op->dilation()->h(17);
212 op->dilation()->w(19);
213 op->fusedActivationFunction(luci::FusedActFunc::RELU);
215 auto kernel = buildKernel<kernels::Conv2D>(op);
216 ASSERT_THAT(kernel, NotNull());
218 checkTensor(kernel->input(), input);
219 checkTensor(kernel->filter(), filter);
220 checkTensor(kernel->bias(), bias);
221 checkTensor(kernel->output(), op);
222 EXPECT_THAT(kernel->params().padding, Eq(op->padding()));
223 EXPECT_THAT(kernel->params().stride_height, Eq(op->stride()->h()));
224 EXPECT_THAT(kernel->params().stride_width, Eq(op->stride()->w()));
225 EXPECT_THAT(kernel->params().dilation_height_factor, Eq(op->dilation()->h()));
226 EXPECT_THAT(kernel->params().dilation_width_factor, Eq(op->dilation()->w()));
227 EXPECT_THAT(kernel->params().activation, Eq(op->fusedActivationFunction()));
230 TEST_F(KernelBuilderTest, DepthToSpace)
232 auto *input = createInputNode();
234 auto *op = createNode<luci::CircleDepthToSpace>();
239 auto kernel = buildKernel<kernels::DepthToSpace>(op);
240 ASSERT_THAT(kernel, NotNull());
242 checkTensor(kernel->input(), input);
243 checkTensor(kernel->output(), op);
244 EXPECT_THAT(kernel->params().block_size, Eq(op->block_size()));
247 TEST_F(KernelBuilderTest, DepthwiseConv2D)
249 auto *input = createInputNode();
250 auto *filter = createInputNode();
251 auto *bias = createInputNode();
253 auto *op = createNode<luci::CircleDepthwiseConv2D>();
258 op->padding(luci::Padding::SAME);
259 op->depthMultiplier(11);
262 op->dilation()->h(19);
263 op->dilation()->w(23);
264 op->fusedActivationFunction(luci::FusedActFunc::RELU);
266 auto kernel = buildKernel<kernels::DepthwiseConv2D>(op);
267 ASSERT_THAT(kernel, NotNull());
269 checkTensor(kernel->input(), input);
270 checkTensor(kernel->filter(), filter);
271 checkTensor(kernel->bias(), bias);
272 checkTensor(kernel->output(), op);
273 EXPECT_THAT(kernel->params().padding, Eq(op->padding()));
274 EXPECT_THAT(kernel->params().depth_multiplier, Eq(op->depthMultiplier()));
275 EXPECT_THAT(kernel->params().stride_height, Eq(op->stride()->h()));
276 EXPECT_THAT(kernel->params().stride_width, Eq(op->stride()->w()));
277 EXPECT_THAT(kernel->params().dilation_height_factor, Eq(op->dilation()->h()));
278 EXPECT_THAT(kernel->params().dilation_width_factor, Eq(op->dilation()->w()));
279 EXPECT_THAT(kernel->params().activation, Eq(op->fusedActivationFunction()));
282 TEST_F(KernelBuilderTest, Elu)
284 auto *input = createInputNode();
286 auto *op = createNode<luci::CircleElu>();
289 auto kernel = buildKernel<kernels::Elu>(op);
290 ASSERT_THAT(kernel, NotNull());
292 checkTensor(kernel->input(), input);
293 checkTensor(kernel->output(), op);
296 TEST_F(KernelBuilderTest, FullyConnected)
298 auto *input = createInputNode();
299 auto *weights = createInputNode();
300 auto *bias = createInputNode();
302 auto *op = createNode<luci::CircleFullyConnected>();
304 op->weights(weights);
307 op->fusedActivationFunction(luci::FusedActFunc::RELU);
309 auto kernel = buildKernel<kernels::FullyConnected>(op);
310 ASSERT_THAT(kernel, NotNull());
312 checkTensor(kernel->input(), input);
313 checkTensor(kernel->weights(), weights);
314 checkTensor(kernel->bias(), bias);
315 checkTensor(kernel->output(), op);
316 EXPECT_THAT(kernel->params().activation, Eq(op->fusedActivationFunction()));
319 TEST_F(KernelBuilderTest, L2Normalize)
321 auto *input = createInputNode();
323 auto *op = createNode<luci::CircleL2Normalize>();
326 op->fusedActivationFunction(luci::FusedActFunc::RELU);
328 auto kernel = buildKernel<kernels::L2Normalize>(op);
329 ASSERT_THAT(kernel, NotNull());
331 checkTensor(kernel->input(), input);
332 checkTensor(kernel->output(), op);
333 EXPECT_THAT(kernel->params().activation, Eq(op->fusedActivationFunction()));
336 TEST_F(KernelBuilderTest, L2Pool2D)
338 auto *input = createInputNode();
340 auto *op = createNode<luci::CircleL2Pool2D>();
343 op->padding(luci::Padding::SAME);
348 op->fusedActivationFunction(luci::FusedActFunc::RELU);
350 auto kernel = buildKernel<kernels::L2Pool2D>(op);
351 ASSERT_THAT(kernel, NotNull());
353 checkTensor(kernel->input(), input);
354 checkTensor(kernel->output(), op);
355 EXPECT_THAT(kernel->params().padding, Eq(op->padding()));
356 EXPECT_THAT(kernel->params().filter_height, Eq(op->filter()->h()));
357 EXPECT_THAT(kernel->params().filter_width, Eq(op->filter()->w()));
358 EXPECT_THAT(kernel->params().stride_height, Eq(op->stride()->h()));
359 EXPECT_THAT(kernel->params().stride_width, Eq(op->stride()->w()));
360 EXPECT_THAT(kernel->params().activation, Eq(op->fusedActivationFunction()));
363 TEST_F(KernelBuilderTest, LeakyRelu)
365 auto *input = createInputNode();
367 auto *op = createNode<luci::CircleLeakyRelu>();
372 auto kernel = buildKernel<kernels::LeakyRelu>(op);
373 ASSERT_THAT(kernel, NotNull());
375 checkTensor(kernel->input(), input);
376 checkTensor(kernel->output(), op);
377 EXPECT_THAT(kernel->params().alpha, Eq(op->alpha()));
380 TEST_F(KernelBuilderTest, LocalResponseNormalization)
382 auto *input = createInputNode();
384 auto *op = createNode<luci::CircleLocalResponseNormalization>();
392 auto kernel = buildKernel<kernels::LocalResponseNormalization>(op);
393 ASSERT_THAT(kernel, NotNull());
395 checkTensor(kernel->input(), input);
396 checkTensor(kernel->output(), op);
397 EXPECT_THAT(kernel->params().radius, Eq(op->radius()));
398 EXPECT_THAT(kernel->params().bias, Eq(op->bias()));
399 EXPECT_THAT(kernel->params().alpha, Eq(op->alpha()));
400 EXPECT_THAT(kernel->params().beta, Eq(op->beta()));
403 TEST_F(KernelBuilderTest, Logistic)
405 auto *input = createInputNode();
407 auto *op = createNode<luci::CircleLogistic>();
410 auto kernel = buildKernel<kernels::Logistic>(op);
411 ASSERT_THAT(kernel, NotNull());
413 checkTensor(kernel->input(), input);
414 checkTensor(kernel->output(), op);
417 TEST_F(KernelBuilderTest, MaxPool2D)
419 auto *input = createInputNode();
421 auto *op = createNode<luci::CircleMaxPool2D>();
424 op->padding(luci::Padding::SAME);
429 op->fusedActivationFunction(luci::FusedActFunc::RELU);
431 auto kernel = buildKernel<kernels::MaxPool2D>(op);
432 ASSERT_THAT(kernel, NotNull());
434 checkTensor(kernel->input(), input);
435 checkTensor(kernel->output(), op);
436 EXPECT_THAT(kernel->params().padding, Eq(op->padding()));
437 EXPECT_THAT(kernel->params().filter_height, Eq(op->filter()->h()));
438 EXPECT_THAT(kernel->params().filter_width, Eq(op->filter()->w()));
439 EXPECT_THAT(kernel->params().stride_height, Eq(op->stride()->h()));
440 EXPECT_THAT(kernel->params().stride_width, Eq(op->stride()->w()));
441 EXPECT_THAT(kernel->params().activation, Eq(op->fusedActivationFunction()));
444 TEST_F(KernelBuilderTest, Mean)
446 auto *input = createInputNode();
447 auto *axes = createInputNode();
449 auto *op = createNode<luci::CircleMean>();
451 op->reduction_indices(axes);
455 auto kernel = buildKernel<kernels::Mean>(op);
456 ASSERT_THAT(kernel, NotNull());
458 checkTensor(kernel->input(), input);
459 checkTensor(kernel->axes(), axes);
460 checkTensor(kernel->output(), op);
461 EXPECT_THAT(kernel->params().keep_dims, Eq(op->keep_dims()));
464 TEST_F(KernelBuilderTest, Mul)
466 auto *input1 = createInputNode();
467 auto *input2 = createInputNode();
469 auto *op = createNode<luci::CircleMul>();
473 op->fusedActivationFunction(luci::FusedActFunc::RELU);
475 auto kernel = buildKernel<kernels::Mul>(op);
476 ASSERT_THAT(kernel, NotNull());
478 checkTensor(kernel->input1(), input1);
479 checkTensor(kernel->input2(), input2);
480 checkTensor(kernel->output(), op);
481 EXPECT_THAT(kernel->params().activation, Eq(op->fusedActivationFunction()));
484 TEST_F(KernelBuilderTest, Pad)
486 auto *input = createInputNode();
487 auto *paddings = createInputNode();
489 auto *op = createNode<luci::CirclePad>();
491 op->paddings(paddings);
493 auto kernel = buildKernel<kernels::Pad>(op);
494 ASSERT_THAT(kernel, NotNull());
496 checkTensor(kernel->input(), input);
497 checkTensor(kernel->paddings(), paddings);
498 checkTensor(kernel->output(), op);
501 TEST_F(KernelBuilderTest, Reshape)
503 auto *input = createInputNode();
504 auto *shape = createInputNode();
506 auto *op = createNode<luci::CircleReshape>();
510 auto kernel = buildKernel<kernels::Reshape>(op);
511 ASSERT_THAT(kernel, NotNull());
513 checkTensor(kernel->input(), input);
514 checkTensor(kernel->shape(), shape);
515 checkTensor(kernel->output(), op);
518 TEST_F(KernelBuilderTest, ReverseV2)
520 auto *input = createInputNode();
521 auto *axes = createInputNode();
523 auto *op = createNode<luci::CircleReverseV2>();
527 auto kernel = buildKernel<kernels::Reverse>(op);
528 ASSERT_THAT(kernel, NotNull());
530 checkTensor(kernel->input(), input);
531 checkTensor(kernel->axes(), axes);
532 checkTensor(kernel->output(), op);
535 TEST_F(KernelBuilderTest, Rsqrt)
537 auto *input = createInputNode();
539 auto *op = createNode<luci::CircleRsqrt>();
542 auto kernel = buildKernel<kernels::Rsqrt>(op);
543 ASSERT_THAT(kernel, NotNull());
545 checkTensor(kernel->input(), input);
546 checkTensor(kernel->output(), op);
549 TEST_F(KernelBuilderTest, Slice)
551 auto *input = createInputNode();
552 auto *begin = createInputNode();
553 auto *size = createInputNode();
555 auto *op = createNode<luci::CircleSlice>();
560 auto kernel = buildKernel<kernels::Slice>(op);
561 ASSERT_THAT(kernel, NotNull());
563 checkTensor(kernel->input(), input);
564 checkTensor(kernel->begin(), begin);
565 checkTensor(kernel->size(), size);
566 checkTensor(kernel->output(), op);
569 TEST_F(KernelBuilderTest, Softmax)
571 auto *input = createInputNode();
573 auto *op = createNode<luci::CircleSoftmax>();
578 auto kernel = buildKernel<kernels::Softmax>(op);
579 ASSERT_THAT(kernel, NotNull());
581 checkTensor(kernel->input(), input);
582 checkTensor(kernel->output(), op);
583 EXPECT_THAT(kernel->params().beta, Eq(op->beta()));
586 TEST_F(KernelBuilderTest, SpaceToDepth)
588 auto *input = createInputNode();
590 auto *op = createNode<luci::CircleSpaceToDepth>();
595 auto kernel = buildKernel<kernels::SpaceToDepth>(op);
596 ASSERT_THAT(kernel, NotNull());
598 checkTensor(kernel->input(), input);
599 checkTensor(kernel->output(), op);
600 EXPECT_THAT(kernel->params().block_size, op->block_size());
603 TEST_F(KernelBuilderTest, Split)
605 auto *axis = createInputNode();
606 auto *input = createInputNode();
607 auto *op = createNode<luci::CircleSplit>();
608 auto *output1 = createNodeOut<luci::CircleSplitOut>(op, 0);
609 auto *output2 = createNodeOut<luci::CircleSplitOut>(op, 1);
616 auto kernel = buildKernel<kernels::Split>(op);
617 ASSERT_THAT(kernel, NotNull());
619 checkTensor(kernel->axis(), axis);
620 checkTensor(kernel->input(), input);
621 checkTensor(kernel->output(0), output1);
622 checkTensor(kernel->output(1), output2);
625 TEST_F(KernelBuilderTest, Sqrt)
627 auto *input = createInputNode();
629 auto *op = createNode<luci::CircleSqrt>();
632 auto kernel = buildKernel<kernels::Sqrt>(op);
633 ASSERT_THAT(kernel, NotNull());
635 checkTensor(kernel->input(), input);
636 checkTensor(kernel->output(), op);
639 TEST_F(KernelBuilderTest, Squeeze)
641 auto *input = createInputNode();
643 auto *op = createNode<luci::CircleSqueeze>();
646 op->squeeze_dims({11, 13});
648 auto kernel = buildKernel<kernels::Squeeze>(op);
649 ASSERT_THAT(kernel, NotNull());
651 checkTensor(kernel->input(), input);
652 checkTensor(kernel->output(), op);
653 EXPECT_THAT(kernel->params().squeeze_dims, ElementsAreArray(op->squeeze_dims()));
656 TEST_F(KernelBuilderTest, StridedSlice)
658 auto *input = createInputNode();
659 auto *begin = createInputNode();
660 auto *end = createInputNode();
661 auto *strides = createInputNode();
663 auto *op = createNode<luci::CircleStridedSlice>();
667 op->strides(strides);
670 op->ellipsis_mask(13);
672 op->new_axis_mask(19);
673 op->shrink_axis_mask(23);
675 auto kernel = buildKernel<kernels::StridedSlice>(op);
676 ASSERT_THAT(kernel, NotNull());
678 checkTensor(kernel->input(), input);
679 checkTensor(kernel->begin(), begin);
680 checkTensor(kernel->end(), end);
681 checkTensor(kernel->strides(), strides);
682 checkTensor(kernel->output(), op);
683 EXPECT_THAT(kernel->params().begin_mask, Eq(op->begin_mask()));
684 EXPECT_THAT(kernel->params().ellipsis_mask, Eq(op->ellipsis_mask()));
685 EXPECT_THAT(kernel->params().end_mask, Eq(op->end_mask()));
686 EXPECT_THAT(kernel->params().new_axis_mask, Eq(op->new_axis_mask()));
687 EXPECT_THAT(kernel->params().shrink_axis_mask, Eq(op->shrink_axis_mask()));
690 TEST_F(KernelBuilderTest, Tanh)
692 auto *input = createInputNode();
694 auto *op = createNode<luci::CircleTanh>();
697 auto kernel = buildKernel<kernels::Tanh>(op);
698 ASSERT_THAT(kernel, NotNull());
700 checkTensor(kernel->input(), input);
701 checkTensor(kernel->output(), op);
704 TEST_F(KernelBuilderTest, Transpose)
706 auto *input = createInputNode();
707 auto *perm = createInputNode();
709 auto *op = createNode<luci::CircleTranspose>();
713 auto kernel = buildKernel<kernels::Transpose>(op);
714 ASSERT_THAT(kernel, NotNull());
716 checkTensor(kernel->input(), input);
717 checkTensor(kernel->perm(), perm);
718 checkTensor(kernel->output(), op);
721 TEST_F(KernelBuilderTest, TransposeConv)
723 auto *output_shape = createInputNode();
724 auto *filter = createInputNode();
725 auto *input = createInputNode();
726 auto *bias = createInputNode();
728 auto *op = createNode<luci::CircleTransposeConv>();
729 op->inputSizes(output_shape);
731 op->outBackprop(input);
734 op->padding(luci::Padding::SAME);
738 auto kernel = buildKernel<kernels::TransposeConv>(op);
739 ASSERT_THAT(kernel, NotNull());
741 checkTensor(kernel->output_shape(), output_shape);
742 checkTensor(kernel->filter(), filter);
743 checkTensor(kernel->input(), input);
744 checkTensor(kernel->output(), op);
745 checkTensor(kernel->bias(), bias);
746 EXPECT_THAT(kernel->params().padding, Eq(op->padding()));
747 EXPECT_THAT(kernel->params().stride_height, Eq(op->stride()->h()));
748 EXPECT_THAT(kernel->params().stride_width, Eq(op->stride()->w()));
751 TEST_F(KernelBuilderTest, Unpack)
753 auto *input = createInputNode();
754 auto *op = createNode<luci::CircleUnpack>();
755 auto *output1 = createNodeOut<luci::CircleUnpackOut>(op, 0);
756 auto *output2 = createNodeOut<luci::CircleUnpackOut>(op, 1);
763 auto kernel = buildKernel<kernels::Unpack>(op);
764 ASSERT_THAT(kernel, NotNull());
766 checkTensor(kernel->input(), input);
767 checkTensor(kernel->output(0), output1);
768 checkTensor(kernel->output(1), output2);
769 EXPECT_THAT(kernel->params().axis, Eq(op->axis()));
772 TEST_F(KernelBuilderTest, NonExisting1_NEG)
774 auto *op = createNode<luci::CircleConst>();
775 ASSERT_ANY_THROW(buildKernel<Kernel>(op));
778 TEST_F(KernelBuilderTest, NonExisting2_NEG)
780 auto *op = createNode<luci::CircleInput>();
781 ASSERT_ANY_THROW(buildKernel<Kernel>(op));
784 TEST_F(KernelBuilderTest, NonExisting3_NEG)
786 auto *op = createNode<luci::CircleOutput>();
787 ASSERT_ANY_THROW(buildKernel<Kernel>(op));
791 } // namespace luci_interpreter