aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTatWai Chong <tatwai.chong@arm.com>2023-01-28 20:43:14 -0800
committerTatWai Chong <tatwai.chong@arm.com>2023-02-02 18:55:33 +0000
commita0bf7c4fb3456b305fc7696967104270efa82875 (patch)
tree3b29add7dee92174fe7bea443831bf978092c6f8
parente1dcee57d8f89cd192411bbec9e8a97b26833bb7 (diff)
downloadtosa_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>
-rw-r--r--src/TosaSerialize.cpp180
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));