--- /dev/null
+#ifndef __COCO_IR_INSTR_MANAGER_H__
+#define __COCO_IR_INSTR_MANAGER_H__
+
+#include "coco/IR/Instr.h"
+
+#include "coco/ADT/PtrManager.h"
+
+namespace coco
+{
+
+class InstrManager final : public PtrManager<Instr>
+{
+public:
+ InstrManager(const PtrLink<Instr, Block> *instr_link) : _instr_link{instr_link}
+ {
+ // DO NOTHING
+ }
+
+public:
+ template<typename OpImpl> UnitF<OpImpl> *createF(void);
+
+private:
+ const PtrLink<Instr, Block> * const _instr_link;
+};
+
+} // namespace coco
+
+#endif // __COCO_IR_INPUT_MANAGER_H__
--- /dev/null
+#include "coco/IR/InstrManager.h"
+
+#include "coco/IR/Op.h"
+
+#include <nncc/foundation/Memory.h>
+
+namespace coco
+{
+
+template<> UnitF<Conv2D> *InstrManager::createF()
+{
+ return take(nncc::foundation::make_unique<UnitF<Conv2D>>(_instr_link));
+}
+
+} // namespace coco
--- /dev/null
+#include "coco/IR/InstrManager.h"
+#include "coco/IR/Op.h"
+
+#include <gtest/gtest.h>
+
+TEST(IR_INSTR_MANAGER, create_UnitF)
+{
+ coco::PtrLink<coco::Instr, coco::Block> link;
+ coco::InstrManager mgr{&link};
+
+ // Conv2D
+ {
+ auto ins = mgr.createF<coco::Conv2D>();
+ ASSERT_NE(ins, nullptr);
+ }
+}