// Copyright (c) 2020, ARM Limited. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef OPS_EWISE_UNARY_H #define OPS_EWISE_UNARY_H #include "graph_node.h" using namespace tosa; namespace TosaReference { template class UnaryNode : public GraphNode { public: UnaryNode(SubgraphTraverser* sgt_, const Op& nodeType, const uint64_t id_); virtual ~UnaryNode(); virtual int checkTensorAttributes() final; virtual int eval() final; virtual int register_fcn() = 0; using InEigenType = typename GetEigenType::type; using OutEigenType = typename GetEigenType::type; using TIn = Eigen::Tensor; using TOut = Eigen::Tensor; protected: std::function fcn; TosaReference::TensorTemplate* a; TosaReference::TensorTemplate* result; }; #define DEF_TEMPLATE_UNARY_OP(Opname, OPNAME) \ template \ class Op##Opname : public UnaryNode \ { \ public: \ Op##Opname(SubgraphTraverser* sgt_, TosaAttributeBase* attribute_, uint64_t id_) \ : UnaryNode(sgt_, Op_##OPNAME, id_) \ { \ register_fcn(); \ } \ static constexpr int32_t QMin = GetQMin::value; \ static constexpr int32_t QMax = GetQMax::value; \ using InEigenType = typename GetEigenType::type; \ using OutEigenType = typename GetEigenType::type; \ virtual int register_fcn(); \ }; DEF_TEMPLATE_UNARY_OP(Abs, ABS) DEF_TEMPLATE_UNARY_OP(BitwiseNot, BITWISE_NOT) DEF_TEMPLATE_UNARY_OP(Ceil, CEIL) DEF_TEMPLATE_UNARY_OP(Clz, CLZ) DEF_TEMPLATE_UNARY_OP(Exp, EXP) DEF_TEMPLATE_UNARY_OP(Floor, FLOOR) DEF_TEMPLATE_UNARY_OP(Log, LOG) DEF_TEMPLATE_UNARY_OP(LogicalNot, LOGICAL_NOT) DEF_TEMPLATE_UNARY_OP(Reciprocal, RECIPROCAL) DEF_TEMPLATE_UNARY_OP(Rsqrt, RSQRT) #undef DEF_TEMPLATE_UNARY_OP // Negate is the only unary op with attributes template class OpNegate : public UnaryNode { public: OpNegate(SubgraphTraverser* sgt_, TosaAttributeBase* attribute_, uint64_t id_); virtual ~OpNegate(); static constexpr int32_t QMin = GetQMin::value; static constexpr int32_t QMax = GetQMax::value; using InEigenType = typename GetEigenType::type; using OutEigenType = typename GetEigenType::type; virtual int register_fcn(); protected: tosa::TosaNegateAttribute* attribute; }; }; // namespace TosaReference #endif