Skip to content

Commit

Permalink
+ Fix #2726.
Browse files Browse the repository at this point in the history
  Handle diagonal() in code generation instead of simplifying it.


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@24616 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
mahge committed Feb 17, 2015
1 parent e985982 commit 588735d
Show file tree
Hide file tree
Showing 6 changed files with 62 additions and 8 deletions.
19 changes: 11 additions & 8 deletions Compiler/FrontEnd/ExpressionSimplify.mo
Expand Up @@ -381,16 +381,19 @@ algorithm
// simplify identity
case DAE.CALL(path = Absyn.IDENT(name = "identity"), expLst = {DAE.ICONST(n)})
equation
matrix = list(DAE.ARRAY(DAE.T_ARRAY(DAE.T_INTEGER_DEFAULT,{DAE.DIM_INTEGER(n)},DAE.emptyTypeSource),false,list(if i==j then DAE.ICONST(1) else DAE.ICONST(0) for i in 1:n)) for j in 1:n);
matrix = list(DAE.ARRAY(DAE.T_ARRAY(DAE.T_INTEGER_DEFAULT,{DAE.DIM_INTEGER(n)},DAE.emptyTypeSource),true,list(if i==j then DAE.ICONST(1) else DAE.ICONST(0) for i in 1:n)) for j in 1:n);
then DAE.ARRAY(DAE.T_ARRAY(DAE.T_INTEGER_DEFAULT,{DAE.DIM_INTEGER(n),DAE.DIM_INTEGER(n)},DAE.emptyTypeSource),false,matrix);

case DAE.CALL(path = Absyn.IDENT(name = "diagonal"), expLst = {DAE.ARRAY(array=expl,ty=tp)})
equation
n = listLength(expl);
tp = Types.arrayElementType(tp);
zero = Expression.makeConstZero(tp);
matrix = list(DAE.ARRAY(DAE.T_ARRAY(tp,{DAE.DIM_INTEGER(n)},DAE.emptyTypeSource),false,list(if i==j then listGet(expl,i) else zero for i in 1:n)) for j in 1:n);
then DAE.ARRAY(DAE.T_ARRAY(tp,{DAE.DIM_INTEGER(n),DAE.DIM_INTEGER(n)},DAE.emptyTypeSource),false,matrix);
/* Dont "simplify" diagonal. We just end up having to reconstrct the matrix from the simplifed form back to runtime arrays.
that is expenisve.*/
// case DAE.CALL(path = Absyn.IDENT(name = "diagonal"), expLst = {DAE.ARRAY(array=expl,ty=tp)})
// equation
// n = listLength(expl);
// tp = Types.arrayElementType(tp);
// zero = Expression.makeConstZero(tp);
// matrix = list(DAE.ARRAY(DAE.T_ARRAY(tp,{DAE.DIM_INTEGER(n)},DAE.emptyTypeSource),true,list(if i==j then listGet(expl,i) else zero for i in 1:n)) for j in 1:n);
// then DAE.ARRAY(DAE.T_ARRAY(tp,{DAE.DIM_INTEGER(n),DAE.DIM_INTEGER(n)},DAE.emptyTypeSource),false,matrix);
// then inExp;

