Skip to content

Commit

Permalink
Fixed checking of reading input paramters
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@729 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
henjo committed Feb 12, 2002
1 parent bb630b3 commit 4124418
Show file tree
Hide file tree
Showing 7 changed files with 68 additions and 31 deletions.
58 changes: 33 additions & 25 deletions modeq/codegen.rml
Expand Up @@ -981,7 +981,7 @@ relation generate_algorithm_statement : (Algorithm.Statement, int)
generate_index_spec(subs,tnr1) => (cfn2,var2,tnr2) &
exp_type_str(typ,true) => type_str &
Util.string_append_list(["indexed_assign_",type_str,"(&",
var1,", &",cref_str,", ",var2,");"]) => stmt &
var1,", &",cref_str,", &",var2,");"]) => stmt &

c_add_statements(cfn2,[stmt]) => cfn2' &
c_merge_fn(cfn1,cfn2') => cfn
Expand Down Expand Up @@ -1059,7 +1059,7 @@ relation generate_algorithm_statement : (Algorithm.Statement, int)
exp_type_str (t,true) => array_type_str &
generate_expression(e,tnr2) => (cfn3,evar,tnr3) &
Util.string_append_list(["for (",tvar," = 1; ",
tvar," < size_of_dimension_",array_type_str,"(&",ivar,", 1); ",
tvar," < size_of_dimension_",array_type_str,"(",ivar,", 1); ",
"++",tvar,") {"]) => for_begin &
Util.string_append_list(["#ifdef ",i]) => def_beg1 &
Util.string_append_list(["#define ",dvar," ",i]) => def_beg2 &
Expand All @@ -1078,9 +1078,10 @@ relation generate_algorithm_statement : (Algorithm.Statement, int)
Util.string_append_list(["restore_memory_state(",svar,");"])
=> mem_end &
Util.string_append_list(["#ifdef ",dvar]) => def_end1 &
Util.string_append_list(["#define ",i," ",dvar]) => def_end2 &
Util.string_append_list(["#undef ",dvar]) => def_end3 &
Util.string_append_list(["#endif"]) => def_end4 &
Util.string_append_list(["#undef ",i]) => def_end2 &
Util.string_append_list(["#define ",i," ",dvar]) => def_end3 &
Util.string_append_list(["#undef ",dvar]) => def_end4 &
Util.string_append_list(["#endif"]) => def_end5 &
let for_end = "}" &

c_add_variables(cfn3,[sdecl,tdecl,idecl]) => cfn3' &
Expand All @@ -1089,7 +1090,7 @@ relation generate_algorithm_statement : (Algorithm.Statement, int)
mem_begin,stmt]) => cfn3'' &

c_add_statements(cfn4,[mem_end,
def_end1,def_end2,def_end3,def_end4,
def_end1,def_end2,def_end3,def_end4,def_end5,
for_end]) => cfn4' &

