Skip to content

Commit

Permalink
implemented get_var_using_name for getting a DAELow by its old name "…
Browse files Browse the repository at this point in the history
…a.b.c" and not by indexed form

git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@1856 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
x02lucpo committed Jul 19, 2005
1 parent 9d73825 commit 3e067b3
Show file tree
Hide file tree
Showing 5 changed files with 133 additions and 35 deletions.
21 changes: 21 additions & 0 deletions Compiler/Absyn.rml
Expand Up @@ -462,6 +462,7 @@ module Absyn:
relation get_cref_from_exp : ( Exp ) => ComponentRef list
relation cref_get_first : ComponentRef => ComponentRef
relation join_paths: (Path, Path) => Path
relation path_append_list: (Path list) => (Path)
relation strip_last: (Path) => Path
relation print_restr : Restriction => ()
relation restr_string : Restriction => string
Expand Down Expand Up @@ -694,6 +695,26 @@ relation join_paths: (Path, Path) => (Path) =
join_paths(QUALIFIED(str,p),p2) => QUALIFIED(str,p')
end

(** relation: join_paths
** author Lucian
** This relation joins a path list
**)
relation path_append_list: (Path list) => (Path) =

axiom path_append_list([]) => IDENT("")

axiom path_append_list(path::[]) => path

rule path_append_list(rest) => path &
join_paths(first,path) => res_path
---------------------------
path_append_list(first::rest) => res_path

end




(** relation: strip_last
**
** Returns the path given as argument to the relation
Expand Down
95 changes: 76 additions & 19 deletions Compiler/DAELow.rml
Expand Up @@ -195,12 +195,15 @@
* EventInfo

datatype Variables = VARIABLES of CrefIndex list array (* HashTB, cref->indx*)
* StringIndex list array (* HashTB, cref->indx for old names*)
* VariableArray (* Array of variables *)
* int (* bucket size *)
* int (* no. of vars *)

datatype CrefIndex = CREFINDEX of Exp.ComponentRef * int

datatype StringIndex = STRINGINDEX of string * int

(* array of Equations are expandable, to amortize the cost of adding
** equations in a more efficient manner
*)
Expand Down Expand Up @@ -316,6 +319,7 @@ datatype EquationArray = EQUATION_ARRAY of int * (* no. elements *)
relation states: (DAE.DAElist,BinTree) => BinTree

relation get_var: (Exp.ComponentRef, Variables) => (Var,int)
relation get_var_using_name: (string, Variables) => (Var,int)
relation add_var: (Var, Variables) => Variables
relation get_var_at:(Variables,int) => (Var)
relation exists_var: (Exp.ComponentRef, Variables) => bool
Expand Down Expand Up @@ -960,7 +964,7 @@ relation var_list: (Variables) => Var list =

rule vararray_list(vararr) => varlst
--------------------------------------
var_list(VARIABLES(_,vararr,_,_)) => varlst
var_list(VARIABLES(_,_,vararr,_,_)) => varlst
end

(** relation: list_var
Expand Down Expand Up @@ -2505,10 +2509,11 @@ end
relation empty_vars: () => Variables =

rule array_create(10000,[]) => arr &
array_create(10000,[]) => arr2 &
Util.list_fill(NONE,1000) => lst &
list_array(lst) => emptyarr
------------------------
empty_vars() => VARIABLES(arr,VARIABLE_ARRAY(0,1000,emptyarr), 10000,0)
empty_vars() => VARIABLES(arr,arr2,VARIABLE_ARRAY(0,1000,emptyarr), 10000,0)
end

(** relation: merge_vars
Expand Down Expand Up @@ -2543,17 +2548,25 @@ relation add_var: (Var, Variables) => Variables =
array_nth(hashvec,indx)=> indexes &
array_setnth(hashvec,indx,CREFINDEX(cr,newpos)::indexes) => hashvec' &
vararray_length(varr') => n'
&
hash_string(name) => hvalold &
int_mod(hvalold,bsize) => indxold &
array_nth(oldhashvec,indxold)=> indexexold &
array_setnth(oldhashvec,indxold,STRINGINDEX(name,newpos)::indexexold) => oldhashvec'

-----------------------------
add_var(v as VAR(cr,_,_,_,_,_,_,_,_,_,_,_,_,flow),vars as VARIABLES(hashvec,varr,bsize,n))
=> VARIABLES(hashvec',varr',bsize,n')
add_var(v as VAR(cr,_,_,_,_,_,_,_,_,name,_,_,_,flow),
vars as VARIABLES(hashvec,oldhashvec,varr,bsize,n))
=> VARIABLES(hashvec',oldhashvec',varr',bsize,n')

rule (* adding when allready present => Updating value *)
get_var(cr,vars) => (v,indx) &
int_sub(indx,1) => indx' &
vararray_setnth(varr,indx',newv) => varr'
-----------------------------------
add_var( newv as VAR(cr,_,_,_,_,_,_,_,_,_,_,_,_,flow),vars as VARIABLES(hashvec,varr,bsize,n))
=> VARIABLES(hashvec,varr',bsize,n)
add_var( newv as VAR(cr,_,_,_,_,_,_,_,_,name,_,_,_,flow),
vars as VARIABLES(hashvec,oldhashvec,varr,bsize,n))
=> VARIABLES(hashvec,oldhashvec,varr',bsize,n)

rule print "-add_var failed\n"
--------------------------
Expand Down Expand Up @@ -2711,7 +2724,7 @@ relation get_var_at:(Variables,int) => (Var) =
rule n - 1 => pos &
vararray_nth(vararr,pos) => v
---------------------
get_var_at(VARIABLES(_,vararr,_,_),n) => v
get_var_at(VARIABLES(_,_,vararr,_,_),n) => v
end

(** relation: get_var
Expand All @@ -2728,7 +2741,7 @@ relation get_var: (Exp.ComponentRef, Variables) => (Var,int) =
Exp.cref_equal(cr,cr2) => true &
int_add(indx,1) => indx'
-----------------------------
get_var(cr,VARIABLES(hashvec,varr,bsize,n)) => (v,indx')
get_var(cr,VARIABLES(hashvec,oldhashvec,varr,bsize,n)) => (v,indx')

rule hash_component_ref(cr) => hval &
int_mod(hval,bsize) => hashindx &
Expand All @@ -2739,7 +2752,7 @@ relation get_var: (Exp.ComponentRef, Variables) => (Var,int) =
Exp.print_component_ref_str cr => str &
print str & print "\n"
-----------------
get_var(cr,VARIABLES(hashvec,varr,bsize,n)) => fail
get_var(cr,VARIABLES(hashvec,oldhashvec,varr,bsize,n)) => fail
end

(** relation: exists_var
Expand All @@ -2754,7 +2767,7 @@ relation exists_var: (Exp.ComponentRef, Variables) => bool =
vararray_nth(varr,indx) => (v as VAR(cr2,_,_,_,_,_,_,_,_,_,_,_,_,flow)) &
Exp.cref_equal(cr,cr2) => true
-----------------------------
exists_var(cr,VARIABLES(hashvec,varr,bsize,n)) => true
exists_var(cr,VARIABLES(hashvec,oldhashvec,varr,bsize,n)) => true

rule hash_component_ref(cr) => hval &
int_mod(hval,bsize) => hashindx &
Expand All @@ -2765,11 +2778,40 @@ relation exists_var: (Exp.ComponentRef, Variables) => bool =
Exp.print_component_ref_str cr => str &
print str & print "\n"
-----------------
exists_var(cr,VARIABLES(hashvec,varr,bsize,n)) => false
exists_var(cr,VARIABLES(hashvec,oldhashvec,varr,bsize,n)) => false

axiom exists_var(_,_) => false
end

(** relation: get_var_using_name
** author lucian
** Return a variable and its index in the vector.
** The index is enumerated from 1..n
**)
relation get_var_using_name: (string, Variables) => (Var,int) =

rule hash_string(cr) => hval &
int_mod(hval,bsize) => hashindx &
array_nth(oldhashvec,hashindx) => indexes &
get_var_using_name2(cr, indexes) => indx &
vararray_nth(varr,indx) => (v as VAR(cr2,_,_,_,_,_,_,_,_,name,_,_,_,flow)) &
name = cr &
int_add(indx,1) => indx'
-----------------------------
get_var_using_name(cr,VARIABLES(hashvec,oldhashvec,varr,bsize,n)) => (v,indx')

rule hash_string(cr) => hval &
int_mod(hval,bsize) => hashindx &
array_nth(oldhashvec,hashindx) => indexes &
get_var_using_name2(cr, indexes) => indx &
not vararray_nth(varr,indx) => (_) &
print "get var using name failed because vararray_nth failed, name:" &
print cr & print "\n"
-----------------
get_var_using_name(cr,VARIABLES(hashvec,oldhashvec,varr,bsize,n)) => fail
end



(** relation set_var_kind
** author: PA
Expand Down Expand Up @@ -2799,6 +2841,20 @@ relation get_var2:(Exp.ComponentRef, CrefIndex list) => int =
get_var2(cr,v::vs) => res
end

(** relation: get_var_string2
** Helper relation to get_var_using_name
**)
relation get_var_using_name2:(string, StringIndex list) => int =

rule cr = cr2
------------------------------
get_var_using_name2(cr,STRINGINDEX(cr2,v)::_) => v

rule get_var_using_name2(cr,vs) => res
----------------------
get_var_using_name2(cr,v::vs) => res
end

(** relation: delete_var
** Deletes a variable from 'Variables'. This is an expensive operation since we need to create a new
** binary tree with new indexes as well as a new compacted vector of variables.
Expand All @@ -2810,7 +2866,7 @@ relation delete_var: (Variables,Exp.ComponentRef) => Variables =
empty_vars() => newvars &
add_vars(varlst',newvars) => newvars'
--------------------------------------------------
delete_var(VARIABLES(hashvec,varr,bsize,n),cr)
delete_var(VARIABLES(hashvec,oldhashvec,varr,bsize,n),cr)
=> newvars'
end

Expand Down Expand Up @@ -3083,7 +3139,7 @@ relation check_matching : (DAELow) => () =
rule equation_size(eqns) => esize &
int_eq(esize,vars_size) => true
------------------
check_matching(DAELOW(VARIABLES(_,_,_,vars_size),_,eqns,_,_,_,_))
check_matching(DAELOW(VARIABLES(_,_,_,_,vars_size),_,eqns,_,_,_,_))
=> ()

rule equation_size(eqns) => esize &
Expand All @@ -3095,7 +3151,7 @@ relation check_matching : (DAELow) => () =
Print.print_error_buf " variables and " & Print.print_error_buf esize_str &
Print.print_error_buf " equations\n"
------------------
check_matching(DAELOW(VARIABLES(_,_,_,vars_size),_,eqns,_,_,_,_))
check_matching(DAELOW(VARIABLES(_,_,_,_,vars_size),_,eqns,_,_,_,_))
=> fail

rule equation_size(eqns) => esize &
Expand All @@ -3107,7 +3163,7 @@ relation check_matching : (DAELow) => () =
Print.print_error_buf " variables and " & Print.print_error_buf esize_str &
Print.print_error_buf " equations\n"
------------------
check_matching(DAELOW(VARIABLES(_,_,_,vars_size),_,eqns,_,_,_,_)) => fail
check_matching(DAELOW(VARIABLES(_,_,_,_,vars_size),_,eqns,_,_,_,_)) => fail

rule Debug.fprint("failtrace", "-check_matching failed\n")
--------------------
Expand Down Expand Up @@ -3256,7 +3312,8 @@ relation matching_algorithm2: (DAELow,IncidenceMatrix, IncidenceMatrixT
the original equation is removed from the system.
*)
reduce_index_dummy_der(dae,m,mt,nv,nf,i)
=> (dae as DAELOW(VARIABLES(_,_,_,nv'),VARIABLES(_,_,_,nkv),eqns,_,_,_,_),m,mt) &
=> (dae as DAELOW(VARIABLES(_,_,_,_,nv'),
VARIABLES(_,_,_,_,nkv),eqns,_,_,_,_),m,mt) &

(* and try again, restarting. This could be optimized later. It should not
be necessary to restart the matching, according to Bernard Bachmann. Instead one
Expand Down Expand Up @@ -3882,7 +3939,7 @@ end
**)
relation variable_size:(Variables) => int =

axiom variable_size(VARIABLES(_,_,_,n)) => n
axiom variable_size(VARIABLES(_,_,_,_,n)) => n
end

(** relation: equation_nth
Expand Down Expand Up @@ -5950,7 +6007,7 @@ relation print_vars_statistics: (Variables,Variables) => () =
int_string(bsize1) => bstr &
print bstr & print "\n"
-----------------------
print_vars_statistics(VARIABLES(_,v1,bsize1,n1),VARIABLES(_,v2,bsize2,n2)) => ()
print_vars_statistics(VARIABLES(_,_,v1,bsize1,n1),VARIABLES(_,_,v2,bsize2,n2)) => ()
end


Expand Down Expand Up @@ -6134,7 +6191,7 @@ relation get_all_exps_vars : Variables => Exp.Exp list =
Util.list_map(vars, get_all_exps_var) => exps &
Util.list_flatten(exps) => exps
---------------------------------------------------------------------
get_all_exps_vars VARIABLES(crefindex, vararray, bsize, nvars) => exps
get_all_exps_vars VARIABLES(crefindex,oldcrefindex, vararray, bsize, nvars) => exps

end

Expand Down
22 changes: 11 additions & 11 deletions Compiler/SimCodegen.rml
Expand Up @@ -1662,13 +1662,13 @@ relation build_when_equation: (DAE.DAElist,
DAELow.vararray_nth(vararr,v') => (va as DAELow.VAR(cr,kind,_,_,_,_,_,_,_,origname,_,dae_var_attr,comment,flow)) &
build_assignment(dae,cr,expr,origname) => assignment_string
--------------------------------
build_when_equation(dae,DAELow.DAELOW(DAELow.VARIABLES(_,vararr,_,_),_,eqns,_,_,_,_),ass1,ass2,e) => assignment_string
build_when_equation(dae,DAELow.DAELOW(DAELow.VARIABLES(_,_,vararr,_,_),_,eqns,_,_,_,_),ass1,ass2,e) => assignment_string

rule int_sub(e,1) => e' &
DAELow.equation_nth(eqns,e') => DAELow.WHEN_EQUATION(e as DAELow.WHEN_EQ(_,cr,expr)) &
print "-build_when_equation failed\n"
----------------------------------------
build_when_equation(dae,DAELow.DAELOW(DAELow.VARIABLES(_,vararr,_,_),_,eqns,_,_,_,_),ass1,ass2,e) => fail
build_when_equation(dae,DAELow.DAELOW(DAELow.VARIABLES(_,_,vararr,_,_),_,eqns,_,_,_,_),ass1,ass2,e) => fail

axiom build_when_equation(_,_,_,_,_) => ""
end
Expand Down Expand Up @@ -1839,7 +1839,7 @@ relation build_equation:(DAE.DAElist,
DAELow.vararray_nth(vararr,v') => (DAELow.VAR(_,kind,_,_,_,_,_,_,_,_,_,_,_,flow)) &
DAELow.is_discrete kind
--------------------------------
build_equation(_,DAELow.DAELOW(DAELow.VARIABLES(_,vararr,_,_),_,_,_,_,_,_),_,ass2,e) => ""
build_equation(_,DAELow.DAELOW(DAELow.VARIABLES(_,_,vararr,_,_),_,_,_,_,_,_),_,ass2,e) => ""

rule (* Solving for non-states *)
int_sub(e,1) => e' &
Expand All @@ -1853,7 +1853,7 @@ relation build_equation:(DAE.DAElist,
Exp.simplify(expr) => simplify_exp &
build_assignment(dae,cr,simplify_exp,origname) => assigment_string
--------------------------------
build_equation(dae,DAELow.DAELOW(DAELow.VARIABLES(_,vararr,_,_),_,eqns,_,_,_,_),ass1,ass2,e) => assigment_string
build_equation(dae,DAELow.DAELOW(DAELow.VARIABLES(_,_,vararr,_,_),_,eqns,_,_,_,_),ass1,ass2,e) => assigment_string


rule (* Solving the state s means solving for der(s) *)
Expand All @@ -1868,7 +1868,7 @@ relation build_equation:(DAE.DAElist,
Exp.simplify(expr) => simplify_exp &
build_assignment(dae,cr ,simplify_exp,origname) => assigment_string
--------------------------------
build_equation(dae,DAELow.DAELOW(DAELow.VARIABLES(_,vararr,_,_),_,eqns,_,_,_,_),ass1,ass2,e) => assigment_string
build_equation(dae,DAELow.DAELOW(DAELow.VARIABLES(_,_,vararr,_,_),_,eqns,_,_,_,_),ass1,ass2,e) => assigment_string

rule (* probably, solved failed in rule above. This means that we have
a non-linear equation. *)
Expand All @@ -1881,7 +1881,7 @@ relation build_equation:(DAE.DAElist,
not Exp.solve(e1,e2,varexp) => _ &
print "nonlinear equation not implemented yet\n"
--------------------------------
build_equation(dae,DAELow.DAELOW(DAELow.VARIABLES(_,vararr,_,_),_,eqns,_,_,_,_),ass1,ass2,e) => fail
build_equation(dae,DAELow.DAELOW(DAELow.VARIABLES(_,_,vararr,_,_),_,eqns,_,_,_,_),ass1,ass2,e) => fail

rule (* Algorithms *)
(* Each algorithm should only be genated once.*)
Expand All @@ -1892,7 +1892,7 @@ relation build_equation:(DAE.DAElist,
=> (Codegen.CFUNCTION(_,_,_,_,_,_,stmt_strs,_),_) &
Util.string_delimit_list(stmt_strs,"\n") => res
-------------------------
build_equation(dae,DAELow.DAELOW(DAELow.VARIABLES(_,vararr,_,_),_,eqns,_,_,algs,_),ass1,ass2,e) => res
build_equation(dae,DAELow.DAELOW(DAELow.VARIABLES(_,_,vararr,_,_),_,eqns,_,_,algs,_),ass1,ass2,e) => res

rule print "-build_equation failed\n"
--------------------------------
Expand Down Expand Up @@ -1964,7 +1964,7 @@ end
DAELow.vararray_nth(vararr,v') => (DAELow.VAR(_,kind,_,_,_,_,_,_,_,_,_,_,_,flow)) &
DAELow.is_discrete kind
--------------------------------
build_residual_equation(_,DAELow.DAELOW(DAELow.VARIABLES(_,vararr,_,_),_,_,_,_,_,_),_,ass2,e) => ""
build_residual_equation(_,DAELow.DAELOW(DAELow.VARIABLES(_,_,vararr,_,_),_,_,_,_,_,_),_,ass2,e) => ""

rule (* Solving for non-states *)
int_sub(e,1) => e' &
Expand All @@ -1980,7 +1980,7 @@ end
Exp.simplify(expr) => simplify_exp &
build_assignment(dae,cr,simplify_exp,origname) => assigment_string
--------------------------------
build_residual_equation(dae,DAELow.DAELOW(DAELow.VARIABLES(_,vararr,_,_),_,eqns,_,_,_,_),ass1,ass2,e) => assigment_string
build_residual_equation(dae,DAELow.DAELOW(DAELow.VARIABLES(_,_,vararr,_,_),_,eqns,_,_,_,_),ass1,ass2,e) => assigment_string


rule (* Solving the state s, caluate residual form. *)
Expand All @@ -1998,7 +1998,7 @@ end
let new_cr = Exp.CREF_IDENT(cr_str,[]) &
build_assignment(dae,new_cr,simplify_exp,origname) => assigment_string
--------------------------------
build_residual_equation(dae,DAELow.DAELOW(DAELow.VARIABLES(_,vararr,_,_),_,eqns,_,_,_,_),ass1,ass2,e) => assigment_string
build_residual_equation(dae,DAELow.DAELOW(DAELow.VARIABLES(_,_,vararr,_,_),_,eqns,_,_,_,_),ass1,ass2,e) => assigment_string

rule (* when-equations are not part of the residual equations *)
int_sub(e,1) => e' &
Expand All @@ -2015,7 +2015,7 @@ end
not Exp.solve(e1,e2,varexp) => _ &
print "nonlinear equation not implemented yet\n"
--------------------------------
build_residual_equation(dae,DAELow.DAELOW(DAELow.VARIABLES(_,vararr,_,_),_,eqns,_,_,_,_),ass1,ass2,e) => fail
build_residual_equation(dae,DAELow.DAELOW(DAELow.VARIABLES(_,_,vararr,_,_),_,eqns,_,_,_,_),ass1,ass2,e) => fail


rule print "-build_residual_equation failed\n"
Expand Down

0 comments on commit 3e067b3

Please sign in to comment.