Skip to content

Commit

Permalink
*** empty log message ***
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@860 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Peter Aronsson committed Oct 14, 2002
1 parent 18eb569 commit 339947c
Show file tree
Hide file tree
Showing 11 changed files with 244 additions and 87 deletions.
66 changes: 25 additions & 41 deletions modeq/codegen.rml
Expand Up @@ -1028,44 +1028,38 @@ relation generate_algorithm_statement : (Algorithm.Statement, int)
generate_temp_decl("",tnr') => (_,dvar,tnr1) &
exp_type_str (t,a) => ident_type_str &
exp_short_type_str t => short_type &
generate_temp_decl(ident_type_str,tnr1) => (idecl,ivar,tnr2') &
generate_temp_decl(ident_type_str,tnr2') => (rdecl1,rvar1,tnr2'') &
generate_temp_decl(ident_type_str,tnr1) => (rdecl1,rvar1,tnr2'') &
generate_temp_decl(ident_type_str,tnr2'') => (rdecl2,rvar2,tnr2''') &
generate_temp_decl(ident_type_str,tnr2''') => (rdecl3,rvar3,tnr2) &

generate_range_expressions(e,tnr2) => (cfn3,e1var,e2var,e3var,tnr3) &
Util.string_append_list([rvar1," = ",e1var,"; ",
rvar2," = ",e2var,"; ",
rvar3," = ",e3var,";"]) => r_stmt &
Util.string_append_list(["for (",ivar," = ",rvar1,"; ",
"in_range_",short_type,"(",ivar,", ",rvar1,", ",rvar3,"); ",
ivar," += ",rvar2,") {"]) => for_begin &
Util.string_append_list(["#ifdef ",i]) => def_beg1 &
Util.string_append_list(["#define ",dvar," ",i]) => def_beg2 &
Util.string_append_list(["#undef ",i]) => def_beg3 &
Util.string_append_list(["#endif"]) => def_beg4 &
Util.string_append_list(["#define ",i," ",ivar]) => def_beg5 &
Util.string_append_list(["for (",i," = ",rvar1,"; ",
"in_range_",short_type,"(",i,", ",rvar1,", ",rvar3,"); ",
i," += ",rvar2,") {"]) => for_begin &

Util.string_append_list(["{\n ",ident_type_str," ",i,";\n"]) => def_beg1 &

Util.string_append_list([svar," = get_memory_state();"]) => mem_begin &

generate_algorithm_statements(stmts,tnr3) => (cfn4,tnr4) &
Util.string_append_list(["restore_memory_state(",svar,");"])
=> mem_end &
Util.string_append_list(["#ifdef ",dvar]) => def_end1 &
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 = "}" &
let def_end1 = "} /* end for*/\n" &

c_add_variables(cfn3,[sdecl,idecl,rdecl1,rdecl2,rdecl3]) => cfn3' &
c_add_variables(cfn3,[sdecl,rdecl1,rdecl2,rdecl3]) => cfn3' &
c_add_statements(cfn3',[r_stmt,
def_beg1,
for_begin,
def_beg1,def_beg2,def_beg3,def_beg4,def_beg5,
mem_begin]) => cfn3'' &

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

c_merge_fns([cfn3'',cfn4']) => cfn

Expand All @@ -1080,43 +1074,33 @@ relation generate_algorithm_statement : (Algorithm.Statement, int)
generate_temp_decl(ident_type_str,tnr1) => (idecl,ivar,tnr2) &
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); ",
Util.string_append_list(["for (",tvar," = 0; ",
tvar," < size_of_dimension_",array_type_str,"(",evar,", 1); ",
"++",tvar,") {"]) => for_begin &
Util.string_append_list(["#ifdef ",i]) => def_beg1 &
Util.string_append_list(["#define ",dvar," ",i]) => def_beg2 &
Util.string_append_list(["#undef ",i]) => def_beg3 &
Util.string_append_list(["#endif"]) => def_beg4 &
Util.string_append_list(["#define ",i," ",ivar]) => def_beg5 &
Util.string_append_list(["{\n ",ident_type_str," ",i,";\n"]) => def_beg1 &
Util.string_append_list([svar," = get_memory_state();"]) => mem_begin &
Util.string_append_list(["simple_index_alloc_",ident_type_str,
"1(&",evar,", ",tvar,", &",ivar,");"])
"1(&",evar,", ",tvar,", &",ivar,"));"])
=> stmt_array &
Util.string_append_list([ivar," = *(",array_type_str,"_element_addr1(&",
evar,", 1, ",tvar,");"]) => stmt_scalar & (* Use fast implementation for 1 dim *)
Util.string_append_list([i," = *(",array_type_str,"_element_addr1(&",
evar,", 1, ",tvar,"));"]) => stmt_scalar & (* Use fast implementation for 1 dim *)

Util.if(a,stmt_array,stmt_scalar) => stmt &
generate_algorithm_statements(stmts,tnr3) => (cfn4,tnr4) &
Util.string_append_list(["restore_memory_state(",svar,");"])
=> mem_end &
Util.string_append_list(["#ifdef ",dvar]) => def_end1 &
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 = "}" &

let def_end1 = "} /* end for*/\n" &
c_add_variables(cfn3,[sdecl,tdecl,idecl]) => cfn3' &
c_add_statements(cfn3',[for_begin,
def_beg1,def_beg2,def_beg3,def_beg4,def_beg5,
c_add_statements(cfn3',[def_beg1,
for_begin,
mem_begin,stmt]) => cfn3'' &

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

c_merge_fns([cfn3'',cfn4']) => cfn

c_merge_fns([cfn3'',cfn4']) => cfn

-------------------------
generate_algorithm_statement (Algorithm.FOR(t,a,i,e,stmts),tnr)
Expand Down
1 change: 1 addition & 0 deletions modeq/dump.rml
Expand Up @@ -55,6 +55,7 @@ module Dump:
relation print_path : Absyn.Path => ()
relation print_subscripts : Absyn.Subscript list => ()
relation print_arraydim: Absyn.ArrayDim => ()
relation print_arraydim_str: Absyn.ArrayDim => string
relation print_equation: Absyn.Equation => ()
relation print_algorithm: Absyn.Algorithm => ()
relation print_list_debug : (string, 'a list, 'a => (), string) => ()
Expand Down
11 changes: 11 additions & 0 deletions modeq/env.rml
Expand Up @@ -55,6 +55,7 @@ module Env:

relation open_scope : Env => Env
relation extend_frame_c : (Env, SCode.Class) => Env
relation extend_frame_classes : (Env, SCode.Program) => Env
relation extend_frame_v : (Env, Types.Var,SCode.Element option,bool) => Env
relation update_frame_v : (Env, Types.Var,bool) => Env
relation extend_frame_t : (Env,Ident,Types.Type) => Env
Expand Down Expand Up @@ -124,6 +125,16 @@ relation extend_frame_c : (Env, SCode.Class) => Env =

end

relation extend_frame_classes : (Env, SCode.Program) => Env =

axiom extend_frame_classes(env,[]) => env

rule extend_frame_c(env,c) => env' &
extend_frame_classes(env',cs) => env''
-------------------------------------
extend_frame_classes(env,c::cs) => env''
end

(** relation: extend_frame_v
**
** This relation adds a component to the environment.
Expand Down
1 change: 1 addition & 0 deletions modeq/exp.rml
Expand Up @@ -129,6 +129,7 @@ module Exp:
relation print_component_ref : ComponentRef => ()
relation print_component_ref_str : ComponentRef => string
relation print_subscript: Subscript => ()
relation print_subscript_str: Subscript => string
relation print_list : ('a list, 'a => (), string) => ()
relation cref_equal : (ComponentRef, ComponentRef) => bool
relation cref_str : ComponentRef => string
Expand Down
33 changes: 27 additions & 6 deletions modeq/inst.rml
Expand Up @@ -106,6 +106,16 @@ type Ident = Exp.Ident
type Env = Env.Env


relation print_dims: DimExp list => () =
rule print_dim([SOME(x)]) => () &
print_dims(xs) => ()
-------------------
print_dims(x::xs) => ()

axiom print_dims([]) => ()
end


(** relation: new_ident
**
** This relation creates a new, unique identifer. The same name is
Expand Down Expand Up @@ -154,7 +164,8 @@ end
relation instantiate_implicit: SCode.Program => DAE.DAElist =

rule Builtin.initial_env => env &
inst_program_implicit(env,p) => l
Env.extend_frame_classes(env,p) => env' &
inst_program_implicit(env',p) => l
-----------------------------
instantiate_implicit(p) => DAE.DAE(l)
end
Expand Down Expand Up @@ -275,11 +286,11 @@ end

relation inst_program_implicit : (Env, SCode.Program) => DAE.Element list =

rule inst_class_decl(env,Mod.NOMOD,Prefix.NOPRE,[],c,[]) => (env',dae1) &
rule implicit_instantiation(env,Mod.NOMOD,Prefix.NOPRE,[],c,[]) => (env',dae1) &
inst_program_implicit(env',cs) => dae2 &
list_append(dae1,dae2) => dae
-----------------------------
inst_program_implicit(env,c::cs) => dae
inst_program_implicit(env,(c as SCode.CLASS(n,_,_,restr,_))::cs) => dae

axiom inst_program_implicit(env,[]) => []

Expand Down Expand Up @@ -759,7 +770,7 @@ relation inst_element : (Env, Mod, Prefix, Connect.Sets, ClassInf.State,
(** modification are inspected for array dimensions. *)

elab_arraydim(env2,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 Expand Up @@ -1072,7 +1083,8 @@ relation update_variable_in_env: (Mod.Mod,Absyn.ComponentRef, Env.Env) => Env.En
(** modification are inspected for array dimensions. *)

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

print_dims dims &

(** Instantiate the component *)
inst_var(env2,mod',Prefix.NOPRE,[],n,cl,attr,dims,[],[])
=> (dae1,csets',ty) &
Expand Down Expand Up @@ -1103,8 +1115,17 @@ end

relation inst_dim_exp : DimExp => Exp.Subscript =

rule Print.print_buf "# Error, can not determine size of array.\n"
-------------------------------------------
inst_dim_exp DIMEXP(Exp.WHOLEDIM,_) => fail

rule Print.print_buf "# Error, can not determine size of array. SLICE\n"
-------------------------------------------
inst_dim_exp DIMEXP(Exp.SLICE(_),_) => fail

axiom inst_dim_exp DIMINT(i) => Exp.INDEX(Exp.ICONST(i))
axiom inst_dim_exp DIMEXP(e,_) => e

axiom inst_dim_exp DIMEXP(e as Exp.INDEX(_),_) => e

end

Expand Down
18 changes: 11 additions & 7 deletions modeq/interactive.rml
Expand Up @@ -82,6 +82,16 @@ val Graphics_records = "type LinePattern=enumeration(None,Solid,Dash,Dot,DashDot

relation evaluate: (InteractiveStmts, InteractiveSymbolTable) => (string,InteractiveSymbolTable) =

rule Print.get_string() => str &
Print.clear_buf() => ()
--------------------------
evaluate(ISTMTS([IEXP(Absyn.CALL(Absyn.CREF_IDENT("getErrorMsg",_),Absyn.FUNCTIONARGS([],[])))]),st as SYMBOLTABLE(p,_,_,_))
=> (str,st)

rule Print.clear_buf() => ()
--------------------
evaluate(_,_) => fail

rule let newst = SYMBOLTABLE(Absyn.PROGRAM([],Absyn.TOP),[],[],[])
-------------------------------------------------------------
evaluate(ISTMTS([IEXP(Absyn.CALL(Absyn.CREF_IDENT("clear",_),_))]),_)
Expand Down Expand Up @@ -114,7 +124,7 @@ relation evaluate: (InteractiveStmts, InteractiveSymbolTable) => (string,Intera
Absyn.cref_to_path(cr) => path &
Absyn.path_string path => pathstr &
Inst.instantiate_implicit(p') => d &
DAE.dump2 d &
DAE.dump d &
ModUtil.string_prefix_params d => d' &
Print.get_string() => errstr &
Print.clear_buf &
Expand All @@ -139,12 +149,6 @@ relation evaluate: (InteractiveStmts, InteractiveSymbolTable) => (string,Intera
--------------------------
evaluate(ISTMTS([IEXP(Absyn.CALL(Absyn.CREF_IDENT("setCompilerFlags",_),Absyn.FUNCTIONARGS([ Absyn.STRING(str)],[])))]),st as SYMBOLTABLE(p,_,_,_))
=> ("Ok\n",st)

rule Print.get_string() => str &
Print.clear_buf() => ()
--------------------------
evaluate(ISTMTS([IEXP(Absyn.CALL(Absyn.CREF_IDENT("getErrorMsg",_),Absyn.FUNCTIONARGS([],[])))]),st as SYMBOLTABLE(p,_,_,_))
=> (str,st)

rule evaluate_graphical_api(stmts,st) => (str,newst)
----------------------------------------------------
Expand Down
84 changes: 84 additions & 0 deletions modeq/interactive_api.txt
Expand Up @@ -304,3 +304,87 @@ record BitMap
String fileName;
String imageSource;
end BitMap;



Issues for Redesign
===================

An interactive function interface could be part of the Modelica
specification or Rationale. In order to add this, the different
implementations (OSM and Dymola and perhaps existing proposals) needs
to be merged. This section presents some naming conventions and other api
design issues that needs to be taken into consideration when deciding
on the standard api.


1. Naming conventions.
Proposal: function names should begin with a Non-capital letters
and have a Capital character for each new word in the name,
e.g.
loadModel
openModelFile

2. Return type
There is a difference between the current implementations. OSM
returns strings, "OK" or "-1", while Dymola returns Boolean, e.g
true or false.
Proposal: All functions, not returning information, like for instance
getModelName, should return a Boolean value.

3. Argument types.
There is also a difference between implementations for the
arguments of a function. For instance, Dymola uses strings as model
and component references, while OSM uses component references.
E.g loadModel("Resistor") in Dymola, but loadModel(Resistor) in
OSM.
One could also use both alternatives, since Modelica will probably
have function overloading in the near future.

4. Function set
The major issue is of course which subset of functions to include,
and what they should do.

Below is a table of Dymola and OSM functions merged together. The
table also contains a proposal for the standard.

<s> == string
<cr> == component reference
[] == list constructor, e.g. [<s>] == vector of strings

Dymola OSM Description Proposal
====================================================================
list() - list variables list

listfunctions() - list function name listfunctions
+ description

- list(<cr>) print model def. list(<cr>), list(<s>)

classDirectory() - current directory currentDirectory()

eraseClasses() clear() removes models clearClasses()

clear() removes all (models clearAll()
& variables)

- - clear variables clearVariables()

openModel(<s>) loadFile(<s>) load models in file loadFile(<s>)

openModelFile(<s>) loadModel(<cr>) open file that loadModel(<cr>),loadModel(<s>)
contain the model

saveTotalModel(<s>,<s>) - save total modeldef. saveTotalModel(<s>,<s>)
or saveTotalModel(<s>,<cr>)

- saveModel(<cr>,<s>) save model saveModel(<s>,<s>) or saveModel(<s>,<cr>)


- createModel(<cr>) create new empty createModel(<cr>),createModel(<s>)
model
eraseClasses([<s>]) deleteModel(<cr>) remove model from deleteModel(<cr>),deleteModel(<s>)
symboltable

instantiateModel(<s>) instantiateClass(<cr>) instantiate model instantiateClass(<cr>)

0 comments on commit 339947c

Please sign in to comment.