#ifndef MEGBRAIN_EXTERN_C_OPR_H
#define MEGBRAIN_EXTERN_C_OPR_H
#include <stddef.h>
#include <stdint.h>
#define MGB_PUBLIC __attribute__((visibility("default")))
#ifdef __cplusplus
extern "C" {
#endif
#define MGB_EXTERN_C_OPR_VERSION 0x23
#define MGB_TENSOR_MAX_NDIM 8
typedef enum MGBDType { MGB_DTYPE_FLOAT32, MGB_DTYPE_INT32 } MGBDType;
typedef struct MGBTensorShape {
uint32_t ndim, shape[MGB_TENSOR_MAX_NDIM];
} MGBTensorShape;
typedef struct MGBTensorLayout {
uint32_t dtype;
MGBTensorShape shape;
} MGBTensorLayout;
typedef struct MGBTensor {
MGBTensorLayout layout;
void* data; } MGBTensor;
typedef struct ExternCOprParam {
size_t _;
} ExternCOprParam;
typedef struct MGBOprDesc {
size_t nr_input, nr_output;
const char* type_name;
void (*release)(struct MGBOprDesc* self);
size_t (*hash)(const struct MGBOprDesc* self);
int (*is_same)(const struct MGBOprDesc* self, const struct MGBOprDesc* rhs);
void (*execute)(
const struct MGBOprDesc* self, const MGBTensor* input, MGBTensor* output);
void (*infer_shape)(
const struct MGBOprDesc* self, const MGBTensorShape* input,
MGBTensorShape* output);
void* user_data;
ExternCOprParam* dynamic_param;
} MGBOprDesc;
#define MGB_OPR_DESC_FOREACH_MEM_FN(cb) \
cb(release) cb(hash) cb(is_same) cb(execute) cb(infer_shape)
typedef struct MGBOprLoader {
const char* name;
MGBOprDesc* (*create_desc)(size_t nr_input, const void* buf, size_t buf_len);
} MGBOprLoader;
typedef struct MGBExternCOprApi {
int (*register_loader)(const MGBOprLoader* loader);
int (*unregister_loader)(const char* name);
} MGBExternCOprApi;
MGB_PUBLIC const MGBExternCOprApi* mgb_get_extern_c_opr_api_versioned(int version);
#ifdef __cplusplus
}
#endif
static inline const MGBExternCOprApi* mgb_get_extern_c_opr_api() {
return mgb_get_extern_c_opr_api_versioned(MGB_EXTERN_C_OPR_VERSION);
}
static inline size_t mgb_get_dtype_size(MGBDType dtype) {
switch (dtype) {
case MGB_DTYPE_INT32:
return 4;
case MGB_DTYPE_FLOAT32:
return 4;
default:
__builtin_trap();
return -1;
}
}
#undef MGB_PUBLIC
#endif