1515#include " operation/range.h"
1616#include " core/types.h"
1717#include " utility/debug.h"
18+ #include " utility/hints.h"
1819#include " utility/logging.h"
1920#include " utility/modeling.h"
2021#include " utility/utility.h"
2122
2223namespace nnadapter {
2324namespace operation {
2425
26+ void GetRangeOperandValue (core::Operand* operand, int64_t * data) { // NOLINT
27+ if (IsConstantOperand (operand)) {
28+ *data = reinterpret_cast <int64_t *>(operand->buffer )[0 ];
29+ } else if (IsTemporaryShapeOperand (operand)) {
30+ auto & temporary_shape = *(GetTemporaryShape (operand));
31+ NNADAPTER_CHECK_EQ (temporary_shape.count , 1 );
32+ *data = temporary_shape.data [0 ];
33+ } else {
34+ NNADAPTER_LOG (FATAL) << " Unsupported operand precision"
35+ << OperandPrecisionCodeToString (
36+ operand->type .precision );
37+ }
38+ }
39+
2540int PrepareRange (core::Operation* operation) {
2641 RANGE_OPERATION_EXTRACT_INPUTS_OUTPUTS
2742
@@ -31,19 +46,22 @@ int PrepareRange(core::Operation* operation) {
3146 NNADAPTER_CHECK_EQ (limit_operand->type .dimensions .count , 1 );
3247 NNADAPTER_CHECK_EQ (delta_operand->type .dimensions .count , 1 );
3348
34- if (IsConstantOperand (start_operand) && IsConstantOperand (limit_operand) &&
35- IsConstantOperand (delta_operand)) {
36- auto start_data = reinterpret_cast <float *>(start_operand->buffer )[0 ];
37- auto limit_data = reinterpret_cast <float *>(limit_operand->buffer )[0 ];
38- auto delta_data = reinterpret_cast <float *>(delta_operand->buffer )[0 ];
49+ int64_t start_data, limit_data, delta_data;
50+ start_data = limit_data = delta_data = -1 ;
51+ GetRangeOperandValue (start_operand, &start_data);
52+ GetRangeOperandValue (limit_operand, &limit_data);
53+ GetRangeOperandValue (delta_operand, &delta_data);
54+
55+ output_type.dimensions .count = 1 ;
56+ output_type.precision = start_operand->type .precision ;
57+ output_type.lifetime = NNADAPTER_TEMPORARY_VARIABLE;
58+ if (start_data == NNADAPTER_UNKNOWN || limit_data == NNADAPTER_UNKNOWN ||
59+ delta_data == NNADAPTER_UNKNOWN) {
60+ output_type.dimensions .data [0 ] = NNADAPTER_UNKNOWN;
61+ } else {
3962 output_type.dimensions .data [0 ] =
4063 GetSpanCount (start_data, limit_data, delta_data);
41- } else {
42- output_type.dimensions .data [0 ] = NNADAPTER_UNKNOWN;
4364 }
44- output_type.precision = start_operand->type .precision ;
45- output_type.lifetime = NNADAPTER_TEMPORARY_VARIABLE;
46- output_type.dimensions .count = 1 ;
4765
4866 NNADAPTER_VLOG (5 ) << " output: " << OperandToString (output_operand);
4967 return NNADAPTER_NO_ERROR;
0 commit comments