/*
 * Copyright (C) 2020 Intel Corporation.
 *
 * 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
 *
 *      http://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.
 */


#include <ia_css_psys_terminal_manifest.h>

/* Data object types on the terminals */
#include <ia_css_program_group_data.h>
/* for ia_css_kernel_bitmap_t, ia_css_kernel_bitmap_clear, ia_css_... */
#include <ia_css_kernel_bitmap.h>

#include "ia_css_psys_program_group_private.h"
#include "ia_css_terminal_manifest.h"
#include "ia_css_terminal_manifest_types.h"

#include <error_support.h>
#include <print_support.h>
#include <misc_support.h>
#include "ia_css_psys_static_trace.h"

#ifndef __IA_CSS_PSYS_STATIC_INLINE__
#include "ia_css_psys_terminal_manifest_impl.h"
#endif
#include "ia_css_terminal_manifest.h"

/* We need to refactor those files in order to build in the firmware only
   what is needed, switches are put current to workaround compilation problems
   in the firmware (for example lack of uint64_t support)
   supported in the firmware
  */
#if !defined(__HIVECC)
static const char *terminal_type_strings[IA_CSS_N_TERMINAL_TYPES + 1] = {
    "IA_CSS_TERMINAL_TYPE_DATA_IN",
    "IA_CSS_TERMINAL_TYPE_DATA_OUT",
    "IA_CSS_TERMINAL_TYPE_PARAM_STREAM",
    /**< Type 1-5 parameter input */
    "IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN",
    /**< Type 1-5 parameter output */
    "IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT",
    /**< Represent the new type of terminal for
     * the "spatial dependent parameters", when params go in
     */
    "IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN",
    /**< Represent the new type of terminal for
     * the "spatial dependent parameters", when params go out
     */
    "IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT",
    /**< Represent the new type of terminal for
     * the explicit slicing, when params go in
     */
    "IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN",
    /**< Represent the new type of terminal for
     * the explicit slicing, when params go out
     */
    "IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT",
    /**< State (private data) input */
    "IA_CSS_TERMINAL_TYPE_STATE_IN",
    /**< State (private data) output */
    "IA_CSS_TERMINAL_TYPE_STATE_OUT",
    "IA_CSS_TERMINAL_TYPE_PROGRAM",
    "IA_CSS_TERMINAL_TYPR_PROGRAM_CONTROL_INIT",
    "UNDEFINED_TERMINAL_TYPE"};

int ia_css_data_terminal_manifest_set_kernel_bitmap_unique(
    ia_css_data_terminal_manifest_t *manifest,
    const unsigned int index)
{
    int retval = -1;

    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
        "ia_css_data_terminal_manifest_set_kernel_bitmap_unique(): enter:\n");

    if (manifest != NULL) {
        ia_css_kernel_bitmap_t kernel_bitmap =
                    ia_css_kernel_bitmap_clear();

        kernel_bitmap = ia_css_kernel_bitmap_set(kernel_bitmap, index);
        verifexit(!ia_css_is_kernel_bitmap_empty(kernel_bitmap));
        verifexit(ia_css_data_terminal_manifest_set_kernel_bitmap(
                manifest, kernel_bitmap) == 0);
        retval = 0;
    }

EXIT:
    if (retval != 0) {
        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
            "ia_css_data_terminal_manifest_set_kernel_bitmap_unique failed (%i)\n",
            retval);
    }
    return retval;
}

int ia_css_data_terminal_manifest_set_min_size(
    ia_css_data_terminal_manifest_t    *manifest,
    const uint16_t min_size[IA_CSS_N_DATA_DIMENSION])
{
    int retval = -1;

    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
        "ia_css_data_terminal_manifest_set_min_size(): enter:\n");

    verifexit(manifest != NULL);

    manifest->min_size[IA_CSS_COL_DIMENSION] =
        min_size[IA_CSS_COL_DIMENSION];
    manifest->min_size[IA_CSS_ROW_DIMENSION] =
        min_size[IA_CSS_ROW_DIMENSION];
    retval = 0;

EXIT:
    if (NULL == manifest) {
        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
            "ia_css_data_terminal_manifest_set_min_size: invalid argument\n");
    }
    return retval;
}

