Skip to content

Commit

Permalink
Implemented unary subtraction for real arrays.
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@4653 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
perost committed Dec 9, 2009
1 parent 6debd50 commit fbee632
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 4 deletions.
15 changes: 11 additions & 4 deletions Compiler/Codegen.mo
Expand Up @@ -5312,8 +5312,8 @@ algorithm
(outCFunction,outString,outInteger):=
matchcontinue (inOperator,inExp,inInteger,inContext)
local
CFunction cfn;
Lib var,var_1,s;
CFunction cfn, cfn1;
Lib var,var_1,s, stmt;
Integer tnr_1,tnr;
DAE.Exp e;
Context context;
Expand Down Expand Up @@ -5364,11 +5364,18 @@ algorithm
(cfn,var,tnr_1) = generateExpression(e, tnr, context);
then
(cfn,var,tnr_1);
case (DAE.UMINUS_ARR(ty = DAE.ET_ARRAY(DAE.ET_REAL(), {NONE})), e, tnr, context)
equation
(cfn1, var, tnr_1) = generateExpression(e, tnr, context);
stmt = Util.stringAppendList({"usub_real_array(&", var, ");"});
cfn = cAddStatements(cfn1, {stmt});
then
(cfn, var, tnr_1);
case (DAE.UMINUS_ARR(ty = _),_,_,_)
equation
Debug.fprint("failtrace", "# unary minus for arrays not implemented\n");
Debug.fprint("failtrace", "# unary minus for non-real arrays not implemented\n");
then
fail();
fail();
case (DAE.UMINUS(ty = tp),_,_,_)
equation
true = RTOpts.debugFlag("failtrace");
Expand Down
11 changes: 11 additions & 0 deletions c_runtime/real_array.c
Expand Up @@ -680,6 +680,17 @@ void add_alloc_real_array(real_array_t* a, real_array_t* b,real_array_t* dest)
add_real_array(a,b,dest);
}

void usub_real_array(real_array_t* a)
{
size_t nr_of_elements, i;

nr_of_elements = base_array_nr_of_elements(a);
for(i = 0; i < nr_of_elements; ++i)
{
real_set(a, i, -real_get(a, i));
}
}

void sub_real_array(real_array_t* a, real_array_t* b, real_array_t* dest)
{
size_t nr_of_elements;
Expand Down
2 changes: 2 additions & 0 deletions c_runtime/real_array.h
Expand Up @@ -147,6 +147,8 @@ void range_real_array(m_real start,m_real stop, m_real inc,real_array_t* dest);
void add_alloc_real_array(real_array_t* a, real_array_t* b,real_array_t* dest);
void add_real_array(real_array_t* a, real_array_t* b, real_array_t* dest);

/* Unary subtraction */
void usub_real_array(real_array_t* a);
void sub_real_array(real_array_t* a, real_array_t* b, real_array_t* dest);
void sub_alloc_real_array(real_array_t* a, real_array_t* b, real_array_t* dest);

Expand Down

0 comments on commit fbee632

Please sign in to comment.