summaryrefslogtreecommitdiff
path: root/runtimes/pure_arm_compute/src/internal/op/DepthwiseConv2D.h
blob: c63e30aae3728ee7cb4df9144ce0e450e77fcc6f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
/*
 * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @file    DepthwiseConv2D.h
 * @ingroup COM_AI_RUNTIME
 * @brief   This file defines internal::tflite::op::DepthwiseConv2D Param structs
 *          and internal::tflite::op::DepthwiseConv2D Node classes
 */
#ifndef __INTERNAL_OP_DEPTHWISE_CONV_2D_H__
#define __INTERNAL_OP_DEPTHWISE_CONV_2D_H__

#include "internal/op/Node.h"

#include <cstdint>

namespace internal
{
namespace tflite
{
namespace op
{
namespace DepthwiseConv2D
{
namespace Explicit
{

/**
 * @brief Struct to have indexes for explicit padding DepthwiseConv2D operation parameter
 */
struct Param
{
  int32_t ofm_index; /**< Index of output feature map */

  int32_t ifm_index;  /**< Index of input feature map */
  int32_t ker_index;  /**< Index of kernel */
  int32_t bias_index; /**< Index of bias */

  int32_t hstride_index; /**< Index of horizontal stride */
  int32_t vstride_index; /**< Index of vertical stride */

  int32_t padding_left_index;   /**< Index of padding left */
  int32_t padding_right_index;  /**< Index of padding right */
  int32_t padding_top_index;    /**< Index of padding top */
  int32_t padding_bottom_index; /**< Index of padding bottom */

  int32_t multipler_index;  /**< Index of multipler */
  int32_t activation_index; /**< Index of activation */
  /**
   * @brief Construct as default
   */
  Param() = default;
  /**
   * @brief Construct a new Param object with params
   * @param[in] inputCount  Count of inputs
   * @param[in] inputs      Pointer of inputs
   * @param[in] outputCount Count of outputs
   * @param[in] outputs     Pointer of outputs
   */
  Param(uint32_t inputCount, const uint32_t *inputs, uint32_t outputCount, const uint32_t *outputs);
};

/**
 * @brief Class to represent an explicit padding DepthwiseConv2D operation of data structure
 */
class Node final : public op::Node
{
public:
  /**
   * @brief Construct a new Node object with param
   * @param[in] param Param object that makes up a Node
   */
  Node(const Param &param) : _param(param)
  {
    // DO NOTHING
  }

public:
  /**
   * @brief Destruct as default
   */
  virtual ~Node() = default;

public:
  /**
   * @brief  Get a reference of Param object
   * @return Reference of Param object
   */
  const Param &param(void) const { return _param; }

public:
  /**
   * @brief Visit this Node by NodeVisitor
   * @param[in] v Visitor
   * @return N/A
   */
  void accept(NodeVisitor &&) const override;

private:
  const Param _param;
};

} // namespace Explicit

/**
 * @brief Struct to have indexes for implicit padding DepthwiseConv2D operation parameter
 */
namespace Implicit
{

struct Param
{
  int32_t ofm_index; /**< Index of output feature map */

  int32_t ifm_index;  /**< Index of input feature map */
  int32_t ker_index;  /**< Index of kernel */
  int32_t bias_index; /**< Index of bias */

  int32_t hstride_index; /**< Index of horizontal stride */
  int32_t vstride_index; /**< Index of vertical stride */

  int32_t padding_index;    /**< Index of padding */
  int32_t multipler_index;  /**< Index of multipler */
  int32_t activation_index; /**< Index of activation */
  /**
   * @brief Construct as default
   */
  Param() = default;
  /**
   * @brief Construct a new Param object with params
   * @param[in] inputCount  Count of inputs
   * @param[in] inputs      Pointer of inputs
   * @param[in] outputCount Count of outputs
   * @param[in] outputs     Pointer of outputs
   */
  Param(uint32_t inputCount, const uint32_t *inputs, uint32_t outputCount, const uint32_t *outputs);
};

/**
 * @brief Class to represent an implicit padding DepthwiseConv2D operation of data structure
 */
class Node final : public op::Node
{
public:
  /**
   * @brief Construct a new Node object with param
   * @param[in] param Param object that makes up a Node
   */
  Node(const Param &param) : _param(param)
  {
    // DO NOTHING
  }

public:
  /**
   * @brief Destruct as default
   */
  virtual ~Node() = default;

public:
  /**
   * @brief  Get a reference of Param object
   * @return Reference of Param object
   */
  const Param &param(void) const { return _param; }

public:
  /**
   * @brief Visit this Node by NodeVisitor
   * @param[in] v Visitor
   * @return N/A
   */
  void accept(NodeVisitor &&) const override;

private:
  const Param _param;
};

} // namespace Implicit
} // namespace DepthwiseConv2D
} // namespace op
} // namespace tflite
} // namespace internal

#endif // __INTERNAL_OP_CONV_2D_H__