这个目录里放的是一个可运行的 hook 原型:
upstream/:复制出来的相关 upstream 代码hooks/:hook 入口和实际 C++ parser runnerprogram_a/:模拟的程序 Atests/:示例测试output/:输出的 JSON
需要本机有:
python3g++bisonflex
在 LLM-P4LTL 目录下执行:
python3 hooks/p4ltl_hook_pipeline.py \
--p4 upstream/Artifact/benchmark/Temporal\ Verification/Case\ Study/P4NIS/main.p4 \
--p4ltl upstream/Artifact/benchmark/Temporal\ Verification/Case\ Study/P4NIS/9.p4ltl \
--program-a "python3 program_a/save_json_sink.py --output-dir output/program_a"这个命令会做三件事:
- 自动编译
hooks/p4ltl_hook_runner.cpp - 用复制出来的 实际 C++ P4LTL parser 解析
.p4ltl - 生成 JSON 并通过 stdin 发给程序 A,程序 A 会把 JSON 保存到
output/program_a/
如果你希望按真正的 Check.sh -> translator -> validator 流程来跑,同时在前面导出 hook JSON,就用这个包装脚本:
bash run_full_flow_with_hook.sh \
"samples/P4NIS/main.p4" \
"samples/P4NIS/9.p4ltl"这个脚本现在会:
- 先运行 hook0,直接从原始
.p4ltl导出一份 JSON - 再调用真实的
p4c-translator - translator 生成
.bpl后,运行 hook1,从 Boogie 中抽取 pre-validator constraints JSON - 再调用真实的 validator
Check.sh - validator 结束后再运行 hook2,把 oracle/result JSON 发给 Program A 并保存
- P4 程序:
upstream/Artifact/benchmark/Temporal Verification/Case Study/P4NIS/main.p4 - P4LTL 规格:
upstream/Artifact/benchmark/Temporal Verification/Case Study/P4NIS/9.p4ltl
python3 hooks/p4ltl_hook_pipeline.py \
--p4 "upstream/Artifact/benchmark/Temporal Verification/Case Study/P4NIS/main.p4" \
--p4ltl "upstream/Artifact/benchmark/Temporal Verification/Case Study/P4NIS/9.p4ltl" \
--program-a "python3 program_a/save_json_sink.py --output-dir output/program_a" \
--dump-json output/last_hook_event.json成功后你会看到类似输出:
Built /home/gosh/P4LTL/LLM-P4LTL/build/p4ltl_hook_runner
/home/gosh/P4LTL/LLM-P4LTL/output/program_a/20260317T144543Z_event-....json
这说明:
- parser runner 编译成功
- Program A 成功收到了 JSON
- JSON 已经保存到
output/program_a/
主要看两个地方:
- Program A 保存的文件:
output/program_a/*.json - 额外导出的最后一次 hook0 结果:
output/last_hook_event.json - 额外导出的最后一次 hook1 结果:
output/last_hook1_event.json - 额外导出的最后一次 oracle 结果:
output/last_oracle_event.json
如果你只想直接验证整条链路能跑通,可以执行:
python3 tests/test_p4nis_demo.py它会自动:
- 跑 P4NIS 示例
- 检查 Program A 是否真的保存了 JSON
当前版本会:
- 运行实际复制过来的 C++ P4LTL parser
- 解析
.p4ltl里的:#LTLVariables#LTLProperty#LTLFairness#CPI*#register_write
- 导出 JSON
- 按保守规则拆成:
packet_constraintsenvironment_constraints
- 在真实 validator 完成后,再从日志中提取最终
oracle
当前已经可以这样跑:
- 先运行复制出来的真实 C++ P4LTL parser
- 把 hook JSON 发给 Program A 并保存
- 再继续跑真实的
Check.sh -> translator -> validator - validator 结束后再把 oracle JSON 发给 Program A 并保存
也就是说,全流程已经能走通,并且两个 hook 都已经接进真实的 Check.sh 路径里;只是 hook2 目前是从 validator 的真实输出日志提取结果,而不是直接改 Java 内部结果对象。