import json
import pathlib
import kshana
BASE = pathlib.Path("scenarios/clock-holdover.toml").read_text()
def holdover_for_spec(threshold_ns: float) -> tuple[float, float]:
src = BASE.replace("threshold_ns = 20.0", f"threshold_ns = {threshold_ns}")
result = json.loads(kshana.run(src))
return (
result["quantum"]["fom"]["holdover_s"],
result["classical"]["fom"]["holdover_s"],
)
def main() -> None:
specs = [20.0, 15.0, 10.0, 5.0]
print(f"{'spec (ns)':>10} {'quantum (s)':>12} {'classical (s)':>14}")
prev_classical = float("inf")
for spec in specs:
q, c = holdover_for_spec(spec)
print(f"{spec:>10.1f} {q:>12.0f} {c:>14.0f}")
assert c <= prev_classical + 1e-9, "classical holdover must be monotone in the spec"
prev_classical = c
print("OK: CSAC holdover is monotone (non-increasing) as the spec tightens")
if __name__ == "__main__":
main()