// arcxxx(xxx(e)) => e; xxx(arcxxx(e)) => e
case (DAE.CALL(path=Absyn.IDENT("sin"),expLst={DAE.CALL(path=Absyn.IDENT("asin"),expLst={e})}))
Expand Down
9 changes: 9 additions & 0 deletions Compiler/Template/CodegenC.tpl
Expand Up @@ -8939,6 +8939,15 @@ template daeExpCall(Exp call, Context context, Text &preExp, Text &varDecls, Tex
let tvar = tempDecl(arr_tp_str, &varDecls)
let &preExp += 'identity_alloc_<%arr_tp_str%>(<%var1%>, &<%tvar%>);<%\n%>'
'<%tvar%>'

case CALL(path=IDENT(name="diagonal"), expLst={A as ARRAY(__)}) then
let arr_tp_str = expTypeFromExpArray(A)
let tvar = tempDecl(arr_tp_str, &varDecls)
let params = (A.array |> e =>
'<%daeExp(e, context, &preExp, &varDecls, &auxFunction)%>'
;separator=", ")
let &preExp += 'diagonal_alloc_<%arr_tp_str%>(&<%tvar%>, <%listLength(A.array)%>, <%params%>);<%\n%>'
'<%tvar%>'

case CALL(path=IDENT(name="String"), expLst={s, format}) then
let tvar = tempDecl("modelica_string", &varDecls)
Expand Down
20 changes: 20 additions & 0 deletions SimulationRuntime/c/util/integer_array.c
Expand Up @@ -1482,6 +1482,26 @@ void diagonal_integer_array(const integer_array_t * v,integer_array_t* dest)
}
}

void diagonal_alloc_integer_array(integer_array_t* dest, int ndims, ...)
{
size_t i;
size_t j;
alloc_integer_array(dest,2,ndims,ndims);

for(i = 0; i < (ndims * ndims); ++i) {
integer_set(dest, i, 0);
}

va_list ap;
va_start(ap,ndims);
j = 0;
for(i = 0; i < ndims; ++i) {
integer_set(dest, j, va_arg(ap, modelica_integer));
j += ndims+1;
}
va_end(ap);
}

void fill_integer_array(integer_array_t* dest,modelica_integer s)
{
size_t nr_of_elements;
Expand Down
1 change: 1 addition & 0 deletions SimulationRuntime/c/util/integer_array.h
Expand Up @@ -249,6 +249,7 @@ extern void identity_integer_array(int n, integer_array_t* dest);
extern void identity_alloc_integer_array(int n, integer_array_t* dest);

extern void diagonal_integer_array(const integer_array_t * v,integer_array_t* dest);
extern void diagonal_alloc_integer_array(integer_array_t* dest, int ndims, ...);
extern void fill_integer_array(integer_array_t* dest,modelica_integer s);
extern void linspace_integer_array(modelica_integer x1,modelica_integer x2,int n,
integer_array_t* dest);
Expand Down
20 changes: 20 additions & 0 deletions SimulationRuntime/c/util/real_array.c
Expand Up @@ -1487,6 +1487,26 @@ void diagonal_real_array(const real_array_t * v,real_array_t* dest)
}
}

void diagonal_alloc_real_array(real_array_t* dest, int ndims, ...)
{
size_t i;
size_t j;
alloc_real_array(dest,2,ndims,ndims);

for(i = 0; i < (ndims * ndims); ++i) {
real_set(dest, i, 0);
}

va_list ap;
va_start(ap,ndims);
j = 0;
for(i = 0; i < ndims; ++i) {
real_set(dest, j, va_arg(ap, modelica_real));
j += ndims+1;
}
va_end(ap);
}

void fill_real_array(real_array_t* dest,modelica_real s)
{
size_t nr_of_elements;
Expand Down
1 change: 1 addition & 0 deletions SimulationRuntime/c/util/real_array.h
Expand Up @@ -230,6 +230,7 @@ extern void outer_product_alloc_real_array(real_array_t* v1, real_array_t* v2, r
extern void outer_product_real_array(const real_array_t * v1,const real_array_t * v2, real_array_t* dest);
extern void identity_real_array(int n, real_array_t* dest);
extern void diagonal_real_array(const real_array_t * v,real_array_t* dest);
extern void diagonal_alloc_real_array(real_array_t* dest, int ndims, ...);
extern void fill_real_array(real_array_t* dest,modelica_real s);
extern void linspace_real_array(modelica_real x1,modelica_real x2,int n,
real_array_t* dest);
Expand Down

0 comments on commit 588735d

Please sign in to comment.