#include "ffi.h"
#include "fp.h"
#include "fp4.h"
#include <cstdint>
#include <stdexcept>
using namespace risc0;
extern "C" const char* risc0_circuit_string_ptr(risc0_string* str) {
return str->str.c_str();
}
extern "C" void risc0_circuit_string_free(risc0_string* str) {
delete str;
}
struct BridgeContext {
void* ctx;
Callback* callback;
};
void bridgeCallback(void* ctx,
const char* name,
const char* extra,
const Fp* args_ptr,
size_t args_len,
Fp* outs_ptr,
size_t outs_len) {
BridgeContext* bridgeCtx = reinterpret_cast<BridgeContext*>(ctx);
if (!bridgeCtx->callback(bridgeCtx->ctx, name, extra, args_ptr, args_len, outs_ptr, outs_len)) {
throw std::runtime_error("Host callback failure");
}
}
extern "C" uint32_t risc0_circuit_rv32im_step_compute_accum(risc0_error* err,
void* ctx,
Callback callback,
size_t steps,
size_t cycle,
Fp** args_ptr,
size_t ) {
return ffi_wrap<uint32_t>(err, 0, [&] {
BridgeContext bridgeCtx{ctx, callback};
return circuit::rv32im::step_compute_accum(&bridgeCtx, bridgeCallback, steps, cycle, args_ptr)
.asRaw();
});
}
extern "C" uint32_t risc0_circuit_rv32im_step_verify_accum(risc0_error* err,
void* ctx,
Callback callback,
size_t steps,
size_t cycle,
Fp** args_ptr,
size_t ) {
return ffi_wrap<uint32_t>(err, 0, [&] {
BridgeContext bridgeCtx{ctx, callback};
return circuit::rv32im::step_verify_accum(&bridgeCtx, bridgeCallback, steps, cycle, args_ptr)
.asRaw();
});
}
extern "C" uint32_t risc0_circuit_rv32im_step_exec(risc0_error* err,
void* ctx,
Callback callback,
size_t steps,
size_t cycle,
Fp** args_ptr,
size_t ) {
return ffi_wrap<uint32_t>(err, 0, [&] {
BridgeContext bridgeCtx{ctx, callback};
return circuit::rv32im::step_exec(&bridgeCtx, bridgeCallback, steps, cycle, args_ptr).asRaw();
});
}
extern "C" uint32_t risc0_circuit_rv32im_step_verify_bytes(risc0_error* err,
void* ctx,
Callback callback,
size_t steps,
size_t cycle,
Fp** args_ptr,
size_t ) {
return ffi_wrap<uint32_t>(err, 0, [&] {
BridgeContext bridgeCtx{ctx, callback};
return circuit::rv32im::step_verify_bytes(&bridgeCtx, bridgeCallback, steps, cycle, args_ptr)
.asRaw();
});
}
extern "C" uint32_t risc0_circuit_rv32im_step_verify_mem(risc0_error* err,
void* ctx,
Callback callback,
size_t steps,
size_t cycle,
Fp** args_ptr,
size_t ) {
return ffi_wrap<uint32_t>(err, 0, [&] {
BridgeContext bridgeCtx{ctx, callback};
return circuit::rv32im::step_verify_mem(&bridgeCtx, bridgeCallback, steps, cycle, args_ptr)
.asRaw();
});
}
#if defined(__clang__)
#pragma clang diagnostic ignored "-Wreturn-type-c-linkage"
#endif
extern "C" Fp4 risc0_circuit_rv32im_poly_fp(size_t cycle, size_t steps, Fp4* poly_mix, Fp** args) {
return circuit::rv32im::poly_fp(cycle, steps, poly_mix, args);
}