--- /dev/null
+#ifndef _NNC_CORE_IR_MODEL_POOL_H_
+#define _NNC_CORE_IR_MODEL_POOL_H_
+
+#include <vector>
+
+#include "nnc/core/IR/model/operations/operation.h"
+#include "nnc/core/IR/model/operations/common.h"
+
+#include "nncc/core/ADT/tensor/Shape.h"
+
+namespace nncc
+{
+namespace contrib
+{
+namespace core
+{
+namespace IR
+{
+namespace model
+{
+namespace ops
+{
+
+using nncc::core::ADT::tensor::Shape;
+
+class PoolOp : public OpDescription
+{
+public:
+ enum class PoolingType
+ {
+ MAX,
+ AVG,
+ MIN
+ };
+
+ explicit PoolOp(const Shape &windowShape, const Shape &strides, PoolingType poolType,
+ PaddingType padding)
+ : OpDescription(1, 1), _padding(padding), _poolingType(poolType), _strides(strides),
+ _windowShape(windowShape)
+ {
+ _pads.resize(_windowShape.rank());
+ }
+
+ PaddingType getPaddingType() const { return _padding; }
+
+ PoolingType getPoolingType() const { return _poolingType; }
+
+ const Shape &getWindowShape() const { return _windowShape; }
+
+ const Shape &getStrides() const { return _strides; }
+
+ const int getPadding(int dim) const { return _pads[dim]; }
+
+ void setPadding(int dim, int pad) { _pads[dim] = pad; }
+
+private:
+ PaddingType _padding;
+ PoolingType _poolingType;
+ Shape _windowShape;
+ Shape _strides;
+ std::vector<int> _pads;
+};
+
+} // namespace ops
+} // namespace model
+} // namespace IR
+} // namespace core
+} // namespace contrib
+} // namespace nncc
+
+#endif //_NNC_CORE_IR_MODEL_POOL_H_