#include "context.h"
#include <cassert>
#include <iostream>
#include <stdexcept>
#if defined(__clang__)
#pragma clang diagnostic ignored "-Wunused-parameter"
#elif defined(__GNUC__)
#pragma GCC diagnostic ignored "-Wunused-parameter"
#endif
using namespace risc0;
namespace risc0::circuit::recursion {
void extern_readIOPHeader(void* ctx, size_t cycle, const char* extra, std::array<Fp, 2> args) {
}
std::array<Fp, 4>
extern_readIOPBody(void* ctx, size_t cycle, const char* extra, std::array<Fp, 3> args) {
PreflightTrace* trace = static_cast<MachineContext*>(ctx)->trace;
uint32_t iopIdx = trace->cycles[cycle].iopIdx++;
const FpExt& body = trace->iops[iopIdx];
return {
body.elems[0],
body.elems[1],
body.elems[2],
body.elems[3],
};
}
std::array<Fp, 4>
extern_womRead(void* ctx, size_t cycle, const char* extra, std::array<Fp, 1> args) {
PreflightTrace* trace = static_cast<MachineContext*>(ctx)->trace;
uint32_t addr = args[0].asUInt32();
FpExt& val = trace->wom[addr];
return {
val.elems[0],
val.elems[1],
val.elems[2],
val.elems[3],
};
}
void extern_womWrite(void* ctx, size_t cycle, const char* extra, std::array<Fp, 5> args) {
}
void extern_plonkWrite_wom(void* ctx, size_t cycle, const char* extra, std::array<Fp, 5> args) {
MachineContext* mctx = static_cast<MachineContext*>(ctx);
uint32_t addr = args[0].asUInt32();
FpExt value(args[1], args[2], args[3], args[4]);
uint32_t idx = mctx->womIndex[cycle]++;
assert(idx < kMaxWomRowsPerCycle);
WomArgumentRow& row = mctx->womRows[cycle * kMaxWomRowsPerCycle + idx];
row.addr = addr;
row.value = value;
}
std::array<Fp, 5>
extern_plonkRead_wom(void* ctx, size_t cycle, const char* extra, std::array<Fp, 0> args) {
MachineContext* mctx = static_cast<MachineContext*>(ctx);
uint32_t idx = mctx->womIndex[cycle]++;
const WomArgumentRow& row = mctx->womRows[idx];
return {
row.addr,
row.value.elems[0],
row.value.elems[1],
row.value.elems[2],
row.value.elems[3],
};
}
void extern_plonkWriteAccum_wom(void* ctx,
size_t cycle,
const char* extra,
std::array<Fp, 4> args) {
AccumContext* actx = static_cast<AccumContext*>(ctx);
actx->accum[cycle] = FpExt(args[0], args[1], args[2], args[3]);
}
std::array<Fp, 4>
extern_plonkReadAccum_wom(void* ctx, size_t cycle, const char* extra, std::array<Fp, 0> args) {
AccumContext* actx = static_cast<AccumContext*>(ctx);
const FpExt& value = actx->accum[cycle];
return {
value.elems[0],
value.elems[1],
value.elems[2],
value.elems[3],
};
}
std::array<Fp, 16>
extern_readCoefficients(void* ctx, size_t cycle, const char* extra, std::array<Fp, 0> args) {
throw std::runtime_error("TODO");
}
void extern_log(void* ctx, size_t cycle, const char* extra, std::vector<Fp> args) {
}
}