diff options
author | TatWai Chong <tatwai.chong@arm.com> | 2023-01-28 20:43:14 -0800 |
---|---|---|
committer | TatWai Chong <tatwai.chong@arm.com> | 2023-02-02 18:55:33 +0000 |
commit | a0bf7c4fb3456b305fc7696967104270efa82875 (patch) | |
tree | 3b29add7dee92174fe7bea443831bf978092c6f8 /src | |
parent | e1dcee57d8f89cd192411bbec9e8a97b26833bb7 (diff) | |
download | tosa_mlir_translator-a0bf7c4fb3456b305fc7696967104270efa82875.tar.gz |
Switch ArrayAttr to DenseArrayAttr
Align with mlir commits:
9e1a344155c0b78be46348b94cae635b7305326c
11030c7d67a7ac0b469e3fbc53dd7a09b47792c9
Change-Id: I5be0fc084fabc1057a39127b67a1ee9a55e5079f
Signed-off-by: TatWai Chong <tatwai.chong@arm.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/TosaSerialize.cpp | 180 |
1 files changed, 41 insertions, 139 deletions
diff --git a/src/TosaSerialize.cpp b/src/TosaSerialize.cpp index 51923ea..ead54f1 100644 --- a/src/TosaSerialize.cpp +++ b/src/TosaSerialize.cpp @@ -202,6 +202,19 @@ TosaSerializationOperatorBuilder::GetTensorName(mlir::Value val) const { assert(0); } +// Unpack 64-bit integer attribute element and pack into a std vector. +template <class T> +static std::vector<T> getDenseI64ArrayAttr(mlir::Attribute attr) { + auto array_ref = attr.cast<mlir::DenseI64ArrayAttr>().asArrayRef(); + + std::vector<T> vec; + for (auto val : array_ref) { + vec.push_back(val); + } + + return vec; +} + // Main template to catch unimplemented translation. template <typename T> TosaSerializationOperator * @@ -225,26 +238,13 @@ TosaSerializationOperatorBuilder::build(mlir::Operation &op) const { TosaSerializationOperator * TosaSerializationOperatorBuilder::BuildPoolOpFromMlirOp(mlir::Operation &op, Op opcode) const { - std::vector<int> pad, stride, kernel; - - auto pad_attr = op.getAttr("pad").dyn_cast<mlir::ArrayAttr>().getValue(); - for (auto &int_attr : pad_attr) { - pad.push_back(int_attr.dyn_cast<mlir::IntegerAttr>().getInt()); - } + auto pad = getDenseI64ArrayAttr<int>(op.getAttr("pad")); ASSERT_VECTOR_LENGTH(pad, 4); - auto stride_attr = - op.getAttr("stride").dyn_cast<mlir::ArrayAttr>().getValue(); - for (auto &int_attr : stride_attr) { - stride.push_back(int_attr.dyn_cast<mlir::IntegerAttr>().getInt()); - } + auto stride = getDenseI64ArrayAttr<int>(op.getAttr("stride")); ASSERT_VECTOR_LENGTH(stride, 2); - auto kernel_attr = - op.getAttr("kernel").dyn_cast<mlir::ArrayAttr>().getValue(); - for (auto &int_attr : kernel_attr) { - kernel.push_back(int_attr.dyn_cast<mlir::IntegerAttr>().getInt()); - } + auto kernel = getDenseI64ArrayAttr<int>(op.getAttr("kernel")); ASSERT_VECTOR_LENGTH(kernel, 2); std::string input_name = GetTensorName(op.getOperand(0)); @@ -549,26 +549,13 @@ template <> TosaSerializationOperator * TosaSerializationOperatorBuilder::build<mlir::tosa::Conv2DOp>( mlir::Operation &op) const { - std::vector<int> pad, stride, dilation; - - auto pad_attr = op.getAttr("pad").dyn_cast<mlir::ArrayAttr>().getValue(); - for (auto &int_attr : pad_attr) { - pad.push_back(int_attr.dyn_cast<mlir::IntegerAttr>().getInt()); - } + auto pad = getDenseI64ArrayAttr<int>(op.getAttr("pad")); ASSERT_VECTOR_LENGTH(pad, 4); - auto stride_attr = - op.getAttr("stride").dyn_cast<mlir::ArrayAttr>().getValue(); - for (auto &int_attr : stride_attr) { - stride.push_back(int_attr.dyn_cast<mlir::IntegerAttr>().getInt()); - } + auto stride = getDenseI64ArrayAttr<int>(op.getAttr("stride")); ASSERT_VECTOR_LENGTH(stride, 2); - auto dilation_attr = - op.getAttr("dilation").dyn_cast<mlir::ArrayAttr>().getValue(); - for (auto &int_attr : dilation_attr) { - dilation.push_back(int_attr.dyn_cast<mlir::IntegerAttr>().getInt()); - } + auto dilation = getDenseI64ArrayAttr<int>(op.getAttr("dilation")); ASSERT_VECTOR_LENGTH(dilation, 2); std::string input0_name = GetTensorName(op.getOperand(0)); @@ -600,26 +587,13 @@ template <> TosaSerializationOperator * TosaSerializationOperatorBuilder::build<mlir::tosa::Conv3DOp>( mlir::Operation &op) const { - std::vector<int> pad, stride, dilation; - - auto pad_attr = op.getAttr("pad").dyn_cast<mlir::ArrayAttr>().getValue(); - for (auto &int_attr : pad_attr) { - pad.push_back(int_attr.dyn_cast<mlir::IntegerAttr>().getInt()); - } + auto pad = getDenseI64ArrayAttr<int>(op.getAttr("pad")); ASSERT_VECTOR_LENGTH(pad, 6); - auto stride_attr = - op.getAttr("stride").dyn_cast<mlir::ArrayAttr>().getValue(); - for (auto &int_attr : stride_attr) { - stride.push_back(int_attr.dyn_cast<mlir::IntegerAttr>().getInt()); - } + auto stride = getDenseI64ArrayAttr<int>(op.getAttr("stride")); ASSERT_VECTOR_LENGTH(stride, 3); - auto dilation_attr = - op.getAttr("dilation").dyn_cast<mlir::ArrayAttr>().getValue(); - for (auto &int_attr : dilation_attr) { - dilation.push_back(int_attr.dyn_cast<mlir::IntegerAttr>().getInt()); - } + auto dilation = getDenseI64ArrayAttr<int>(op.getAttr("dilation")); ASSERT_VECTOR_LENGTH(dilation, 3); std::string input0_name = GetTensorName(op.getOperand(0)); @@ -650,26 +624,13 @@ template <> TosaSerializationOperator * TosaSerializationOperatorBuilder::build<mlir::tosa::DepthwiseConv2DOp>( mlir::Operation &op) const { - std::vector<int> pad, stride, dilation; - - auto pad_attr = op.getAttr("pad").dyn_cast<mlir::ArrayAttr>().getValue(); - for (auto &int_attr : pad_attr) { - pad.push_back(int_attr.dyn_cast<mlir::IntegerAttr>().getInt()); - } + auto pad = getDenseI64ArrayAttr<int>(op.getAttr("pad")); ASSERT_VECTOR_LENGTH(pad, 4); - auto stride_attr = - op.getAttr("stride").dyn_cast<mlir::ArrayAttr>().getValue(); - for (auto &int_attr : stride_attr) { - stride.push_back(int_attr.dyn_cast<mlir::IntegerAttr>().getInt()); - } + auto stride = getDenseI64ArrayAttr<int>(op.getAttr("stride")); ASSERT_VECTOR_LENGTH(stride, 2); - auto dilation_attr = - op.getAttr("dilation").dyn_cast<mlir::ArrayAttr>().getValue(); - for (auto &int_attr : dilation_attr) { - dilation.push_back(int_attr.dyn_cast<mlir::IntegerAttr>().getInt()); - } + auto dilation = getDenseI64ArrayAttr<int>(op.getAttr("dilation")); ASSERT_VECTOR_LENGTH(dilation, 2); std::string input0_name = GetTensorName(op.getOperand(0)); @@ -700,28 +661,14 @@ template <> TosaSerializationOperator * TosaSerializationOperatorBuilder::build<mlir::tosa::TransposeConv2DOp>( mlir::Operation &op) const { - std::vector<int> outpad, stride, dilation, output_shape; - - auto outpad_attr = - op.getAttr("out_pad").dyn_cast<mlir::ArrayAttr>().getValue(); - for (auto &int_attr : outpad_attr) { - outpad.push_back(int_attr.dyn_cast<mlir::IntegerAttr>().getInt()); - } - ASSERT_VECTOR_LENGTH(outpad, 4); + auto out_pad = getDenseI64ArrayAttr<int>(op.getAttr("out_pad")); + ASSERT_VECTOR_LENGTH(out_pad, 4); - auto stride_attr = - op.getAttr("stride").dyn_cast<mlir::ArrayAttr>().getValue(); - for (auto &int_attr : stride_attr) { - stride.push_back(int_attr.dyn_cast<mlir::IntegerAttr>().getInt()); - } + auto stride = getDenseI64ArrayAttr<int>(op.getAttr("stride")); ASSERT_VECTOR_LENGTH(stride, 2); - auto output_shape_attr = - op.getAttr("out_shape").dyn_cast<mlir::ArrayAttr>().getValue(); - for (auto &int_attr : output_shape_attr) { - output_shape.push_back(int_attr.dyn_cast<mlir::IntegerAttr>().getInt()); - } - ASSERT_VECTOR_LENGTH(output_shape, 4); + auto out_shape = getDenseI64ArrayAttr<int>(op.getAttr("out_shape")); + ASSERT_VECTOR_LENGTH(out_shape, 4); std::string input0_name = GetTensorName(op.getOperand(0)); std::string input1_name = GetTensorName(op.getOperand(1)); @@ -737,7 +684,7 @@ TosaSerializationOperatorBuilder::build<mlir::tosa::TransposeConv2DOp>( op.getOperand(0).getType().cast<mlir::RankedTensorType>(); DType type = Type2AccumDType(tensor.getElementType()); - TosaTransposeConvAttribute attribute(outpad, stride, output_shape, input_zp, weight_zp, type); + TosaTransposeConvAttribute attribute(out_pad, stride, out_shape, input_zp, weight_zp, type); TosaSerializationOperator *tyop = new TosaSerializationOperator( Op_TRANSPOSE_CONV2D, Attribute_TransposeConvAttribute, &attribute, @@ -919,13 +866,7 @@ TosaSerializationOperatorBuilder::build<mlir::tosa::ReshapeOp>( mlir::Operation &op) const { std::string input_name = GetTensorName(op.getOperand(0)); std::string output_name = GetTensorName(op.getResult(0)); - - std::vector<int> shape; - auto shape_attr = - op.getAttr("new_shape").dyn_cast<mlir::ArrayAttr>().getValue(); - for (auto &int_attr : shape_attr) { - shape.push_back(int_attr.dyn_cast<mlir::IntegerAttr>().getInt()); - } + auto shape = getDenseI64ArrayAttr<int>(op.getAttr("new_shape")); TosaReshapeAttribute attribute(shape); @@ -993,17 +934,8 @@ template <> TosaSerializationOperator * TosaSerializationOperatorBuilder::build<mlir::tosa::SliceOp>( mlir::Operation &op) const { - std::vector<int> start, size; - auto begin_attr = op.getAttr("start").dyn_cast<mlir::ArrayAttr>().getValue(); - auto size_attr = op.getAttr("size").dyn_cast<mlir::ArrayAttr>().getValue(); - - for (auto &int_attr : begin_attr) { - start.push_back(int_attr.dyn_cast<mlir::IntegerAttr>().getInt()); - } - - for (auto &int_attr : size_attr) { - size.push_back(int_attr.dyn_cast<mlir::IntegerAttr>().getInt()); - } + auto start = getDenseI64ArrayAttr<int>(op.getAttr("start")); + auto size = getDenseI64ArrayAttr<int>(op.getAttr("size")); TosaSliceAttribute attribute(start, size); @@ -1024,13 +956,7 @@ TosaSerializationOperatorBuilder::build<mlir::tosa::TileOp>( mlir::Operation &op) const { std::string input_name = GetTensorName(op.getOperand(0)); std::string output_name = GetTensorName(op.getResult(0)); - - std::vector<int> multiples; - auto multiples_attr = - op.getAttr("multiples").dyn_cast<mlir::ArrayAttr>().getValue(); - for (auto &int_attr : multiples_attr) { - multiples.push_back(int_attr.dyn_cast<mlir::IntegerAttr>().getInt()); - } + auto multiples = getDenseI64ArrayAttr<int>(op.getAttr("multiples")); TosaTileAttribute attribute(multiples); @@ -1082,28 +1008,13 @@ TosaSerializationOperatorBuilder::build<mlir::tosa::ResizeOp>( std::string input_name = GetTensorName(op.getOperand(0)); std::string output_name = GetTensorName(op.getResult(0)); - std::vector<int16_t> scale; - auto scale_attr = - op.getAttr("scale").dyn_cast<mlir::ArrayAttr>().getValue(); - for (auto &int_attr : scale_attr) { - scale.push_back(int_attr.dyn_cast<mlir::IntegerAttr>().getInt()); - } + auto scale = getDenseI64ArrayAttr<int16_t>(op.getAttr("scale")); ASSERT_VECTOR_LENGTH(scale, 4); - std::vector<int16_t> offset; - auto offset_attr = - op.getAttr("offset").dyn_cast<mlir::ArrayAttr>().getValue(); - for (auto &int_attr : offset_attr) { - offset.push_back(int_attr.dyn_cast<mlir::IntegerAttr>().getInt()); - } + auto offset = getDenseI64ArrayAttr<int16_t>(op.getAttr("offset")); ASSERT_VECTOR_LENGTH(offset, 2); - std::vector<int16_t> border; - auto border_attr = - op.getAttr("border").dyn_cast<mlir::ArrayAttr>().getValue(); - for (auto &int_attr : border_attr) { - border.push_back(int_attr.dyn_cast<mlir::IntegerAttr>().getInt()); - } + auto border = getDenseI64ArrayAttr<int16_t>(op.getAttr("border")); ASSERT_VECTOR_LENGTH(border, 2); auto mode_str = @@ -1222,18 +1133,9 @@ TosaSerializationOperatorBuilder::build<mlir::tosa::RescaleOp>( bool per_channel = op.getAttr("per_channel").dyn_cast<mlir::BoolAttr>().getValue(); - std::vector<int> multiplier, shift; - auto multiplier_attr = - op.getAttr("multiplier").dyn_cast<mlir::ArrayAttr>().getValue(); - auto shift_attr = op.getAttr("shift").dyn_cast<mlir::ArrayAttr>().getValue(); - - for (auto &int_attr : multiplier_attr) { - multiplier.push_back(int_attr.dyn_cast<mlir::IntegerAttr>().getInt()); - } - - for (auto &int_attr : shift_attr) { - shift.push_back(int_attr.dyn_cast<mlir::IntegerAttr>().getInt()); - } + auto multiplier = + op.getAttr("multiplier").dyn_cast<mlir::DenseI32ArrayAttr>().asArrayRef(); + auto shift = op.getAttr("shift").dyn_cast<mlir::DenseI32ArrayAttr>().asArrayRef(); std::string input_name = GetTensorName(op.getOperand(0)); std::string output_name = GetTensorName(op.getResult(0)); |