aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTai Ly <tai.ly@arm.com>2023-12-15 20:34:51 +0000
committerTai Ly <tai.ly@arm.com>2024-01-12 21:39:59 +0000
commit5d580faec02bcef56164587accb5fd88a3e80d86 (patch)
tree0bf550d054f37d2831ac80e1e901265e905d1f1c /src
parentcc426df2a6762cb09c6a25c911039ae34660570c (diff)
downloadserialization_lib-5d580faec02bcef56164587accb5fd88a3e80d86.tar.gz
[serialization_lib] Add tosa shape ops
Added tosa shape ops to tosa.fbs also added convert I64 to and from U8 for storing const_shape data values Signed-off-by: Tai Ly <tai.ly@arm.com> Change-Id: I1e938dec7398fbcbe5be657dad65cdd61af5b597
Diffstat (limited to 'src')
-rw-r--r--src/tosa_serialization_handler.cpp50
1 files changed, 49 insertions, 1 deletions
diff --git a/src/tosa_serialization_handler.cpp b/src/tosa_serialization_handler.cpp
index 015dda4..453670f 100644
--- a/src/tosa_serialization_handler.cpp
+++ b/src/tosa_serialization_handler.cpp
@@ -1,5 +1,5 @@
-// Copyright (c) 2020-2023, ARM Limited.
+// Copyright (c) 2020-2024, ARM Limited.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -777,6 +777,25 @@ tosa_err_t TosaSerializationHandler::ConvertF32toU8(const std::vector<float>& in
return TOSA_OK;
}
+tosa_err_t TosaSerializationHandler::ConvertI64toU8(const std::vector<int64_t>& in, std::vector<uint8_t>& out)
+{
+ out.clear();
+ for (auto val : in)
+ {
+ uint64_t* val_u64 = reinterpret_cast<uint64_t*>(&val);
+ out.push_back(*val_u64 & 0xFF);
+ out.push_back((*val_u64 >> 8) & 0xFF);
+ out.push_back((*val_u64 >> 16) & 0xFF);
+ out.push_back((*val_u64 >> 24) & 0xFF);
+ out.push_back((*val_u64 >> 32) & 0xFF);
+ out.push_back((*val_u64 >> 40) & 0xFF);
+ out.push_back((*val_u64 >> 48) & 0xFF);
+ out.push_back((*val_u64 >> 56) & 0xFF);
+ }
+ ForceAlignTensorData(out);
+ return TOSA_OK;
+}
+
tosa_err_t TosaSerializationHandler::ConvertI48toU8(const std::vector<int64_t>& in, std::vector<uint8_t>& out)
{
out.clear();
@@ -926,6 +945,35 @@ tosa_err_t
return TOSA_OK;
}
+tosa_err_t TosaSerializationHandler::ConvertU8toI64(const std::vector<uint8_t>& in,
+ uint32_t out_size,
+ std::vector<int64_t>& out)
+{
+ out.clear();
+ if (in.size() < out_size * sizeof(int64_t))
+ {
+ printf("TosaSerializationHandler::ConvertU8toI64(): uint8 buffer size %ld must >= target size %ld\n", in.size(),
+ out_size * sizeof(int64_t));
+ return TOSA_USER_ERROR;
+ }
+ for (uint32_t i = 0; i < out_size; i++)
+ {
+ uint64_t byte0 = in[i * sizeof(int64_t)];
+ uint64_t byte1 = in[i * sizeof(int64_t) + 1];
+ uint64_t byte2 = in[i * sizeof(int64_t) + 2];
+ uint64_t byte3 = in[i * sizeof(int64_t) + 3];
+ uint64_t byte4 = in[i * sizeof(int64_t) + 4];
+ uint64_t byte5 = in[i * sizeof(int64_t) + 5];
+ uint64_t byte6 = in[i * sizeof(int64_t) + 6];
+ uint64_t byte7 = in[i * sizeof(int64_t) + 7];
+ uint64_t val_u64 = byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24) + (byte4 << 32) + (byte5 << 40) +
+ (byte6 << 48) + (byte7 << 56);
+ int64_t* val_i64 = reinterpret_cast<int64_t*>(&val_u64);
+ out.push_back(*val_i64);
+ }
+ return TOSA_OK;
+}
+
tosa_err_t TosaSerializationHandler::ConvertU8toI48(const std::vector<uint8_t>& in,
uint32_t out_size,
std::vector<int64_t>& out)