From: 박종현/동작제어Lab(SR)/Staff Engineer/삼성전자 Date: Thu, 9 Aug 2018 23:00:15 +0000 (+0900) Subject: [coco] Implement Op::parent method (#940) X-Git-Tag: nncc_backup~2212 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e19d2ed5776443af166fe7d24ec8fda5d91d9fdc;p=platform%2Fcore%2Fml%2Fnnfw.git [coco] Implement Op::parent method (#940) This commit implements Op::parent method which allows users to retrieve an instruction that owns an operation. Signed-off-by: Jonghyun Park --- diff --git a/contrib/coco/core/include/coco/IR/Op.h b/contrib/coco/core/include/coco/IR/Op.h index d8a6012..83f2ae5 100644 --- a/contrib/coco/core/include/coco/IR/Op.h +++ b/contrib/coco/core/include/coco/IR/Op.h @@ -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 @@ -67,6 +70,12 @@ struct Op template T accept(Visitor &v) const { return accept(&v); } template T accept(Visitor &&v) const { return accept(&v); } + +protected: + virtual void get(const PtrLink **) const = 0; + +public: + Instr *parent(void) const; }; } // namespace coco @@ -94,7 +103,7 @@ public: }; public: - explicit Conv2D(const Param &); + explicit Conv2D(const PtrLink *, const Param &); public: std::set uses(void) const override; @@ -109,6 +118,12 @@ private: public: KernelObject *ker(void) const { return _ker; } void ker(KernelObject *ker); + +private: + const PtrLink *const _op_link; + +private: + void get(const PtrLink **out) const override { *out = _op_link; } }; } // namespace coco diff --git a/contrib/coco/core/src/IR/Op.cpp b/contrib/coco/core/src/IR/Op.cpp index 10fd278..3cee376 100644 --- a/contrib/coco/core/src/IR/Op.cpp +++ b/contrib/coco/core/src/IR/Op.cpp @@ -1,12 +1,28 @@ #include "coco/IR/Op.h" // +// Op +// +#include + +namespace coco +{ +Instr *Op::parent(void) const +{ + const PtrLink *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_link, const Param &) : _op_link{op_link}, _ker{nullptr} { // NOTE Currently, Param class is just a placeholder } diff --git a/contrib/coco/core/src/IR/Op.test.cpp b/contrib/coco/core/src/IR/Op.test.cpp index a1a7590..033c182 100644 --- a/contrib/coco/core/src/IR/Op.test.cpp +++ b/contrib/coco/core/src/IR/Op.test.cpp @@ -5,19 +5,23 @@ TEST(IR_OP_CONV2D, ctor) { + const coco::PtrLink 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 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 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 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; diff --git a/contrib/coco/core/src/IR/OpManager.cpp b/contrib/coco/core/src/IR/OpManager.cpp index 6c3b02c..4754726 100644 --- a/contrib/coco/core/src/IR/OpManager.cpp +++ b/contrib/coco/core/src/IR/OpManager.cpp @@ -12,6 +12,9 @@ OpManager::OpManager(const PtrLink *op_link) : _op_link{op_link} // DO NOTHING } -Conv2D *OpManager::create(const Conv2D::Param ¶m) { return take(make_unique(param)); } +Conv2D *OpManager::create(const Conv2D::Param ¶m) +{ + return take(make_unique(_op_link, param)); +} } // namespace coco