Skip to content

Commit

Permalink
Changed lookup. Components from inherited classes are annotated with …
Browse files Browse the repository at this point in the history
…the baseclassname and this is later used when instantiating to find correct environment. The old lookup, with baseclasses annotated to environment does not work for all cases.

git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@1096 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Peter Aronsson committed Feb 18, 2004
1 parent 3da2c67 commit ef2dd24
Show file tree
Hide file tree
Showing 8 changed files with 268 additions and 227 deletions.
34 changes: 17 additions & 17 deletions modeq/builtin.rml
Expand Up @@ -82,7 +82,7 @@ val unit = SCode.COMPONENT("unit",true,false,false,
SCode.PARAM,
Absyn.BIDIR),
Absyn.IDENT("StringType"),
SCode.MOD(false,[],SOME(Absyn.STRING(""))))
SCode.MOD(false,[],SOME(Absyn.STRING(""))),NONE)
(** This `unit' component is used in several places below, and it is
** declared once here to make the definitions below easier to read. *)
val quantity = SCode.COMPONENT("quantity",true,false,false,
Expand All @@ -92,7 +92,7 @@ val quantity = SCode.COMPONENT("quantity",true,false,false,
SCode.PARAM,
Absyn.BIDIR),
Absyn.IDENT("StringType"),
SCode.MOD(false,[],SOME(Absyn.STRING(""))))
SCode.MOD(false,[],SOME(Absyn.STRING(""))),NONE)

val display_unit = SCode.COMPONENT("displayUnit",true,false,false,
SCode.ATTR([],
Expand All @@ -101,7 +101,7 @@ val display_unit = SCode.COMPONENT("displayUnit",true,false,false,
SCode.PARAM,
Absyn.BIDIR),
Absyn.IDENT("StringType"),
SCode.MOD(false,[],SOME(Absyn.STRING(""))))
SCode.MOD(false,[],SOME(Absyn.STRING(""))),NONE)

val min = SCode.COMPONENT("min",true,false,false,
SCode.ATTR([],
Expand All @@ -110,7 +110,7 @@ val min = SCode.COMPONENT("min",true,false,false,
SCode.PARAM,
Absyn.BIDIR),
Absyn.IDENT("RealType"),
SCode.MOD(false,[],SOME(Absyn.REAL(-1e99))))
SCode.MOD(false,[],SOME(Absyn.REAL(-1e99))),NONE)

val max = SCode.COMPONENT("max",true,false,false,
SCode.ATTR([],
Expand All @@ -119,7 +119,7 @@ val max = SCode.COMPONENT("max",true,false,false,
SCode.PARAM,
Absyn.BIDIR),
Absyn.IDENT("RealType"),
SCode.MOD(false,[],SOME(Absyn.REAL(1e99))))
SCode.MOD(false,[],SOME(Absyn.REAL(1e99))),NONE)

val real_start = SCode.COMPONENT("start",true,false,false,
SCode.ATTR([],
Expand All @@ -128,7 +128,7 @@ val real_start = SCode.COMPONENT("start",true,false,false,
SCode.PARAM,
Absyn.BIDIR),
Absyn.IDENT("RealType"),
SCode.MOD(false,[],SOME(Absyn.REAL(0.0))))
SCode.MOD(false,[],SOME(Absyn.REAL(0.0))),NONE)

val integer_start = SCode.COMPONENT("start",true,false,false,
SCode.ATTR([],
Expand All @@ -137,7 +137,7 @@ val integer_start = SCode.COMPONENT("start",true,false,false,
SCode.PARAM,
Absyn.BIDIR),
Absyn.IDENT("IntegerType"),
SCode.MOD(false,[],SOME(Absyn.INTEGER(0))))
SCode.MOD(false,[],SOME(Absyn.INTEGER(0))),NONE)

val string_start = SCode.COMPONENT("start",true,false,false,
SCode.ATTR([],
Expand All @@ -146,7 +146,7 @@ val string_start = SCode.COMPONENT("start",true,false,false,
SCode.PARAM,
Absyn.BIDIR),
Absyn.IDENT("StringType"),
SCode.MOD(false,[],SOME(Absyn.STRING(""))))
SCode.MOD(false,[],SOME(Absyn.STRING(""))),NONE)

val boolean_start = SCode.COMPONENT("start",true,false,false,
SCode.ATTR([],
Expand All @@ -155,7 +155,7 @@ val boolean_start = SCode.COMPONENT("start",true,false,false,
SCode.PARAM,
Absyn.BIDIR),
Absyn.IDENT("BooleanType"),
SCode.MOD(false,[],SOME(Absyn.BOOL(false))))
SCode.MOD(false,[],SOME(Absyn.BOOL(false))),NONE)

val fixed = SCode.COMPONENT("fixed",true,false,false,
SCode.ATTR([],
Expand All @@ -164,7 +164,7 @@ val fixed = SCode.COMPONENT("fixed",true,false,false,
SCode.PARAM,
Absyn.BIDIR),
Absyn.IDENT("BooleanType"),
SCode.MOD(false,[],SOME(Absyn.BOOL(false))))
SCode.MOD(false,[],SOME(Absyn.BOOL(false))),NONE)
(* Should be true for variables*)

val nominal = SCode.COMPONENT("nominal",true,false,false,
Expand All @@ -174,7 +174,7 @@ val nominal = SCode.COMPONENT("nominal",true,false,false,
SCode.PARAM,
Absyn.BIDIR),
Absyn.IDENT("RealType"),
SCode.MOD(false,[],NONE))
SCode.MOD(false,[],NONE),NONE)

val state_select = SCode.COMPONENT("stateSelect",true,false,false,
SCode.ATTR([],
Expand All @@ -183,16 +183,16 @@ val state_select = SCode.COMPONENT("stateSelect",true,false,false,
SCode.PARAM,
Absyn.BIDIR),
Absyn.IDENT("StateSelect"),
SCode.MOD(false,[],SOME(Absyn.CREF(Absyn.CREF_QUAL("StateSelect",[],Absyn.CREF_IDENT("default",[]))))))
SCode.MOD(false,[],SOME(Absyn.CREF(Absyn.CREF_QUAL("StateSelect",[],Absyn.CREF_IDENT("default",[]))))),NONE)

(* The StateSelect enumeration *)
val state_select_comps =
[
SCode.COMPONENT("never",true,false,false,SCode.ATTR([],false,SCode.RO,SCode.CONST,Absyn.BIDIR),Absyn.IDENT("EnumType"),SCode.NOMOD),
SCode.COMPONENT("avoid",true,false,false,SCode.ATTR([],false,SCode.RO,SCode.CONST,Absyn.BIDIR),Absyn.IDENT("EnumType"),SCode.NOMOD),
SCode.COMPONENT("default",true,false,false,SCode.ATTR([],false,SCode.RO,SCode.CONST,Absyn.BIDIR),Absyn.IDENT("EnumType"),SCode.NOMOD),
SCode.COMPONENT("prefer",true,false,false,SCode.ATTR([],false,SCode.RO,SCode.CONST,Absyn.BIDIR),Absyn.IDENT("EnumType"),SCode.NOMOD),
SCode.COMPONENT("always",true,false,false,SCode.ATTR([],false,SCode.RO,SCode.CONST,Absyn.BIDIR),Absyn.IDENT("EnumType"),SCode.NOMOD)
SCode.COMPONENT("never",true,false,false,SCode.ATTR([],false,SCode.RO,SCode.CONST,Absyn.BIDIR),Absyn.IDENT("EnumType"),SCode.NOMOD,NONE),
SCode.COMPONENT("avoid",true,false,false,SCode.ATTR([],false,SCode.RO,SCode.CONST,Absyn.BIDIR),Absyn.IDENT("EnumType"),SCode.NOMOD,NONE),
SCode.COMPONENT("default",true,false,false,SCode.ATTR([],false,SCode.RO,SCode.CONST,Absyn.BIDIR),Absyn.IDENT("EnumType"),SCode.NOMOD,NONE),
SCode.COMPONENT("prefer",true,false,false,SCode.ATTR([],false,SCode.RO,SCode.CONST,Absyn.BIDIR),Absyn.IDENT("EnumType"),SCode.NOMOD,NONE),
SCode.COMPONENT("always",true,false,false,SCode.ATTR([],false,SCode.RO,SCode.CONST,Absyn.BIDIR),Absyn.IDENT("EnumType"),SCode.NOMOD,NONE)
]

val state_select_type =
Expand Down
2 changes: 1 addition & 1 deletion modeq/builtin_safe.rml
Expand Up @@ -79,7 +79,7 @@ val unit = SCode.COMPONENT("unit",true,false,
Absyn.VAR,
Absyn.BIDIR),
Absyn.IDENT("StringType"),
SCode.MOD(false,[],SOME(Absyn.STRING(""))))
SCode.MOD(false,[],SOME(Absyn.STRING(""))),NONE)
(** This `unit' component is used in several places below, and it is
** declared once here to make the definitions below easier to read. *)

