Skip to content

Commit

Permalink
[NF] Avoid evaluating external functions.
Browse files Browse the repository at this point in the history
- Mark external function calls as non-structural, to avoid expressions
  containing such calls from being marked as structural when its not
  strictly necessary.
  • Loading branch information
perost committed May 23, 2019
1 parent a09c8ab commit 0468d69
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 34 deletions.
10 changes: 7 additions & 3 deletions OMCompiler/Compiler/NFFrontEnd/NFCall.mo
Expand Up @@ -373,9 +373,13 @@ uniontype Call
ty := getSpecialReturnType(func, args);
end if;

// Functions that return a discrete type, e.g. Integer, should probably be
// treated as implicitly discrete if the arguments are continuous.
if Type.isDiscrete(ty) and var == Variability.CONTINUOUS then
if var == Variability.PARAMETER and Function.isExternal(func) then
// Mark external functions with parameter expressions as non-structural,
// to avoid them being marked as structural unnecessarily.
var := Variability.NON_STRUCTURAL_PARAMETER;
elseif Type.isDiscrete(ty) and var == Variability.CONTINUOUS then
// Functions that return a discrete type, e.g. Integer, should probably be
// treated as implicitly discrete if the arguments are continuous.
var := Variability.IMPLICITLY_DISCRETE;
end if;

