Skip to main content

Verifier Support Matrix

The following tables present which features of Verifier should be considered fully, partially, or un- supported, following this guide:

  • ✅: Fully supported
  • ⚠️: Fully supported within listed limitations
  • 🚧: In progress, some features may not work and documentation may be unclear
  • ❌: Unsupported

Interoperability Features

Transports

TransportVerifier in Tangram ProVerifier in CI
ActiveMQ
HTTP
Kafka
NATS
RabbitMQ
ZeroMQ
TCP
UDP

Serializers

TransportVerifier in Tangram ProVerifier in CI
CSV
Direct (Binary)
JSON
LMCP
MAVLink
OMS 2.0 (XML)
Protobuf
ROS
STANAG 4586
WOSA
XML

Flex Features

The Flex language has a large surface area, not all of which is currently supported by Verifier. These tables help disambiguate Verifier's current support for features of the Flex language.

Declarations

DeclarationSupported
Imports🚧
Message
Struct
Variant
Enum⚠️ ONLY int32 base
type
newtype
Global protocol
Local protocol
Component
System
Connection

Protocol Features

Protocol FeatureSupported
All primitive types (message fields)
All primitive types (protocol variables)
Built-in Functions🚧
send let
send any
send ... where { ... }
send <var>⚠️ See linked example for limitations
recv let
recv any
listen🚧
branch🚧
loop
do🚧
@Topic annotation (on recv/send)
@End annotation (on local protocol)

Constraints

Constraints should be specified as a list of boolean checks.

See the examples below as well as in the Flex protocol examples.

The table below shows the current limitations of Verifier with respect to the larger capability list of Flex protocols.

Why are some features supported in send but not recv?

Recall that Verifier acts as the reciprocal of the component: when the component protocol sends a message, Verifier receives it, and when the component recvs a message, Verifier has to generate and send it.

Generating a message from constraints is a difficult task. We continue to add new features to our message generators, so please keep an eye on the supported constraint types shown in this table.

Constraint Featuresendrecv
Single var conditional statements
Non-array primitive types✅ Full support for boolean operations
Array primitive types⚠️ arr_field == [] and length(arr_field) == x only
Variant type matching
Enum type matching✅ Full support for boolean operations
Dependency on prior message
Dependency on variable
Multi var conditional statements

Examples

Valid Single Variable Boolean Expressions

enum DataType int32 {
    Temperature = 0;
    WindSpeed   = 1;
    AirPressure = 2;
    Rainfall    = 3;
}

struct DataRequest {
    id: string;
    time: uint64;
    request: DataType;
}

struct DataRespone {
    id: string;
    time: uint64;
    response: RequestType;
    data: float64;
}

component Dashboard;
component WeatherStation;

local protocol Example for Dashboard {
    send req: DataRequest
        where req.id == "weatherstation_0"
            && req.time > 0
            && req.request == DataType.Rainfall
        to WeatherStation;

    recv res: DataRespone
        assuming res.id == "weatherstation_0"
            && res.time >= req.time
            && res.response == req.request
        from WeatherStation;
}

Invalid Single Variable Array Index Expressions

local protocol X for Component {
    recv msg: Msg
        // Verifier does not support indexing constraints
        assuming msg.array_field[0] == 10
        from Other;
}

Invalid Multi-Variable Boolean Expressions

message struct Position {
    lat: float64;
    long: float64;
}

component A;
component B;

local protocol X for A {
    // Verifier will struggle to generate the message which the component says it must receive
    recv pos: Position
        assuming pos.x + pos.y < 100
        to B;
}

send Constraints

message struct Position {
	lat: float64;
	long: float64;
}

component Component;
component Other;

local protocol X for Component {
    // WRONG: Message blocks are _not_ checked as constraints
    send pos: Position {
            lat = 10,
            long = 20
        }
        to Other;

    // RIGHT: Instead, do:
    send pos: Position
        where pos.lat == 10
           && pos.long == 20
        to Other;
}