int ia_css_data_terminal_manifest_set_max_size(
    ia_css_data_terminal_manifest_t    *manifest,
    const uint16_t max_size[IA_CSS_N_DATA_DIMENSION])
{
    int retval = -1;

    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
        "ia_css_data_terminal_manifest_set_max_size(): enter:\n");

    verifexit(manifest != NULL);

    manifest->max_size[IA_CSS_COL_DIMENSION] =
        max_size[IA_CSS_COL_DIMENSION];
    manifest->max_size[IA_CSS_ROW_DIMENSION] =
        max_size[IA_CSS_ROW_DIMENSION];
    retval = 0;

EXIT:
    if (NULL == manifest) {
        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
            "ia_css_data_terminal_manifest_set_max_size: invalid argument\n");
    }
    return retval;
}
#endif

int ia_css_data_terminal_manifest_get_min_size(
    const ia_css_data_terminal_manifest_t *manifest,
    uint16_t min_size[IA_CSS_N_DATA_DIMENSION])
{
    int retval = -1;

    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
        "ia_css_data_terminal_manifest_get_min_size(): enter:\n");

    verifexit(manifest != NULL);

    min_size[IA_CSS_COL_DIMENSION] =
        manifest->min_size[IA_CSS_COL_DIMENSION];
    min_size[IA_CSS_ROW_DIMENSION] =
        manifest->min_size[IA_CSS_ROW_DIMENSION];
    retval = 0;

EXIT:
    if (NULL == manifest) {
        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
            "ia_css_data_terminal_manifest_get_min_size: invalid argument\n");
    }
    return retval;
}

int ia_css_data_terminal_manifest_get_max_size(
    const ia_css_data_terminal_manifest_t *manifest,
    uint16_t max_size[IA_CSS_N_DATA_DIMENSION])
{
    int retval = -1;

    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
        "ia_css_data_terminal_manifest_get_max_size(): enter:\n");

    verifexit(manifest != NULL);

    max_size[IA_CSS_COL_DIMENSION] =
        manifest->max_size[IA_CSS_COL_DIMENSION];
    max_size[IA_CSS_ROW_DIMENSION] =
        manifest->max_size[IA_CSS_ROW_DIMENSION];
    retval = 0;

EXIT:
    if (NULL == manifest) {
        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
            "ia_css_data_terminal_manifest_get_max_size: invalid argument\n");
    }
    return retval;
}

#if !defined(__HIVECC)
int ia_css_data_terminal_manifest_set_min_fragment_size(
    ia_css_data_terminal_manifest_t    *manifest,
    const uint16_t min_size[IA_CSS_N_DATA_DIMENSION])
{
    int retval = -1;

    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
        "ia_css_data_terminal_manifest_set_min_fragment_size(): enter:\n");

    verifexit(manifest != NULL);

    manifest->min_fragment_size[IA_CSS_COL_DIMENSION] =
        min_size[IA_CSS_COL_DIMENSION];
    manifest->min_fragment_size[IA_CSS_ROW_DIMENSION] =
        min_size[IA_CSS_ROW_DIMENSION];
    retval = 0;

EXIT:
    if (NULL == manifest) {
        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
            "ia_css_data_terminal_manifest_set_min_fragment_size invalid argument\n");
    }
    return retval;
}

int ia_css_data_terminal_manifest_set_max_fragment_size(
    ia_css_data_terminal_manifest_t    *manifest,
    const uint16_t max_size[IA_CSS_N_DATA_DIMENSION])
{
    int retval = -1;

    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
        "ia_css_data_terminal_manifest_set_max_fragment_size(): enter:\n");

    verifexit(manifest != NULL);

    manifest->max_fragment_size[IA_CSS_COL_DIMENSION] =
        max_size[IA_CSS_COL_DIMENSION];
    manifest->max_fragment_size[IA_CSS_ROW_DIMENSION] =
        max_size[IA_CSS_ROW_DIMENSION];
    retval = 0;

EXIT:
    if (NULL == manifest) {
        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
            "ia_css_data_terminal_manifest_set_max_fragment_size invalid argument\n");
    }
    return retval;
}
#endif

