/*
    Copyright (c) 2014-2016 Intel Corporation.  All Rights Reserved.

    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:

      * Redistributions of source code must retain the above copyright
        notice, this list of conditions and the following disclaimer.
      * Redistributions in binary form must reproduce the above copyright
        notice, this list of conditions and the following disclaimer in the
        documentation and/or other materials provided with the distribution.
      * Neither the name of Intel Corporation nor the names of its
        contributors may be used to endorse or promote products derived
        from this software without specific prior written permission.

    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/


#include "offload_common.h"

bool __dv_is_contiguous(const ArrDesc *dvp)
{
    if (dvp->Flags & ArrDescFlagsContiguous) {
        return true;
    }

    if (dvp->Rank != 0) {
        if (dvp->Dim[0].Mult != dvp->Len) {
            return false;
        }
        for (int i = 1; i < dvp->Rank; i++) {
            if (dvp->Dim[i].Mult !=
                dvp->Dim[i-1].Extent * dvp->Dim[i-1].Mult) {
                return false;
            }
        }
    }
    return true;
}

bool __dv_is_allocated(const ArrDesc *dvp)
{
    return (dvp->Flags & ArrDescFlagsDefined);
}

uint64_t __dv_data_length(const ArrDesc *dvp)
{
    uint64_t size;

    if (dvp->Rank == 0) {
        size = dvp->Len;
        return size;
    }

    size = dvp->Len;
    for (int i = 0; i < dvp->Rank; ++i) {
        size += (dvp->Dim[i].Extent-1) * dvp->Dim[i].Mult;
    }
    return size;
}

uint64_t __dv_data_length(const ArrDesc *dvp, int64_t count)
{
    if (dvp->Rank == 0) {
        return count;
    }

    return count * dvp->Dim[0].Mult;
}

// Create CeanReadRanges data for reading contiguous ranges of
// noncontiguous array defined by the argument
CeanReadRanges * init_read_ranges_dv(const ArrDesc *dvp)
{
    int64_t         len;
    int             count;
    int             rank = dvp->Rank;
    CeanReadRanges *res = NULL;

    if (rank != 0) {
        int i = 0;
        len = dvp->Len;
        if (dvp->Dim[0].Mult == len) {
            for (i = 1; i < rank; i++) {
                len *= dvp->Dim[i-1].Extent;
                if (dvp->Dim[i].Mult != len) {
                    break;
                }
            }
        }
        res = (CeanReadRanges *)malloc(
            sizeof(CeanReadRanges) + (rank - i) * sizeof(CeanReadDim));
        if (res == NULL)
            LIBOFFLOAD_ERROR(c_malloc);
        res -> last_noncont_ind = rank - i - 1;
        count = 1;
        for (; i < rank; i++) {
            res->Dim[rank - i - 1].count = count;
            res->Dim[rank - i - 1].size = dvp->Dim[i].Mult;
            count *= dvp->Dim[i].Extent;
        }
        res -> range_max_number = count;
        res -> range_size = len;
        res -> ptr = (void*)dvp->Base;
        res -> current_number = 0;
        res -> init_offset = 0;
    }
    return res;
}

#if OFFLOAD_DEBUG > 0
void __dv_desc_dump(const char *name, const ArrDesc *dvp)
{
    OFFLOAD_TRACE(3, "%s DV %p\n", name, dvp);

    if (dvp != 0) {
        OFFLOAD_TRACE(3,
                      "    dv->Base   = 0x%lx\n"
                      "    dv->Len    = 0x%lx\n"
                      "    dv->Offset = 0x%lx\n"
                      "    dv->Flags  = 0x%lx\n"
                      "    dv->Rank   = 0x%lx\n"
                      "    dv->Resrvd = 0x%lx\n",
                      dvp->Base,
                      dvp->Len,
                      dvp->Offset,
                      dvp->Flags,
                      dvp->Rank,
                      dvp->Reserved);

        for (int i = 0 ; i < dvp->Rank; i++) {
            OFFLOAD_TRACE(3,
                          "    (%d) Extent=%ld, Multiplier=%ld, LowerBound=%ld\n",
                          i,
                          dvp->Dim[i].Extent,
                          dvp->Dim[i].Mult,
                          dvp->Dim[i].LowerBound);
        }
    }
}
#endif // OFFLOAD_DEBUG > 0
