8. QGen Constraints on Input Models

8.4. MATLAB

8.4.1. MATLAB .p and .mat Files

MATLAB .p and .mat files are not supported.

8.4.2. MATLAB Code for Parameters in Workspace Containers and Block Parameters

8.4.2.1. Dimensions of data

Scalars, vectors and two-dimensional data (matrices) are supported. Data with more dimensions is not supported.

Non-scalar data should not contain casts as part of the contained elements.

8.4.2.2. Accepted Constructs

QGen will export the data that is used within the set of models targeted by the code generation process, based on the workspace containers specified for each model. To define such data in the base workspace for example, one can use sets of .m files that are manually or automatically loaded as part of the model setup.

Only constant definitions are accepted in .m files. The supported format is:

<identifier> = [<data type> (] <value> [)];

where

<identifier> := <constant name>[.<structure element name>]
<value> := <literal value> | <expression>

Datastructures are defined implicitly by assigning values for each structure element. There is currently no way to attach explicitly defined data type to a constant.

Values can be composed of literal values, references to other constants and expressions including of arithmetic operators and supported functions (see section “MATLAB functions” below).

Annotation delimiter is “%”.

Examples

% Constant definition, implicit data type
MyIntParam = 15;

% Constant definition, explicit data type
MyDoubleParam = double (100);

% Array with explicit data type
MyArrParam = double ([1 2 3]);

% Definition of a constant structure
MyStructParam.Elem1 = 1;
MyStructParam.Elem2 = [1 2 3];
MyStructParam.Elem3 = MyIntParam;

% Expression using other constants
MyIntParam2 = int8 (MyIntParam + MyDoubleParam);

8.4.2.3. Type Definitions

  • Type definitions are not supported in parameter .m-files. However, QGen supports several ways of using custom data types. See Custom Data Types for further details.

  • The only exception is an implicit type definition of a structure (record) parameter. QGen infers the type definition from the instance definition in the parameter file. See MATLAB Code for Parameters in Workspace Containers and Block Parameters.

  • Type definitions should be scalars to be accepted by QGen; arrays containing type definitions are rejected.

8.4.3. MATLAB Operators

The following unary operators are supported:

+ - ~

The following binary operators are supported:

+ - * .* / ./ ^ .^ < <= > >= ~= || && :

Supported values for “:” are detailed in the MATLAB Expressions section below.

8.4.4. MATLAB Functions

The following MATLAB functions are supported in both .m files and Simulink block parameters:

abs, acos, asin, atan, atan2, bin2dec, ceil, cos, cosh, exp, floor,
hex2dec, log, log10, min, max, mod, rem, round, sign, sin, sinh, sqrt, tan,
tanh, isinf, isnan, isfinite.

Explicit typing/casting expressions are supported for:

int8, int16, int32, uint8, uint16, uint32, single, double, logical

In addition to numeric literals, the following literals are supported as well:

Inf

8.4.5. MATLAB Expressions

Expressions containing the colon operator can only be used to get a slice of a vector (without increment value):

mySlice = myVector(3:8);

The following expressions are not supported:

  • Matrix partial indexing:

myMatrix(:,1);
myMatrix(1:3);
  • Creation of row vector:

MyVector = [10:20];
  • Vector slice with increment value:

mySlice = myVector(1:5:20);

In case there is a need for using such subarrays, then you should do the slicing in MATLAB and feed an appropriate subrarray to qgenc.

For instance when myMatrix is a two dimensional array and a model contains block parameter with value myMatrix (:,1) (i.e. the parameter is a vector containing the first column from matrix) then:

  • the original matrix is

myMatrix = [1 2; 3 4];
  • create a vector variable myVector1 in MATLAB

myVector1 = myMatrix(:,1);
  • copy the vector value to the .m file that is given as an argument to qgenc

myVector1 = [1 3];
  • replace the expression “myMatrix(:,1)” in model with “myVector1”

  • assign to a structure in array:

