ONE - On-device Neural Engine
Loading...
Searching...
No Matches
luci::CircleConstNodeBuilder Class Reference

Builder creates CircleConst node from Tensor with buffer. More...

#include <CircleConst.h>

Collaboration diagram for luci::CircleConstNodeBuilder:

Public Member Functions

CircleNodebuild (TensorIndex tensor_index, GraphBuilderContext *ctx) const final
 
- Public Member Functions inherited from luci::TypedNodeBuilder< NodeBuilderType::BUFFER >
NodeBuilderType builder_type () const final
 
- Public Member Functions inherited from luci::NodeBuilderBase
virtual ~NodeBuilderBase ()=default
 

Detailed Description

Builder creates CircleConst node from Tensor with buffer.

Definition at line 30 of file CircleConst.h.

Member Function Documentation

◆ build()

CircleNode * luci::CircleConstNodeBuilder::build ( TensorIndex  tensor_index,
GraphBuilderContext ctx 
) const
finalvirtual

Implements luci::NodeBuilderBase.

Definition at line 146 of file CircleConst.cpp.

148{
149 assert(tensor_index >= 0);
150 LOGGER(l);
151
152 auto graph = context->graph();
153 auto reader = context->reader();
154 const auto tensors = reader->tensors();
155 const auto const_tensor = tensors[tensor_index];
156 assert(const_tensor != nullptr);
157 if (const_tensor->is_variable())
158 {
159 // Create CircleVariable for variable
160 return nullptr;
161 }
162
163 const auto r_buffers = reader->buffers();
164 const auto c_buffer = const_tensor->buffer();
165 const auto r_buffer = r_buffers[c_buffer];
166 assert(r_buffer != nullptr);
167 if (r_buffer->offset() == 1 || r_buffer->size() == 1)
168 {
169 // NOTE this shouldn't happen
170 throw std::runtime_error("CircleConst: Circle file with invalid extended Buffer.");
171 }
172 // temporary buffer to provide raw data from file
173 // must have life time same or longer than 'buffer' variable
174 std::vector<uint8_t> temp_buffer;
175 luci::VectorWrapper<uint8_t> buffer(nullptr);
176 if (r_buffer->offset() > 1)
177 {
178 if (r_buffer->size() >= std::numeric_limits<uint32_t>::max())
179 {
180 // NOTE uint32_t limit is to match "uoffset_t flatbuffers::Vector::size()"
181 throw std::runtime_error("CircleConst: Circle file with invalid extended Buffer.");
182 }
183 uint32_t r_size = static_cast<uint32_t>(r_buffer->size());
184 // match binary level to flatbuffers::Vector
185 temp_buffer.resize(r_size + sizeof(uint32_t));
186
187 uint8_t *t_data = temp_buffer.data();
188 const uint8_t *f_data = reader->file_data(r_buffer->offset());
189 if (f_data == nullptr)
190 {
191 // NOTE this shouldn't happen
192 assert(false);
193 return nullptr;
194 }
195 memcpy(t_data, &r_size, sizeof(r_size));
196 t_data = t_data + sizeof(r_size);
197 if (r_buffer->offset() + r_buffer->size() > reader->file_size())
198 {
199 // NOTE this shouldn't happen
200 assert(false);
201 return nullptr;
202 }
203 memcpy(t_data, f_data, r_buffer->size());
204
206 const fbv_t *v_data = reinterpret_cast<const fbv_t *>(temp_buffer.data());
207 buffer = wrap(v_data);
208
209 context->ext_buffer(true);
210 }
211 else
212 {
213 buffer = wrap(r_buffer->data());
214 }
215 const auto const_dims = wrap(const_tensor->shape()); // in NHWC
216 if (const_dims.size() == 0 && buffer.empty())
217 {
218 // unknown shape tensor and scalar tensor
219 return nullptr;
220 }
221
222 // if tensor_index is used as output to some other operator, this is not a constant
223 auto tensoroutputs = context->tensoroutputs();
224 if (tensoroutputs->find(tensor_index))
225 {
226 // other operator output tensor
227 return nullptr;
228 }
229
231 for (uint32_t r = 0; r < const_dims.size(); ++r)
232 {
234 }
235
236 if (buffer.empty() && num_elements > 0)
237 {
238 // normal empty tensor
239 return nullptr;
240 }
241
242 auto const_node = graph->nodes()->create<CircleConst>();
244 const_node->shape_status(luci::ShapeStatus::VALID);
245 INFO(l) << "[luci] NodeFinder const_node(" << tensor_index << ") -> " << const_node << " "
246 << const_dims << std::endl;
247 if (num_elements > 0)
248 {
249 switch (luci_datatype(const_tensor->type()))
250 {
251 case loco::DataType::FLOAT32:
252 copy_data<loco::DataType::FLOAT32>(buffer, num_elements, const_node);
253 break;
254
255 case loco::DataType::FLOAT16:
256 copy_data<loco::DataType::FLOAT16>(buffer, num_elements, const_node);
257 break;
258
259 case loco::DataType::U4:
260 copy_data_4<loco::DataType::U4>(buffer, num_elements, const_node);
261 break;
262
263 case loco::DataType::U8:
264 copy_data<loco::DataType::U8>(buffer, num_elements, const_node);
265 break;
266
267 case loco::DataType::S4:
268 copy_data_4<loco::DataType::S4>(buffer, num_elements, const_node);
269 break;
270
271 case loco::DataType::S8:
272 copy_data<loco::DataType::S8>(buffer, num_elements, const_node);
273 break;
274
275 case loco::DataType::S16:
276 copy_data<loco::DataType::S16>(buffer, num_elements, const_node);
277 break;
278
279 case loco::DataType::S32:
280 copy_data<loco::DataType::S32>(buffer, num_elements, const_node);
281 break;
282
283 case loco::DataType::S64:
284 copy_data<loco::DataType::S64>(buffer, num_elements, const_node);
285 break;
286
287 case loco::DataType::BOOL:
288 copy_data<loco::DataType::BOOL>(buffer, num_elements, const_node);
289 break;
290
291 case loco::DataType::STRING:
292 copy_data<loco::DataType::STRING>(buffer, num_elements, const_node);
293 break;
294
295 default:
296 throw oops::UserExn("Unsupported tensor type",
297 circle::EnumNameTensorType(const_tensor->type()));
298 }
299 }
300
301 return const_node;
302}
#define LOGGER(name)
Definition Log.h:65
#define INFO(name)
Definition Log.h:68
Class to build tensor data.
Definition CircleConst.h:35
Wrapper to use flatbuffers::Vector pointer as std::vector entity.
Exception to user.
Definition UserExn.h:42
loco::DataType luci_datatype(circle::TensorType type)
void copy_tensor_attributes(const circle::Tensor *tensor, CircleNode *node)
Copy common tensor attributes such as name, type, etc. to node.
T must_cast(loco::Node *node)
VectorWrapper< T > wrap(const flatbuffers::Vector< T > *vec)
uint32_t num_elements(const Shape &shape)
The number of elements of a feature map of a given shape.
Definition Shape.h:59

References luci::copy_tensor_attributes(), luci::VectorWrapper< T >::empty(), luci::GraphBuilderContext::ext_buffer(), luci::GraphBuilderContext::graph(), INFO, LOGGER, luci::luci_datatype(), luci::must_cast(), luci::GraphBuilderContext::reader(), luci::CircleNode::shape_status(), luci::GraphBuilderContext::tensoroutputs(), luci::CircleReader::tensors(), luci::VALID, and luci::wrap().


The documentation for this class was generated from the following files: