Skip to content

Commit

Permalink
Added error message for wrong type in modifiers.(MC bug 443)
Browse files Browse the repository at this point in the history
Fixed bug when turning of error messages in Inst.

git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@2149 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Peter Aronsson committed Feb 21, 2006
1 parent 5d56f87 commit 4c43de1
Show file tree
Hide file tree
Showing 5 changed files with 93 additions and 39 deletions.
9 changes: 7 additions & 2 deletions Compiler/DAELow.rml
Expand Up @@ -1251,9 +1251,14 @@ relation dump: DAELow => () =
int_string(eqnlen) => eqnlen_str &
print eqnlen_str & print ")\n" &
print "=========\n" &
dump_eqns ieqnsl
dump_eqns ieqnsl &
print "Zero Crossings :\n"&
print "===============\n" &
Util.list_map(zc,dump_zc_str) => ss &
Util.string_delimit_list(ss,",\n") => s &
print s & print "\n"
-----------------
dump(DAELOW(vars1,vars2,eqns,reqns,ieqns,ae,algs,eventinfo))
dump(DAELOW(vars1,vars2,eqns,reqns,ieqns,ae,algs,EVENT_INFO(_,zc)))
end


Expand Down
7 changes: 7 additions & 0 deletions Compiler/Error.rml
Expand Up @@ -143,6 +143,8 @@ val ASSIGN_READONLY_ERROR : ErrorID (* assigning to a readonly component *)

val ASSIGN_TYPE_MISMATCH_ERROR : ErrorID (* type mismatch in assignment *)

val MODIFIER_TYPE_MISMATCH_ERROR : ErrorID (* type mismatch in modifier *)

val IF_CONDITION_TYPE_ERROR : ErrorID (* Type error in if conditional *)

val FOR_EXPRESSION_TYPE_ERROR : ErrorID (* Type error in for expressions *)
Expand Down Expand Up @@ -473,6 +475,8 @@ val ERROR_OPENING_FILE = 85

val INHERIT_BASIC_WITH_COMPS = 86

val MODIFIER_TYPE_MISMATCH_ERROR = 87

val UNBOUND_PARAMETER_WARNING = 500

val INDEX_REDUCTION_NOTIFICATION = 1000
Expand Down Expand Up @@ -633,6 +637,9 @@ val ErrorTable =
(ERROR_OPENING_FILE,TRANSLATION, ERROR, "Error opening file %s"),

(INHERIT_BASIC_WITH_COMPS,TRANSLATION, ERROR, "Class %s inherits primary type but has components"),

(MODIFIER_TYPE_MISMATCH_ERROR, TRANSLATION, ERROR, "Type mismatch in modifier, expected type %s, got modifier %s of type %s"),

(* WARNING *)
(UNBOUND_PARAMETER_WARNING, TRANSLATION, WARNING, "Warning, parameter %s has no value."),

Expand Down
46 changes: 22 additions & 24 deletions Compiler/Inst.rml
Expand Up @@ -911,6 +911,7 @@ relation inst_classdef: (Env, Mod, Prefix, Connect.Sets, ClassInf.State,

inst_basictype_baseclass(env3,extendselts,compelts,mods,inst_dims)
=> bc
& ErrorExt.error_on()
------------------------------------------------------
inst_classdef(env,mods,pre, csets, ci_state,
SCode.PARTS(els,eqs,initeqs,alg,initalg,_), re, prot,
Expand Down Expand Up @@ -1137,11 +1138,6 @@ relation inst_basictype_baseclass:(Env,

Mod.merge(mods,m',env,Prefix.NOPRE) => m'' &
Lookup.lookup_class(env,path,true) => (cdef,cenv) &

(* SCode.print_class_str cdef => str &
print "classdef :" & print str & print "\n" &
Mod.print_mod_str(m') => s &
print "mod = "& print s & print "\n" &*)

inst_class_basictype(env,m'',Prefix.NOPRE,Connect.empty_set,cdef,inst_dims,false (*impl*),INNER_CALL)
=>(dae,env',_,ty,st) &
Expand Down Expand Up @@ -6074,30 +6070,32 @@ relation make_binding : (Env, SCode.Attributes, Mod,Types.Type)
make_binding (env, _, Types.MOD(_,_,_,SOME(Types.TYPED(e,_,Types.PROP(e_tp,_)))),tp)
=> Types.VALBOUND(v)

(* Numerical values becomes VALBOUND *)
axiom make_binding (env, _, Types.MOD(_,_,_,SOME(Types.TYPED(Exp.ICONST(i),_,_))),tp)
=> Types.VALBOUND(Values.INTEGER(i))

axiom make_binding (env, _, Types.MOD(_,_,_,SOME(Types.TYPED(Exp.RCONST(r),_,_))),tp)
=> Types.VALBOUND(Values.REAL(r))

axiom make_binding (env, _, Types.MOD(_,_,_,SOME(Types.TYPED(Exp.SCONST(s),_,_))),tp)
=> Types.VALBOUND(Values.STRING(s))

axiom make_binding (env, _, Types.MOD(_,_,_,SOME(Types.TYPED(Exp.BCONST(b),_,_))),tp)
=> Types.VALBOUND(Values.BOOL(b))

(* Constant binding *)
axiom make_binding (env, SCode.ATTR(_,_,_,SCode.CONST,_), Types.MOD(_,_,_,SOME(Types.TYPED(e,SOME(e_val),prop))),tp)
=> Types.VALBOUND(e_val)

(* default *)
rule Exp.simplify(e) => e'
rule Types.match_type(e,e_tp,tp) => (e',_) &
Exp.simplify(e') => e'
-------------------
make_binding (_,_, Types.MOD(_,_,_,
SOME(Types.TYPED(e,e_val,Types.PROP(t,c)))),tp)
SOME(Types.TYPED(e,e_val,Types.PROP(e_tp,c)))),tp)
=> Types.EQBOUND(e',e_val,c)

rule Types.match_type(e,e_tp,tp) => (e',_)
-------------------
make_binding (_,_, Types.MOD(_,_,_,
SOME(Types.TYPED(e,e_val,Types.PROP(e_tp,c)))),tp)
=> Types.EQBOUND(e',e_val,c)

rule not Types.match_type(e,e_tp,tp) => (_,_) &
Types.unparse_type(e_tp) => e_tp_str &
Types.unparse_type(tp) => tp_str &
Exp.print_exp_str(e) => e_str &
string_append("=",e_str) => e_str' &
Error.add_message(Error.MODIFIER_TYPE_MISMATCH_ERROR,[tp_str,e_str',
e_tp_str])
--------------------------
make_binding (_,_, Types.MOD(_,_,_,
SOME(Types.TYPED(e,e_val,Types.PROP(e_tp,c)))),tp)
=> fail

rule Debug.fprint("failtrace", "- make_binding failed\n")
-------------------------------
make_binding(_,_,_,_) => fail
Expand Down
63 changes: 50 additions & 13 deletions Compiler/SimCodegen.rml
Expand Up @@ -1722,7 +1722,6 @@ end

(** relation


**)
relation generate_mixed_discrete_possible_values:
(DAELow.Equation list (* continous eqns*),
Expand Down Expand Up @@ -1973,10 +1972,12 @@ relation generate_mixed_system_discrete_part_check: (DAELow.Equation list,
Util.list_map(crefs,Exp.print_component_ref_str) => strs &
Util.list_map_1r(strs,string_append,"&") => strs2 &
Util.string_delimit_list(strs2,", ") => ptrs_str &
Util.string_append_list(["check_discrete_values(",len_str,",{",
ptrs_str,"});"])
=> stmt &
Codegen.c_add_statements(cfn,[stmt]) => cfn'
Util.string_append_list(["double *loc_ptrs[",len_str,"]={",
ptrs_str,"};"])
=> stmt1 &
Util.string_append_list(["check_discrete_values(",len_str,");"])
=> stmt2 &
Codegen.c_add_statements(cfn,["{",stmt1,stmt2,"}"]) => cfn'
-------------------------
generate_mixed_system_discrete_part_check(eqn,var,cg_id)
=> (cfn',cg_id,funcs)
Expand All @@ -1998,7 +1999,7 @@ relation generate_mixed_system_discrete_part_check2: (DAELow.Equation list,
DAELow.var_cref(v) => cr &
let varexp = Exp.CREF(cr,Exp.REAL) &
Exp.solve(e1,e2,varexp) => expr &
Codegen.generate_expression(expr,cg_id) => (exp_func,var,cg_id') &
Codegen.generate_expression(expr,cg_id') => (exp_func,var,cg_id'') &
int_string(indx) => indx_str &
Exp.print_component_ref_str cr => cr_str &
Util.string_append_list([cr_str," = ",var,";"]) => stmt &
Expand All @@ -2008,7 +2009,7 @@ relation generate_mixed_system_discrete_part_check2: (DAELow.Equation list,
Codegen.c_merge_fns([exp_func',cfn]) => cfn'
-----------------------------------
generate_mixed_system_discrete_part_check2(DAELow.EQUATION(e1,e2)::eqns,v::vs,indx,cg_id)
=> (cfn',cg_id',funcs)
=> (cfn',cg_id'',funcs)

rule print "generate_mixed_system_discrete_part_check2 failed\n"
-------------------------------
Expand Down Expand Up @@ -3762,11 +3763,20 @@ relation build_zero_crossing_eqns : (DAE.DAElist,
rule is_part_of_mixed_system(dlow,eqn,blocks,ass2) => true &
get_zc_mixed_system(dlow,eqn,blocks,ass2) => block &

eqn - 1 => eqn' &
vector_nth(ass2,eqn') => v &
DAELow.get_var_at(vars,v) => (DAELow.VAR(cr,_,_,_,_,_,_,_,_,_,_,_,_,_)) &
Exp.print_component_ref_str(cr) => cr_str &
Util.string_append_list(["save(",cr_str,");"]) => save_stmt &

Util.list_map_3_2(block,get_equation_and_solved_var,eqns,vars,ass2)
=> (eqn_lst,var_lst) &
is_mixed_system(var_lst) => true &
split_mixed_equations(eqn_lst,var_lst) => (cont_eqn,cont_var,
disc_eqn,disc_var) &

(*dump_mixed_system(cont_eqn,cont_var,disc_eqn,disc_var) &*)

DAELow.list_var(cont_var) => vars' &

DAELow.list_equation(cont_eqn) => eqns' &
Expand All @@ -3781,6 +3791,7 @@ relation build_zero_crossing_eqns : (DAE.DAElist,

generate_mixed_header(cont_eqn,cont_var,disc_eqn,disc_var,cg_id)
=> (s0,cg_id1) &
Codegen.c_prepend_statements(s0,[save_stmt]) => s0 &
generate_ode_system2(cont_subsystem_dae,jac,jac_tp,cg_id1)
=> (Codegen.CFUNCTION(rettp,fn,retrec,arg,vars,init,stmts,cleanups),cg_id2,_) &
(* initialization of e.g. matrices for linsys must be done in each
Expand All @@ -3793,35 +3804,61 @@ relation build_zero_crossing_eqns : (DAE.DAElist,
=> (s3,cg_id4,_) &
generate_mixed_system_store_discrete(disc_var,0,cg_id4)
=> (s1,cg_id5,_) &

Codegen.c_merge_fns([s0,s1,s2',s3,s4]) => cfn
build_zero_crossing_eqns(dae,dlow,ass1,ass2,rest,blocks,cg_id5)
=> (cfn3,cg_id6) &
Codegen.c_merge_fns([s0,s1,s2',s3,s4,cfn3]) => cfn
----------------------------------------
build_zero_crossing_eqns(dae,
dlow as DAELow.DAELOW(vars,knvars,eqns,se,ie,ae,al,ev),
ass1,ass2,eqn::rest,blocks,cg_id)
=> (cfn,cg_id5)
=> (cfn,cg_id6)

(* Zero crossing for single equation*)
rule build_equation(dae,dlow,ass1,ass2,eqn,cg_id) => (cfn2,cg_id') &
eqn - 1 => eqn' &
vector_nth(ass2,eqn') => v &
v - 1 => v' &
DAELow.vararray_nth(vararr,v') => (DAELow.VAR(cr,_,_,_,_,_,_,_,_,_,_,_,_,_)) &
DAELow.get_var_at(vars,v) => (DAELow.VAR(cr,_,_,_,_,_,_,_,_,_,_,_,_,_)) &
Exp.print_component_ref_str(cr) => cr_str &
build_zero_crossing_eqns(dae,dlow,ass1,ass2,rest,blocks,cg_id')
=> (cfn3,cg_id'') &
Util.string_append_list(["save(",cr_str,");"]) => stmt &
Codegen.c_add_statements(Codegen.c_empty_function,[stmt]) => cfn1 &
Codegen.c_merge_fns([cfn1,cfn2,cfn3]) => cfn
----------------------------------------
build_zero_crossing_eqns(dae,dlow as DAELow.DAELOW(DAELow.VARIABLES(_,_,vararr,_,_),_,_,_,_,_,_,_),
build_zero_crossing_eqns(dae,dlow as DAELow.DAELOW(vars,_,_,_,_,_,_,_),
ass1,ass2,eqn::rest,blocks,cg_id)
=> (cfn,cg_id'')

axiom build_zero_crossing_eqns(_,_,_,_,_,_,cg_id)
=> (Codegen.c_empty_function,cg_id)
end

(** relation: dump_mixed_system
**
** dumps a mixed system of equations on stdout.
**)
relation dump_mixed_system: (DAELow.Equation list, (* continous eqns*)
DAELow.Var list, (* continuous vars*)
DAELow.Equation list (* discrete eqns*),
DAELow.Var list (* discrete vars*)) => ()=


rule print "Mixed system\n" &
print "============\n" &
print " continous eqns:\n" &
DAELow.dump_eqns(c_e) &
print " continous vars:\n" &
DAELow.dump_vars(c_v) &
print " discrete eqns:\n" &
DAELow.dump_eqns(d_e) &
print " discret vars:\n" &
DAELow.dump_vars(d_v) &
print "\n"
---------------------
dump_mixed_system(c_e,c_v,d_e,d_v) => ()

end

(** relation: build_when_equation
**
** Helper relation to build_when_blocks.
Expand Down
7 changes: 7 additions & 0 deletions Compiler/Types.rml
Expand Up @@ -608,6 +608,13 @@ relation subtype : (Type, Type) => bool =
-----------------------------------
subtype((T_COMPLEX(st1,els1,SOME(tp)),_), tp2)
=> res

(* A complex type that extends a basic type is checked
* against the baseclass basic type *)
rule subtype(tp1,tp2) => res
-----------------------------------
subtype(tp1,(T_COMPLEX(st1,els1,SOME(tp2)),_))
=> res

(* PR. Check of tuples, similar to complex. Just that
identifier name do not have to be checked. Only types are
Expand Down

0 comments on commit 4c43de1

Please sign in to comment.