Skip to content

Commit e252e7d

Browse files
author
Peter Aronsson
committed
Code generation of functions now working inside interactive env
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@857 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent 9d82f57 commit e252e7d

File tree

4 files changed

+130
-41
lines changed

4 files changed

+130
-41
lines changed

modeq/interactive.rml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,9 @@ relation evaluate: (InteractiveStmts, InteractiveSymbolTable) => (string,Intera
120120
Codegen.generate_functions(d') &
121121
string_append(pathstr,".c") => filename &
122122
Print.print_buf "#include \"modelica.h\"\n#include <stdio.h>\n#include <stdlib.h>\n#include <errno.h>\n" &
123-
Print.print_buf "\nint main(int argc, char** argv)\n{\n\n if (argc != 3)\n {\n fprintf(stderr,\"# Incorrrect number of arguments\n\");\n return 1;\n }\n " &
123+
Print.print_buf "\nint main(int argc, char** argv)\n{\n\n if (argc != 3)\n {\n fprintf(stderr,\"# Incorrrect number of arguments\n\");\n return 1;\n }\n" &
124124
Print.print_buf pathstr &
125-
Print.print_buf "_read_call_write(argv[1],argv[2]);\n return 0;\n}" &
125+
Print.print_buf "_read_call_write(argv[1],argv[2]);\n return 0;\n}\n" &
126126
Print.write_buf(filename)&
127127
System.compile_c_file(filename)
128128
--------------------------------

modeq/runtime/Makefile.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ RMLINCLUDE = @rmlinc@
1010

1111
SHELL = /bin/sh
1212
CC = gcc
13-
CFLAGS = -I$(RMLINCLUDE)
13+
CFLAGS = -I$(RMLINCLUDE) -I../../c_runtime
1414

1515
SRC = rtopts.c socketimpl.c printimpl.c systemimpl.c
1616

modeq/runtime/systemimpl.c

Lines changed: 94 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@
55
#include "../values.h"
66

77
char * cc="/usr/bin/gcc";
8-
char * cflags="-I$MOSHHOME/../c_runtime -L$MOSHHOME/../c_runtime -lc_runtime";
8+
char * cflags="-I$MOSHHOME/../c_runtime -L$MOSHHOME/../c_runtime -lc_runtime -lm";
9+
10+
void * generate_array(char,int,type_description *,void *data);
11+
float next_realelt(float*);
12+
int next_intelt(int*);
913

1014
void System_5finit(void)
1115
{
@@ -21,7 +25,9 @@ RML_BEGIN_LABEL(System__compile_5fc_5ffile)
2125
if (cc == NULL||cflags == NULL) {
2226
/* RMLFAIL */
2327
}
24-
memcpy(exename,str,strlen(str)-1);
28+
memcpy(exename,str,strlen(str)-2);
29+
exename[strlen(str)-2]='\0';
30+
2531
sprintf(command,"%s %s -o %s %s",cc,str,exename,cflags);
2632
printf("compile using: %s\n",command);
2733
if (system(command) != 0) {
@@ -65,7 +71,7 @@ RML_BEGIN_LABEL(System__execute_5ffunction)
6571
char* str = RML_STRINGDATA(rmlA0);
6672
char command[255];
6773
int ret_val;
68-
sprintf(command,"%s %s_in.txt %s_out.txt",str,str,str);
74+
sprintf(command,"./%s %s_in.txt %s_out.txt",str,str,str);
6975
ret_val = system(command);
7076

7177
assert(ret_val == 0);
@@ -102,7 +108,10 @@ RML_BEGIN_LABEL(System__read_5fvalues_5ffrom_5ffile)
102108
type_description desc;
103109
void * res, *res2;
104110
int ival;
105-
double rval;
111+
float rval;
112+
float *rval_arr;
113+
int *ival_arr;
114+
int size;
106115

107116
char* filename = RML_STRINGDATA(rmlA0);
108117
FILE * file=NULL;
@@ -123,34 +132,95 @@ RML_BEGIN_LABEL(System__read_5fvalues_5ffrom_5ffile)
123132
}
124133
else /* Array value */
125134
{
126-
int currdim,el;
135+
int currdim,el,i;
127136
if (desc.type == 'r') {
128-
res = (void*) mk_nil();
137+
/* Create array to hold inserted values, max dimension as size */
138+
size = 1;
129139
for (currdim=0;currdim < desc.ndims; currdim++) {
130-
res2 = (void*)mk_nil();
131-
for (el=0; el < desc.dim_size[currdim]; el++) {
132-
fscanf(file,"%e",&rval);
133-
res2 =(void*) mk_cons(Values__REAL(mk_rcon(rval)),res2);
134-
}
135-
res = (void*) mk_cons(res,Values__ARRAY(res2));
140+
size *= desc.dim_size[currdim];
136141
}
137-
res = (void*) Values__ARRAY(res2);
142+
rval_arr = (float*)malloc(sizeof(float)*size);
143+
assert(rval_arr);
144+
/* Fill the array in reversed order */
145+
for(i=size-1;i>=0;i--) {
146+
fscanf(file,"%e",&rval_arr[i]);
147+
}
148+
149+
next_realelt(NULL);
150+
/* 1 is current dimension (start value) */
151+
res =(void*) Values__ARRAY(generate_array('r',1,&desc,(void*)rval_arr));
138152
}
139-
140-
if (desc.type == 'r') {
141-
res = (void*) mk_nil();
153+
154+
if (desc.type == 'i') {
155+
int currdim,el,i;
156+
/* Create array to hold inserted values, mult of dimensions as size */
157+
size = 1;
142158
for (currdim=0;currdim < desc.ndims; currdim++) {
143-
res2 = (void*) mk_nil();
144-
for (el=0; el < desc.dim_size[currdim]; el++) {
145-
fscanf(file,"%e",&rval);
146-
res2 = (void*) mk_cons(Values__REAL(mk_rcon(rval)),res2);
147-
}
148-
res = (void*) mk_cons(res,Values__ARRAY(res2));
159+
size *= desc.dim_size[currdim];
160+
}
161+
ival_arr = (int*)malloc(sizeof(int)*size);
162+
assert(rval_arr);
163+
/* Fill the array in reversed order */
164+
for(i=size-1;i>=0;i--) {
165+
fscanf(file,"%f",&ival_arr[i]);
149166
}
150-
res = (void*) Values__ARRAY(res2);
167+
next_intelt(NULL);
168+
res = (void*) Values__ARRAY(generate_array('i',1,&desc,(void*)ival_arr));
169+
151170
}
152171
}
153172
rmlA0 = (void*)res;
154173
RML_TAILCALLK(rmlSC);
155-
}
174+
}
156175
RML_END_LABEL
176+
177+
float next_realelt(float *arr)
178+
{
179+
static int curpos;
180+
181+
if(arr == NULL) {
182+
curpos = 0;
183+
return 0.0;
184+
}
185+
else {
186+
return arr[curpos++];
187+
}
188+
}
189+
190+
int next_intelt(int *arr)
191+
{
192+
static int curpos;
193+
194+
if(arr == NULL) {
195+
curpos = 0;
196+
return 0.0;
197+
}
198+
else return arr[curpos++];
199+
}
200+
201+
void * generate_array(char type, int curdim, type_description *desc,void *data)
202+
203+
{
204+
void *lst;
205+
float rval;
206+
int ival;
207+
int i;
208+
lst = (void*)mk_nil();
209+
if (curdim == desc->ndims) {
210+
for (i=0; i< desc->dim_size[curdim-1]; i++) {
211+
if (type == 'r') {
212+
rval = next_realelt((float*)data);
213+
lst = (void*)mk_cons(Values__REAL(mk_rcon(rval)),lst);
214+
215+
} else if (type == 'i') {
216+
ival = next_intelt((int*)data);
217+
lst = (void*)mk_cons(Values__INTEGER(mk_icon(ival)),lst);
218+
}
219+
}
220+
} else {
221+
for (i=0; i< desc->dim_size[curdim-1]; i++) {
222+
lst = mk_cons(Values__ARRAY(generate_array(type,curdim+1,desc,data)),lst);
223+
}
224+
}
225+
return lst;
226+
}

modeq/values.rml

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,16 @@ end
6767

6868
relation unparse_values: (Value list) => string =
6969

70-
rule unparse_description(vallst) => s1 &
71-
unparse_value_numbers(vallst) => s2 &
72-
string_append(s1,s2) => str
70+
rule unparse_description([v]) => s1 &
71+
unparse_value_numbers([v]) => s2 &
72+
unparse_values(vallst) => s3 &
73+
string_append(s1,s2) => s4 &
74+
string_append(s4,"\n") => s5 &
75+
string_append(s5,s3) => str
7376
-----------------------------
74-
unparse_values(vallst) => str
77+
unparse_values(v::vallst) => str
7578

76-
axiom unparse_values(_) => "Unparse values failed\n"
79+
axiom unparse_values([]) => ""
7780
end
7881

7982
relation unparse_value_numbers: (Value list) => string =
@@ -104,8 +107,8 @@ end
104107
relation unparse_description:(Value list) => string =
105108

106109
rule unparse_description(xs) => s1 &
107-
string_append("# i!\n",s1) => str
108-
-------------------------------
110+
string_append("# i!\n",s1) => str
111+
--------------------------------
109112
unparse_description(INTEGER(_)::xs)=> str
110113

111114
rule unparse_description(xs) => s1 &
@@ -115,8 +118,8 @@ relation unparse_description:(Value list) => string =
115118

116119
rule unparse_description(xs) => s1 &
117120
unparse_array_description(vallst) => s2 &
118-
string_append("# [ ",s2) => s3 &
119-
string_append(s3,s1) => str
121+
string_append(s2,s1) => s4 &
122+
string_append(s4," \n") => str
120123
-------------------------------
121124
unparse_description(ARRAY(vallst)::xs)=> str
122125

@@ -125,15 +128,31 @@ end
125128

126129
relation unparse_array_description:(Value list) => string =
127130

128-
rule unparse_num_dims(lst) => i1 &
129-
int_string(i1) => s1 &
130-
string_append(s1," ") => s2 &
131-
unparse_dim_sizes(lst) => s3 &
132-
string_append(s2,s3) => str
131+
rule unparse_prim_type (lst) => pt &
132+
string_append("# ",pt) => s1 &
133+
string_append(s1,"[") => s2 &
134+
unparse_num_dims(lst) => i1 &
135+
int_string(i1) => s3 &
136+
string_append(s2,s3) => s4 &
137+
string_append(s4," ") => s5 &
138+
unparse_dim_sizes(lst) => s6 &
139+
string_append(s5,s6) => str
133140
------------------
134141
unparse_array_description(lst) => str
135142
end
136143

144+
relation unparse_prim_type: (Value list) => string =
145+
146+
rule unparse_prim_type(elts) => res
147+
------------------------------
148+
unparse_prim_type(ARRAY(elts)::_) => res
149+
axiom unparse_prim_type(INTEGER(_)::_) => "i"
150+
axiom unparse_prim_type(REAL(_)::_) => "r"
151+
axiom unparse_prim_type(STRING(_)::_) => "s"
152+
axiom unparse_prim_type(BOOL(_)::_) => "b"
153+
axiom unparse_prim_type(_) => "error"
154+
end
155+
137156
relation unparse_num_dims: (Value list) => int =
138157

139158
rule unparse_num_dims(vals) => i1 &

0 commit comments

Comments
 (0)