diff options
Diffstat (limited to 'compiler/loco/include/loco')
-rw-r--r-- | compiler/loco/include/loco/IR/DataType.h | 3 | ||||
-rw-r--r-- | compiler/loco/include/loco/IR/DataTypeTraits.h | 43 | ||||
-rw-r--r-- | compiler/loco/include/loco/IR/Graph.h | 1 | ||||
-rw-r--r-- | compiler/loco/include/loco/IR/NodeMixins.h | 6 | ||||
-rw-r--r-- | compiler/loco/include/loco/IR/Nodes.h | 56 | ||||
-rw-r--r-- | compiler/loco/include/loco/IR/Padding2D.h | 2 |
6 files changed, 78 insertions, 33 deletions
diff --git a/compiler/loco/include/loco/IR/DataType.h b/compiler/loco/include/loco/IR/DataType.h index b07022bf5..b89edf29e 100644 --- a/compiler/loco/include/loco/IR/DataType.h +++ b/compiler/loco/include/loco/IR/DataType.h @@ -44,6 +44,9 @@ enum class DataType // WARNING the size of Bool may vary for NN frameworks // TODO we need to find a way to resolve this issue BOOL, // Boolean + + // WARNING STRING is NOT fully supported yet + STRING, // String }; } // namespace loco diff --git a/compiler/loco/include/loco/IR/DataTypeTraits.h b/compiler/loco/include/loco/IR/DataTypeTraits.h index c186300de..6be46c3b3 100644 --- a/compiler/loco/include/loco/IR/DataTypeTraits.h +++ b/compiler/loco/include/loco/IR/DataTypeTraits.h @@ -21,6 +21,7 @@ #include <cassert> #include <cstdint> +#include <stdexcept> namespace loco { @@ -52,6 +53,12 @@ template <> struct DataTypeImpl<DataType::S16> using Type = int16_t; }; +template <> struct DataTypeImpl<DataType::U16> +{ + // Use C++ uint16_t type for unsigned 16bit integer + using Type = uint16_t; +}; + template <> struct DataTypeImpl<DataType::S32> { // Use C++ int32_t type for 32bit integer @@ -70,12 +77,31 @@ template <> struct DataTypeImpl<DataType::S64> using Type = int64_t; }; +template <> struct DataTypeImpl<DataType::U64> +{ + // Use C++ uint64_t type for unsigned 64bit integer + using Type = uint64_t; +}; + +template <> struct DataTypeImpl<DataType::FLOAT16> +{ + // float16 type with 16bit value, encoded with help of FP16 library + // https://github.com/Maratyszcza/FP16/ + using Type = uint16_t; +}; + template <> struct DataTypeImpl<DataType::FLOAT32> { // Use C++ float type for IEEE 32-bit floating-point numbers using Type = float; }; +template <> struct DataTypeImpl<DataType::FLOAT64> +{ + // Use C++ double type for IEEE 64-bit floating-point numbers + using Type = double; +}; + // NOTE DataTypeImpl for BOOL is subject to change template <> struct DataTypeImpl<DataType::BOOL> { @@ -83,6 +109,12 @@ template <> struct DataTypeImpl<DataType::BOOL> using Type = uint8_t; }; +template <> struct DataTypeImpl<DataType::STRING> +{ + // Use C++ std::string type for STRING + using Type = std::string; +}; + /** * @brief Returns the size of the data type. * @note If you need the size at compile time, use `sizeof(typename DataTypeImpl<DT>::Type)`. @@ -97,16 +129,27 @@ inline uint32_t size(DataType data_type) return sizeof(DataTypeImpl<DataType::U8>::Type); case DataType::S16: return sizeof(DataTypeImpl<DataType::S16>::Type); + case DataType::U16: + return sizeof(DataTypeImpl<DataType::U16>::Type); case DataType::S32: return sizeof(DataTypeImpl<DataType::S32>::Type); case DataType::U32: return sizeof(DataTypeImpl<DataType::U32>::Type); case DataType::S64: return sizeof(DataTypeImpl<DataType::S64>::Type); + case DataType::U64: + return sizeof(DataTypeImpl<DataType::U64>::Type); + case DataType::FLOAT16: + return sizeof(DataTypeImpl<DataType::FLOAT16>::Type); case DataType::FLOAT32: return sizeof(DataTypeImpl<DataType::FLOAT32>::Type); + case DataType::FLOAT64: + return sizeof(DataTypeImpl<DataType::FLOAT64>::Type); case DataType::BOOL: return sizeof(DataTypeImpl<DataType::BOOL>::Type); + case DataType::STRING: + // STRING is variable length. Cannot decide size by type + throw std::runtime_error("Invalid size call with STRING type"); default: // TODO Support remaining data types. assert(false); diff --git a/compiler/loco/include/loco/IR/Graph.h b/compiler/loco/include/loco/IR/Graph.h index a820aba91..176e6cce1 100644 --- a/compiler/loco/include/loco/IR/Graph.h +++ b/compiler/loco/include/loco/IR/Graph.h @@ -264,7 +264,6 @@ struct GraphOutputIndexQueryService : public DialectService virtual GraphOutputIndex index(const Node *node) const = 0; }; -// TODO Use "const Graph *" std::vector<Node *> output_nodes(Graph *); /** diff --git a/compiler/loco/include/loco/IR/NodeMixins.h b/compiler/loco/include/loco/IR/NodeMixins.h index f0e34b0ba..fcadcaba7 100644 --- a/compiler/loco/include/loco/IR/NodeMixins.h +++ b/compiler/loco/include/loco/IR/NodeMixins.h @@ -83,7 +83,7 @@ private: std::vector<Dimension> _dims; }; -template <unsigned N> struct FixedArity +template <uint32_t N> struct FixedArity { template <typename Base> class Mixin : public virtual Base { @@ -99,7 +99,7 @@ template <unsigned N> struct FixedArity virtual ~Mixin() = default; public: - unsigned arity(void) const final { return N; } + uint32_t arity(void) const final { return N; } Node *arg(uint32_t n) const final { return _args.at(n)->node(); } @@ -113,7 +113,7 @@ template <unsigned N> struct FixedArity protected: // This API allows inherited classes to access "_args" field. - Use *at(unsigned n) const { return _args.at(n).get(); } + Use *at(uint32_t n) const { return _args.at(n).get(); } private: std::array<std::unique_ptr<Use>, N> _args{}; diff --git a/compiler/loco/include/loco/IR/Nodes.h b/compiler/loco/include/loco/IR/Nodes.h index fecfad28d..63b1181bb 100644 --- a/compiler/loco/include/loco/IR/Nodes.h +++ b/compiler/loco/include/loco/IR/Nodes.h @@ -49,7 +49,7 @@ class GraphOutput; * @brief Make a value visible to user */ class Push /* to user */ final - : public CanonicalNodeDef<CanonicalOpcode::Push, FixedArity<1>::Mixin> + : public CanonicalNodeDef<CanonicalOpcode::Push, FixedArity<1>::Mixin> { public: Push() = default; @@ -91,8 +91,8 @@ Push *push_node(Graph *g, const GraphOutputIndex &index); * @brief Create a value from user data */ class Pull /* from user */ final - : public CanonicalNodeDef<CanonicalOpcode::Pull, FixedArity<0>::Mixin, - With<NodeTrait::TensorShape>::Mixin> + : public CanonicalNodeDef<CanonicalOpcode::Pull, FixedArity<0>::Mixin, + With<NodeTrait::TensorShape>::Mixin> { public: Pull() = default; @@ -213,8 +213,8 @@ public: * } */ class ConstGen final - : public CanonicalNodeDef<CanonicalOpcode::ConstGen, FixedArity<0>::Mixin, - With<NodeTrait::DataType>::Mixin, With<NodeTrait::TensorShape>::Mixin> + : public CanonicalNodeDef<CanonicalOpcode::ConstGen, FixedArity<0>::Mixin, + With<NodeTrait::DataType>::Mixin, With<NodeTrait::TensorShape>::Mixin> { public: ConstGen() = default; @@ -376,7 +376,7 @@ private: * @brief Create a feature map from a tensor */ class FeatureEncode final - : public CanonicalNodeDef<CanonicalOpcode::FeatureEncode, FixedArity<1>::Mixin> + : public CanonicalNodeDef<CanonicalOpcode::FeatureEncode, FixedArity<1>::Mixin> { public: Node *input(void) const { return at(0)->node(); } @@ -395,7 +395,7 @@ private: * @brief Create a tensor from a feature map */ class FeatureDecode final - : public CanonicalNodeDef<CanonicalOpcode::FeatureDecode, FixedArity<1>::Mixin> + : public CanonicalNodeDef<CanonicalOpcode::FeatureDecode, FixedArity<1>::Mixin> { public: Node *input(void) const { return at(0)->node(); } @@ -414,7 +414,7 @@ private: * @brief Create a filter from a tensor */ class FilterEncode final - : public CanonicalNodeDef<CanonicalOpcode::FilterEncode, FixedArity<1>::Mixin> + : public CanonicalNodeDef<CanonicalOpcode::FilterEncode, FixedArity<1>::Mixin> { public: Node *input(void) const { return at(0)->node(); } @@ -433,7 +433,7 @@ private: * @brief Create a tensor from a filter */ class FilterDecode final - : public CanonicalNodeDef<CanonicalOpcode::FilterDecode, FixedArity<1>::Mixin> + : public CanonicalNodeDef<CanonicalOpcode::FilterDecode, FixedArity<1>::Mixin> { public: Node *input(void) const { return at(0)->node(); } @@ -452,7 +452,7 @@ private: * @brief Create a depthwise filter from a tensor */ class DepthwiseFilterEncode final - : public CanonicalNodeDef<CanonicalOpcode::DepthwiseFilterEncode, FixedArity<1>::Mixin> + : public CanonicalNodeDef<CanonicalOpcode::DepthwiseFilterEncode, FixedArity<1>::Mixin> { public: Node *input(void) const { return at(0)->node(); } @@ -471,7 +471,7 @@ private: * @brief Create a tensor from a depthwise filter */ class DepthwiseFilterDecode final - : public CanonicalNodeDef<CanonicalOpcode::DepthwiseFilterDecode, FixedArity<1>::Mixin> + : public CanonicalNodeDef<CanonicalOpcode::DepthwiseFilterDecode, FixedArity<1>::Mixin> { public: Node *input(void) const { return at(0)->node(); } @@ -512,8 +512,8 @@ template <ReshapeType RT> class Reshape; */ template <> class Reshape<ReshapeType::Fixed> final - : public CanonicalNodeDef<CanonicalOpcode::FixedReshape, FixedArity<1>::Mixin, - With<NodeTrait::TensorShape>::Mixin> + : public CanonicalNodeDef<CanonicalOpcode::FixedReshape, FixedArity<1>::Mixin, + With<NodeTrait::TensorShape>::Mixin> { public: Node *input(void) const { return at(0)->node(); } @@ -529,7 +529,7 @@ using FixedReshape = Reshape<ReshapeType::Fixed>; * concatenated along the given axis. */ class TensorConcat final - : public CanonicalNodeDef<CanonicalOpcode::TensorConcat, FixedArity<2>::Mixin> + : public CanonicalNodeDef<CanonicalOpcode::TensorConcat, FixedArity<2>::Mixin> { public: Node *lhs(void) const { return at(0)->node(); } @@ -578,7 +578,7 @@ private: * @brief Depthwise 2D Convolution */ class DepthwiseConv2D final - : public CanonicalNodeDef<CanonicalOpcode::DepthwiseConv2D, FixedArity<2>::Mixin> + : public CanonicalNodeDef<CanonicalOpcode::DepthwiseConv2D, FixedArity<2>::Mixin> { public: Node *ifm(void) const { return at(0)->node(); } @@ -616,7 +616,7 @@ enum class ReduceFunc * @note All the reduce functions always keep dimensions */ class TensorReduce final - : public CanonicalNodeDef<CanonicalOpcode::TensorReduce, FixedArity<1>::Mixin> + : public CanonicalNodeDef<CanonicalOpcode::TensorReduce, FixedArity<1>::Mixin> { public: Node *input(void) const { return at(0)->node(); } @@ -684,7 +684,7 @@ private: * With this, output shape is uniquely determined by all inputs and attributes. */ class TransposedConv2D final - : public CanonicalNodeDef<CanonicalOpcode::TransposedConv2D, FixedArity<2>::Mixin> + : public CanonicalNodeDef<CanonicalOpcode::TransposedConv2D, FixedArity<2>::Mixin> { public: Node *ifm(void) const { return at(0)->node(); } @@ -714,11 +714,11 @@ private: template <Domain D> class Softmax; /** -* @brief Computes softmax activations for Tensor domain -*/ + * @brief Computes softmax activations for Tensor domain + */ template <> class Softmax<Domain::Tensor> final - : public CanonicalNodeDef<CanonicalOpcode::TensorSoftmax, FixedArity<1>::Mixin> + : public CanonicalNodeDef<CanonicalOpcode::TensorSoftmax, FixedArity<1>::Mixin> { public: Softmax() = default; @@ -777,7 +777,7 @@ template <Domain D> class BiasAdd; */ template <> class BiasAdd<Domain::Tensor> final - : public CanonicalNodeDef<CanonicalOpcode::TensorBiasAdd, FixedArity<2>::Mixin> + : public CanonicalNodeDef<CanonicalOpcode::TensorBiasAdd, FixedArity<2>::Mixin> { public: BiasAdd() = default; @@ -813,7 +813,7 @@ using TensorBiasAdd = BiasAdd<Domain::Tensor>; */ template <> class BiasAdd<Domain::Feature> final - : public CanonicalNodeDef<CanonicalOpcode::FeatureBiasAdd, FixedArity<2>::Mixin> + : public CanonicalNodeDef<CanonicalOpcode::FeatureBiasAdd, FixedArity<2>::Mixin> { public: BiasAdd() = default; @@ -848,7 +848,7 @@ using FeatureBiasAdd = BiasAdd<Domain::Feature>; * [padding.front(0) + 1 + padding.back(0), padding.front(1) + 2 + padding.back(1)] = [4,9]. */ class TensorConstantPad final - : public CanonicalNodeDef<CanonicalOpcode::TensorConstantPad, FixedArity<2>::Mixin> + : public CanonicalNodeDef<CanonicalOpcode::TensorConstantPad, FixedArity<2>::Mixin> { public: Node *input(void) const { return at(0)->node(); } @@ -951,7 +951,7 @@ public: * @brief Elementwise Sqrt of input */ class EltwiseSqrt final - : public CanonicalNodeDef<CanonicalOpcode::EltwiseSqrt, FixedArity<1>::Mixin> + : public CanonicalNodeDef<CanonicalOpcode::EltwiseSqrt, FixedArity<1>::Mixin> { public: EltwiseSqrt() = default; @@ -976,7 +976,7 @@ public: * TODO Explain the operation semantics */ class TensorBroadcast final - : public CanonicalNodeDef<CanonicalOpcode::TensorBroadcast, FixedArity<1>::Mixin> + : public CanonicalNodeDef<CanonicalOpcode::TensorBroadcast, FixedArity<1>::Mixin> { public: TensorBroadcast() = default; @@ -1014,7 +1014,7 @@ private: * MatrixEncode currently requires a rank-2 Tensor as its input. */ class MatrixEncode final - : public CanonicalNodeDef<CanonicalOpcode::MatrixEncode, FixedArity<1>::Mixin> + : public CanonicalNodeDef<CanonicalOpcode::MatrixEncode, FixedArity<1>::Mixin> { public: MatrixEncode() = default; @@ -1038,7 +1038,7 @@ private: * MatrixDecode currently requires a Matrix as its input. */ class MatrixDecode final - : public CanonicalNodeDef<CanonicalOpcode::MatrixDecode, FixedArity<1>::Mixin> + : public CanonicalNodeDef<CanonicalOpcode::MatrixDecode, FixedArity<1>::Mixin> { public: MatrixDecode() = default; @@ -1086,7 +1086,7 @@ public: * Input and output belong to tensor domain. */ class TensorTranspose final - : public CanonicalNodeDef<CanonicalOpcode::TensorTranspose, FixedArity<1>::Mixin> + : public CanonicalNodeDef<CanonicalOpcode::TensorTranspose, FixedArity<1>::Mixin> { public: TensorTranspose() = default; diff --git a/compiler/loco/include/loco/IR/Padding2D.h b/compiler/loco/include/loco/IR/Padding2D.h index 30557a891..b50a8045f 100644 --- a/compiler/loco/include/loco/IR/Padding2D.h +++ b/compiler/loco/include/loco/IR/Padding2D.h @@ -32,7 +32,7 @@ public: public: Padding2D(uint32_t top, uint32_t bottom, uint32_t left, uint32_t right) - : _top{top}, _bottom{bottom}, _left{left}, _right{right} + : _top{top}, _bottom{bottom}, _left{left}, _right{right} { // DO NOTHING } |