I don’t have the lowering, but you can get a sense of the expected behavior from the specification. (Download link at
TOSA (mlplatform.org))
Here’s the pseudocode from the specification for the scatter operator:
// The following array is used to check compliance that an output position
// is modified at most once.
bool_t output_modified[N,K,C];
// Copy the values_in tensor to the values_out tensor.
// Values not written by the scatter operation are unchanged in the output.
for_each(0 <= n < N, 0 <= k < K, 0 <= c < C) {
value_t value = tensor_read<value_t>(values_in, [N,K,C], [n,k,c]);
tensor_write<value_t>(values_out, [N,K,C], [n, k, c], value);
output_modified[n,k,c]=false;
}
// Now perform the SCATTER operation, modifying the positions from the indices tensor
for_each(0 <= n < N, 0 <= w < W, 0 <= c < C) {
index_t k = tensor_read<index_t>(indices, [N,W], [n,w]);
REQUIRE(0 <= k && k < K);
REQUIRE(output_modified[n,k,c] == false);
value_t value = tensor_read<value_t>(input, [N,W,C], [n,w,c]);
tensor_write<value_t>(values_out, [N,K,C], [n, k, c], value);
output_modified[n,k,c] = true;
}