int ia_css_data_terminal_manifest_get_min_fragment_size(
    const ia_css_data_terminal_manifest_t *manifest,
    uint16_t min_size[IA_CSS_N_DATA_DIMENSION])
{
    int retval = -1;

    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
        "ia_css_data_terminal_manifest_get_min_fragment_size(): enter:\n");

    verifexit(manifest != NULL);

    min_size[IA_CSS_COL_DIMENSION] =
        manifest->min_fragment_size[IA_CSS_COL_DIMENSION];
    min_size[IA_CSS_ROW_DIMENSION] =
        manifest->min_fragment_size[IA_CSS_ROW_DIMENSION];
    retval = 0;

EXIT:
    if (NULL == manifest) {
        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
            "ia_css_data_terminal_manifest_get_min_fragment_size invalid argument\n");
    }
    return retval;
}

int ia_css_data_terminal_manifest_get_max_fragment_size(
    const ia_css_data_terminal_manifest_t *manifest,
    uint16_t max_size[IA_CSS_N_DATA_DIMENSION])
{
    int retval = -1;

    IA_CSS_TRACE_0(PSYSAPI_STATIC, VERBOSE,
        "ia_css_data_terminal_manifest_get_max_fragment_size(): enter:\n");

    verifexit(manifest != NULL);

    max_size[IA_CSS_COL_DIMENSION] =
        manifest->max_fragment_size[IA_CSS_COL_DIMENSION];
    max_size[IA_CSS_ROW_DIMENSION] =
        manifest->max_fragment_size[IA_CSS_ROW_DIMENSION];
    retval = 0;

EXIT:
    if (NULL == manifest) {
        IA_CSS_TRACE_0(PSYSAPI_STATIC, ERROR,
            "ia_css_data_terminal_manifest_get_max_fragment_size invalid argument\n");
    }
    return retval;
}

/* We need to refactor those files in order to build in the firmware only
   what is needed, switches are put current to workaround compilation problems
   in the firmware (for example lack of uint64_t support)
   supported in the firmware
  */
#if !defined(__HIVECC)

#define PRINT_DIMENSION(name, var) IA_CSS_TRACE_3(PSYSAPI_STATIC, \
    INFO, "%s:\t%d %d\n", \
    (name), \
    (var)[IA_CSS_COL_DIMENSION], \
    (var)[IA_CSS_ROW_DIMENSION])

int ia_css_terminal_manifest_print(
    const ia_css_terminal_manifest_t *manifest,
    void *fid)
{
    int retval = -1;
    ia_css_terminal_type_t terminal_type =
        ia_css_terminal_manifest_get_type(manifest);

    IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO,
        "ia_css_terminal_manifest_print(): enter:\n");

    verifexit(manifest != NULL);
    NOT_USED(fid);
    NOT_USED(terminal_type_strings);

    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "sizeof(manifest) = %d\n",
        (int)ia_css_terminal_manifest_get_size(manifest));
#ifndef __XTENSA_FW__
    IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "typeof(manifest) = %s\n",
            terminal_type_strings[terminal_type]);
