Structuring Concepts: Systems consist of processes, running in parallel and communicating through message passing via communication buffers.
Communication primitives: Processes may communicate either through signal exchange (directly or via signalroutes) or through shared variables.
Real Time Primitives: Each process may use several clocks to measure time during the execution and, in addition, transitions may be guarded with time constraints (depending on clocks) and decorated with explicit (eager, delayable, lazy) deadlines.
Open Systems: The language offers the concept of open communication channel, connected to the environment, and transporting messages between it and the system.
Non Determinism: Processes may be non-deterministic i.e, more than one transition may be enabled at some control state, and all situations have to be considered at execution
Complex data types: The language provide several type constructors such as enumeration, range, array, record, abstract as well as predefined basic types in order to simplify complex data description and manipulation.
Parametrisation: It is possible to parameterize data types (i.e, size of arrays), system configurations (i.e, number of instances), timing behavior (i.e, clock constraints).
Dynamic creation: The language include dynamic creation and destruction of process and signalroute (channel) instances. This makes system configuration to be dynamic, that is, the number of components running (and in turn, the number of clocks ...) may change during execution.
Structured Control: The language integrates hierarchical states (to structure automata) and composed transitions basic control statements such as if-then-else and while-do are provided to structure automata transitions.
External Code integration: The language provide a simple an elegant way to abstract complex transformations on data through the integration of external code within procedures. The external code to be provided depend on tools used i.e, an executable implementation in order to simulate and model check, or a first-order axiomatic definition in order to use it inside a prover, etc.
Static analysis:: IF provides the dfa tool which implements classical static analysis techniques such as live variable analysis, dead-code elimination and variable elimination (backward slicing) with respect to user-defined criteria.
Model Checking: The core component of the IF Toolset is the IF simulator allowing to explore the underlying semantic model (i.e, state graph) of an IF specification. Several exploration modes are implemented: interactive (user-driven), random or exhaustive (breadth-first or depth-first). Partial order reductions can be applied in exhaustive- depth first search.
Test Generation: The IF simulator has been connected to the TGV test generator in the context of the AGEDIS project.
Model: This library gives access to the abstract syntax tree (AST) of IF specifications. It can be used to implement tools operating "statically" on the specification such as translators to other languages, static analysis and optimisations at source level.
Simulator: A simulation library providing the minimal functionality for on-the-fly state-space traversal (state representation + successors computation) is provided. It can be used to implement tools operating "dynamically" on the specification such as exploration tools, model-checkers, simulators, etc.