// TODO TFLDepthwiseConv2D
-// TODO TFLDiv
+/**
+ * @brief DIV in TensorFlow Lite
+ */
+class TFLDiv final : public FixedArityNode<2, TFLNodeImpl<TFLOpcode::DIV>>
+{
+public:
+ TFLDiv() = default;
+
+public:
+ loco::Node *x(void) const { return at(0)->node(); }
+ void x(loco::Node *node) { at(0)->node(node); }
+
+ loco::Node *y(void) const { return at(1)->node(); }
+ void y(loco::Node *node) { at(1)->node(node); }
+};
/**
* @brief MAX_POOL_2D in TensorFlow Lite
// TODO TFLSqrt
-// TODO TFLSub
+/**
+ * @brief SUB in TensorFlow Lite
+ */
+class TFLSub final : public FixedArityNode<2, TFLNodeImpl<TFLOpcode::SUB>>
+{
+public:
+ TFLSub() = default;
+
+public:
+ loco::Node *x(void) const { return at(0)->node(); }
+ void x(loco::Node *node) { at(0)->node(node); }
+
+ loco::Node *y(void) const { return at(1)->node(); }
+ void y(loco::Node *node) { at(1)->node(node); }
+};
// TODO TFLTanh
// TODO TFLConcatenation
// TODO TFLConv2D
// TODO TFLDepthwiseConv2D
-// TODO TFLDiv
+TFL_NODE(DIV, locoex::TFLDiv)
TFL_NODE(MAX_POOL_2D, locoex::TFLMaxPool2D)
TFL_NODE(MUL, locoex::TFLMul)
TFL_NODE(RELU, locoex::TFLRelu)
// TODO TFLReshape
// TODO TFLSoftmax
// TODO TFLSqrt
-// TODO TFLSub
+TFL_NODE(SUB, locoex::TFLSub)
// TODO TFLTanh
// TODO TFLTranspose
// TODO TFLDepthwiseConv2D
-// TODO TFLDiv
+TEST(TFLDivTest, constructor)
+{
+ locoex::TFLDiv div_node;
+
+ ASSERT_EQ(div_node.dialect(), locoex::TFLDialect::get());
+ ASSERT_EQ(div_node.opcode(), locoex::TFLOpcode::DIV);
+
+ ASSERT_EQ(div_node.x(), nullptr);
+ ASSERT_EQ(div_node.y(), nullptr);
+}
// TODO TFLMaxPool2D
// TODO TFLSqrt
-// TODO TFLSub
+TEST(TFLSubTest, constructor)
+{
+ locoex::TFLSub sub_node;
+
+ ASSERT_EQ(sub_node.dialect(), locoex::TFLDialect::get());
+ ASSERT_EQ(sub_node.opcode(), locoex::TFLOpcode::SUB);
+
+ ASSERT_EQ(sub_node.x(), nullptr);
+ ASSERT_EQ(sub_node.y(), nullptr);
+}
// TODO TFLTanh
// TODO TFLDepthwiseConv2D
-// TODO TFLDiv
+bool TFLNodeSummaryBuilder::summary(const locoex::TFLDiv *node, locop::NodeSummary &s) const
+{
+ s.args().append("x", tbl()->lookup(node->x()));
+ s.args().append("y", tbl()->lookup(node->y()));
+ s.state(locop::NodeSummary::State::Complete);
+ return true;
+}
bool TFLNodeSummaryBuilder::summary(const locoex::TFLMaxPool2D *node, locop::NodeSummary &s) const
{
// TODO TFLSqrt
-// TODO TFLSub
+bool TFLNodeSummaryBuilder::summary(const locoex::TFLSub *node, locop::NodeSummary &s) const
+{
+ s.args().append("x", tbl()->lookup(node->x()));
+ s.args().append("y", tbl()->lookup(node->y()));
+ s.state(locop::NodeSummary::State::Complete);
+ return true;
+}
// TODO TFLTanh