myVector1(1,2).member = 1;

8.4.6. MATLAB cell arrays

Cell arrays in MATLAB workspace are not supported. qgen_export_workspace generates warning and array is not exported. When the array is referenced from Simulink model then code generation fails.

8.4.7. Supported Enumerations

Enumerations should all inherit from a signed Integer superclass to be accepted by QGen.

8.4.8. Char Arrays

Char arrays are not supported when defined in any Workspace container. They can however be used in mask parameters, Simulink.Signals or Parameters properties.

8.4.9. Empty Arrays

In most cases empty arrays will be rejected by QGen, and should not be used to initialize values used in the model.

8.5. Stateflow chart modelling rules

Stateflow charts must comply to the following modeling rules and constraints.

8.5.1. Event broadcast for local events shall not to be used

Description: Stateflow event broadcast mechanism for Stateflow local events shall not to be used. Dataflow shall be used for controlling the chart’s mode instead.

Note: An exception is broadcasting external events, i.e. events that are received by other parts of the (Simulink) model than the broadcasting chart itself. Such events do not directly affect the behaviour of the chart. The only affect is changing global data. This kind of broadcasting is allowed. Typically the trigger type of the event/port is in such cases “Function call”.

Justification: Some forms of event broadcast can lead to non-termination. Broadcasting an event in a transition action is one case that can never lead to non-termination by itself. In other cases static checks could be used to detect potentially looping behaviour.

8.5.2. Output event of a chart shall have the “Function call” trigger type

Description: The trigger type property of an output event of a chart shall have be “Function call”.

Justification: Function call events ensure unambiguous and controllable timing of event broadcasts. Output events with edge trigger type can create confusing models, because an event can be triggered several times in Stateflow, but is seen once or not at all in the Simulink part.

Note

Input events having a trigger type “Rising”, “Falling” or “Either” are supported by QGen.

8.5.3. [REMOVED]

This constraint was applicable up to version 2.1.2 of QGen. It was removed in version 17 and is no longer relevant in subsequent versions.

This section is preserved for traceability of constraints across different versions of QGen.

8.5.4. [REMOVED]

This constraint was applicable up to version 1.0.1 of QGen. It was removed in version 2.0.1 and is no longer relevant in subsequent versions.

This section is preserved for traceability of constraints across different versions of QGen.

8.5.5. Transition actions shall not be used in graphical functions and pure flow-graph decompositions. Condition actions shall be used instead.

Description: Transition actions shall not be used in graphical functions and pure flow-graph decompositions.

Note

This rule applies to pure flow-graphs only. It does not concern OR compositions of states, where transition actions are very appropriate.

Justification: This is a robustness constraint against effectively dead modelling constructs. Transition actions are meaningless in the above-mentioned cases since they are executed only when there is a transition from state to state (some versions of Stateflow allow to specify such actions, but they are never executed). In flow-graph networks condition actions should be used instead.

8.5.6. An OR decomposition must always have an unguarded default transition

Description: An OR decomposition must always have an unguarded default transition. Exception: An OR decomposition with only one substate can exist without a default transition. However, when any default transitions are present, then at least one must be unguarded.

Justification: If this condition is not satisfied then a run-time error due to state inconsistency can result, when a decomposition is entered, since it means that a system is in inconsistent state. When the decomposition consists of one substate only, then there is no need for the default transition. However, default transitions might exist, with different transitions specifying different actions. In the last case one of them must be without a guard to avoid confusion reading the model, as in Stateflow the state is nevertheless entered.

8.5.7. [REMOVED]

This constraint was applicable up to version 17.1 of QGen. It was removed in version 17.2 and is no longer relevant in subsequent versions.

This section is preserved for traceability of constraints across different versions of QGen.

8.5.8. Boxes shall only be used for grouping functions

Description: Boxes shall only be used for grouping functions.

