Skip to content
This repository was archived by the owner on May 18, 2019. It is now read-only.

Commit 098c4ec

Browse files
rfrankeOpenModelica-Hudson
authored andcommitted
Treat array variables during Cpp code generation, ticket:5110
Belonging to [master]: - #2679
1 parent 0880a6c commit 098c4ec

File tree

3 files changed

+124
-44
lines changed

3 files changed

+124
-44
lines changed

Compiler/Template/CodegenCpp.tpl

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8052,6 +8052,15 @@ template memberVariableInitialize2(SimVar simVar, HashTableCrIListArray.HashTabl
80528052
getSimVars()->init<%type%>AliasArray(LIST_OF <%arrayIndices%> LIST_END, <%arrayName%>_ref_data);
80538053
<%arrayName%> = RefArrayDim<%dims%><<%typeString%>, <%arrayextentDims(name, v.numArrayElement)%>>(<%arrayName%>_ref_data);
80548054
>>
8055+
/* newInst with arrays */
8056+
case v as SIMVAR(type_ = T_ARRAY()) then
8057+
let& dims = buffer "" /*BUFD*/
8058+
let varName = arraycref2(name, dims)
8059+
let typeString = expTypeShort(type_)
8060+
let arrayHeadIdx = listHead(SimCodeUtil.getVarIndexListByMapping(varToArrayIndexMapping,name,true,indexForUndefinedReferences))
8061+
<<
8062+
<%varName%> = StatArrayDim<%listLength(v.numArrayElement)%><<%typeString%>, <%List.lastN(v.numArrayElement, listLength(v.numArrayElement));separator=","%>, true>(&_pointerTo<%type%>Vars[<%arrayHeadIdx%>]);
8063+
>>
80558064
/*special case for variables that marked as array but are not arrays */
80568065
case SIMVAR(numArrayElement=_::_) then
80578066

@@ -8310,6 +8319,14 @@ template memberVariableDefine2(SimVar simVar, HashTableCrIListArray.HashTable va
83108319
<<
83118320
RefArrayDim<%dims%><<%typeString%>, <%array_dimensions%>> <%arrayName%>;
83128321
>>
8322+
/* newInst with arrays */
8323+
case v as SIMVAR(type_ = T_ARRAY()) then
8324+
let& dims = buffer "" /*BUFD*/
8325+
let varName = arraycref2(name, dims)
8326+
let typeString = expTypeShort(type_)
8327+
<<
8328+
StatArrayDim<%listLength(v.numArrayElement)%><<%typeString%>, <%List.lastN(v.numArrayElement, listLength(v.numArrayElement));separator=","%>, <%createRefVar%>> <%varName%>;
8329+
>>
83138330
/*special case for variables that marked as array but are not arrays */
83148331
case SIMVAR(numArrayElement=_::_) then
83158332
let& dims = buffer "" /*BUFD*/
@@ -9446,22 +9463,16 @@ template initValst(Text &varDecls, Text type, list<SimVar> varsLst, SimCode simC
94469463
let crefStr = cref1(sv.name,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace,context,varDeclsCref, stateDerVectorName, useFlatArrayNotation)
94479464
match initialValue
94489465
case SOME(v) then
9449-
match daeExp(v, contextOther, &preExp, &varDecls,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)
9450-
case vStr as "0"
9451-
case vStr as "0.0"
9452-
case vStr as "(0)" then
9453-
'<%preExp%>
9454-
SystemDefaultImplementation::set<%type%>StartValue(<%crefStr%>,<%vStr%>);'
9455-
case vStr as "" then
9456-
'<%preExp%>
9457-
SystemDefaultImplementation::set<%type%>StartValue(<%crefStr%>,<%vStr%>);'
9458-
case vStr then
9459-
'<%preExp%>
9460-
SystemDefaultImplementation::set<%type%>StartValue(<%crefStr%>,<%vStr%>);'
9461-
end match
9466+
let vStr = daeExp(v, contextOther, &preExp, &varDecls,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace, stateDerVectorName, useFlatArrayNotation)
9467+
<<
9468+
<%preExp%>
9469+
SystemDefaultImplementation::set<%type%>StartValue(<%crefStr%>, <%vStr%>);
9470+
>>
94629471
else
9463-
'<%preExp%>
9464-
SystemDefaultImplementation::set<%type%>StartValue(<%crefStr%>,<%startValue(sv.type_)%>);'
9472+
<<
9473+
<%preExp%>
9474+
SystemDefaultImplementation::set<%type%>StartValue(<%crefStr%>, <%startValue(sv.type_)%>);
9475+
>>
94659476
;separator="\n")
94669477
else
94679478
(varsLst |> sv as SIMVAR(__) =>
@@ -9489,7 +9500,8 @@ template startValue(DAE.Type ty)
94899500
case ty as T_REAL(__) then '0.0'
94909501
case ty as T_BOOL(__) then 'false'
94919502
case ty as T_STRING(__) then '"empty"'
9492-
case ty as T_ENUMERATION(__) then '0'
9503+
case ty as T_ENUMERATION(__) then '0'
9504+
case ty as T_ARRAY(ty = elty) then startValue(elty)
94939505
else ""
94949506
end startValue;
94959507

SimulationRuntime/cpp/Core/System/SystemDefaultImplementation.cpp

Lines changed: 84 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -634,48 +634,112 @@ string& SystemDefaultImplementation::getStringStartValue(string& var)
634634
return _string_start_values.getGetStartValue(var);
635635
}
636636

637-
void SystemDefaultImplementation::setRealStartValue(double& var,double val)
637+
void SystemDefaultImplementation::setRealStartValue(double& var, double val, bool overwriteOldValue)
638638
{
639-
setRealStartValue(var,val,false);
639+
var = val;
640+
_real_start_values.setStartValue(var, val, overwriteOldValue);
640641
}
641642

642-
void SystemDefaultImplementation::setRealStartValue(double& var,double val,bool overwriteOldValue)
643+
void SystemDefaultImplementation::setRealStartValue(BaseArray<double>& avar, double val, bool overwriteOldValue)
643644
{
644-
var=val;
645-
_real_start_values.setStartValue(var,val,overwriteOldValue);
645+
double *varp = avar.getData();
646+
size_t nel = avar.getNumElems();
647+
for (size_t i = 0; i < nel; varp++, i++) {
648+
*varp = val;
649+
_real_start_values.setStartValue(*varp, val, overwriteOldValue);
650+
}
651+
}
652+
653+
void SystemDefaultImplementation::setRealStartValue(BaseArray<double>& avar, const BaseArray<double>& aval, bool overwriteOldValue)
654+
{
655+
double *varp = avar.getData();
656+
const double *valp = aval.getData();
657+
size_t nel = avar.getNumElems();
658+
for (size_t i = 0; i < nel; varp++, valp++, i++) {
659+
*varp = *valp;
660+
_real_start_values.setStartValue(*varp, *valp, overwriteOldValue);
661+
}
662+
}
663+
664+
void SystemDefaultImplementation::setBoolStartValue(bool& var, bool val, bool overwriteOldValue)
665+
{
666+
var = val;
667+
_bool_start_values.setStartValue(var, val, overwriteOldValue);
668+
}
669+
670+
void SystemDefaultImplementation::setBoolStartValue(BaseArray<bool>& avar, bool val, bool overwriteOldValue)
671+
{
672+
bool *varp = avar.getData();
673+
size_t nel = avar.getNumElems();
674+
for (size_t i = 0; i < nel; varp++, i++) {
675+
*varp = val;
676+
_bool_start_values.setStartValue(*varp, val, overwriteOldValue);
677+
}
678+
}
679+
680+
void SystemDefaultImplementation::setBoolStartValue(BaseArray<bool>& avar, const BaseArray<bool>& aval, bool overwriteOldValue)
681+
{
682+
bool *varp = avar.getData();
683+
const bool *valp = aval.getData();
684+
size_t nel = avar.getNumElems();
685+
for (size_t i = 0; i < nel; varp++, valp++, i++) {
686+
*varp = *valp;
687+
_bool_start_values.setStartValue(*varp, *valp, overwriteOldValue);
688+
}
646689
}
647690

648-
void SystemDefaultImplementation::setBoolStartValue(bool& var,bool val)
691+
void SystemDefaultImplementation::setIntStartValue(int& var, int val, bool overwriteOldValue)
649692
{
650-
setBoolStartValue(var,val,false);
693+
var = val;
694+
_int_start_values.setStartValue(var, val, overwriteOldValue);
651695
}
652696

653-
void SystemDefaultImplementation::setBoolStartValue(bool& var,bool val,bool overwriteOldValue)
697+
void SystemDefaultImplementation::setIntStartValue(BaseArray<int>& avar, int val, bool overwriteOldValue)
654698
{
655-
var=val;
656-
_bool_start_values.setStartValue(var,val,overwriteOldValue);
699+
int *varp = avar.getData();
700+
size_t nel = avar.getNumElems();
701+
for (size_t i = 0; i < nel; varp++, i++) {
702+
*varp = val;
703+
_int_start_values.setStartValue(*varp, val, overwriteOldValue);
704+
}
657705
}
658706

659-
void SystemDefaultImplementation::setIntStartValue(int& var,int val)
707+
void SystemDefaultImplementation::setIntStartValue(BaseArray<int>& avar, const BaseArray<int>& aval, bool overwriteOldValue)
660708
{
661-
setIntStartValue(var,val,false);
709+
int *varp = avar.getData();
710+
const int *valp = aval.getData();
711+
size_t nel = avar.getNumElems();
712+
for (size_t i = 0; i < nel; varp++, valp++, i++) {
713+
*varp = *valp;
714+
_int_start_values.setStartValue(*varp, *valp, overwriteOldValue);
715+
}
662716
}
663717

664-
void SystemDefaultImplementation::setIntStartValue(int& var,int val,bool overwriteOldValue)
718+
void SystemDefaultImplementation::setStringStartValue(string& var, string val, bool overwriteOldValue)
665719
{
666-
var=val;
667-
_int_start_values.setStartValue(var,val,overwriteOldValue);
720+
var = val;
721+
_string_start_values.setStartValue(var, val, overwriteOldValue);
668722
}
669723

670-
void SystemDefaultImplementation::setStringStartValue(string& var,string val)
724+
void SystemDefaultImplementation::setStringStartValue(BaseArray<string>& avar, string val, bool overwriteOldValue)
671725
{
672-
setStringStartValue(var,val,false);
726+
string *varp = avar.getData();
727+
size_t nel = avar.getNumElems();
728+
for (size_t i = 0; i < nel; varp++, i++) {
729+
*varp = val;
730+
_string_start_values.setStartValue(*varp, val, overwriteOldValue);
731+
}
673732
}
674733

675-
void SystemDefaultImplementation::setStringStartValue(string& var,string val,bool overwriteOldValue)
734+
void SystemDefaultImplementation::setStringStartValue(BaseArray<string>& avar, const BaseArray<string>& aval, bool overwriteOldValue)
676735
{
677-
var=val;
678-
_string_start_values.setStartValue(var,val,overwriteOldValue);
736+
string *varp = avar.getData();
737+
const string *valp = aval.getData();
738+
size_t nel = avar.getNumElems();
739+
for (size_t i = 0; i < nel; varp++, valp++, i++) {
740+
*varp = *valp;
741+
_string_start_values.setStartValue(*varp, *valp, overwriteOldValue);
742+
}
679743
}
680744

681745
/**

SimulationRuntime/cpp/Include/Core/System/SystemDefaultImplementation.h

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -146,14 +146,18 @@ class BOOST_EXTENSION_SYSTEM_DECL SystemDefaultImplementation
146146
virtual bool& getBoolStartValue(bool& var);
147147
virtual int& getIntStartValue(int& var);
148148
virtual string& getStringStartValue(string& var);
149-
virtual void setRealStartValue(double& var,double val);
150-
virtual void setRealStartValue(double& var,double val,bool overwriteOldValue);
151-
virtual void setBoolStartValue(bool& var,bool val);
152-
virtual void setBoolStartValue(bool& var,bool val,bool overwriteOldValue);
153-
virtual void setIntStartValue(int& var,int val);
154-
virtual void setIntStartValue(int& var,int val,bool overwriteOldValue);
155-
virtual void setStringStartValue(string& var,string val);
156-
virtual void setStringStartValue(string& var,string val,bool overwriteOldValue);
149+
virtual void setRealStartValue(double& var, double val, bool overwriteOldValue = false);
150+
virtual void setRealStartValue(BaseArray<double>& avar, double val, bool overwriteOldValue = false);
151+
virtual void setRealStartValue(BaseArray<double>& avar, const BaseArray<double>& aval, bool overwriteOldValue = false);
152+
virtual void setBoolStartValue(bool& var, bool val, bool overwriteOldValue = false);
153+
virtual void setBoolStartValue(BaseArray<bool>& avar, bool val, bool overwriteOldValue = false);
154+
virtual void setBoolStartValue(BaseArray<bool>& avar, const BaseArray<bool>& aval, bool overwriteOldValue = false);
155+
virtual void setIntStartValue(int& var,int val, bool overwriteOldValue = false);
156+
virtual void setIntStartValue(BaseArray<int>& avar, int val, bool overwriteOldValue = false);
157+
virtual void setIntStartValue(BaseArray<int>& avar, const BaseArray<int>& aval, bool overwriteOldValue = false);
158+
virtual void setStringStartValue(string& var, string val, bool overwriteOldValue = false);
159+
virtual void setStringStartValue(BaseArray<string>& avar, string val, bool overwriteOldValue = true);
160+
virtual void setStringStartValue(BaseArray<string>& avar, const BaseArray<string>& aval, bool overwriteOldValue = true);
157161
protected:
158162
void Assert(bool cond, const string& msg);
159163
void Terminate(string msg);

0 commit comments

Comments
 (0)