# 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 NpuBlockTraversal
from ethosu.vela.api import NpuConv2DOperation
from ethosu.vela.api import NpuConvDepthWiseOperation
from ethosu.vela.api import NpuDataType
from ethosu.vela.api import NpuElementWiseOp
from ethosu.vela.api import NpuElementWiseOperation
from ethosu.vela.api import NpuFeatureMap
from ethosu.vela.api import NpuKernel
from ethosu.vela.api import NpuLayout
from ethosu.vela.api import NpuPadding
from ethosu.vela.api import NpuShape3D
from ethosu.vela.api import NpuTileBox
from ethosu.vela.architecture_features import Accelerator
from ethosu.vela.architecture_features import create_default_arch
from ethosu.vela.register_command_stream_generator import calc_blockdep
from ethosu.vela.register_command_stream_generator import get_strides
from ethosu.vela.register_command_stream_util import get_address_ranges
from ethosu.vela.test.extapi.test_extapi_generate_commands import create_feature_map


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)


# -------------------------------------------------------------------
# ADDRESS TESTS
# -------------------------------------------------------------------


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=16000, length=25480),
    ]


# -------------------------------------------------------------------
# BLOCKDEP TESTS
# -------------------------------------------------------------------


def test_calc_blockdep0():
    """
    Tests blockdep calculation, op1 that produces op2's IFM2.
    op2 takes 1 block to complete, which results in blockdep 0
    """
    op1 = NpuElementWiseOperation(NpuElementWiseOp.CLZ)
    op1.ifm = create_feature_map(
        NpuShape3D(height=1, width=1, depth=1),
        1,
        0x60,
        layout=NpuLayout.NHCWB16,
    )
    intermediate_fm = create_feature_map(
        NpuShape3D(height=1, width=1, depth=1),
        1,
        0xA0,
        layout=NpuLayout.NHCWB16,
    )
    op1.ofm = intermediate_fm
    op1.block_config = NpuShape3D(height=1, width=1, depth=4)
    op2 = NpuElementWiseOperation(NpuElementWiseOp.SUB)
    op2.ifm = create_feature_map(
        NpuShape3D(height=1, width=1, depth=1),
        1,
        0x39AC0,
        layout=NpuLayout.NHCWB16,
    )
    op2.ifm2 = intermediate_fm
    op2.ofm = create_feature_map(
        NpuShape3D(height=1, width=1, depth=1),
        1,
        0xE0,
        layout=NpuLayout.NHCWB16,
    )
    op2.block_config = NpuShape3D(height=1, width=1, depth=4)
    arch = create_default_arch(Accelerator.Ethos_U55_128)
    block_dep = calc_blockdep(arch, op1, op2)
    assert block_dep == 0


def test_calc_blockdep2():
    """
    Tests blockdep calculation, op1 produces part of the input of op2,
    op1 and op2 have different sizes.
    op2 takes 3 blocks to complete, op1's last block collides with op2's last block
    which results in blockdep 2
    """
    op1 = NpuConv2DOperation()
    op1.ifm = create_feature_map(
        NpuShape3D(height=4, width=48, depth=8),
        1,
        0x4C80,
        layout=NpuLayout.NHCWB16,
    )
    op1.ofm = create_feature_map(
        NpuShape3D(height=4, width=48, depth=16),
        1,
        0x6480,
        layout=NpuLayout.NHCWB16,
    )
    op1.kernel = NpuKernel(1, 1)
    op1.weights = [NpuAddressRange(region=1, address=0x4AE0, length=208)]
    op1.biases = [NpuAddressRange(region=1, address=0x49A0, length=160)]
    op1.padding = NpuPadding(top=0, left=0, right=0, bottom=0)
    op1.block_traversal = NpuBlockTraversal.PART_KERNEL_FIRST
    op1.block_config = NpuShape3D(height=4, width=6, depth=16)
    op2 = NpuConvDepthWiseOperation()
    op2.ifm = create_feature_map(
        NpuShape3D(height=3, width=48, depth=16),
        1,
        0,
        layout=NpuLayout.NHCWB16,
    )
    # op2 has two tiles, the lower tile is produced by op1
    op2.ifm.tiles = NpuTileBox(height_0=2, height_1=2, width_0=48, addresses=[0x7680, 0, 0x6480, 0])
    op2.ofm = create_feature_map(
        NpuShape3D(height=1, width=24, depth=16),
        1,
        0x6480,
        layout=NpuLayout.NHCWB16,
    )
    op2.kernel = NpuKernel(3, 3, stride_x=2, stride_y=2)
    op2.weights = [NpuAddressRange(region=1, address=0x4BB0, length=208)]
    op2.biases = [NpuAddressRange(region=1, address=0x4A40, length=160)]
    op2.padding = NpuPadding(top=0, left=0, right=0, bottom=0)
    op2.block_config = NpuShape3D(height=1, width=8, depth=16)
    arch = create_default_arch(Accelerator.Ethos_U55_128)
    block_dep = calc_blockdep(arch, op1, op2)
    assert block_dep == 2


def test_calc_blockdep3():
    """
    Tests blockdep calculation, op2 consumes part of op1, op1 and op2 have different sizes.
    There is no overlap between the last blocks of op1 and the first jobs of op2,
    which results in blockdep 3
    """
    op1 = NpuConv2DOperation()
    op1.ifm = create_feature_map(
        NpuShape3D(height=13, width=96, depth=1),
        1,
        0,
        layout=NpuLayout.NHWC,
    )
    op1.ofm = create_feature_map(
        NpuShape3D(height=6, width=48, depth=8),
        1,
        0x7C80,
        layout=NpuLayout.NHCWB16,
    )
    op1.kernel = NpuKernel(3, 3, stride_x=2, stride_y=2)
    op1.weights = [NpuAddressRange(region=1, address=0x4AE0, length=144)]
    op1.biases = [NpuAddressRange(region=1, address=0x49A0, length=80)]
    op1.padding = NpuPadding(top=0, left=0, right=1, bottom=0)
    op1.block_traversal = NpuBlockTraversal.PART_KERNEL_FIRST
    op1.block_config = NpuShape3D(height=6, width=3, depth=8)
    op2 = NpuConvDepthWiseOperation()
    op2.ifm = create_feature_map(
        NpuShape3D(height=5, width=48, depth=8),
        1,
        0x7C80,
        layout=NpuLayout.NHCWB16,
    )
    op2.ofm = create_feature_map(
        NpuShape3D(height=4, width=48, depth=8),
        1,
        0x4C80,
        layout=NpuLayout.NHCWB16,
    )
    op2.kernel = NpuKernel(3, 3)
    op2.weights = [NpuAddressRange(region=1, address=0x4BB0, length=112)]
    op2.biases = [NpuAddressRange(region=1, address=0x4A40, length=80)]
    op2.padding = NpuPadding(top=0, left=0, right=0, bottom=0)
    op2.block_config = NpuShape3D(height=4, width=6, depth=8)
    arch = create_default_arch(Accelerator.Ethos_U55_128)
    block_dep = calc_blockdep(arch, op1, op2)
    assert block_dep == 3