Justification: Justification: Using boxes around states or flow-graph networks creates strange and complex scoping. The logical scoping for executing the chart’s sections and the name scopes introduced by boxes do not match. Boxes are fine for grouping graphical functions and truthtable functions.

8.5.9. Only bounded flow-graph loops should be used

Description: Flow-graph loops can cause non-termination of the chart’s execution. The loops should be designed with care and preferrably use a simple for-style pattern.

Note

This rule is currently not checked by QGen.

8.5.10. The transition arc shall not leave its logical parent’s boundary

Description: The transition arc shall not leave the boundary of the logical parent of the transition (the lowest common ancestor of the source and destination states).

Warning

Stateflow issues a warning about such transition arcs when simulating the model. This rule is not checked by QGen. In case such arcs exist the behaviour in Stateflow can have some side-effects that are not taken into account by QGen.

Justification: This is an error-prone pattern. The detailed semantics for such transitions is complicated and unintuitive. Identical or similar behaviour can be obtained by more clear and explicit constructs.

8.5.11. Super step semantics shall not be used

Description: The Stateflow super step semantics is not supported. This option should be turned off in charts supplied to QGen.

8.5.12. Variable-size arrays shall not be used

Description: The variable-size arrays in Stateflow are not supported. This option should be turned off in charts supplied to QGen.

8.5.13. Only C action language shall be used

Description: QGen does not support the MATLAB action language.

8.5.14. Moore charts shall not be used for breaking data loops

Description: It is possible in Simulink/Stateflow to use Moore charts for breaking causality of data feedback loops (algebraic loops). This is currently not supported in QGen.

If a Moore chart is used in a data feedback path make sure there is also some non-direct feedthrough block, such as Unit Delay on the same path.

8.5.16. History junctions shall not be used

Description: History junctions are not supported by QGen. Their use is also deprecated by the MISRA AC SLSF guide (rule 046) as it complicates interpretation of the model’s semantics.

The history can be modelled with an explicit local variable and transitions instead.

8.5.17. [CHANGED] Absolute-time temporal logic shall not be used

Description: The Stateflow absolute-time temporal logic operators and events are currently not supported by QGen.

This constraint has been changed in QGen version 18, where the support for event-based temporal logic was added. In earlier versions neither event-based nor absolute-time temporal logic were supported.

8.5.18. Change detection functions shall not be used

Description: The Stateflow change detection functions: ‘hasChanged’, ‘hasChangedFrom’ and ‘hasChangedTo’ are currently not supported by QGen.

8.5.19. ‘in <state>’ operator shall not be used

Description: The ‘in <state>’ operator is currently not supported by QGen.

8.5.20. Data stores shall only be accessed through chart’s I/O

Description: Defining or accessing data stores directly from Stateflow chart is not supported. If referring or modifying a value of a Data Store is needed in Stateflow, create resp. Data Store Read and Write blocks and connect them to the chart’s I/O.

8.5.21. Some C math functions are not supported

Description: Most C math functions are supported. The exceptions are “labs”, “atan2”, “fmod”, “ldexp” and “rand”.

8.5.22. Messages and queued communication are not supported

Description: The Stateflow message objects and queued communication are not supported. If queuing is required, then the necessary mechanism should be explicitly modeled.

8.5.23. An AND decomposition must not contain transitions or junctions

Description: Transitions and junctions have proper semantics only for OR decompositions. In some cases Stateflow allows them also in AND decompositions, but this pattern shouldn’t be used.

8.5.24. Nested graphical functions are not supported

Description: QGen does not support nested graphical functions.

8.5.25. Boxes are not supported in functions

Description: QGen does not support boxes in graphical functions.

8.5.26. Machine-level data are not supported

Description: QGen does not support defining shared data at the Stateflow root level. Data objects must be defined at the level of a chart or below.

8.5.27. Box-level data are not supported

Description: QGen only supports defining functions in boxes. Local or parameter data may be defined at a function level.

Warning