#endif
    if (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_IN ||
        terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_CACHED_OUT) {
        ia_css_param_terminal_manifest_t *pterminal_manifest =
            (ia_css_param_terminal_manifest_t *)manifest;
        uint16_t section_count =
            pterminal_manifest->param_manifest_section_desc_count;
        int    i;

        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
            "sections(manifest) = %d\n", (int)section_count);
        for (i = 0; i < section_count; i++) {
            const ia_css_param_manifest_section_desc_t *manifest =
        ia_css_param_terminal_manifest_get_prm_sct_desc(
            pterminal_manifest, i);
            verifjmpexit(manifest != NULL);
            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
                "kernel_id = %d\n", (int)ia_css_param_manifest_section_desc_get_kernel_id(manifest));
            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
                "mem_type_id = %d\n",
                (int)ia_css_param_manifest_section_desc_get_mem_type_id(manifest));
            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
                "max_mem_size = %d\n",
                (int)manifest->max_mem_size);
            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
                "region_id = %d\n",
                (int)ia_css_param_manifest_section_desc_get_region_id(manifest));
        }
    } else if (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_IN ||
        terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SLICED_OUT) {
        ia_css_sliced_param_terminal_manifest_t
        *sliced_terminal_manifest =
            (ia_css_sliced_param_terminal_manifest_t *)manifest;
        uint32_t kernel_id;
        uint16_t section_count;
        uint16_t section_idx;

        kernel_id = sliced_terminal_manifest->kernel_id;
        section_count =
            sliced_terminal_manifest->sliced_param_section_count;

        NOT_USED(kernel_id);

        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
            "kernel_id = %d\n", (int)kernel_id);
        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
            "section_count = %d\n", (int)section_count);

        for (section_idx = 0; section_idx < section_count;
            section_idx++) {
            ia_css_sliced_param_manifest_section_desc_t
                *sliced_param_manifest_section_desc;

            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
                "section %d\n", (int)section_idx);
            sliced_param_manifest_section_desc =
        ia_css_sliced_param_terminal_manifest_get_sliced_prm_sct_desc(
                sliced_terminal_manifest, section_idx);
            verifjmpexit(sliced_param_manifest_section_desc !=
                NULL);
            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
                "mem_type_id = %d\n",
            (int)sliced_param_manifest_section_desc->mem_type_id);
            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
                "region_id = %d\n",
            (int)sliced_param_manifest_section_desc->region_id);
            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
                "max_mem_size = %d\n",
            (int)sliced_param_manifest_section_desc->max_mem_size);
        }
    } else if (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM) {
        ia_css_program_terminal_manifest_t *program_terminal_manifest =
            (ia_css_program_terminal_manifest_t *)manifest;
        uint32_t sequencer_info_kernel_id;
        uint16_t max_kernel_fragment_sequencer_command_desc;
        uint16_t kernel_fragment_sequencer_info_manifest_info_count;
        uint16_t seq_info_idx;
        uint16_t section_count =
            program_terminal_manifest->fragment_param_manifest_section_desc_count;
        uint16_t sec_idx;

        sequencer_info_kernel_id =
            program_terminal_manifest->sequencer_info_kernel_id;
        max_kernel_fragment_sequencer_command_desc =
            program_terminal_manifest->
            max_kernel_fragment_sequencer_command_desc;
        kernel_fragment_sequencer_info_manifest_info_count =
            program_terminal_manifest->
            kernel_fragment_sequencer_info_manifest_info_count;

        NOT_USED(sequencer_info_kernel_id);
        NOT_USED(max_kernel_fragment_sequencer_command_desc);

        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
            "sequencer_info_kernel_id = %d\n",
            (int)sequencer_info_kernel_id);
        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
            "max_kernel_fragment_sequencer_command_desc = %d\n",
            (int)max_kernel_fragment_sequencer_command_desc);
        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
            "kernel_fragment_sequencer_info_manifest_info_count = %d\n",
            (int)
            kernel_fragment_sequencer_info_manifest_info_count);

        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
            "fragment_param_manifest_section_desc_count = %d\n", (int)section_count);
        for (sec_idx = 0; sec_idx < section_count; sec_idx++) {
            const ia_css_fragment_param_manifest_section_desc_t *ptmanifest =
        ia_css_program_terminal_manifest_get_frgmnt_prm_sct_desc(
            program_terminal_manifest, sec_idx);
            NOT_USED(ptmanifest);
            verifjmpexit(manifest != NULL);
            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
                "kernel_id = %d\n", (int)ia_css_fragment_param_manifest_section_desc_get_kernel_id(ptmanifest));
            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
                "mem_type_id = %d\n",
                (int)ia_css_fragment_param_manifest_section_desc_get_mem_type_id(ptmanifest));
            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
                "max_mem_size = %d\n",
                (int)ptmanifest->max_mem_size);
            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
                "region_id = %d\n",
                (int)ia_css_fragment_param_manifest_section_desc_get_region_id(ptmanifest));
        }
        for (seq_info_idx = 0; seq_info_idx <
            kernel_fragment_sequencer_info_manifest_info_count;
                seq_info_idx++) {
            ia_css_kernel_fragment_sequencer_info_manifest_desc_t
                *sequencer_info_manifest_desc;

            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
                "sequencer info %d\n", (int)seq_info_idx);
            sequencer_info_manifest_desc =
        ia_css_program_terminal_manifest_get_kernel_frgmnt_seq_info_desc
                (program_terminal_manifest, seq_info_idx);
            verifjmpexit(sequencer_info_manifest_desc != NULL);
            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
                "min_fragment_grid_slice_dimension[] = {%d, %d}\n",
                (int)sequencer_info_manifest_desc->
                min_fragment_grid_slice_dimension[
                        IA_CSS_COL_DIMENSION],
                (int)sequencer_info_manifest_desc->
                min_fragment_grid_slice_dimension[
                        IA_CSS_ROW_DIMENSION]);
            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
                "max_fragment_grid_slice_dimension[] = {%d, %d}\n",
                (int)sequencer_info_manifest_desc->
                max_fragment_grid_slice_dimension[
                        IA_CSS_COL_DIMENSION],
                (int)sequencer_info_manifest_desc->
                max_fragment_grid_slice_dimension[
                        IA_CSS_ROW_DIMENSION]);
            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
                "min_fragment_grid_slice_count[] = {%d, %d}\n",
                (int)sequencer_info_manifest_desc->
                min_fragment_grid_slice_count[
                        IA_CSS_COL_DIMENSION],
                (int)sequencer_info_manifest_desc->
                min_fragment_grid_slice_count[
                        IA_CSS_ROW_DIMENSION]);
            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
                "max_fragment_grid_slice_count[] = {%d, %d}\n",
                (int)sequencer_info_manifest_desc->
                max_fragment_grid_slice_count[
                        IA_CSS_COL_DIMENSION],
                (int)sequencer_info_manifest_desc->
                max_fragment_grid_slice_count[
                        IA_CSS_ROW_DIMENSION]);
            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
                "min_fragment_grid_point_decimation_factor[] = {%d, %d}\n",
                (int)sequencer_info_manifest_desc->
                min_fragment_grid_point_decimation_factor[
                        IA_CSS_COL_DIMENSION],
                (int)sequencer_info_manifest_desc->
                min_fragment_grid_point_decimation_factor[
                        IA_CSS_ROW_DIMENSION]);
            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
                "max_fragment_grid_point_decimation_factor[] = {%d, %d}\n",
                (int)sequencer_info_manifest_desc->
                max_fragment_grid_point_decimation_factor[
                        IA_CSS_COL_DIMENSION],
                (int)sequencer_info_manifest_desc->
                max_fragment_grid_point_decimation_factor[
                        IA_CSS_ROW_DIMENSION]);
            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
                "min_fragment_grid_overlay_on_pixel_topleft_index[] = {%d, %d}\n",
                (int)sequencer_info_manifest_desc->
            min_fragment_grid_overlay_pixel_topleft_index[
                        IA_CSS_COL_DIMENSION],
                (int)sequencer_info_manifest_desc->
            min_fragment_grid_overlay_pixel_topleft_index[
                        IA_CSS_ROW_DIMENSION]);
            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
                "max_fragment_grid_overlay_on_pixel_topleft_index[] = {%d, %d}\n",
                (int)sequencer_info_manifest_desc->
            max_fragment_grid_overlay_pixel_topleft_index[
                        IA_CSS_COL_DIMENSION],
                (int)sequencer_info_manifest_desc->
            max_fragment_grid_overlay_pixel_topleft_index[
                        IA_CSS_ROW_DIMENSION]);
            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
                "min_fragment_grid_overlay_on_pixel_dimension[] = {%d, %d}\n",
                (int)sequencer_info_manifest_desc->
                min_fragment_grid_overlay_pixel_dimension[
                        IA_CSS_COL_DIMENSION],
                (int)sequencer_info_manifest_desc->
                min_fragment_grid_overlay_pixel_dimension[
                        IA_CSS_ROW_DIMENSION]);
            IA_CSS_TRACE_2(PSYSAPI_STATIC, INFO,
                "max_fragment_grid_overlay_on_pixel_dimension[] = {%d, %d}\n",
                (int)sequencer_info_manifest_desc->
                max_fragment_grid_overlay_pixel_dimension[
                        IA_CSS_COL_DIMENSION],
                (int)sequencer_info_manifest_desc->
                max_fragment_grid_overlay_pixel_dimension[
                        IA_CSS_ROW_DIMENSION]);
        }
    } else if (terminal_type == IA_CSS_TERMINAL_TYPE_PROGRAM_CONTROL_INIT) {
        ia_css_program_control_init_terminal_manifest_t *progctrlinit_man =
            (ia_css_program_control_init_terminal_manifest_t *)manifest;
        ia_css_program_control_init_terminal_manifest_print(progctrlinit_man);
    } else if (terminal_type == IA_CSS_TERMINAL_TYPE_DATA_IN ||
        terminal_type == IA_CSS_TERMINAL_TYPE_DATA_OUT) {

        ia_css_data_terminal_manifest_t *dterminal_manifest =
            (ia_css_data_terminal_manifest_t *)manifest;
        int i;

        NOT_USED(dterminal_manifest);

        verifexit(ia_css_kernel_bitmap_print(
            ia_css_data_terminal_manifest_get_kernel_bitmap(
                dterminal_manifest), fid) == 0);
        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
            "formats(manifest) = %04x\n",
        (int)ia_css_data_terminal_manifest_get_frame_format_bitmap(
            dterminal_manifest));
        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
            "connection(manifest) = %04x\n",
        (int)ia_css_data_terminal_manifest_get_connection_bitmap(
            dterminal_manifest));
        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
            "dependent(manifest) = %d\n",
            (int)dterminal_manifest->terminal_dependency);

        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
            "\tmin_size[%d]   = {\n",
            IA_CSS_N_DATA_DIMENSION);
        for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
                "\t\t%4d,\n", dterminal_manifest->min_size[i]);
        }
        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
            "\t\t%4d }\n", dterminal_manifest->min_size[i]);

        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
            "\tmax_size[%d]   = {\n", IA_CSS_N_DATA_DIMENSION);
        for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
            "\t\t%4d,\n", dterminal_manifest->max_size[i]);
        }
        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
            "\t\t%4d }\n", dterminal_manifest->max_size[i]);

        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
            "\tmin_fragment_size[%d]   = {\n",
            IA_CSS_N_DATA_DIMENSION);
        for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
                "\t\t%4d,\n",
                dterminal_manifest->min_fragment_size[i]);
        }
        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
            "\t\t%4d }\n",
            dterminal_manifest->min_fragment_size[i]);

        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
            "\tmax_fragment_size[%d]   = {\n",
            IA_CSS_N_DATA_DIMENSION);
        for (i = 0; i < (int)IA_CSS_N_DATA_DIMENSION - 1; i++) {
            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
                "\t\t%4d,\n",
                dterminal_manifest->max_fragment_size[i]);
        }
        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO,
            "\t\t%4d }\n",
            dterminal_manifest->max_fragment_size[i]);

    } else if (terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_IN ||
        terminal_type == IA_CSS_TERMINAL_TYPE_PARAM_SPATIAL_OUT) {

        ia_css_spatial_param_terminal_manifest_t *stm =
            (ia_css_spatial_param_terminal_manifest_t *)manifest;
        ia_css_frame_grid_param_manifest_section_desc_t *sec;
        int sec_count =
            stm->frame_grid_param_manifest_section_desc_count;
        int sec_index;

        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "kernel_id:\t\t%d\n",
            stm->kernel_id);
        IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "compute_units_p_elem:\t%d\n",
            stm->compute_units_p_elem);
