[nest] Add 'Schedule' class (#847)
author박종현/동작제어Lab(SR)/Staff Engineer/삼성전자 <jh1302.park@samsung.com>
Tue, 31 Jul 2018 23:47:11 +0000 (08:47 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Tue, 31 Jul 2018 23:47:11 +0000 (08:47 +0900)
This commit adds 'Schedule' class which basically stores the level of
each variables.

Note that this commit justs introduces the primitive implementation of
'Schedule'. The current implementation does not support any schedule
primitives.

Signed-off-by: Jonghyun Park <jh1302.park@samsung.com>
contrib/nest/include/nest/Schedule.h [new file with mode: 0644]
contrib/nest/src/Schedule.cpp [new file with mode: 0644]
contrib/nest/src/Schedule.test.cpp [new file with mode: 0644]

diff --git a/contrib/nest/include/nest/Schedule.h b/contrib/nest/include/nest/Schedule.h
new file mode 100644 (file)
index 0000000..fb1aaef
--- /dev/null
@@ -0,0 +1,36 @@
+#ifndef __NEST_SCHEDULE_H__
+#define __NEST_SCHEDULE_H__
+
+#include "nest/Module.h"
+#include "nest/Level.h"
+
+#include <vector>
+
+namespace nest
+{
+
+class Schedule final
+{
+public:
+  explicit Schedule(const Module &);
+
+public:
+  const VarContext &var(void) const { return _module.var(); }
+  const DomainContext &domain(void) const { return _module.domain(); }
+  const Block &block(void) const { return _module.block(); }
+  const Ret &ret(void) const { return _module.ret(); }
+
+public:
+  Var at(const Level &) const;
+  Level level(const Var &) const;
+
+private:
+  Module _module;
+
+private:
+  std::vector<VarID> _level;
+};
+
+} // namespace nest
+
+#endif // __NEST_SCHEDULE_H___
diff --git a/contrib/nest/src/Schedule.cpp b/contrib/nest/src/Schedule.cpp
new file mode 100644 (file)
index 0000000..593263e
--- /dev/null
@@ -0,0 +1,35 @@
+#include "nest/Schedule.h"
+
+#include <cassert>
+#include <stdexcept>
+
+namespace nest
+{
+
+Schedule::Schedule(const Module &module) : _module{module}
+{
+  // NOTE This implementation assumes that VarContext sequentially assigns VarID
+  for (uint32_t n = 0; n < _module.var().count(); ++n)
+  {
+    _level.emplace_back(VarID{n});
+  }
+
+  assert(_level.size() == _module.var().count());
+}
+
+Var Schedule::at(const Level &lv) const { return Var{_level.at(lv.value())}; }
+
+Level Schedule::level(const Var &var) const
+{
+  for (uint32_t lv = 0; lv < _level.size(); ++lv)
+  {
+    if (_level.at(lv) == var.id())
+    {
+      return Level{lv};
+    }
+  }
+
+  throw std::invalid_argument{"var"};
+}
+
+} // namespace nest
diff --git a/contrib/nest/src/Schedule.test.cpp b/contrib/nest/src/Schedule.test.cpp
new file mode 100644 (file)
index 0000000..f91a72d
--- /dev/null
@@ -0,0 +1,28 @@
+#include "nest/Schedule.h"
+
+#include <gtest/gtest.h>
+
+TEST(SCHEDULE, module)
+{
+  nest::Module m;
+
+  auto var_1 = m.var().make();
+
+  nest::Schedule sch{m};
+
+  ASSERT_EQ(sch.level(var_1).value(), 0);
+}
+
+TEST(SCHEDULE, module_copy)
+{
+  nest::Module m;
+
+  m.var().make();
+
+  nest::Schedule sch{m};
+
+  // Update on 'm' does not affect the schedule
+  m.var().make();
+
+  ASSERT_EQ(sch.var().count(), 1);
+}