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

Commit 0470a5b

Browse files
perostOpenModelica-Hudson
authored andcommitted
Improve runtime implementation of 'diagonal'.
- Rewrote runtime functions for 'diagonal' to handle all kinds of array expressions, and not only array literals. Belonging to [master]: - #2954
1 parent cc9ae78 commit 0470a5b

File tree

5 files changed

+53
-51
lines changed

5 files changed

+53
-51
lines changed

Compiler/Template/CodegenCFunctions.tpl

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5922,13 +5922,11 @@ simple_alloc_1d_base_array(&<%tvar%>, <%nElts%>, <%tvardata%>);
59225922
let &preExp += 'identity_alloc_<%arr_tp_str%>(<%var1%>, &<%tvar%>);<%\n%>'
59235923
tvar
59245924
5925-
case CALL(path=IDENT(name="diagonal"), expLst={A as ARRAY(__)}) then
5925+
case CALL(path=IDENT(name="diagonal"), expLst={A}) then
5926+
let var1 = daeExpAsLValue(A, context, &preExp, &varDecls, &auxFunction)
59265927
let arr_tp_str = expTypeFromExpArray(A)
59275928
let tvar = tempDecl(arr_tp_str, &varDecls)
5928-
let params = (A.array |> e =>
5929-
daeExp(e, context, &preExp, &varDecls, &auxFunction)
5930-
;separator=", ")
5931-
let &preExp += 'diagonal_alloc_<%arr_tp_str%>(&<%tvar%>, <%listLength(A.array)%>, <%params%>);<%\n%>'
5929+
let &preExp += 'diagonal_alloc_<%arr_tp_str%>(&<%var1%>, &<%tvar%>);<%\n%>'
59325930
tvar
59335931
59345932
case CALL(path=IDENT(name="String"), expLst={s, format}) then

SimulationRuntime/c/util/integer_array.c

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1388,49 +1388,50 @@ void identity_alloc_integer_array(int n,integer_array_t* dest)
13881388
identity_integer_array(n,dest);
13891389
}
13901390

1391-
void diagonal_integer_array(const integer_array_t * v,integer_array_t* dest)
1391+
static void diagonal_integer_array_impl(const integer_array_t *v, integer_array_t* dest)
13921392
{
13931393
size_t i;
13941394
size_t j;
13951395
size_t n;
13961396

1397-
/* Assert that v is a vector */
1398-
omc_assert_macro(v->ndims == 1);
1399-
1400-
/* Assert that dest is a nxn matrix */
14011397
n = v->dim_size[0];
1402-
omc_assert_macro(dest->ndims == 2);
1403-
omc_assert_macro((dest->dim_size[0] == n) && (dest->dim_size[1] == n));
14041398

14051399
for(i = 0; i < (n * n); ++i) {
14061400
integer_set(dest, i, 0);
14071401
}
14081402
j = 0;
14091403
for(i = 0; i < n; ++i) {
14101404
integer_set(dest, j, integer_get(*v, i));
1411-
j += n+1;
1405+
j += n + 1;
14121406
}
14131407
}
14141408

1415-
void diagonal_alloc_integer_array(integer_array_t* dest, int ndims, ...)
1409+
void diagonal_integer_array(const integer_array_t * v,integer_array_t* dest)
14161410
{
1417-
size_t i;
1418-
size_t j;
1419-
va_list ap;
1411+
size_t n;
14201412

1421-
alloc_integer_array(dest,2,ndims,ndims);
1413+
/* Assert that v is a vector */
1414+
omc_assert_macro(v->ndims == 1);
14221415

1423-
for(i = 0; i < (ndims * ndims); ++i) {
1424-
integer_set(dest, i, 0);
1425-
}
1416+
/* Assert that dest is a nxn matrix */
1417+
n = v->dim_size[0];
1418+
omc_assert_macro(dest->ndims == 2);
1419+
omc_assert_macro((dest->dim_size[0] == n) && (dest->dim_size[1] == n));
14261420

1427-
va_start(ap,ndims);
1428-
j = 0;
1429-
for(i = 0; i < ndims; ++i) {
1430-
integer_set(dest, j, va_arg(ap, modelica_integer));
1431-
j += ndims+1;
1432-
}
1433-
va_end(ap);
1421+
diagonal_integer_array_impl(v, dest);
1422+
}
1423+
1424+
void diagonal_alloc_integer_array(const integer_array_t* v, integer_array_t* dest)
1425+
{
1426+
size_t n;
1427+
1428+
/* Assert that v is a vector */
1429+
omc_assert_macro(v->ndims == 1);
1430+
1431+
/* Allocate a n*n matrix and fill it. */
1432+
n = v->dim_size[0];
1433+
alloc_integer_array(dest, 2, n, n);
1434+
diagonal_integer_array_impl(v, dest);
14341435
}
14351436