#ifndef __XTENSA_FW__
        PRINT_DIMENSION("min_fragment_grid_dimension",
            stm->common_fragment_grid_desc.min_fragment_grid_dimension);
        PRINT_DIMENSION("max_fragment_grid_dimension",
            stm->common_fragment_grid_desc.max_fragment_grid_dimension);
        PRINT_DIMENSION("min_frame_grid_dimension",
            stm->frame_grid_desc.min_frame_grid_dimension);
        PRINT_DIMENSION("max_frame_grid_dimension",
            stm->frame_grid_desc.max_frame_grid_dimension);
#endif
        for (sec_index = 0; sec_index < sec_count; sec_index++) {
            sec = ia_css_spatial_param_terminal_manifest_get_frm_grid_prm_sct_desc(
                stm, sec_index);
            verifjmpexit(sec != NULL);

            IA_CSS_TRACE_0(PSYSAPI_STATIC, INFO, "--------------------------\n");
            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\tmem_type_id:\t%d\n",
                sec->mem_type_id);
            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\tregion_id:\t%d\n",
                sec->region_id);
            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\telem_size:\t%d\n",
                sec->elem_size);
            IA_CSS_TRACE_1(PSYSAPI_STATIC, INFO, "\tmax_mem_size:\t%d\n",
                sec->max_mem_size);
        }
    } else if (terminal_type < IA_CSS_N_TERMINAL_TYPES) {
        IA_CSS_TRACE_0(PSYSAPI_STATIC, WARNING,
            "terminal type can not be pretty printed, not supported\n");
    }

    retval = 0;
