#pragma once
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#define MAX_SUBSTRATES 16
enum SokrResult
#ifdef __cplusplus
: uint32_t
#endif {
SOKR_RESULT_OK = 0,
SOKR_RESULT_CAPABILITY_DENIED = 1,
SOKR_RESULT_DISPATCH_FAILED = 2,
SOKR_RESULT_TIMEOUT = 3,
SOKR_RESULT_VERSION_MISMATCH = 4,
SOKR_RESULT_NO_CAPABLE_SUBSTRATE = 5,
SOKR_RESULT_INVALID_INPUT = 6,
SOKR_RESULT_INVALID_IR = 7,
SOKR_RESULT_NOT_FOUND = 8,
SOKR_RESULT_REGISTRY_FULL = 9,
};
#ifndef __cplusplus
typedef uint32_t SokrResult;
#endif
enum SokrCompletionSignal
#ifdef __cplusplus
: uint32_t
#endif {
SOKR_COMPLETION_SIGNAL_PENDING = 0,
SOKR_COMPLETION_SIGNAL_COMPLETE = 1,
SOKR_COMPLETION_SIGNAL_FAILED = 2,
SOKR_COMPLETION_SIGNAL_TIMED_OUT = 3,
};
#ifndef __cplusplus
typedef uint32_t SokrCompletionSignal;
#endif
typedef struct SokrVersion {
uint32_t major;
uint32_t minor;
uint32_t patch;
} SokrVersion;
#define SokrVersion_CURRENT (SokrVersion){ .major = 0, .minor = 3, .patch = 0 }
typedef struct SokrComputationId {
uint64_t high;
uint64_t low;
} SokrComputationId;
typedef struct SokrCapabilityQuery {
struct SokrComputationId computation_id;
const char *ir_format;
const void *ir_data_ptr;
uintptr_t ir_data_len;
uint8_t padding[8];
} SokrCapabilityQuery;
typedef struct SokrCapabilityResponse {
SokrResult result;
uint32_t padding;
uint64_t substrate_id;
uint64_t estimated_latency_ns;
} SokrCapabilityResponse;
typedef SokrResult (*SokrCapabilityFn)(const struct SokrVersion *version,
const struct SokrCapabilityQuery *query,
struct SokrCapabilityResponse *response);
typedef struct SokrDispatchRequest {
struct SokrComputationId computation_id;
uint64_t substrate_id;
const void *ir_data_ptr;
uintptr_t ir_data_len;
const void *params_ptr;
uintptr_t params_len;
uint8_t padding[16];
} SokrDispatchRequest;
typedef uint64_t SokrCompletionToken;
typedef struct SokrDispatchResponse {
SokrResult result;
uint32_t padding;
SokrCompletionToken completion_token;
} SokrDispatchResponse;
typedef SokrResult (*SokrDispatchFn)(const struct SokrDispatchRequest *request,
struct SokrDispatchResponse *response);
typedef struct SokrCompletionQuery {
SokrCompletionToken completion_token;
uint64_t timeout_ns;
uint8_t padding[8];
} SokrCompletionQuery;
typedef SokrResult (*SokrCompletionFn)(const struct SokrCompletionQuery *query,
SokrCompletionSignal *signal);
typedef void (*SokrDestroyFn)(void);
typedef struct SokrSubstratePlugin {
struct SokrVersion version;
SokrCapabilityFn capability_fn;
SokrDispatchFn dispatch_fn;
SokrCompletionFn completion_fn;
SokrDestroyFn destroy_fn;
uint64_t substrate_id;
uint8_t padding[8];
} SokrSubstratePlugin;
#ifdef __cplusplus
extern "C" {
#endif
extern const struct SokrVersion SOKR_VERSION_CURRENT;
const struct SokrVersion *sokr_version(void) ;
SokrResult sokr_check_version(const struct SokrVersion *plugin, int32_t *result) ;
SokrResult sokr_register_substrate(const struct SokrSubstratePlugin *plugin,
uint64_t *substrate_id_out)
;
SokrResult sokr_deregister_substrate(uint64_t substrate_id) ;
SokrResult sokr_list_substrates(uint64_t *substrate_ids_out,
uintptr_t capacity,
uintptr_t *count_out)
;
SokrResult sokr_capability(const struct SokrCapabilityQuery *query,
struct SokrCapabilityResponse *response)
;
SokrResult sokr_dispatch(const struct SokrDispatchRequest *request,
struct SokrDispatchResponse *response)
;
SokrResult sokr_completion(const struct SokrCompletionQuery *query, SokrCompletionSignal *signal) ;
#ifdef __cplusplus
} #endif