Quick notes on submitted tools for SYNTCOMP


SDF

(raw version at https://github.com/5nizza/sdf)

Implementation of the fix-point computation for safety games. Plain implementation without any new optimizations:

  • computing “transition function”: the transition function is saved in the form of a map (this is standard) latch -> BDD for that latch Thus, there are no variables for primed latches

  • computing “transition function”: SDF caches BDDs for computed nodes of AIGER. Despite CUDD having its own cache, this really helps on amba_match examples.

  • computing the predecessor: SDF uses the direct substitution CUDD’s command (standard), i.e.: ∀u ∃c: (!error(t,u,c) & (dst(t)[t <- bdd_next_t(t,u,c)]))

  • during win_region computation: (the following does not seem to help) each time re-ordering happens, SDF saves the resulting ordering of variables. After some time limit, SDF groups variables appearing often together. This speeds up reordering, but the decreases its quality.

  • before computing the strategy, SDF removes all BDDs except the nondeterministic strategy, and then calls reordering SIFT_CONVERGE

  • strategy determinization (using co-factor approach): SDF does “variables elimintation” (this is also standard): when checking a strategy for a variable, it checks for all other variables if they can be safely removed (i.e., check if function for controllable_a can be independent of other variables)

  • translating into AIGER: caching computed AIGER circuits, i.e., SDF caches AIGER nodes for each BDD node it computes, thus if two BDDs share a BDD node – it will be shared in AIGER as well. (significantly reduces the circuit size) No ABC optimizations are used.

party-elli

(https://github.com/5nizza/party-elli)

Implementation of the bounded synthesis approach originally by Schewe Finkbeiner:

  • LTL formula -> negated formula -> NBW -> treat it as UCW
  • fix system S size k
  • encode S*UCW into the SMT query which is SAT iff there exists system of size k that realizes the spec
  • if UNSAT, increase the size
  • if SAT, turn into aiger: verilog -> mv [using vl2mv] -> aiger [using ABC with ABC optimizations]

Differences to the standard SF approach:

  • systems are not input preserving
  • formula strengthening:

    G(…) & GF(..) -> G(…) & GF(..)

    is rewritten into

    G(…) W !G(…) & G(…) & GF(..) -> GF(..)

    where G(…) is a safety formula that starts with G, GF(..) - liveness formula.

  • when the spec automaton has two SCCs, then there is no relation between the counter values of states of those different SCCs

Before checking the SAT I check if the spec is UNSAT:

  • negate formula, change inputs and outputs, check for ‘system’ of size 1
  • the check is time restricted to ~200 seconds.

Notes:

  • formula strengthening can be seen as ‘cheating’, but the tool never returns unsound answer (if rewritten formula is found UNSAT, then the tool searches for a strategy for the original formula)
  • formula strengthening is crucial for performance
  • use: python, Z3 (logic LRA, incremental mode), ABC, vl2mv