namespace
{
+// TODO Remove unused code
bool aligned(const coco::FeatureObject *o, const nncc::core::ADT::feature::Layout &l)
{
const auto &shape = o->shape();
return true;
}
+// TODO Remove unused code
bool is_HWC_layout(const coco::FeatureObject *o)
{
return aligned(o, nncc::core::ADT::feature::HWCLayout{});
}
+coco::Copy *make_copy(coco::FeatureObject *from, coco::FeatureObject *into)
+{
+ auto m = from->module();
+ assert(m != nullptr);
+ assert(from->module() == into->module());
+
+ auto copy = m->entity()->instr()->create<coco::Copy>();
+
+ copy->from(from);
+ copy->into(into);
+
+ return copy;
+}
+
class ShuffleGen : public coco::Instr::Mutator
{
public:
private:
coco::FeatureObject *clone(const coco::FeatureObject *oldobj) const;
+ // TODO Remove unused code
coco::Shuffle *create(const coco::FeatureObject *from, const coco::FeatureObject *into) const;
public:
void mutate(coco::UnitF *unit) override;
void mutate(coco::Shuffle *) override;
+ void mutate(coco::Copy *) override;
private:
coco::Module *const _module;
return newobj;
}
+// TODO Remove unused code
coco::Shuffle *ShuffleGen::create(const coco::FeatureObject *oldobj,
const coco::FeatureObject *newobj) const
{
// shuffle->at(ElemID{n}) = m[ElemID{n}];
#endif
{
- if (!is_HWC_layout(unit->ifm()))
+ if (unit->ifm()->layout()->id() != coco::FeatureLayouts::BHWC::uid())
{
auto oldobj = unit->ifm();
auto newobj = clone(oldobj);
- auto shuffle = create(oldobj, newobj);
- shuffle->insertBefore(unit);
-
unit->ifm(newobj);
+
+ auto copy = make_copy(oldobj, newobj);
+ copy->insertBefore(unit);
}
- if (!is_HWC_layout(unit->ofm()))
+ if (unit->ofm()->layout()->id() != coco::FeatureLayouts::BHWC::uid())
{
auto oldobj = unit->ofm();
auto newobj = clone(oldobj);
- auto shuffle = create(newobj, oldobj);
- shuffle->insertAfter(unit);
-
unit->ofm(newobj);
+
+ auto copy = make_copy(newobj, oldobj);
+ copy->insertAfter(unit);
}
}
// DO NOTHING
}
+void ShuffleGen::mutate(coco::Copy *)
+{
+ // DO NOTHING
+}
+
} // namespace
namespace enco