14361437
void fill_integer_array(integer_array_t* dest,modelica_integer s)

SimulationRuntime/c/util/integer_array.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ extern void identity_integer_array(int n, integer_array_t* dest);
254254
extern void identity_alloc_integer_array(int n, integer_array_t* dest);
255255

256256
extern void diagonal_integer_array(const integer_array_t * v,integer_array_t* dest);
257-
extern void diagonal_alloc_integer_array(integer_array_t* dest, int ndims, ...);
257+
extern void diagonal_alloc_integer_array(const integer_array_t *v, integer_array_t* dest);
258258
extern void fill_integer_array(integer_array_t* dest,modelica_integer s);
259259
extern void linspace_integer_array(modelica_integer x1,modelica_integer x2,int n,
260260
integer_array_t* dest);

SimulationRuntime/c/util/real_array.c

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1368,49 +1368,52 @@ void identity_real_array(int n, real_array_t* dest)
13681368
}
13691369
}
13701370

1371-
void diagonal_real_array(const real_array_t * v,real_array_t* dest)
1371+
static void diagonal_real_array_impl(const real_array_t *v, real_array_t* dest)
13721372
{
13731373
size_t i;
13741374
size_t j;
13751375
size_t n;
13761376

1377-
/* Assert that v is a vector */
1378-
omc_assert_macro(v->ndims == 1);
1379-
1380-
/* Assert that dest is a nxn matrix */
13811377
n = v->dim_size[0];
1382-
omc_assert_macro(dest->ndims == 2);
1383-
omc_assert_macro((dest->dim_size[0] == n) && (dest->dim_size[1] == n));
13841378

13851379
for(i = 0; i < (n * n); ++i) {
13861380
real_set(dest, i, 0);
13871381
}
13881382
j = 0;
13891383
for(i = 0; i < n; ++i) {
13901384
real_set(dest, j, real_get(*v, i));
1391-
j += n+1;
1385+
j += n + 1;
13921386
}
13931387
}
13941388

1395-
void diagonal_alloc_real_array(real_array_t* dest, int ndims, ...)
1389+
void diagonal_real_array(const real_array_t * v,real_array_t* dest)
13961390
{
13971391
size_t i;
13981392
size_t j;
1399-
va_list ap;
1393+
size_t n;
14001394

1401-
alloc_real_array(dest,2,ndims,ndims);
1395+
/* Assert that v is a vector */
1396+
omc_assert_macro(v->ndims == 1);
14021397

1403-
for(i = 0; i < (ndims * ndims); ++i) {
1404-
real_set(dest, i, 0);
1405-
}
1398+
/* Assert that dest is a nxn matrix */
1399+
n = v->dim_size[0];
1400+
omc_assert_macro(dest->ndims == 2);
1401+
omc_assert_macro((dest->dim_size[0] == n) && (dest->dim_size[1] == n));
14061402

1407-
va_start(ap,ndims);
1408-
j = 0;
1409-
for(i = 0; i < ndims; ++i) {
1410-
real_set(dest, j, va_arg(ap, modelica_real));
1411-
j += ndims+1;
1412-
}
1413-
va_end(ap);
1403+
diagonal_real_array_impl(v, dest);
1404+
}
1405+
1406+
void diagonal_alloc_real_array(const real_array_t* v, real_array_t* dest)
1407+
{
1408+
size_t n;
1409+
1410+
/* Assert that v is a vector */
1411+
omc_assert_macro(v->ndims == 1);
1412+
1413+
/* Allocate a n*n matrix and fill it. */
1414+
n = v->dim_size[0];
1415+
alloc_real_array(dest, 2, n, n);
1416+
diagonal_real_array_impl(v, dest);
14141417
}
14151418

14161419
void fill_real_array(real_array_t* dest,modelica_real s)

SimulationRuntime/c/util/real_array.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ extern void outer_product_alloc_real_array(real_array_t* v1, real_array_t* v2, r
237237
extern void outer_product_real_array(const real_array_t * v1,const real_array_t * v2, real_array_t* dest);
238238
extern void identity_real_array(int n, real_array_t* dest);
239239
extern void diagonal_real_array(const real_array_t * v,real_array_t* dest);
240-
extern void diagonal_alloc_real_array(real_array_t* dest, int ndims, ...);
240+
extern void diagonal_alloc_real_array(const real_array_t* v, real_array_t* dest);
241241
extern void fill_real_array(real_array_t* dest,modelica_real s);
242242
extern void linspace_real_array(modelica_real x1,modelica_real x2,int n,
243243
real_array_t* dest);

0 commit comments

Comments
 (0)