From e4e4270543714ee1c9f2427bd37d71c0cf7cd9cf Mon Sep 17 00:00:00 2001 From: perost Date: Tue, 24 May 2022 19:23:28 +0200 Subject: [PATCH] Make non-final constants inputs in constructors (#9016) --- OMCompiler/Compiler/NFFrontEnd/NFComponent.mo | 7 ------- OMCompiler/Compiler/NFFrontEnd/NFConvertDAE.mo | 6 +++--- OMCompiler/Compiler/NFFrontEnd/NFRecord.mo | 10 +++++----- .../modelica/scodeinst/FunctionRecordArg3.mo | 2 +- .../flattening/modelica/scodeinst/RecordBinding6.mo | 4 ++-- .../flattening/modelica/scodeinst/RecordBinding7.mo | 4 ++-- .../modelica/scodeinst/RecordConstructor2.mo | 6 +++--- 7 files changed, 16 insertions(+), 23 deletions(-) diff --git a/OMCompiler/Compiler/NFFrontEnd/NFComponent.mo b/OMCompiler/Compiler/NFFrontEnd/NFComponent.mo index 7e65c5a2a1a..c8542bb87c8 100644 --- a/OMCompiler/Compiler/NFFrontEnd/NFComponent.mo +++ b/OMCompiler/Compiler/NFFrontEnd/NFComponent.mo @@ -980,13 +980,6 @@ public end match; end isTypeAttribute; - function isModifiable - input Component component; - output Boolean isModifiable; - algorithm - isModifiable := not isFinal(component) and not (isConst(component) and hasBinding(component)); - end isModifiable; - function countConnectorVars "Returns the number of potential (neither constant, parameter, input, nor output), flow, and stream variables in the given connector." diff --git a/OMCompiler/Compiler/NFFrontEnd/NFConvertDAE.mo b/OMCompiler/Compiler/NFFrontEnd/NFConvertDAE.mo index 8da95510c36..c8212948c9a 100644 --- a/OMCompiler/Compiler/NFFrontEnd/NFConvertDAE.mo +++ b/OMCompiler/Compiler/NFFrontEnd/NFConvertDAE.mo @@ -1271,10 +1271,10 @@ algorithm comp := InstNode.component(component); attr := Component.getAttributes(comp); - if Component.isModifiable(comp) then - vis := InstNode.visibility(component); - else + if Component.isFinal(comp) then vis := Visibility.PROTECTED; + else + vis := InstNode.visibility(component); end if; binding := Component.getBinding(comp); diff --git a/OMCompiler/Compiler/NFFrontEnd/NFRecord.mo b/OMCompiler/Compiler/NFFrontEnd/NFRecord.mo index e661271402a..52818966445 100644 --- a/OMCompiler/Compiler/NFFrontEnd/NFRecord.mo +++ b/OMCompiler/Compiler/NFFrontEnd/NFRecord.mo @@ -253,12 +253,12 @@ algorithm comp := InstNode.component(comp_node); - if Component.isModifiable(comp) then - setFieldDirection(comp_node, Direction.INPUT); - inputs := comp_node :: inputs; - else + if Component.isFinal(comp) then setFieldDirection(comp_node, Direction.NONE); locals := comp_node :: locals; + else + setFieldDirection(comp_node, Direction.INPUT); + inputs := comp_node :: inputs; end if; end collectRecordParam; @@ -296,7 +296,7 @@ algorithm else comp := InstNode.component(comp_node); - if not Component.isModifiable(comp) then + if Component.isFinal(comp) then fields := Field.LOCAL(InstNode.name(comp_node)) :: fields; elseif not Component.isOutput(comp) then fields := Field.INPUT(InstNode.name(comp_node)) :: fields; diff --git a/testsuite/flattening/modelica/scodeinst/FunctionRecordArg3.mo b/testsuite/flattening/modelica/scodeinst/FunctionRecordArg3.mo index 0a402bb9706..e777ca6ae34 100644 --- a/testsuite/flattening/modelica/scodeinst/FunctionRecordArg3.mo +++ b/testsuite/flattening/modelica/scodeinst/FunctionRecordArg3.mo @@ -31,7 +31,7 @@ end FunctionRecordArg3; // end BaseR; // // function R "Automatically generated record constructor for R" -// protected Integer n = 2; +// input Integer n = 2; // input Real[2] x; // output R res; // end R; diff --git a/testsuite/flattening/modelica/scodeinst/RecordBinding6.mo b/testsuite/flattening/modelica/scodeinst/RecordBinding6.mo index abfe4ded93e..eb419bd990d 100644 --- a/testsuite/flattening/modelica/scodeinst/RecordBinding6.mo +++ b/testsuite/flattening/modelica/scodeinst/RecordBinding6.mo @@ -6,7 +6,7 @@ record R Real x; - constant Real y = 2.0; + final constant Real y = 2.0; Real z; end R; @@ -20,7 +20,7 @@ end RecordBinding6; // Result: // class RecordBinding6 // constant Real r.x = 1.0; -// constant Real r.y = 2.0; +// final constant Real r.y = 2.0; // constant Real r.z = 3.0; // constant Real x = 1.0; // constant Real y = 2.0; diff --git a/testsuite/flattening/modelica/scodeinst/RecordBinding7.mo b/testsuite/flattening/modelica/scodeinst/RecordBinding7.mo index 70c25c54259..f0de82f64e2 100644 --- a/testsuite/flattening/modelica/scodeinst/RecordBinding7.mo +++ b/testsuite/flattening/modelica/scodeinst/RecordBinding7.mo @@ -6,7 +6,7 @@ record R Real x; - constant Real y = x / 2.0; + final constant Real y = x / 2.0; Real z; end R; @@ -20,7 +20,7 @@ end RecordBinding7; // Result: // class RecordBinding7 // constant Real r.x = 1.0; -// constant Real r.y = 0.5; +// final constant Real r.y = 0.5; // constant Real r.z = 3.0; // constant Real x = 1.0; // constant Real y = 0.5; diff --git a/testsuite/flattening/modelica/scodeinst/RecordConstructor2.mo b/testsuite/flattening/modelica/scodeinst/RecordConstructor2.mo index 7b8832eb191..cfd4684b03c 100644 --- a/testsuite/flattening/modelica/scodeinst/RecordConstructor2.mo +++ b/testsuite/flattening/modelica/scodeinst/RecordConstructor2.mo @@ -3,13 +3,13 @@ // status: correct // cflags: -d=newInst // -// Checks that constants in a record becomes protected in the default +// Checks that final components in a record becomes protected in the default // constructor. // record R Real x; - constant Real y = 1.0; + final constant Real y = 1.0; end R; model RecordConstructor2 @@ -27,7 +27,7 @@ end RecordConstructor2; // // class RecordConstructor2 // Real r.x; -// constant Real r.y = 1.0; +// final constant Real r.y = 1.0; // algorithm // r := R(time, 1.0); // end RecordConstructor2;