Skip to content

Commit

Permalink
Added code gen for array-array multiplication
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@15774 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
sjoelund committed Apr 9, 2013
1 parent 1a7a954 commit c24c0e1
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 5 deletions.
2 changes: 1 addition & 1 deletion Compiler/FrontEnd/DAE.mo
Expand Up @@ -1529,7 +1529,7 @@ uniontype Operator "Operators which are overloaded in the abstract syntax are he
Type ty;
end SUB_ARR;

record MUL_ARR
record MUL_ARR "Element-wise array multiplication"
Type ty;
end MUL_ARR;

Expand Down
14 changes: 10 additions & 4 deletions Compiler/Template/CodegenC.tpl
Expand Up @@ -6792,17 +6792,23 @@ case BINARY(__) then
let var = tempDecl(type, &varDecls /*BUFD*/)
let &preExp += 'sub_alloc_<%type%>(&<%e1%>, &<%e2%>, &<%var%>);<%\n%>'
'<%var%>'
case MUL_ARR(__) then 'daeExpBinary:ERR for MUL_ARR'
case DIV_ARR(__) then 'daeExpBinary:ERR for DIV_ARR'
case MUL_ARR(__) then
let type = match ty case T_ARRAY(ty=T_INTEGER(__)) then "integer_array"
case T_ARRAY(ty=T_ENUMERATION(__)) then "integer_array"
else "real_array"
let var = tempDecl(type, &varDecls /*BUFD*/)
let &preExp += 'mul_alloc_<%type%>(&<%e1%>, &<%e2%>, &<%var%>);<%\n%>'
'<%var%>'
case DIV_ARR(__) then error(sourceInfo(),'Code generation does not support DIV_ARR <%printExpStr(exp)%>')
case MUL_ARRAY_SCALAR(__) then
let type = match ty case T_ARRAY(ty=T_INTEGER(__)) then "integer_array"
case T_ARRAY(ty=T_ENUMERATION(__)) then "integer_array"
else "real_array"
let var = tempDecl(type, &varDecls /*BUFD*/)
let &preExp += 'mul_alloc_<%type%>_scalar(&<%e1%>, <%e2%>, &<%var%>);<%\n%>'
'<%var%>'
case ADD_ARRAY_SCALAR(__) then 'daeExpBinary:ERR for ADD_ARRAY_SCALAR'
case SUB_SCALAR_ARRAY(__) then 'daeExpBinary:ERR for SUB_SCALAR_ARRAY'
case ADD_ARRAY_SCALAR(__) then error(sourceInfo(),'Code generation does not support ADD_ARRAY_SCALAR <%printExpStr(exp)%>')
case SUB_SCALAR_ARRAY(__) then error(sourceInfo(),'Code generation does not support SUB_SCALAR_ARRAY <%printExpStr(exp)%>')
case MUL_SCALAR_PRODUCT(__) then
let type = match ty case T_ARRAY(ty=T_INTEGER(__)) then "integer_scalar"
case T_ARRAY(ty=T_ENUMERATION(__)) then "integer_scalar"
Expand Down
18 changes: 18 additions & 0 deletions SimulationRuntime/c/util/real_array.c
Expand Up @@ -974,6 +974,24 @@ void mul_alloc_real_array_scalar(const real_array_t * a,modelica_real b,real_arr
mul_real_array_scalar(a,b,dest);
}

void mul_real_array(const real_array_t *a,const real_array_t *b,real_array_t* dest)
{
size_t nr_of_elements;
size_t i;
/* Assert that a,b have same sizes? */
nr_of_elements = base_array_nr_of_elements(a);
for(i=0; i < nr_of_elements; ++i) {
real_set(dest, i, real_get(a, i) * real_get(b, i));
}
}

void mul_alloc_real_array(const real_array_t *a,const real_array_t *b,real_array_t *dest)
{
clone_real_array_spec(a,dest);
alloc_real_array_data(dest);
mul_real_array(a,b,dest);
}

modelica_real mul_real_scalar_product(const real_array_t * a, const real_array_t * b)
{
size_t nr_of_elements;
Expand Down
3 changes: 3 additions & 0 deletions SimulationRuntime/c/util/real_array.h
Expand Up @@ -167,6 +167,9 @@ extern void mul_real_array_scalar(const real_array_t * a,modelica_real b,real_ar
extern void mul_alloc_real_array_scalar(const real_array_t * a,modelica_real b,
real_array_t* dest);

void mul_real_array(const real_array_t *a,const real_array_t *b,real_array_t* dest);
void mul_alloc_real_array(const real_array_t *a,const real_array_t *b,real_array_t *dest);

extern modelica_real mul_real_scalar_product(const real_array_t * a, const real_array_t * b);

extern void mul_real_matrix_product(const real_array_t *a,const real_array_t *b,real_array_t*dest);
Expand Down

0 comments on commit c24c0e1

Please sign in to comment.