EXIT:
    if (retval != 0) {
        IA_CSS_TRACE_1(PSYSAPI_STATIC, ERROR,
            "ia_css_terminal_manifest_print failed (%i)\n",
            retval);
    }
    return retval;
}

/* Program control init Terminal */
unsigned int ia_css_program_control_init_terminal_manifest_get_connect_section_count(
    const ia_css_program_control_init_manifest_program_desc_t *prog)
{
    assert(prog);
    return prog->connect_section_count;
}


unsigned int ia_css_program_control_init_terminal_manifest_get_load_section_count(
    const ia_css_program_control_init_manifest_program_desc_t *prog)
{
    assert(prog);
    return prog->load_section_count;
}

unsigned int ia_css_program_control_init_terminal_manifest_get_size(
    const uint16_t nof_programs,
    const uint16_t *nof_load_sections,
    const uint16_t *nof_connect_sections)
{
    (void)nof_load_sections; /* might be needed in future */
    (void)nof_connect_sections; /* might be needed in future */

    return sizeof(ia_css_program_control_init_terminal_manifest_t) +
        nof_programs *
        sizeof(ia_css_program_control_init_manifest_program_desc_t);
}

ia_css_program_control_init_manifest_program_desc_t *
ia_css_program_control_init_terminal_manifest_get_program_desc(
    const ia_css_program_control_init_terminal_manifest_t *terminal,
    unsigned int program)
{
    ia_css_program_control_init_manifest_program_desc_t *progs;

    assert(terminal != NULL);
    assert(program < terminal->program_count);

    progs = (ia_css_program_control_init_manifest_program_desc_t *)
        ((const char *)terminal + terminal->program_desc_offset);

    return &progs[program];
}

