blob: f2a16097255764bf39dfaa3955e21a4b28ba3722 [file] [log] [blame]
# Copyright (C) 2020 Arm Limited or its affiliates. All rights reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the License); you may
# not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an AS IS BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Description:
# Contains unit tests for register command stream generator
from ethosu.vela.api import NpuAddressRange
from ethosu.vela.api import NpuDataType
from ethosu.vela.api import NpuFeatureMap
from ethosu.vela.api import NpuLayout
from ethosu.vela.api import NpuShape3D
from ethosu.vela.api import NpuTileBox
from ethosu.vela.register_command_stream_generator import get_address_ranges
from ethosu.vela.register_command_stream_generator import get_strides
def test_get_fm_strides():
"""Tests calculation of feature map strides"""
fm = NpuFeatureMap()
fm.layout = NpuLayout.NHCWB16
fm.data_type = NpuDataType.INT16
fm.shape = NpuShape3D(height=7, width=10, depth=24)
assert get_strides(fm) == NpuShape3D(height=640, width=32, depth=320)
fm.layout = NpuLayout.NHWC
assert get_strides(fm) == NpuShape3D(height=480, width=48, depth=2)
fm.data_type = NpuDataType.UINT8
assert get_strides(fm) == NpuShape3D(height=240, width=24, depth=1)
def test_get_address_ranges_one_tile():
"""Tests calculation of feature map address ranges, with 1 tile used"""
fm = NpuFeatureMap()
fm.region = 4
fm.layout = NpuLayout.NHWC
fm.data_type = NpuDataType.INT16
fm.shape = NpuShape3D(height=50, width=40, depth=3)
fm.tiles = NpuTileBox(height_0=50, height_1=50, width_0=40, addresses=[8000, 0, 0, 0])
ranges = get_address_ranges(fm)
assert ranges == [NpuAddressRange(region=4, address=8000, length=12000), None, None, None]
def test_get_address_ranges_horizontal_tiles():
"""Tests calculation of feature map address ranges, with 2 horizontal tiles used"""
fm = NpuFeatureMap()
fm.region = 6
fm.layout = NpuLayout.NHWC
fm.data_type = NpuDataType.INT16
fm.shape = NpuShape3D(height=50, width=10, depth=20)
fm.tiles = NpuTileBox(height_0=20, height_1=30, width_0=10, addresses=[256, 0, 16000, 0])
ranges = get_address_ranges(fm)
assert ranges == [
NpuAddressRange(region=6, address=256, length=8000),
None,
NpuAddressRange(region=6, address=16000, length=12000),
None,
]
def test_get_address_ranges_vertical_tiles():
"""Tests calculation of feature map address ranges, with 2 vertical tiles used"""
fm = NpuFeatureMap()
fm.region = 6
fm.layout = NpuLayout.NHWC
fm.data_type = NpuDataType.INT8
# Set strides explicitly
fm.shape = NpuShape3D(height=50, width=10, depth=20)
fm.strides = NpuShape3D(height=100, width=20, depth=1)
fm.tiles = NpuTileBox(height_0=50, height_1=50, width_0=5, addresses=[16, 32000, 0, 0])
ranges = get_address_ranges(fm)
assert ranges == [
NpuAddressRange(region=6, address=16, length=5000),
NpuAddressRange(region=6, address=32000, length=5000),
None,
None,
]
def test_get_address_ranges_4_tiles():
"""Tests calculation of feature map address ranges, with 4 tiles used"""
fm = NpuFeatureMap()
fm.region = 6
fm.layout = NpuLayout.NHCWB16
fm.data_type = NpuDataType.INT16
fm.shape = NpuShape3D(height=50, width=10, depth=20)
fm.tiles = NpuTileBox(height_0=30, height_1=10, width_0=3, addresses=[16, 32000, 8000, 16000])
ranges = get_address_ranges(fm)
assert ranges == [
NpuAddressRange(region=6, address=16, length=18952),
NpuAddressRange(region=6, address=32000, length=6280),
NpuAddressRange(region=6, address=8000, length=12552),
NpuAddressRange(region=6, address=28800, length=12680),
]