//==============================================================================
//
// Copyright (c) 2019-2021 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
//
//==============================================================================
# ifndef SNPE_UDO_IMPL_H
# define SNPE_UDO_IMPL_H
# include <stdbool.h>
# include "SnpeUdo/UdoShared.h"
# ifdef __cplusplus
extern " C "
{
# endif
/** @addtogroup c_plus_plus_apis C++
@ { */
typedef struct _SnpeUdo_OpFactory_t * SnpeUdo_OpFactory_t ;
typedef struct _SnpeUdo_Operation_t * SnpeUdo_Operation_t ;
typedef SnpeUdo_OpFactory_t Udo_OpFactory_t ;
typedef SnpeUdo_Operation_t Udo_Operation_t ;
/**
* @ brief Initialize the shared library ' s data structures . Calling any other
* library function before this one will result in error .
*
* @ param [ in ] globalInfrastructure Global core - specific infrastructure to be
* used by operations created in this library . The definition and
* semantics of this object will be defined in the corresponding
* implementation header for the core type .
* @ return Error code
*/
SnpeUdo_ErrorType_t
SnpeUdo_initImplLibrary ( void * globalInfrastructure ) ;
typedef SnpeUdo_ErrorType_t
( * SnpeUdo_InitImplLibraryFunction_t ) ( void * ) ;
/**
* @ brief A function to query the API version of the UDO implementation library .
* The function populates a SnpeUdo_LibVersion_t struct , which contains a SnpeUdo_Version_t
* struct for API version and library version .
*
* @ param [ in , out ] version A pointer to struct which contains major , minor , teeny information for
* library and api versions .
*
* @ return Error code
*/
SnpeUdo_ErrorType_t
SnpeUdo_getImplVersion ( SnpeUdo_LibVersion_t * * version ) ;
typedef SnpeUdo_ErrorType_t
( * SnpeUdo_getImplVersion_t ) ( SnpeUdo_LibVersion_t * * version ) ;
/**
* @ brief Release the shared library ' s data structures , and invalidate any
* handles returned by the library . The behavior of any outstanding
* asynchronous calls made to this library when this function is called
* are undefined . All library functions ( except SnpeUdo_initImplLibrary ) will
* return an error after this function has been successfully called .
*
* It should be possible to call SnpeUdo_initImplLibrary after calling this
* function , and re - initialize the library .
*
* @ return Error code
*/
SnpeUdo_ErrorType_t
SnpeUdo_terminateImplLibrary ( void ) ;
typedef SnpeUdo_ErrorType_t
( * SnpeUdo_TerminateImplLibraryFunction_t ) ( void ) ;
/**
* @ brief A function to query info on the UDO implementation library .
* The function populates a structure which contains information about
* operations that are part of this library
*
* @ param [ in , out ] implementationInfo A pointer to struct which contains information
* on the operations
*
* @ return error code
*
*/
SnpeUdo_ErrorType_t
SnpeUdo_getImpInfo ( SnpeUdo_ImpInfo_t * * implementationInfo ) ;
typedef SnpeUdo_ErrorType_t
( * SnpeUdo_GetImpInfoFunction_t ) ( SnpeUdo_ImpInfo_t * * implementationInfo ) ;
typedef SnpeUdo_GetImpInfoFunction_t Udo_GetImpInfoFunction_t ;
/**
* @ brief A function to create an operation factory .
* The function receives the operation type , and an array of static parameters ,
* and returns operation factory handler
*
* @ param [ in ] udoCoreType The Core type to create the operation on . An error will
* be returned if this does not match the core type of the library .
*
* @ param [ in ] perFactoryInfrastructure CreateOpFactory infrastructure appropriate to this
* core type . The definition and semantics of this object will be defined
* in the corresponding implementation header for the core type .
*
* @ param [ in ] operationType A string containing Operation type . for example " MY_CONV "
*
* @ param [ in ] numOfStaticParams The number of static parameters .
*
* @ param [ in ] staticParams Array of static parameters
*
* @ param [ in , out ] opFactory Handler to Operation Factory , to be used when creating operations
*
* @ return Error Code
*/
SnpeUdo_ErrorType_t
SnpeUdo_createOpFactory ( SnpeUdo_CoreType_t udoCoreType ,
void * perFactoryInfrastructure ,
SnpeUdo_String_t operationType ,
uint32_t numOfStaticParams ,
SnpeUdo_Param_t * staticParams ,
SnpeUdo_OpFactory_t * opFactory ) ;
typedef SnpeUdo_ErrorType_t
( * SnpeUdo_CreateOpFactoryFunction_t ) ( SnpeUdo_CoreType_t ,
void * ,
SnpeUdo_String_t ,
uint32_t ,
SnpeUdo_Param_t * ,
SnpeUdo_OpFactory_t * ) ;
typedef SnpeUdo_CreateOpFactoryFunction_t Udo_CreateOpFactoryFunction_t ;
/**
* @ brief A function to release the resources allocated for an operation factory
* created by this library .
*
* @ param [ in ] factory The operation factory to release . Upon success this handle will be invalidated .
*
* @ return Error Code
*/
SnpeUdo_ErrorType_t
SnpeUdo_releaseOpFactory ( SnpeUdo_OpFactory_t opFactory ) ;
typedef SnpeUdo_ErrorType_t
( * SnpeUdo_ReleaseOpFactoryFunction_t ) ( SnpeUdo_OpFactory_t ) ;
typedef SnpeUdo_ReleaseOpFactoryFunction_t Udo_ReleaseOpFactoryFunction_t ;
/**
* @ brief A function to create an operation from the factory .
* The function receives array of inputs and array of outputs , and creates an operation
* instance , returning the operation instance handler .
*
* @ param [ in ] opFactory OpFactory instance containing the parameters for this operation .
*
* @ param [ in ] perOpInfrastructure Per - Op infrastructure for this operation . The definition
* and semantics of this object will be defined in the implementation header
* appropriate to this core type .
*
* @ param [ in ] numOfInputs The number of input tensors this operation will receive .
*
* @ param [ in ] inputs Array of input tensors , providing both the sizes and initial
* location of the data .
*
* @ param [ in ] numOfOutputs Number of output tensors this operation will produce .
*
* @ param [ in ] outputs Array of output tensors , providing both the sizes and
* initial location of the data .
*
* @ param [ in , out ] operation Handle for newly created operation instance .
*
* @ return Error Code
*/
SnpeUdo_ErrorType_t
SnpeUdo_createOperation ( SnpeUdo_OpFactory_t opFactory ,
void * perOpInfrastructure ,
uint32_t numOfInputs ,
SnpeUdo_TensorParam_t * inputs ,
uint32_t numOfOutputs ,
SnpeUdo_TensorParam_t * outputs ,
SnpeUdo_Operation_t * operation ) ;
typedef SnpeUdo_ErrorType_t
( * SnpeUdo_CreateOperationFunction_t ) ( SnpeUdo_OpFactory_t ,
void * ,
uint32_t ,
SnpeUdo_TensorParam_t * ,
uint32_t ,
SnpeUdo_TensorParam_t * ,
SnpeUdo_Operation_t * ) ;
typedef SnpeUdo_CreateOperationFunction_t Udo_CreateOperationFunction_t ;
/**
* @ brief A pointer to notification function .
*
* The notification function supports the non - blocking ( e . g . asynchronous ) execution use - case .
* In case an " executeUdoOp " function is called with " blocking " set to zero , and a
* notify function , this function will be called by the implementation library at the
* end of execution . The implementation library will pass the notify function the ID
* that was provided to it when " executeUdoOp " was called .
*
* @ param [ in ] ID 32 - bit value , that was provided to executeUdoOp by the calling entity .
* Can be used to track the notifications , in case of multiple execute calls issued .
*
* @ return Error code
*
*/
typedef SnpeUdo_ErrorType_t
( * SnpeUdo_ExternalNotify_t ) ( const uint32_t ID ) ;
typedef SnpeUdo_ExternalNotify_t Udo_ExternalNotify_t ;
/**
* @ brief Operation execution function .
*
* Calling this function will run the operation on set of inputs , generating a set of outputs .
* The call can be blocking ( synchronous ) or non - blocking ( asynchronous ) . To support the
* non - blocking mode , the calling entity can pass an ID and a notification function .
* At the end of the execution this notification function would be called , passing it the ID .
* < b > NOTE : Asynchronous execution mode not supported in this release . < / b >
*
* @ param [ in ] operation handle to the operation on which execute is invoked
* @ param [ in ] blocking flag to indicate execution mode .
* If set , execution is blocking ,
* e . g SnpeUdo_executeOp call does not return until execution is done .
* If not set , SnpeUdo_executeOp returns immediately , and the
* library will call the notification function ( if set ) when execution is done .
*
* @ param [ in ] ID 32 - bit number that can be used by the calling entity to track execution
* in case of non - blocking execution .
* For example , it can be a sequence number , increased by one on each call .
*
* @ param [ in ] notifyFunc Pointer to notification function . if the pointer is set , and execution is
* non - blocking , the library will call this function at end of execution ,
* passing the number provided as ID
*
* @ return Error code
*
*/
SnpeUdo_ErrorType_t
SnpeUdo_executeOp ( SnpeUdo_Operation_t operation ,
bool blocking ,
const uint32_t ID ,
SnpeUdo_ExternalNotify_t notifyFunc ) ;
typedef SnpeUdo_ErrorType_t
( * SnpeUdo_ExecuteOpFunction_t ) ( SnpeUdo_Operation_t ,
bool ,
const uint32_t ,
SnpeUdo_ExternalNotify_t ) ;
typedef SnpeUdo_ExecuteOpFunction_t Udo_ExecuteOpFunction_t ;
/**
* @ brief A function to setting the inputs & outputs . part of SnpeUdo_Operation struct ,
* returned from creation of a new operation instance .
* < b > Not supported in this release . < / b >
*
* This function allows the calling entity to change some of the inputs and outputs
* between calls to execute .
* Note that the change is limited to changing the < b > pointer < / b > to the tensor data only .
* Any other change may be rejected by the implementation library , causing
* immediate invalidation of the operation instance
*
* @ param [ in ] operation Operation on which IO tensors are set
*
* @ param [ in ] inputs array of tensor parameters . The calling entity may provide a subset of the
* operation inputs , providing only those that it wants to change .
*
* @ param [ in ] outputs array of tensor parameters . The calling entity may provide a subset of the
* operation outputs , providing only those that it wants to change .
*
* @ return Error code
*
*/
SnpeUdo_ErrorType_t
SnpeUdo_setOpIO ( SnpeUdo_Operation_t operation ,
SnpeUdo_TensorParam_t * inputs ,
SnpeUdo_TensorParam_t * outputs ) ;
typedef SnpeUdo_ErrorType_t
( * SnpeUdo_SetOpIOFunction_t ) ( SnpeUdo_Operation_t ,
SnpeUdo_TensorParam_t * ,
SnpeUdo_TensorParam_t * ) ;
typedef SnpeUdo_SetOpIOFunction_t Udo_SetOpIOFunction_t ;
/**
* @ brief A function to return execution times .
*
* This function can be called to query the operation execution times on the IP core
* on which the operation is run . The time is provided in micro - seconds
*
* @ param [ in ] operation Handle to operation whose execution time is being profiled
*
* @ param [ in , out ] executionTime pointer to a uint32 value . This function writes the operation
* execution time in usec into this value .
*
* @ return Error code
*
*/
SnpeUdo_ErrorType_t
SnpeUdo_profileOp ( SnpeUdo_Operation_t operation , uint32_t * executionTime ) ;
typedef SnpeUdo_ErrorType_t
( * SnpeUdo_ProfileOpFunction_t ) ( SnpeUdo_Operation_t , uint32_t * ) ;
typedef SnpeUdo_ProfileOpFunction_t Udo_ProfileOpFunction_t ;
/**
* @ brief A function to release the operation instance
* \ n When it is called , the implementation library needs to release all resources
* allocated for this operation instance .
* \ n Note that all function pointers which are part of SnpeUdo_Operation become
* < b > invalid < / b > once releaseUdoOp call returns .
*
* @ param [ in ] operation Handle to operation to be released
* @ return Error code
*
*/
SnpeUdo_ErrorType_t
SnpeUdo_releaseOp ( SnpeUdo_Operation_t operation ) ;
typedef SnpeUdo_ErrorType_t
( * SnpeUdo_ReleaseOpFunction_t ) ( SnpeUdo_Operation_t ) ;
typedef SnpeUdo_ReleaseOpFunction_t Udo_ReleaseOpFunction_t ;
/** @} */ /* end_addtogroup c_plus_plus_apis C++ */
# ifdef __cplusplus
} // extern "C"
# endif
# endif //SNPE_UDO_IMPL_H