Expand Down
67 changes: 36 additions & 31 deletions OMCompiler/Compiler/NFFrontEnd/NFPrefixes.mo
Expand Up @@ -273,6 +273,7 @@ type Variability = enumeration(
CONSTANT,
STRUCTURAL_PARAMETER,
PARAMETER,
NON_STRUCTURAL_PARAMETER,
DISCRETE,
IMPLICITLY_DISCRETE,
CONTINUOUS
Expand Down Expand Up @@ -381,10 +382,10 @@ function variabilityFromSCode
output Variability var;
algorithm
var := match scodeVar
case SCode.Variability.CONST() then Variability.CONSTANT;
case SCode.Variability.PARAM() then Variability.PARAMETER;
case SCode.Variability.CONST() then Variability.CONSTANT;
case SCode.Variability.PARAM() then Variability.PARAMETER;
case SCode.Variability.DISCRETE() then Variability.DISCRETE;
case SCode.Variability.VAR() then Variability.CONTINUOUS;
case SCode.Variability.VAR() then Variability.CONTINUOUS;
end match;
end variabilityFromSCode;

Expand All @@ -393,10 +394,11 @@ function variabilityToSCode
output SCode.Variability scodeVar;
algorithm
scodeVar := match var
case Variability.CONSTANT then SCode.Variability.CONST();
case Variability.STRUCTURAL_PARAMETER then SCode.Variability.PARAM();
case Variability.PARAMETER then SCode.Variability.PARAM();
case Variability.DISCRETE then SCode.Variability.DISCRETE();
case Variability.CONSTANT then SCode.Variability.CONST();
case Variability.STRUCTURAL_PARAMETER then SCode.Variability.PARAM();
case Variability.PARAMETER then SCode.Variability.PARAM();
case Variability.NON_STRUCTURAL_PARAMETER then SCode.Variability.PARAM();
case Variability.DISCRETE then SCode.Variability.DISCRETE();
else SCode.Variability.VAR();
end match;
end variabilityToSCode;
Expand All @@ -406,10 +408,11 @@ function variabilityToDAE
output DAE.VarKind varKind;
algorithm
varKind := match var
case Variability.CONSTANT then DAE.VarKind.CONST();
case Variability.STRUCTURAL_PARAMETER then DAE.VarKind.PARAM();
case Variability.PARAMETER then DAE.VarKind.PARAM();
case Variability.DISCRETE then DAE.VarKind.DISCRETE();
case Variability.CONSTANT then DAE.VarKind.CONST();
case Variability.STRUCTURAL_PARAMETER then DAE.VarKind.PARAM();
case Variability.PARAMETER then DAE.VarKind.PARAM();
case Variability.NON_STRUCTURAL_PARAMETER then DAE.VarKind.PARAM();
case Variability.DISCRETE then DAE.VarKind.DISCRETE();
else DAE.VarKind.VARIABLE();
end match;
end variabilityToDAE;
Expand All @@ -419,9 +422,10 @@ function variabilityToDAEConst
output DAE.Const const;
algorithm
const := match var
case Variability.CONSTANT then DAE.Const.C_CONST();
case Variability.STRUCTURAL_PARAMETER then DAE.Const.C_PARAM();
case Variability.PARAMETER then DAE.Const.C_PARAM();
case Variability.CONSTANT then DAE.Const.C_CONST();
case Variability.STRUCTURAL_PARAMETER then DAE.Const.C_PARAM();
case Variability.PARAMETER then DAE.Const.C_PARAM();
case Variability.NON_STRUCTURAL_PARAMETER then DAE.Const.C_PARAM();
else DAE.Const.C_VAR();
end match;
end variabilityToDAEConst;
Expand All @@ -431,12 +435,13 @@ function variabilityString
output String str;
algorithm
str := match var
case Variability.CONSTANT then "constant";
case Variability.STRUCTURAL_PARAMETER then "parameter";
case Variability.PARAMETER then "parameter";
case Variability.DISCRETE then "discrete";
case Variability.IMPLICITLY_DISCRETE then "discrete";
case Variability.CONTINUOUS then "continuous";
case Variability.CONSTANT then "constant";
case Variability.STRUCTURAL_PARAMETER then "parameter";
case Variability.PARAMETER then "parameter";
case Variability.NON_STRUCTURAL_PARAMETER then "parameter";
case Variability.DISCRETE then "discrete";
case Variability.IMPLICITLY_DISCRETE then "discrete";
case Variability.CONTINUOUS then "continuous";
end match;
end variabilityString;

Expand All @@ -446,10 +451,11 @@ function unparseVariability
output String str;
algorithm
str := match var
case Variability.CONSTANT then "constant ";
case Variability.STRUCTURAL_PARAMETER then "parameter ";
case Variability.PARAMETER then "parameter ";
case Variability.DISCRETE then if Type.isDiscrete(ty) then "" else "discrete ";
case Variability.CONSTANT then "constant ";
case Variability.STRUCTURAL_PARAMETER then "parameter ";
case Variability.PARAMETER then "parameter ";
case Variability.NON_STRUCTURAL_PARAMETER then "parameter ";
case Variability.DISCRETE then if Type.isDiscrete(ty) then "" else "discrete ";
else "";
end match;
end unparseVariability;
Expand All @@ -470,13 +476,12 @@ function effectiveVariability
input Variability inVar;
output Variability outVar;
algorithm
if inVar == Variability.STRUCTURAL_PARAMETER then
outVar := Variability.PARAMETER;
elseif inVar == Variability.IMPLICITLY_DISCRETE then
outVar := Variability.DISCRETE;
else
outVar := inVar;
end if;
outVar := match inVar
case Variability.STRUCTURAL_PARAMETER then Variability.PARAMETER;
case Variability.NON_STRUCTURAL_PARAMETER then Variability.PARAMETER;
case Variability.IMPLICITLY_DISCRETE then Variability.DISCRETE;
else inVar;
end match;
end effectiveVariability;

function directionFromSCode
Expand Down
4 changes: 4 additions & 0 deletions OMCompiler/Compiler/NFFrontEnd/NFTyping.mo
Expand Up @@ -855,6 +855,10 @@ algorithm
Binding.isCrefExp(binding) then
attrs.variability := bind_var;
c.attributes := attrs;
elseif bind_var == Variability.NON_STRUCTURAL_PARAMETER and
comp_var == Variability.PARAMETER then
attrs.variability := bind_var;
c.attributes := attrs;
end if;
else
if Binding.isBound(c.condition) then
Expand Down

0 comments on commit 0468d69

Please sign in to comment.