This rule is currently not checked by QGen. The behaviour of simulation and code generated by QGen can be different.

8.5.29. Custom C code is not supported

Description: QGen ignores any custom code specified in the model and such code cannot be referenced from Stateflow charts.

8.5.30. Literal code (the literal code symbol ‘$’) is not supported

Description: Literal code (the literal code symbol $) is currently not supported in Stateflow actions and guards.

8.5.31. The ‘change’ (‘chg’) event is not supported

Description: The implicit ‘change’ (‘chg’) event is currently not supported.

8.5.32. The time symbol ‘t’ is not supported

Description: The absolute time symbol ‘t’ is not supported by QGen.

8.5.33. The reference ‘*’ and dereference ‘&’ operators are not supported

Description: These operators (i.e. pointers) are not supported in Stateflow guards and actions.

8.5.34. The shorthand notation for combining multiple state action conditions is not supported

Description: QGen doesn’t support the state label notation where multiple action conditions have been combined. E.g., the following are not supported:

en, ex: Out1++
du, on e1: Out2++

Workaround: Specify each action condition separately and duplicate the action.

en: Out1++
ex: Out1++
du: Out2++
on e1: Out2++

8.5.35. Explicit type cast operator ‘cast’ is not supported

Description: QGen doesn’t currently support this operator.

8.5.36. The type reference operator ‘type’ is not supported

Description: QGen doesn’t currently support this operator.

8.5.37. [CHANGED] The ‘bind’ keyword is not supported

Description: QGen does not support the “bind” keyword in state labels.

The constraint is enforced since QGen version 22. In earlier versions the construct was accepted, but ignored by QGen.

8.5.38. The ‘Saturate on integer overflow’ property of a Stateflow chart must be set to “off”

Description: QGen does not support this feature.

8.5.39. The ‘Create output for monitoring’ property of a Stateflow chart or state must be set to “off”

Description: QGen does not support this feature.

8.5.40. Stateflow functions with multiple output data definitions are not supported

Description: QGen does not support multiple output data definitions (formal parameters with direction ‘out’) in Stateflow functions. However, a single non-scalar output is supported. The number of non-scalar input arguments is not limited.

8.5.41. Stateflow functions with non-scalar output must only be used in simple assignments

Description: QGen supports calling Stateflow functions with non-scalar output only from statements of following form:

Y = fun(X)

Combining and/or nesting such calls with other expressions is currently not supported.

8.5.42. Inlining graphical functions is not supported

Description: QGen currently ignores the ‘Function Inline Option’ of Stateflow functions and treats them always as if the option was set to “Function”.

8.5.43. The first index of non-scalar data must be 0 (default)

Description: The ‘First index’ property of any Stateflow data object must be set to 0 or be unset (left to default).

8.5.44. Atomic subcharts are not supported

Description: QGen doesn’t currently support the option ‘Atomic Subchart’ in the ‘Group & Subchart’ properties of state objects. You may, however, use the options ‘Group’ and ‘Subchart’.

Note

This also means that subcharts cannot be referenced from libraries. To reuse charts place the entire chart to a library.

8.5.46. Commented out elements are not supported

Description: QGen doesn’t support commented out state chart elements, such as states, transitions, functions and junctions.

8.5.47. Object names must not coincide with keywords

Description: The names of user-defined objects must not coincide with any Stateflow keyword. The list of currently known unsupported names is provided in the following section. In some cases using such a name for a user-defined object is supported in Stateflow, but such models have confusing and error-prone semantics.

Warning

This rule is currently not checked by QGen. The behaviour of simulation and code generated by QGen can be different.

8.5.47.1. Stateflow Keywords

Boolean symbols

  • true

  • false

Change detection

  • hasChanged

  • hasChangedFrom

  • hasChangedTo

Complex data

  • complex

  • imag

  • real

Data types

  • boolean

  • double

  • int8

  • int16

  • int32

  • single

  • uint8

  • uint16

  • uint32