int ia_css_program_control_init_terminal_manifest_init(
    ia_css_program_control_init_terminal_manifest_t *terminal,
    const uint16_t nof_programs,
    const uint16_t *nof_load_sections,
    const uint16_t *nof_connect_sections)
{
    unsigned int i;
    ia_css_program_control_init_manifest_program_desc_t *progs;

    if (terminal == NULL) {
        return -EFAULT;
    }

    terminal->program_count = nof_programs;
    terminal->program_desc_offset =
        sizeof(ia_css_program_control_init_terminal_manifest_t);

    progs = ia_css_program_control_init_terminal_manifest_get_program_desc(
        terminal, 0);

    for (i = 0; i < nof_programs; i++) {
        progs[i].load_section_count = nof_load_sections[i];
        progs[i].connect_section_count = nof_connect_sections[i];
    }
    return 0;
}

void ia_css_program_control_init_terminal_manifest_print(
    ia_css_program_control_init_terminal_manifest_t *terminal)
{
    unsigned int i;

    ia_css_program_control_init_manifest_program_desc_t *progs;

    progs = ia_css_program_control_init_terminal_manifest_get_program_desc(
        terminal, 0);

    assert(progs);
    (void)progs;

    for (i = 0; i < terminal->program_count; i++) {
        IA_CSS_TRACE_3(PSYSAPI_STATIC, INFO,
            "program index: %d, load sec: %d, connect sec: %d\n",
            i,
            progs[i].load_section_count,
            progs[i].connect_section_count);
    }
}

#endif

