--- /dev/null
+#ifndef __NNCC_CORE_ADT_FEATURE_HWC_LAYOUT_H__
+#define __NNCC_CORE_ADT_FEATURE_HWC_LAYOUT_H__
+
+#include "nncc/core/ADT/feature/Layout.h"
+
+namespace nncc
+{
+namespace core
+{
+namespace ADT
+{
+namespace feature
+{
+
+struct HWCLayout final : public Layout
+{
+ HWCLayout();
+};
+
+} // namespace feature
+} // namespace ADT
+} // namespace core
+} // namespace nncc
+
+#endif // __NNCC_CORE_ADT_FEATURE_HWC_LAYOUT_H__
--- /dev/null
+#include "nncc/core/ADT/feature/HWCLayout.h"
+
+using nncc::core::ADT::feature::Shape;
+
+static uint32_t HWC_offset(const Shape &shape, uint32_t ch, uint32_t row, uint32_t col)
+{
+ return (row * shape.width() + col) * shape.depth() + ch;
+}
+
+namespace nncc
+{
+namespace core
+{
+namespace ADT
+{
+namespace feature
+{
+
+HWCLayout::HWCLayout() : Layout{HWC_offset}
+{
+ // DO NOTHING
+}
+
+} // namespace feature
+} // namespace ADT
+} // namespace core
+} // namespace nncc
--- /dev/null
+#include "nncc/core/ADT/feature/HWCLayout.h"
+
+#include <gtest/gtest.h>
+
+using namespace nncc::core::ADT::feature;
+
+TEST(ADT_FEATURE_HWC_LAYOUT, C_increase)
+{
+ const uint32_t C = 4;
+ const uint32_t H = 3;
+ const uint32_t W = 6;
+
+ const Shape shape{C, H, W};
+ const HWCLayout l;
+
+ ASSERT_EQ(l.offset(shape, 1, 1, 1) + 1, l.offset(shape, 2, 1, 1));
+}
+
+TEST(ADT_FEATURE_HWC_LAYOUT, W_increase)
+{
+ const uint32_t C = 4;
+ const uint32_t H = 3;
+ const uint32_t W = 6;
+
+ const Shape shape{C, H, W};
+ const HWCLayout l;
+
+ ASSERT_EQ(l.offset(shape, 1, 2, 1) + C, l.offset(shape, 1, 2, 2));
+}
+
+TEST(ADT_FEATURE_HWC_LAYOUT, H_increase)
+{
+ const uint32_t C = 4;
+ const uint32_t H = 3;
+ const uint32_t W = 6;
+
+ const Shape shape{C, H, W};
+ const HWCLayout l;
+
+ ASSERT_EQ(l.offset(shape, 1, 1, 1) + W * C, l.offset(shape, 1, 2, 1));
+}