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