[enco] Introduce PadInstrBuilder (#1825)
author박종현/동작제어Lab(SR)/Staff Engineer/삼성전자 <jh1302.park@samsung.com>
Thu, 11 Oct 2018 03:59:29 +0000 (12:59 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Thu, 11 Oct 2018 03:59:29 +0000 (12:59 +0900)
This commit extracts PadF instruction generation routine as
PadInstrBuilder class, and simplifies AvgPoolRewritePass using it.

Signed-off-by: Jonghyun Park <jh1302.park@samsung.com>
contrib/enco/core/src/Transforms/AvgPoolLowering.cpp

index afbad10..cb20aeb 100644 (file)
@@ -74,6 +74,48 @@ ShapeTransform::Pad shape_xform(const coco::Padding2D *pad) { return ShapeTransf
 
 } // namespace
 
+namespace
+{
+
+class PadInstrBuilder final
+{
+public:
+  PadInstrBuilder(const coco::Padding2D *pad) : _pad{pad}
+  {
+    // DO NOTHING
+  }
+
+public:
+  coco::Instr *build(coco::FeatureObject *ifm_obj, coco::FeatureObject *ofm_obj) const
+  {
+    assert(ifm_obj->module() == ofm_obj->module());
+    auto m = ifm_obj->module();
+    assert(m != nullptr);
+
+    auto pad_op = m->entity()->op()->create<coco::PadF>();
+
+    pad_op->pad()->top(_pad->top());
+    pad_op->pad()->bottom(_pad->bottom());
+    pad_op->pad()->left(_pad->left());
+    pad_op->pad()->right(_pad->right());
+
+    auto pad_instr = m->entity()->instr()->create<coco::UnitF>();
+
+    pad_instr->ifm(ifm_obj);
+    pad_instr->ofm(ofm_obj);
+    pad_instr->op(pad_op);
+
+    return pad_instr;
+  }
+
+private:
+  const coco::Padding2D *_pad;
+};
+
+PadInstrBuilder pad_instr_builder(const coco::Padding2D *pad) { return PadInstrBuilder{pad}; }
+
+} // namespace
+
 namespace enco
 {
 
@@ -111,18 +153,7 @@ void AvgPoolRewritePass::runOnModule(coco::Module *m) const
               pad_obj->bag(pad_bag);
               pad_obj->layout(coco::FeatureLayouts::BHWC::create(pad_shape));
 
-              auto pad_op = m->entity()->op()->create<coco::PadF>();
-
-              pad_op->pad()->top(avgpool->pad()->top());
-              pad_op->pad()->bottom(avgpool->pad()->bottom());
-              pad_op->pad()->left(avgpool->pad()->left());
-              pad_op->pad()->right(avgpool->pad()->right());
-
-              auto pad_instr = m->entity()->instr()->create<coco::UnitF>();
-
-              pad_instr->ifm(ifm_obj);
-              pad_instr->ofm(pad_obj);
-              pad_instr->op(pad_op);
+              auto pad_instr = pad_instr_builder(avgpool->pad()).build(ifm_obj, pad_obj);
 
               // Insert PadF before AvgPool2D
               pad_instr->insertBefore(unit);