Properties and verdicts¶
Verify answers questions about every run of a circuit: every value of every input, at every step, however long the run. The questions are blocks of the Verification section of the palette.
The properties¶
| Block | Its input | Verify answers |
|---|---|---|
| Assertion | a boolean that must hold at every step | holds: proved; or fails at step N, with a trace |
| Target | a condition to reach | reached at step N, with a trace; or unreachable: proved never to happen |
| Assume | a condition the inputs keep to at every step | nothing: it restricts the runs the others consider |
An assertion and a target are two sides of one question: an assertion
p holds exactly when a target not p is unreachable. Use whichever
reads better: an assertion for what must always be so, a target for a
situation that must be possible (that an alarm can sound), or one you want
an example of.
Assumptions narrow the runs Verify and the MC/DC tests consider to those where every Assume block's input is true at every step. They say what the circuit's environment guarantees: a sensor's range, two buttons never pressed together. A wrong assumption hides real failures, so keep them few and true.
Verdicts¶
The Verify tab of the panel lists each property, its verdict, the engine that answered, and the time; the verdicts are written beside the blocks too.
- holds or unreachable: proved, for every run.
- fails or reached, at step N: a run of N + 1 steps shows it. A click on the row plays the trace on the canvas and in the scope, the cursor on the step where it happens; ← and → step through it. Use as stimuli, in the row's right-click menu, copies its inputs to the stimuli, so that ▶ Simulate replays it.
- unknown: no engine answered within the timeout, or within the depth given. Try a longer timeout, another engine, or a smaller circuit.
A result goes out of date as soon as the circuit changes.
The engines¶
The engine menu of the Verify tab chooses who answers:
| Engine | What it does | Good at |
|---|---|---|
| portfolio | all of the engines below, side by side; the first answer wins | the default |
| bmc | bounded model checking: the runs of 0, 1, 2, … steps | counterexamples, the shortest first |
| kind | k-induction: bmc, and a proof that k steps without failure mean no failure ever | proofs of properties that are inductive after a few steps |
| br | backward reachability: from the failures back to the initial states | proofs, with an inductive invariant |
| pdr | property directed reachability (IC3) | proofs of harder properties, with an inductive invariant |
timeout is the seconds each property may take, max depth the deepest bmc and kind go. The settings are saved with the circuit. A long run can be cancelled.
Proof certificates¶
Tick proof certificates in the Verify tab, and a property proved comes
with its proof: an SMT-LIB 2 script, each of whose check-sat must answer
unsat, that any SMT solver checks. Export proof…, in the row's
right-click menu, saves it, and offers to check it with a solver found on
the machine (z3, cvc5, bitwuzla, yices). Backward reachability and PDR
prove with an inductive invariant, k-induction with its base cases and its
step; the script says which, and why it is a proof. intrepid checks every
proof before giving it. The tutorial shows one.