From 680cef208b929a696bf24fe3a889d2196d25cc4e Mon Sep 17 00:00:00 2001 From: =?utf8?q?=EB=B0=95=EC=A2=85=ED=98=84/=EB=8F=99=EC=9E=91=EC=A0=9C?= =?utf8?q?=EC=96=B4Lab=28SR=29/Staff=20Engineer/=EC=82=BC=EC=84=B1?= =?utf8?q?=EC=A0=84=EC=9E=90?= Date: Wed, 1 Aug 2018 08:47:11 +0900 Subject: [PATCH] [nest] Add 'Schedule' class (#847) 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 --- contrib/nest/include/nest/Schedule.h | 36 ++++++++++++++++++++++++++++++++++++ contrib/nest/src/Schedule.cpp | 35 +++++++++++++++++++++++++++++++++++ contrib/nest/src/Schedule.test.cpp | 28 ++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 contrib/nest/include/nest/Schedule.h create mode 100644 contrib/nest/src/Schedule.cpp create mode 100644 contrib/nest/src/Schedule.test.cpp diff --git a/contrib/nest/include/nest/Schedule.h b/contrib/nest/include/nest/Schedule.h new file mode 100644 index 0000000..fb1aaef --- /dev/null +++ b/contrib/nest/include/nest/Schedule.h @@ -0,0 +1,36 @@ +#ifndef __NEST_SCHEDULE_H__ +#define __NEST_SCHEDULE_H__ + +#include "nest/Module.h" +#include "nest/Level.h" + +#include + +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 _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 index 0000000..593263e --- /dev/null +++ b/contrib/nest/src/Schedule.cpp @@ -0,0 +1,35 @@ +#include "nest/Schedule.h" + +#include +#include + +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 index 0000000..f91a72d --- /dev/null +++ b/contrib/nest/src/Schedule.test.cpp @@ -0,0 +1,28 @@ +#include "nest/Schedule.h" + +#include + +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); +} -- 2.7.4