aboutsummaryrefslogtreecommitdiff
path: root/reference_model/src/ops/type_conversion.cc
diff options
context:
space:
mode:
Diffstat (limited to 'reference_model/src/ops/type_conversion.cc')
-rw-r--r--reference_model/src/ops/type_conversion.cc56
1 files changed, 46 insertions, 10 deletions
diff --git a/reference_model/src/ops/type_conversion.cc b/reference_model/src/ops/type_conversion.cc
index 5dbc7bd..d58cfeb 100644
--- a/reference_model/src/ops/type_conversion.cc
+++ b/reference_model/src/ops/type_conversion.cc
@@ -35,7 +35,7 @@ template <int Rank, TOSA_REF_TYPE InDtype, TOSA_REF_TYPE OutDtype>
OpRescale<Rank, InDtype, OutDtype>::OpRescale(SubgraphTraverser* sgt_, TosaAttributeBase* attribute_, uint64_t id_)
: GraphNode(sgt_, Op_RESCALE, id_)
{
- setRequiredOperands(1, 1);
+ setRequiredOperands(3, 1);
INIT_ATTRIBUTE(Rescale);
}
@@ -68,6 +68,20 @@ int OpRescale<Rank, InDtype, OutDtype>::checkTensorAttributes()
ASSERT_MEM(in && out);
+ multiplierI32 = dynamic_cast<TosaReference::TensorTemplate<TMultiplierI32>*>(inputs[1]);
+ multiplierI16 = dynamic_cast<TosaReference::TensorTemplate<TMultiplierI16>*>(inputs[1]);
+ shift = dynamic_cast<TosaReference::TensorTemplate<TShift>*>(inputs[2]);
+ ASSERT_MEM(shift);
+
+ if (attribute->scale32())
+ {
+ ASSERT_MEM(multiplierI32);
+ }
+ else
+ {
+ ASSERT_MEM(multiplierI16);
+ }
+
if ((InDtype != TOSA_REF_TYPE_INT8) && (InDtype != TOSA_REF_TYPE_UINT8) && (InDtype != TOSA_REF_TYPE_UINT16) &&
(attribute->input_zp() != 0))
{
@@ -124,15 +138,15 @@ static int64_t zero_extend(int16_t val)
template <int Rank, TOSA_REF_TYPE InDtype, TOSA_REF_TYPE OutDtype>
int OpRescale<Rank, InDtype, OutDtype>::eval()
{
- int32_t input_zp = attribute->input_zp();
- int32_t output_zp = attribute->output_zp();
- std::vector<int32_t> multiplier = attribute->multiplier();
- std::vector<int32_t> shift = attribute->shift();
- bool scale32 = attribute->scale32();
- bool double_round = attribute->double_round();
- bool per_channel = attribute->per_channel();
- bool input_unsigned = attribute->input_unsigned();
- bool output_unsigned = attribute->output_unsigned();
+ int32_t input_zp = attribute->input_zp();
+ int32_t output_zp = attribute->output_zp();
+ std::vector<int32_t> multiplier;
+ std::vector<int32_t> shift;
+ bool scale32 = attribute->scale32();
+ bool double_round = attribute->double_round();
+ bool per_channel = attribute->per_channel();
+ bool input_unsigned = attribute->input_unsigned();
+ bool output_unsigned = attribute->output_unsigned();
// reshape [d0, d1, ..., dn] into [d0 * d1 ..., dn]
Eigen::array<Eigen::Index, 2> shape_2d;
@@ -153,6 +167,28 @@ int OpRescale<Rank, InDtype, OutDtype>::eval()
ETensor2<OutEigenType> output_2d(shape_2d);
+ if (scale32)
+ {
+ auto multiplier_val = this->multiplierI32->getTensor();
+ for (int i = 0; i < multiplier_val.size(); i++)
+ {
+ multiplier.push_back(static_cast<int32_t>(multiplier_val(i)));
+ }
+ }
+ else
+ {
+ auto multiplier_val = this->multiplierI16->getTensor();
+ for (int i = 0; i < multiplier_val.size(); i++)
+ {
+ multiplier.push_back(static_cast<int32_t>(multiplier_val(i)));
+ }
+ }
+ auto shift_val = this->shift->getTensor();
+ for (int i = 0; i < shift_val.size(); i++)
+ {
+ shift.push_back(static_cast<int32_t>(shift_val(i)));
+ }
+
if (per_channel)
{
ETensor2<InEigenType> curr_channel_slice_prescaled;