[nest] Support 'ret' (#722)
author박종현/동작제어Lab(SR)/Staff Engineer/삼성전자 <jh1302.park@samsung.com>
Thu, 19 Jul 2018 10:43:13 +0000 (19:43 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Thu, 19 Jul 2018 10:43:13 +0000 (19:43 +0900)
This commit introduces 'ret' methods which allows users to set/get the
return specification.

Signed-off-by: Jonghyun Park <jh1302.park@samsung.com>
contrib/nest/include/nest/Module.h
contrib/nest/src/Module.cpp
contrib/nest/src/Module.test.cpp

index e8af83b..7e4f1f3 100644 (file)
@@ -3,6 +3,7 @@
 
 #include "nest/VarContext.h"
 #include "nest/DomainContext.h"
+#include "nest/Ret.h"
 #include "nest/Block.h"
 
 namespace nest
@@ -39,6 +40,17 @@ public:
 
 public:
   void push(const Expr &expr);
+
+private:
+  std::shared_ptr<Ret> _ret;
+
+public:
+  // NOTE Do NOT invoke ret() before ret(expr) call
+  const Ret &ret(void) const;
+
+public:
+  // NOTE Only one ret(expr) call is allowed for each module
+  void ret(const Closure &closure);
 };
 
 } // namespace nest
index 18c953b..acfb6aa 100644 (file)
@@ -1,5 +1,7 @@
 #include "nest/Module.h"
 
+#include <cassert>
+
 namespace nest
 {
 
@@ -9,4 +11,18 @@ void Module::push(const Expr &expr)
   _block.append(stmt);
 }
 
+void Module::ret(const Closure &clo)
+{
+  // Only one RET is allowed for each module
+  assert(_ret == nullptr);
+  _ret = std::make_shared<Ret>(clo.id(), clo.sub());
+}
+
+const Ret &Module::ret(void) const
+{
+  // Caller should NOT invoke this method before setting ret
+  assert(_ret != nullptr);
+  return *_ret;
+}
+
 } // namespace nest
index 5def2c7..975ee12 100644 (file)
@@ -53,3 +53,19 @@ TEST(MODULE, push)
   ASSERT_EQ(m.block().size(), 1);
   ASSERT_NE(m.block().at(0)->asPush(), nullptr);
 }
+
+TEST(MODULE, ret)
+{
+  nest::Module m;
+
+  auto ifm = m.domain().make({1});
+  auto ofm = m.domain().make({1});
+
+  auto ind = m.var().make();
+
+  m.push(ifm(ind));
+  m.ret(ofm(ind));
+
+  ASSERT_EQ(m.ret().id(), ofm.id());
+  ASSERT_EQ(m.ret().sub().rank(), 1);
+}