82int main(
int argc,
char **argv) {
83 llvm::sys::PrintStackTraceOnErrorSignal(llvm::StringRef());
84 llvm::setBugReportMsg(
86 " and include the crash backtrace, relevant LLZK files, and associated run script(s).\n"
89 llvm::cl::ParseCommandLineOptions(
91 "llzk-witgen: execute LLZK compute semantics and emit JSON public outputs.\n"
92 "Note: llzk-witgen v1 ignores constrain() and traps on bool.assert.\n"
95 DialectRegistry registry;
97 mlir::func::registerInlinerExtension(registry);
99 mlir::arith::ArithDialect, mlir::cf::ControlFlowDialect, mlir::func::FuncDialect,
100 mlir::memref::MemRefDialect, mlir::scf::SCFDialect>();
102 context.appendDialectRegistry(registry);
103 context.loadAllAvailableDialects();
105 mlir::arith::ArithDialect, mlir::cf::ControlFlowDialect, mlir::func::FuncDialect,
106 mlir::memref::MemRefDialect, mlir::scf::SCFDialect>();
111 auto sourceBuffer = llvm::MemoryBuffer::getFileOrSTDIN(InputFilename);
113 llvm::errs() << sourceBuffer.getError().message() <<
'\n';
117 ParserConfig parserConfig(&context);
118 OwningOpRef<ModuleOp> moduleOp =
119 parseSourceString<ModuleOp>(sourceBuffer.get()->getBuffer(), parserConfig, InputFilename);
124 auto buffer = llvm::MemoryBuffer::getFileOrSTDIN(InputsFilename);
126 llvm::errs() << buffer.getError().message() <<
'\n';
130 auto parsed = llvm::json::parse(buffer.get()->getBuffer());
132 llvm::errs() <<
"failed to parse JSON input: " << llvm::toString(parsed.takeError()) <<
'\n';
137 if (BackendName ==
"execution-engine") {
139 }
else if (BackendName ==
"interpreter") {
142 llvm::errs() <<
"unknown backend: " << BackendName <<
'\n';
145 if (OutputScopeName ==
"full-witness") {
147 }
else if (OutputScopeName ==
"public") {
150 llvm::errs() <<
"unknown output scope: " << OutputScopeName <<
'\n';
153 if (UninitializedBehaviorName ==
"zero") {
155 }
else if (UninitializedBehaviorName ==
"random") {
157 }
else if (UninitializedBehaviorName ==
"fail") {
160 llvm::errs() <<
"unknown uninitialized behavior: " << UninitializedBehaviorName <<
'\n';
163 if (UninitializedSeed.getNumOccurrences() > 0) {
172 llvm::errs() <<
"llzk-witgen error: " << llvm::toString(result.takeError()) <<
'\n';
176 if (CheckOutputFilename.getNumOccurrences() > 0) {
177 auto expectedBuffer = llvm::MemoryBuffer::getFileOrSTDIN(CheckOutputFilename);
178 if (!expectedBuffer) {
179 llvm::errs() << expectedBuffer.getError().message() <<
'\n';
183 auto expected = llvm::json::parse(expectedBuffer.get()->getBuffer());
185 llvm::errs() <<
"failed to parse expected JSON output: "
186 << llvm::toString(expected.takeError()) <<
'\n';
190 llvm::SmallVector<llzk::witgen::JSONMismatch> mismatches;
192 if (!mismatches.empty()) {
193 llvm::errs() <<
"llzk-witgen output mismatch:\n";
198 llvm::outs() <<
"output matched expected JSON\n";
202 llvm::outs() << llvm::formatv(
"{0:2}", *result) <<
'\n';
void diffJSON(const llvm::json::Value &expected, const llvm::json::Value &actual, llvm::SmallVectorImpl< JSONMismatch > &out, llvm::StringRef path)
Compare two JSON values structurally and append any mismatches to out.
llvm::Expected< llvm::json::Value > runWitgen(ModuleOp moduleOp, const llvm::json::Value &input, const WitgenOptions &options)
Run include preprocessing, field validation, and backend execution.