Data type operations

  • cast

  • fixdt

  • type

Explicit events

  • send

Implicit events

  • change

  • chg

  • tick

  • wakeup

Messages

  • send

  • forward

  • discard

  • isvalid

  • length

  • receive

Literal symbols

  • inf

  • t (C charts only)

MATLAB functions and data

  • matlab

  • ml

State actions

  • bind

  • du

  • during

  • en

  • entry

  • ex

  • exit

  • on

State activity

  • in

Temporal logic

  • after

  • at

  • before

  • every

  • sec

  • msec

  • usec

  • temporalCount

  • elapsed

  • t

  • duration

  • count

C Math Functions

  • ‘abs’, ‘fabs’, ‘sin’, ‘cos’, ‘tan’, ‘sinh’, ‘cosh’, ‘tanh’,

  • ‘asin’, ‘acos’, ‘atan’, ‘log’, ‘log10’, ‘ceil’, ‘floor’, ‘sqrt’,

  • ‘exp’, ‘pow’, ‘fmod’, ‘labs’, ‘ldexp’, ‘atan2’, ‘rand’

8.5.48. Transition paths involving states must not contain flow-graph loops

Description: Transition paths that start or end in a state must not contain a flow-graph loop, i.e. a loop involving only transitions and junctions, on the transition path.

Note

Transition paths that start and end in the same state, but do not involve a flow-graph loop according to the above criteria are not concerned by the current constraint and are allowed.

Flow-graph loops involving only transitions and junctions are, however, allowed in graphical functions and inner compositions of states. Such graphical functions can, for example, also be called from transition or condition actions of transitions having a path to or from a state.

8.5.49. Atomic boxes are not supported

Description: QGen doesn’t currently support the option ‘Atomic Subchart’ in the ‘Group & Subchart’ properties of box objects. You may, however, use the options ‘Group’ and ‘Subchart’.

Note

This also means that subcharts cannot be referenced from libraries. To reuse charts place the entire chart to a library.

8.5.50. “Data must resolve to signal object” is not supported for local data

Description: QGen doesn’t currently support the option “Data must resolve to signal object” for local data. You may, however, use this option for the chart’s outputs.

8.5.51. “Treat Exported Functions as Globally Visible” option is not supported

Description: QGen doesn’t currently support the chart-level option “Treat Exported Functions as Globally Visible”. Functions exported from a chart must be called using a qualified name.

8.6. Target Languages

8.6.1. Ada / SPARK

QGen generates Ada code compliant with the Ada 83, Ada 95, Ada 2005, Ada 2012 and SPARK 2014 standards.

Generated code might be non-compilable when the source of a Merge block is an atomic subsystem. This limitation will be fixed in a future QGen release.

8.6.2. MISRA-C

QGen generates C code compliant with the C89/C99 ANSI standard and MISRA C:2012 guidelines.

8.7. XMI Support

The XMI importer has the following limitations:

  • The xsi:type of an object is specified using the fully qualified name:

    <?xml version="1.0" encoding="ASCII"?>
    <geneauto.emf.models.gacodemodel:GACodeModel ...>
       <elements xmi:type="geneauto.emf.models.gacodemodel:Module" ... />
    <geneauto.emf.models.gacodemodel:GACodeModel>
    
  • The xmi:id attribute is used to resolve references to elements and is always required for every node. XPath expressions are not (and will not be) supported. For example, the following XMI is acceptable:

    <expressions
        xmi:type="geneauto.emf.models.gacodemodel.expression:VariableExpression"
        xmi:id="830" ... variable="404"/>
      ...
      <variables
          xmi:type="geneauto.emf.models.common:Variable" xmi:id="404" ... />
    

    Where the variable attribute in the first node references the xmi:id of the second node.

  • If two features are one the eOpposite of the other, the values for both need to be included in the XMI file.

These limitations are not planned to be alleviated.