FUNCTION (GENERIC)

DEFINITION

A System/Logical/Physical Function is an action, an operation or a service fulfilled by one Component or Actor. It has input and output Ports, respectively targets and sources of Functional Exchanges (information, data, material, fluid, etc.).

The behavior of a Function itself can be defined in a recursive manner using Sub-Functions and internal Functional Exchanges. These Sub-Functions are represented "inside" the Function itself. When splitting a Function into Sub-Functions, Input and output Ports shall be moved / allocated to the Sub-Functions.

Some particular functional computation nodes are defined:

Duplicate: This figure depicts a case where both Function 2 and 3 depend on the same result produced by Function 1 (Two data dependencies). Operator duplicate is purely functional and simply duplicates the data provided by Function 1. It has no value of synchronization but only, as all the functions presented here, a purpose to capture data dependencies.

The behavior of this computation node can be simply described in terms of sequence of actions:

iterate [true] // repeating infinitely often

│ in = Read input // read data from the input port and store it in variable in

Write output1 in // write the data on the first output port

Write output2 in // write the data on the second output port

Gather: This figure shows a pure data flow with a purely functional computation node: gather. It depicts a case where Function3 needs data from both Functions 1 and 2 to execute. There is no need for an explicit join operator in a pure dataflow graph.

iterate [true] // repeating infinitely often

│ re = Read input1 // read data from the first input port and store it in variable re

│ im = Read input2 // read data from the second input port and store it in variable im

Write output Complex(re, im) // write the data on the output port

Route: This figure shows a pure data flow node called route. Function3 depends on the data produced by Function 1 and Function 2. However only one of the two functions produces a data for each computation of Function3. The choice of the branch must not depend on the availability of the data on an input port and must only depend on a local condition.

iterate [true] // repeating infinitely often

│ in = Read input1 // read data from the first input port and store it in variable in

Write output in // write the data on the output port

│ in = Read input2 // read data from the second input port and store it in variable in

Write output in // write the data on the output port

Select: This figure shows a pure data flow with a predefined computation node called select. It depicts a case where both Functions 2 and 3 depend on the same result produced by Function 1 (Two data dependencies). The choice operator is purely functional and simply routes the data provided by Function 1. It has no value of synchronization but only, as all the functions presented here, a purpose to capture data dependencies. It differs from duplicate since only one of the two functions uses the data produced by Function1 during one single computation. Different executions of Function1 lead to either the execution of Function2 or Function3. The choice of the branch must not depend on the availability of the data on an input port and must only depend on a local condition.

iterate [true] // repeating infinitely often

│ in = Read input // read data from the input port and store it in variable in

Write output1 in // write the data on the first output port

│ in = Read input // read data from the input port and store it in variable in

Write output2 in // write the data on the second output port

Split: This figure shows a pure data flow with a fork computation node. It depicts a case where both Functions 2 and 3 depend on the same result produced by Function1 (Two data dependencies). The main difference with the duplicate is that each function uses only one part of the structured data produced by Function1. It has no value of synchronization but only, as all the functions presented here, a purpose to capture data dependencies.

The behavior of this computation node can be simply described in terms of sequence of actions:

iterate [true] // repeating infinitely often

│ in = Read input // read data from the input port and store it in variable in

Write output1 in.real // write the data on the first output port

Write output2 in.imaginary // write the data on the second output port

This example assumes that the data produced by Function1 is a structured data of type Complex and that Function2 and 3 use part of this data (the real and imaginary parts)

ICONS        