Output

The tool performs a systematic analysis on the application specification given as input. The first part of this analysis is optional and only checks the correctness of the specification. The remaining parts are used to infer which is the correct coordination that should be applied to the application.
If the specification fails any of the specification correction tests the tool stops its analysis as the tests related to consistency can only be executed on correct specifications.

Finally, after the tests are executed, the tool outputs a token model that defines the correct coordination to be applied to the application.

Note: You should always make sure that the input specification passes the correction tests. If it doesn't the results of the consistency tests may not be valid.

Specification Correction Tests

For each test executed the output is a line that specifies the type of test, followed by "PASSED" or "FAILED", and bellow it's printed the output of the execution of the corresponding, automatically generated, Boogie specification used in the test.

For instance:

IMPORTS TEST: (PASSED)
Boogie program verifier finished with 0 verified, 0 errors

These tests are divided into Base Verification tests and Logic Verification tests.

Base Verification

Logic Verification

Consistency Tests

Coordination Generation

By executing the previous three tests it is already known which pairs of operations need coordination. However, the tool provides a more fine grained approach to coordination then operation based coordination and generates, if possible, parameter based coordination to substitute the operation based coordination already inferred.

Take as an example the operation withdraw(client, amount) from the specification specifications/applications/basic_bank.json present in the repository, which removes a specified amount from a clients bank account.

You can verify that the operation withdraw is not stable when executed with itself by running the tool with this specification as input:

withdraw withdraw STABILITY TEST: (FAILED)

This happens because the tool detects that the invariant of the specification, that all bank accounts must have a credit above of equal to zero, might be violated when two concurrent withdraw operations happen.

But the pair of operations (withdraw, withdraw) is stable if we are sure that the clients both operations are modifying are different. This is what the tool infers and outputs.

withdraw(c1: Client, a1: int) withdraw(c1: Client, a1: int) INEQUALITY SOLVER: (PASSED)
Solutions:
( @1 != @3 )

Here the tool proposes that the first parameter of the first operation (denoted as @1) must be different from the first parameter of the second operation (denoted as @3) for the pair to be able to execute concurrently (@1 is c1 of the first operation, @2 is a1 of the first operation, @3 is c1of the second operation and @4 is a1 of the second operation).

If, during these tests, the tool outputs "FAILED" for a pair of operations it's because the tool wasn't able to find a relationship between the parameters that, when enforced, would stop the conflict.

Finally, this relationships are represented trough a Token Model using two sets:

Note: If you need to enforce multiple restrictions between parameters, the tool will output a line formatted like ( @x != @x && @x != @x ). If you can enforce one restriction or other, the tool will output multiple lines formatted like (@x != @x) , each line being one option.