Expand Down
66 changes: 24 additions & 42 deletions modeq/env.rml
Expand Up @@ -45,7 +45,6 @@ module Env:
BinTree * (* List of classes and variables which must be uniquely named*)
BinTree * (* List of types, which DOES NOT be uniquely named, eg. size have several types*)
Item list * (* list of unnamed items (imports)**)
Absyn.Path list * (* list of inherited classes *)
bool (* encapsulated *)
(* bool=true means that FRAME is created due to encapsulated class *)

Expand All @@ -72,7 +71,6 @@ module Env:

relation new_frame : (bool) => Frame
relation open_scope : (Env,bool, Ident option) => Env
relation add_inherits: (Env,Absyn.Path) => 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*Types.Mod) option,bool) => Env
Expand Down Expand Up @@ -117,7 +115,7 @@ relation new_frame: (bool) => Frame =
rule tree_new => ht &
tree_new => httypes
--------------------
new_frame(enc) => FRAME(NONE,ht,httypes,[],[],enc)
new_frame(enc) => FRAME(NONE,ht,httypes,[],enc)
end

(** relation: open_scope
Expand Down Expand Up @@ -150,20 +148,8 @@ end

relation name_scope: (Env,Ident) => Env =

axiom name_scope(FRAME(_,ht,httypes,imps,inh,encflag)::res,id)
=> FRAME(SOME(id),ht,httypes,imps,inh,encflag)::res
end

(** relation: add_inherits
** This relation adds a Absyn.Path to the inherits list of a scope. It is used
** for lookup though the inherited classes of a class.
**)
relation add_inherits: (Env,Absyn.Path) => Env =

(* TODO: Should probably check if it is allready in the list *)
axiom add_inherits (FRAME(id,ht,httypes,imps,inh,encflag)::res,path)

=> FRAME(id,ht,httypes,imps,path::inh,encflag)::res
axiom name_scope(FRAME(_,ht,httypes,imps,encflag)::res,id)
=> FRAME(SOME(id),ht,httypes,imps,encflag)::res
end

(** relation: extend_frame_c
Expand All @@ -188,8 +174,8 @@ relation extend_frame_c : (Env, SCode.Class) => Env =

rule tree_add(ht,n,CLASS(c,env),System.hash) => (ht')
--------------------------
extend_frame_c(env as (FRAME(id,ht,httypes,imps,inh,encflag)::fs),c as SCode.CLASS(n,_,_,_,_))
=> ((FRAME(id,ht',httypes,imps,inh,encflag)::fs))
extend_frame_c(env as (FRAME(id,ht,httypes,imps,encflag)::fs),c as SCode.CLASS(n,_,_,_,_))
=> ((FRAME(id,ht',httypes,imps,encflag)::fs))

rule print "extend_frame_c FAILED\n"
--------------------------
Expand Down Expand Up @@ -228,8 +214,8 @@ relation extend_frame_v : (Env,Types.Var,(SCode.Element*Types.Mod) option,bool)
*)
rule tree_add(ht,n,VAR(v,c,i),System.hash) => (ht')
---------------------------------------
extend_frame_v(FRAME(id,ht,httypes,imps,inh,encflag)::fs,v as Types.VAR(n,_,_,_,_),c,i)
=> (FRAME(id,ht',httypes,imps,inh,encflag)::fs)
extend_frame_v(FRAME(id,ht,httypes,imps,encflag)::fs,v as Types.VAR(n,_,_,_,_),c,i)
=> (FRAME(id,ht',httypes,imps,encflag)::fs)

end

Expand All @@ -247,21 +233,21 @@ relation update_frame_v : (Env,Types.Var,bool) => Env =
rule tree_get(ht,n,System.hash) => VAR(_,c,_) &
tree_add(ht,n,VAR(v,c,i),System.hash) => (ht')
------------------------
update_frame_v (FRAME(sid,ht,httypes,imps,inh,encflag)::fs, v as Types.VAR(n,_,_,_,_),i)
=> (FRAME(sid,ht',httypes,imps,inh,encflag)::fs)
update_frame_v (FRAME(sid,ht,httypes,imps,encflag)::fs, v as Types.VAR(n,_,_,_,_),i)
=> (FRAME(sid,ht',httypes,imps,encflag)::fs)

rule (* Also check frames above, e.g. when variable is in base class *)
update_frame_v(fs,v,i) => frames
--------------
update_frame_v(FRAME(sid,ht,httypes,imps,inh,encflag)::fs,v as Types.VAR(n,_,_,_,_),i)
=> (FRAME(sid,ht,httypes,imps,inh,encflag)::frames)
update_frame_v(FRAME(sid,ht,httypes,imps,encflag)::fs,v as Types.VAR(n,_,_,_,_),i)
=> (FRAME(sid,ht,httypes,imps,encflag)::frames)

rule Print.print_buf "- update_frame_v, variable " & Print.print_buf n &
Print.print_buf " not found\n rest of env:" &
print_env fs & Print.print_buf "\n"
--------------
update_frame_v(FRAME(sid,ht,httypes,imps,inh,encflag)::fs, Types.VAR(n,_,_,_,_),_)
=> (FRAME(sid,ht,httypes,imps,inh,encflag)::fs)
update_frame_v(FRAME(sid,ht,httypes,imps,encflag)::fs, Types.VAR(n,_,_,_,_),_)
=> (FRAME(sid,ht,httypes,imps,encflag)::fs)

rule Print.print_buf "- update_frame_v failed\n" &
Print.print_buf " - variable: " & Types.print_var v &
Expand Down Expand Up @@ -299,21 +285,21 @@ relation extend_frame_t : (Env,Ident,Types.Type) => Env =
tree_get(httypes,n,System.hash) => TYPE(tps) &
tree_add(httypes,n,TYPE(t::tps),System.hash) => (httypes')
-----------------------------
extend_frame_t(FRAME(sid,ht,httypes,imps,inh,encflag)::fs, n, t)
=> (FRAME(sid,ht,httypes',imps,inh,encflag)::fs)
extend_frame_t(FRAME(sid,ht,httypes,imps,encflag)::fs, n, t)
=> (FRAME(sid,ht,httypes',imps,encflag)::fs)

rule (* No other types exists *)
not tree_get(httypes,n,System.hash) => TYPE(_) &
tree_add(httypes,n,TYPE([t]),System.hash) => (httypes')
-----------------------------
extend_frame_t(FRAME(sid,ht,httypes,imps,inh,encflag)::fs, n, t)
=> (FRAME(sid,ht,httypes',imps,inh,encflag)::fs)
extend_frame_t(FRAME(sid,ht,httypes,imps,encflag)::fs, n, t)
=> (FRAME(sid,ht,httypes',imps,encflag)::fs)
end

relation extend_frame_i : (Env,Absyn.Import) => Env =

axiom extend_frame_i(FRAME(sid,ht,httypes,imps,inh,encflag)::fs,imp)
=> (FRAME(sid,ht,httypes, IMPORT(imp)::imps,inh,encflag)::fs)
axiom extend_frame_i(FRAME(sid,ht,httypes,imps,encflag)::fs,imp)
=> (FRAME(sid,ht,httypes, IMPORT(imp)::imps,encflag)::fs)
end

relation top_frame : Env => Frame =
Expand All @@ -331,12 +317,12 @@ end
**)
relation get_env_path: Env => Absyn.Path option =

axiom get_env_path ([FRAME(SOME(id),_,_,_,_,_),FRAME(NONE,_,_,_,_,_)]) => SOME(Absyn.IDENT(id))
axiom get_env_path ([FRAME(SOME(id),_,_,_,_),FRAME(NONE,_,_,_,_)]) => SOME(Absyn.IDENT(id))

rule get_env_path(rest) => SOME(path) &
Absyn.join_paths(path,Absyn.IDENT(id)) => path'
----------------------------------------------
get_env_path(FRAME(SOME(id),_,_,_,_,_)::rest) =>SOME(path')
get_env_path(FRAME(SOME(id),_,_,_,_)::rest) =>SOME(path')

axiom get_env_path(_) => NONE
end
Expand Down Expand Up @@ -380,11 +366,9 @@ relation print_frame : Frame => () =
print_bintree httypes &
Print.print_buf " Imports:" &
print_imports imps &
Print.print_buf " Inherits:" &
Dump.print_list(inh,Dump.print_path,", ") &
Print.print_buf "\n"
--------------------------------------------
print_frame FRAME(SOME(sid),ht,httypes,imps,inh,encflag)
print_frame FRAME(SOME(sid),ht,httypes,imps,encflag)

rule Print.print_buf "FRAME: " &
Print.print_buf "unnamed" &
Expand All @@ -396,11 +380,9 @@ relation print_frame : Frame => () =
print_bintree httypes &
Print.print_buf " Imports:" &
print_imports imps &
Print.print_buf " Inherits:" &
Dump.print_list(inh,Dump.print_path,", ") &
Print.print_buf "\n"
--------------------------------------------
print_frame FRAME(NONE,ht,httypes,imps,inh,encflag)
print_frame FRAME(NONE,ht,httypes,imps,encflag)

end

Expand Down Expand Up @@ -508,7 +490,7 @@ end

relation build_frame_graphviz : Frame => Graphviz.Node =

axiom build_frame_graphviz FRAME(sid,ht,httypes,imps,inh,encflag)
axiom build_frame_graphviz FRAME(sid,ht,httypes,imps,encflag)
=> Graphviz.NODE("FRAME",[],[])
end

Expand Down

0 comments on commit ef2dd24

Please sign in to comment.