[coco] Implement Op::parent method (#940)
author박종현/동작제어Lab(SR)/Staff Engineer/삼성전자 <jh1302.park@samsung.com>
Thu, 9 Aug 2018 23:00:15 +0000 (08:00 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Thu, 9 Aug 2018 23:00:15 +0000 (08:00 +0900)
This commit implements Op::parent method which allows users to retrieve
an instruction that owns an operation.

Signed-off-by: Jonghyun Park <jh1302.park@samsung.com>
contrib/coco/core/include/coco/IR/Op.h
contrib/coco/core/src/IR/Op.cpp
contrib/coco/core/src/IR/Op.test.cpp
contrib/coco/core/src/IR/OpManager.cpp

index d8a6012..83f2ae5 100644 (file)
@@ -2,6 +2,9 @@
 #define __COCO_IR_OP_H__
 
 #include "coco/IR/Object.forward.h"
+#include "coco/IR/Instr.forward.h"
+
+#include "coco/ADT/PtrLink.h"
 
 #include <set>
 
@@ -67,6 +70,12 @@ struct Op
 
   template <typename T> T accept(Visitor<T> &v) const { return accept(&v); }
   template <typename T> T accept(Visitor<T> &&v) const { return accept(&v); }
+
+protected:
+  virtual void get(const PtrLink<Op, Instr> **) const = 0;
+
+public:
+  Instr *parent(void) const;
 };
 
 } // namespace coco
@@ -94,7 +103,7 @@ public:
   };
 
 public:
-  explicit Conv2D(const Param &);
+  explicit Conv2D(const PtrLink<Op, Instr> *, const Param &);
 
 public:
   std::set<Object *> uses(void) const override;
@@ -109,6 +118,12 @@ private:
 public:
   KernelObject *ker(void) const { return _ker; }
   void ker(KernelObject *ker);
+
+private:
+  const PtrLink<Op, Instr> *const _op_link;
+
+private:
+  void get(const PtrLink<Op, Instr> **out) const override { *out = _op_link; }
 };
 
 } // namespace coco
index 10fd278..3cee376 100644 (file)
@@ -1,12 +1,28 @@
 #include "coco/IR/Op.h"
 
 //
+// Op
+//
+#include <cassert>
+
+namespace coco
+{
+Instr *Op::parent(void) const
+{
+  const PtrLink<Op, Instr> *op_link = nullptr;
+  get(&op_link);
+  assert(op_link != nullptr);
+
+  return op_link->find(this);
+}
+} // namespace coco
+//
 // Conv2D
 //
 namespace coco
 {
 
-Conv2D::Conv2D(const Param &) : _ker{nullptr}
+Conv2D::Conv2D(const PtrLink<Op, Instr> *op_link, const Param &) : _op_link{op_link}, _ker{nullptr}
 {
   // NOTE Currently, Param class is just a placeholder
 }
index a1a7590..033c182 100644 (file)
@@ -5,19 +5,23 @@
 
 TEST(IR_OP_CONV2D, ctor)
 {
+  const coco::PtrLink<coco::Op, coco::Instr> op_link;
   const coco::Conv2D::Param param{};
-  const coco::Conv2D op{param};
+  const coco::Conv2D op{&op_link, param};
 
   // ker() should be initialized as nullptr on construction
   ASSERT_EQ(op.ker(), nullptr);
 
   // uses() should be empty on construction
   ASSERT_EQ(op.uses().size(), 0);
+  // parent() should be nullptr on construction
+  ASSERT_EQ(op.parent(), nullptr);
 }
 
 TEST(IR_OP_CONV2D, asConv2D)
 {
-  coco::Conv2D op{coco::Conv2D::Param{}};
+  const coco::PtrLink<coco::Op, coco::Instr> op_link;
+  coco::Conv2D op{&op_link, coco::Conv2D::Param{}};
 
   coco::Op *mutable_base = &op;
   const coco::Op *immutable_base = &op;
@@ -47,8 +51,9 @@ TEST(IR_OP_CONV2D, ker_update)
   auto obj = obj_mgr.create(nncc::core::ADT::kernel::Shape{1, 1, 3, 3});
 
   // Test 'Conv2D' class
+  const coco::PtrLink<coco::Op, coco::Instr> op_link;
   const coco::Conv2D::Param param{};
-  coco::Conv2D op{param};
+  coco::Conv2D op{&op_link, param};
 
   op.ker(obj);
   ASSERT_EQ(op.ker(), obj);
@@ -64,8 +69,9 @@ TEST(IR_OP_CONV2D, ker_update)
 TEST(IR_OP_CONV2D, accept)
 {
   // Test 'Conv2D' class
+  const coco::PtrLink<coco::Op, coco::Instr> op_link;
   const coco::Conv2D::Param param{};
-  coco::Conv2D op{param};
+  coco::Conv2D op{&op_link, param};
 
   coco::Conv2D *mutable_ptr = &op;
   const coco::Conv2D *immutable_ptr = &op;
index 6c3b02c..4754726 100644 (file)
@@ -12,6 +12,9 @@ OpManager::OpManager(const PtrLink<Op, Instr> *op_link) : _op_link{op_link}
   // DO NOTHING
 }
 
-Conv2D *OpManager::create(const Conv2D::Param &param) { return take(make_unique<Conv2D>(param)); }
+Conv2D *OpManager::create(const Conv2D::Param &param)
+{
+  return take(make_unique<Conv2D>(_op_link, param));
+}
 
 } // namespace coco