c_merge_fns([cfn3'',cfn4']) => cfn
Expand Down Expand Up @@ -1263,7 +1264,7 @@ relation generate_var : (DAE.Element,int) => (CFunction,int) =
c_add_inits(cfn',[alloc_str]) => cfn'' &
Util.if (is_a,cfn'',cfn') => cfn
----------------------------------------------------
generate_var(DAE.VAR(id, vk, vd, typ, NONE,inst_dims),tnr) => (cfn,tnr)
generate_var(DAE.VAR(id, vk, vd, typ, NONE,inst_dims),tnr) => (cfn,tnr1)

rule is_array id => is_a &
is_first_in_array id => true &
Expand All @@ -1289,7 +1290,7 @@ relation generate_var : (DAE.Element,int) => (CFunction,int) =
Exp.print_exp e & print "\n"
-----------
generate_var(DAE.VAR(id, vk, vd, typ, SOME(e),inst_dims),tnr)
=> (cfn,tnr)
=> (cfn,tnr1)


rule is_array id => is_a &
Expand Down Expand Up @@ -2039,7 +2040,7 @@ relation generate_array_rhs_cref : (string, Exp.Type,Exp.Subscript list, int)
exp_type_str(crt,true) => array_type_str &
generate_temp_decl(array_type_str,tnr1) => (decl,temp,tnr2) &
Util.string_append_list(["index_alloc_",array_type_str,"(&",cref_str,
", ",spec1,", ",temp,");"]) => stmt &
", &",spec1,", &",temp,");"]) => stmt &
c_add_variables(cfn1,[decl]) => cfn'&
c_add_statements(cfn',[stmt]) => cfn
-------------------------------------------
Expand All @@ -2050,11 +2051,15 @@ end
relation generate_index_spec : (Exp.Subscript list, int)
=> (CFunction, string, int) =

rule generate_indices_array(subs,tnr) => (cfn1,idxs1,tnr1) &
rule generate_indices_array(subs,tnr) => (cfn1,idxs1,idxsizes,tnr1) &
generate_temp_decl("index_spec_t",tnr1) => (decl,spec,tnr2) &
Util.string_delimit_list(idxs1,", ") => idxs_str &
list_length idxs1 => nridx &
int_string nridx => nridx_str &
Util.list_thread(idxsizes,idxs1) => idxs' &
Util.string_delimit_list(idxs',", ") => idxs_str &
Util.string_append_list(["create_index_spec(&",
spec,", ",idxs_str,");"]) => stmt &
spec,", ",nridx_str,", ",idxs_str,");"])
=> stmt &

c_add_variables(cfn1,[decl]) => cfn' &
c_add_statements(cfn',[stmt]) => cfn
Expand All @@ -2069,17 +2074,18 @@ relation generate_index_spec : (Exp.Subscript list, int)
end

relation generate_indices_array : (Exp.Subscript list, int)
=> (CFunction, string list, int) =
=> (CFunction, string list, string list, int) =

axiom generate_indices_array ([],tnr) => (c_empty_function,[],tnr)
axiom generate_indices_array ([],tnr) => (c_empty_function,[],[],tnr)

rule generate_index_array(f,tnr) => (cfn1,idx1, tnr1) &
generate_indices_array(r,tnr1)=>(cfn2,idxs2,tnr2) &
rule generate_index_array(f,tnr) => (cfn1,idx1,idxsize1, tnr1) &
generate_indices_array(r,tnr1)=>(cfn2,idxs2,idxsizes2,tnr2) &

c_merge_fn(cfn1,cfn2) => cfn &
let idxs = idx1::idxs2
let idxs = idx1::idxs2 &
let idxsizes = idxsize1::idxsizes2
---------
generate_indices_array (f::r, tnr) => (cfn,idxs,tnr2)
generate_indices_array (f::r, tnr) => (cfn,idxs,idxsizes,tnr2)

rule print "# generate_indices_array failed\n"
-----------------------------
Expand Down Expand Up @@ -2107,18 +2113,20 @@ relation generate_indices : (Exp.Subscript list, int)
end

relation generate_index_array : (Exp.Subscript, int)
=> (CFunction, string, int) =
=> (CFunction, string, string, int) =

rule generate_expression(e,tnr) => (cfn,var1,tnr1) &
Util.string_append_list(["make_index_array(",var1,")"]) => idx1
Util.string_append_list(["make_index_array(1, ",var1,")"]) => idx &
let idxsize = "(0)"
------------------------------------
generate_index_array(Exp.INDEX(e), tnr)
=> (cfn,idx1,tnr1)
=> (cfn,idx,idxsize,tnr1)

rule let idx1 = "(0)"
rule let idx = "(0)" &
let idxsize = "(1)"
------------------------------------
generate_index_array(Exp.WHOLEDIM, tnr)
=> (c_empty_function,idx1,tnr)
=> (c_empty_function,idx,idxsize,tnr)


rule print "# generate_index_array failed\n"
Expand Down Expand Up @@ -2572,7 +2580,7 @@ relation generate_read : DAE.Element list => CFunction =

rule comp_ref_cstr id => (cref_str,_) &
dae_type_str(t, false) => type_string &
Util.string_append_list(["read_",type_string,"(in_file, &",cref_str,");"])
Util.string_append_list(["if(read_",type_string,"(in_file, &",cref_str,")) return 1;"])
=> stmt &

c_add_statements(c_empty_function,[stmt]) => cfn1 &
Expand All @@ -2584,7 +2592,7 @@ relation generate_read : DAE.Element list => CFunction =
rule comp_ref_cstr id => (cref_str,_) &
is_first_in_array id => true &
dae_type_str(t, true) => type_string &
Util.string_append_list(["read_",type_string,"(in_file, &",cref_str,");"])
Util.string_append_list(["if(read_",type_string,"(in_file, &",cref_str,")) return 1;"])
=> stmt &

c_add_statements(c_empty_function,[stmt]) => cfn1 &
Expand Down
6 changes: 3 additions & 3 deletions modeq/explode.rml
Expand Up @@ -179,13 +179,13 @@ relation elab_classdef_elements: Absyn.ClassPart list => Element list =

rule elab_classdef_elements rest => els &
elab_elist (es, false) => es' &
list_append (els, es') => els'
list_append (es',els) => els'
------------------------------
elab_classdef_elements (Absyn.PUBLIC(es)::rest) => els'

rule elab_classdef_elements rest => els &
elab_elist (es, true) => es' &
list_append (els, es') => els'
list_append (es',els) => els'
------------------------------
elab_classdef_elements (Absyn.PROTECTED(es)::rest) => els'

Expand Down Expand Up @@ -602,4 +602,4 @@ relation print_element : Element => () =
----------------------------------------
print_element COMPONENT(n,final,prot,attr,typath,mod)

end
end
3 changes: 3 additions & 0 deletions modeq/inst.rml
Expand Up @@ -475,14 +475,17 @@ relation inst_element : (Env, Mod, Prefix, Connect.Sets, ClassInf.State,
(** modification is applied, it is an error. *)

check_prot(prot, mm, vn) &
Debug.fprintln ("insttr", "Protection checked") &

Mod.mod_equation mod' => eq &

Debug.fprintln ("insttr", "mod equation done") &
(** The variable declaration and the (optional) equation *)
(** modification are inspected for array dimensions. *)

elab_arraydim(env,ad,eq) => dims &

Debug.fprintln ("insttr", "arraydim elabed") &

(** Instantiate the component *)
inst_var(cenv,mod',pre,csets,n,cl,attr,dims,[],inst_dims)
Expand Down
5 changes: 5 additions & 0 deletions modeq/lookup.rml
Expand Up @@ -372,6 +372,11 @@ relation check_subscripts : (Types.Type, Exp.Subscript list)
check_subscripts(Types.T_ARRAY(Types.DIM(SOME(sz)),t),
Exp.INDEX(_)::ys) => t'

rule check_subscripts(t, ys) => t'
------------------------------
check_subscripts(Types.T_ARRAY(Types.DIM(NONE),t),
Exp.INDEX(_)::ys) => t'

rule print "- check_subscripts failed (" &
Types.print_type t & print ", [" &
Exp.print_list(s,Exp.print_subscript,",") & print "])\n"
Expand Down
10 changes: 7 additions & 3 deletions modeq/staticexp.rml
Expand Up @@ -1160,10 +1160,14 @@ end
relation fill_subscripts : (Exp.Subscript list, Types.Type)
=> Exp.Subscript list =

rule fill_subscripts (subs,t) => subs' &
list_append(subs,[Exp.WHOLEDIM]) => subs''
rule fill_subscripts ([],t) => subs' &
list_append([Exp.WHOLEDIM],subs') => subs''
------------
fill_subscripts (subs,Types.T_ARRAY(_,t)) => subs''
fill_subscripts ([],Types.T_ARRAY(_,t)) => subs''

rule fill_subscripts (subs,t) => subs'
------------
fill_subscripts (fs::subs,Types.T_ARRAY(_,t)) => fs::subs'

axiom fill_subscripts (subs,_) => subs

Expand Down
4 changes: 4 additions & 0 deletions modeq/types.rml
Expand Up @@ -162,6 +162,10 @@ relation subtype : (Type, Type) => bool =
-----------------------
subtype(T_ARRAY(_,t1),T_ARRAY(DIM(NONE),t2)) => true

rule subtype (t1,t2) => true
-----------------------
subtype(T_ARRAY(DIM(NONE),t1),T_ARRAY(_,t2)) => true

rule i1 = i2 &
subtype (t1,t2) => true
---------------------------------------------------------
Expand Down
13 changes: 13 additions & 0 deletions modeq/util.rml
Expand Up @@ -5,6 +5,7 @@ module Util :
relation list_flatten : 'a list list => 'a list
relation list_map : ('a list, 'a => 'b) => 'b list
relation list_list_map : ('a list list, 'a => 'b) => 'b list list
relation list_thread : ('a list, 'a list) => 'a list
relation list_thread_tuple : ('a list, 'b list) => ('a * 'b) list
relation list_list_thread_tuple : ('a list list, 'b list list)
=> ('a * 'b) list list
Expand Down Expand Up @@ -50,6 +51,18 @@ relation list_list_map : ('a list list, 'a => 'b) => 'b list list =

end

relation list_thread : ('a list, 'a list) => 'a list =

axiom list_thread([],[]) => []

rule list_thread(ra,rb) => r' &
let c = fb::r' &
let d = fa::c
------------------------
list_thread(fa::ra,fb::rb) => d

end

relation list_thread_tuple : ('a list, 'b list) => ('a * 'b) list =

axiom list_thread_tuple ([],[]) => []
Expand Down

0 comments on commit 4124418

Please sign in to comment.