[loco] add int32 type (#3636)
author박세희/On-Device Lab(SR)/Principal Engineer/삼성전자 <saehie.park@samsung.com>
Fri, 31 May 2019 05:52:36 +0000 (14:52 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Fri, 31 May 2019 05:52:36 +0000 (14:52 +0900)
* [loco] add int32 type

This will add int32 type for data types

Signed-off-by: SaeHie Park <saehie.park@samsung.com>
* change order

* another change order

* move after todo

contrib/loco/include/loco/IR/DataTypeTraits.h
contrib/loco/src/IR/Nodes.cpp
contrib/loco/src/IR/Nodes.test.cpp

index 660d5d5..ef73187 100644 (file)
@@ -19,6 +19,8 @@
 
 #include "loco/IR/DataType.h"
 
+#include <cstdint>
+
 namespace loco
 {
 
@@ -31,6 +33,12 @@ template <DataType DT> struct DataTypeImpl
 };
 
 // TODO Support other enum values
+template <> struct DataTypeImpl<DataType::S32>
+{
+  // Use C++ int32_t type for 32bit integer
+  using Type = int32_t;
+};
+
 template <> struct DataTypeImpl<DataType::FLOAT32>
 {
   // Use C++ float type for IEEE 32-bit floating-point numbers
index 1c5c600..5f197f2 100644 (file)
@@ -59,6 +59,7 @@ template <DataType DT> typename DataTypeImpl<DT>::Type &ConstGen::at(uint32_t n)
   template const typename DataTypeImpl<DT>::Type &ConstGen::at<DT>(uint32_t) const; \
   template typename DataTypeImpl<DT>::Type &ConstGen::at<DT>(uint32_t);
 
+INSTANTIATE(DataType::S32);
 INSTANTIATE(DataType::FLOAT32);
 
 #undef INSTANTIATE
index 4337bce..45a4111 100644 (file)
@@ -118,6 +118,47 @@ TEST(ConstGenTest, constructor)
   ASSERT_EQ(constgen_node.at<loco::DataType::FLOAT32>(5), 5.0f);
 }
 
+TEST(ConstGenTest, constructor_s32)
+{
+  loco::ConstGen constgen_node;
+
+  ASSERT_EQ(constgen_node.dtype(), loco::DataType::Unknown);
+  ASSERT_EQ(constgen_node.rank(), 0);
+
+  constgen_node.dtype(loco::DataType::S32);
+  ASSERT_EQ(constgen_node.dtype(), loco::DataType::S32);
+
+  constgen_node.rank(2);
+  ASSERT_EQ(constgen_node.rank(), 2);
+
+  constgen_node.dim(0) = loco::make_dimension(2);
+  constgen_node.dim(1) = loco::make_dimension(3);
+
+  ASSERT_TRUE(constgen_node.dim(0).known());
+  ASSERT_TRUE(constgen_node.dim(1).known());
+
+  ASSERT_EQ(constgen_node.dim(0), 2);
+  ASSERT_EQ(constgen_node.dim(1), 3);
+
+  constgen_node.size<loco::DataType::S32>(6);
+
+  ASSERT_EQ(constgen_node.size<loco::DataType::S32>(), 6);
+
+  constgen_node.at<loco::DataType::S32>(0) = 0;  // Set 0,0
+  constgen_node.at<loco::DataType::S32>(1) = 1;  // Set 0,1
+  constgen_node.at<loco::DataType::S32>(2) = 2;  // Set 0,2
+  constgen_node.at<loco::DataType::S32>(3) = -3; // Set 1,0
+  constgen_node.at<loco::DataType::S32>(4) = -4; // Set 1,1
+  constgen_node.at<loco::DataType::S32>(5) = -5; // Set 1,2
+
+  ASSERT_EQ(constgen_node.at<loco::DataType::S32>(0), 0);
+  ASSERT_EQ(constgen_node.at<loco::DataType::S32>(1), 1);
+  ASSERT_EQ(constgen_node.at<loco::DataType::S32>(2), 2);
+  ASSERT_EQ(constgen_node.at<loco::DataType::S32>(3), -3);
+  ASSERT_EQ(constgen_node.at<loco::DataType::S32>(4), -4);
+  ASSERT_EQ(constgen_node.at<loco::DataType::S32>(5), -5);
+}
+
 TEST(MaxPool2DTest, constructor)
 {
   loco::MaxPool2D maxpool_node;