/*
 * 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.
 */

#ifndef __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_SIM_H
#define __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_SIM_H

/*! \file */

/** @file ia_css_psys_program_group_manifest.sim.h
 *
 * Define the methods on the program group manifest object: Simulation only
 */

#include <ia_css_psys_manifest_types.h>

#include <type_support.h>	/* uint8_t */
#include "ia_css_terminal_defs.h"

/*! Create a program group manifest object from specification

 @param	specification[in]		specification (index)

 @return NULL on error
 */
extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_create(
	const unsigned int specification);

/*! Destroy the program group manifest object

 @param	manifest[in]			program group manifest

 @return NULL
 */
extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_destroy(
	ia_css_program_group_manifest_t			*manifest);

/*! Compute the size of storage required for allocating
 * the program group (PG) manifest object

 @param	program_count[in]			Number of programs in the PG
 @param	terminal_count[in]			Number of terminals on the PG
 @param program_needs_extension[in]		Array[program count]
 @param	program_dependency_count[in]		Array[program_count] with the PG
 @param	terminal_dependency_count[in]		Array[program_count] with the
						terminal dependencies
 @param	terminal_type[in]			Array[terminal_count] with the
						terminal type
 @param	cached_in_param_section_count[in]	Number of parameter
						in terminal sections
 @param	cached_out_param_section_count[in]	Number of parameter
						out terminal sections
 @param	sliced_param_section_count[in]		Array[sliced_terminal_count]
						with sections per
						sliced in terminal
 @param	sliced_out_param_section_count[in]	Array[sliced_terminal_count]
						with sections per
						sliced out terminal
 @param	spatial_param_section_count[in]		Array[spatial_terminal_count]
						with sections per
						spatial terminal
 @param	fragment_param_section_count[in]	Number of fragment parameter
						sections of the
						program init terminal,
 @param	kernel_fragment_seq_count[in]		Number of
						kernel_fragment_seq_count.
 @param	progctrlinit_load_section_counts[in]	Number of progctrinit load
						sections (size of array is program_count)
 @param	progctrlinit_connect_section_counts[in]	Number of progctrinit connect
						sections (size of array is program_count)
 @return 0 on error
 */
size_t ia_css_sizeof_program_group_manifest(
	const uint8_t			program_count,
	const uint8_t			terminal_count,
	const uint8_t			*program_needs_extension,
	const uint8_t			*program_dependency_count,
	const uint8_t			*terminal_dependency_count,
	const ia_css_terminal_type_t	*terminal_type,
	const uint16_t			*cached_in_param_section_count,
	const uint16_t			*cached_out_param_section_count,
	const uint16_t			*spatial_param_section_count,
	const uint16_t			*fragment_param_section_count,
	const uint16_t			*sliced_param_section_count,
	const uint16_t			*sliced_out_param_section_count,
	const uint16_t			*kernel_fragment_seq_count,
	const uint16_t			*progctrlinit_load_section_counts,
	const uint16_t			*progctrlinit_connect_section_counts);

/*! Create (the storage for) the program group manifest object

 @param	program_count[in]		Number of programs in the program group
 @param	terminal_count[in]		Number of terminals on the program group
 @param	program_dependency_count[in]	Array[program_count] with the
					program dependencies
 @param	terminal_dependency_count[in]	Array[program_count] with the
					terminal dependencies
 @param	terminal_type[in]		Array[terminal_count] with the
					terminal type

 @return NULL on error
 */
extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_alloc(
	const uint8_t			program_count,
	const uint8_t			terminal_count,
	const uint8_t			*program_dependency_count,
	const uint8_t			*terminal_dependency_count,
	const ia_css_terminal_type_t	*terminal_type);

/*! Free (the storage of) the program group manifest object

 @param	manifest[in]			program group manifest

 @return NULL
 */
extern ia_css_program_group_manifest_t *ia_css_program_group_manifest_free(
	ia_css_program_group_manifest_t *manifest);

#endif /* __IA_CSS_PSYS_PROGRAM_GROUP_MANIFEST_SIM_H */
