xref: /aosp_15_r20/external/executorch/backends/qualcomm/aot/wrappers/QuantizeParamsWrapper.cpp (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
1 /*
2  * Copyright (c) Qualcomm Innovation Center, Inc.
3  * All rights reserved.
4  *
5  * This source code is licensed under the BSD-style license found in the
6  * LICENSE file in the root directory of this source tree.
7  */
8 #include <executorch/backends/qualcomm/aot/wrappers/QuantizeParamsWrapper.h>
9 #include <executorch/backends/qualcomm/runtime/Logging.h>
10 namespace executorch {
11 namespace backends {
12 namespace qnn {
CreateQuantizationParamWrapper(const Qnn_QuantizeParams_t & quantization)13 std::unique_ptr<QuantizeParamsWrapper> CreateQuantizationParamWrapper(
14     const Qnn_QuantizeParams_t& quantization) {
15   std::unique_ptr<QuantizeParamsWrapper> quantize_param_wrapper;
16 
17   if (quantization.quantizationEncoding ==
18       QNN_QUANTIZATION_ENCODING_UNDEFINED) {
19     quantize_param_wrapper = std::make_unique<UndefinedQuantizeParamsWrapper>();
20   } else if (
21       quantization.quantizationEncoding ==
22       QNN_QUANTIZATION_ENCODING_AXIS_SCALE_OFFSET) {
23     std::vector<Qnn_ScaleOffset_t> scale_offset(
24         quantization.axisScaleOffsetEncoding.scaleOffset,
25         quantization.axisScaleOffsetEncoding.scaleOffset +
26             quantization.axisScaleOffsetEncoding.numScaleOffsets);
27     quantize_param_wrapper =
28         std::make_unique<AxisScaleOffsetQuantizeParamsWrapper>(
29             quantization.axisScaleOffsetEncoding.axis, scale_offset);
30   } else if (
31       quantization.quantizationEncoding ==
32       QNN_QUANTIZATION_ENCODING_BW_AXIS_SCALE_OFFSET) {
33     std::vector<float> scales(
34         quantization.bwAxisScaleOffsetEncoding.scales,
35         quantization.bwAxisScaleOffsetEncoding.scales +
36             quantization.bwAxisScaleOffsetEncoding.numElements);
37     std::vector<int32_t> offsets(
38         quantization.bwAxisScaleOffsetEncoding.offsets,
39         quantization.bwAxisScaleOffsetEncoding.offsets +
40             quantization.bwAxisScaleOffsetEncoding.numElements);
41 
42     quantize_param_wrapper =
43         std::make_unique<BwAxisScaleOffsetQuantizeParamsWrapper>(
44             quantization.bwAxisScaleOffsetEncoding.bitwidth,
45             quantization.bwAxisScaleOffsetEncoding.axis,
46             quantization.bwAxisScaleOffsetEncoding.numElements,
47             scales,
48             offsets);
49   } else if (
50       quantization.quantizationEncoding ==
51       QNN_QUANTIZATION_ENCODING_BW_SCALE_OFFSET) {
52     quantize_param_wrapper =
53         std::make_unique<BwScaleOffsetQuantizeParamsWrapper>(
54             quantization.bwScaleOffsetEncoding.bitwidth,
55             quantization.bwScaleOffsetEncoding.scale,
56             quantization.bwScaleOffsetEncoding.offset);
57   } else if (
58       quantization.quantizationEncoding ==
59       QNN_QUANTIZATION_ENCODING_SCALE_OFFSET) {
60     quantize_param_wrapper = std::make_unique<ScaleOffsetQuantizeParamsWrapper>(
61         quantization.scaleOffsetEncoding.scale,
62         quantization.scaleOffsetEncoding.offset);
63   } else {
64     QNN_EXECUTORCH_LOG_ERROR(
65         "Unknown the encoding of quantization: %d",
66         quantization.quantizationEncoding);
67   }
68 
69   return quantize_param_wrapper;
70 }
71 } // namespace qnn
72 } // namespace backends
73 } // namespace executorch
74