Skip to content

Commit

Permalink
Reworked modifications
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@316 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
x97davka committed Jul 3, 1998
1 parent 3118e51 commit a4591f7
Show file tree
Hide file tree
Showing 2 changed files with 92 additions and 29 deletions.
51 changes: 36 additions & 15 deletions modeq/explode.rml
Expand Up @@ -17,7 +17,8 @@ module SCode :
type Subscript = Absyn.Subscript
type Restriction = Absyn.Restriction

datatype SubMod = SUBMOD of Ident * Subscript list * Mod
datatype SubMod = NAMEMOD of Ident * Mod
| IDXMOD of Subscript list * Mod
and Mod = MOD of bool * (SubMod list) * (Absyn.Exp option)
| REDECL of bool * Absyn.ElementSpec
| NOMOD
Expand Down Expand Up @@ -258,7 +259,7 @@ relation build_mod : (Absyn.Modification option, bool) => Mod =
=> MOD(final,[],e)

rule build_args(l) => subs
---------------------
---------------------------------
build_mod(SOME(Absyn.CLASSMOD(l,e)),final) => MOD(final,subs,e)

end
Expand All @@ -269,23 +270,22 @@ relation build_args : (Absyn.ElementArg list) => SubMod list =

rule build_args xs => subs &
build_mod(SOME(mod),final) => mod' &
build_sub(path,mod') => sub
build_sub(cref,mod') => sub
----------------------
build_args((Absyn.MODIFICATION(final,path,mod)::xs)) => (sub::subs)
build_args((Absyn.MODIFICATION(final,cref,mod)::xs)) => (sub::subs)

rule build_args xs => subs &
Absyn.element_spec_name spec => n
---------------------------
build_args((Absyn.REDECLARATION(final,spec)::xs))
=> (SUBMOD(n,[],REDECL(final,spec))::subs)
=> (NAMEMOD(n,REDECL(final,spec))::subs)

end

(** relation: build_sub
**
** This relation converts a `ComponentRef' into a number of nested
** `SUBMOD's. It also prevents modifications of the type
** `x[17](..)'.
** `SUBMOD's.
**)

relation build_sub : (Absyn.ComponentRef,Mod) => SubMod =
Expand All @@ -304,12 +304,24 @@ relation build_sub : (Absyn.ComponentRef,Mod) => SubMod =

(* Then the normal rules *)

axiom build_sub(Absyn.CREF_IDENT(i,ss),mod) => SUBMOD(i,ss,mod)
rule build_sub_sub (ss,mod) => mod'
------------------------------
build_sub(Absyn.CREF_IDENT(i,ss),mod) => NAMEMOD(i,mod')

rule build_sub(path,mod) => sub
rule build_sub(path,mod) => sub &
let mod = MOD(false,[sub],NONE) &
build_sub_sub(ss,mod) => mod'
--------------------------
build_sub(Absyn.CREF_QUAL(i,ss,path),mod)
=> SUBMOD(i,ss,MOD(false,[sub],NONE))
build_sub(Absyn.CREF_QUAL(i,ss,path),mod) => NAMEMOD(i,mod')

end

(** relation: build_sub_sub *)

relation build_sub_sub : (Subscript list, Mod) => Mod =

axiom build_sub_sub ([], m) => m
axiom build_sub_sub (l, m) => MOD(false(*FIXME*),[IDXMOD(l,m)],NONE)

end

Expand Down Expand Up @@ -347,14 +359,23 @@ relation print_subs : SubMod list => () =

axiom print_subs []

rule print n & Dump.print_subscripts ss & print_mod mod
rule print n & print_mod mod
-----------------------
print_subs [NAMEMOD(n,mod)]

rule print n & print_mod mod & print ", " &
print_subs subs
---------------
print_subs NAMEMOD(n,mod)::subs

rule Dump.print_subscripts ss & print_mod mod
------------------
print_subs [SUBMOD(n,ss,mod)]
print_subs [IDXMOD(ss,mod)]

rule print n & Dump.print_subscripts ss & print_mod mod & print ", " &
rule Dump.print_subscripts ss & print_mod mod & print ", " &
print_subs subs
--------------
print_subs SUBMOD(n,ss,mod)::subs
print_subs IDXMOD(ss,mod)::subs

end

Expand Down
70 changes: 56 additions & 14 deletions modeq/mod.rml
Expand Up @@ -25,7 +25,8 @@ module Mod:

(** - Modification datatype *)
type Eqmod = (Exp.Exp * Types.Type * bool)
datatype SubMod = SUBMOD of Ident * int list * Mod
datatype SubMod = NAMEMOD of Ident * Mod
| IDXMOD of int list * Mod
and Mod = MOD of bool * (SubMod list) * Eqmod option
| REDECL of bool * Absyn.ElementSpec
| NOMOD
Expand Down Expand Up @@ -96,21 +97,26 @@ relation elab_submods : (Env.Env, Prefix.Prefix, SCode.SubMod list)
axiom elab_submods (_,_,[]) => []

rule elab_submod (env,pre,x) => x' &
elab_submods (env,pre,xs) => xs'
--------------------------------
elab_submods (env,pre,x::xs) => x'::xs'
elab_submods (env,pre,xs) => xs' &
submod_insert (x',xs') => res
-----------------------------
elab_submods (env,pre,x::xs) => res

end

(**)

relation elab_submod : (Env.Env, Prefix.Prefix, SCode.SubMod) => SubMod =

rule elab_mod (env,pre,m) => m'
--------------------------
elab_submod (env,pre,SCode.NAMEMOD(i,m)) => NAMEMOD(i,m')

rule elab_subscripts (env,pre,ss) => ss' &
(* Prefix.prefix_add (i,ss',pre) => pre' & *)
elab_mod (env,pre(*'*),m) => m'
---------------------------
elab_submod (env,pre,SCode.SUBMOD(i,ss,m)) => SUBMOD(i,ss',m')
elab_submod (env,pre,SCode.IDXMOD(ss,m)) => IDXMOD(ss',m')

end

Expand Down Expand Up @@ -159,6 +165,32 @@ relation eval_subscript : (Env.Env, Exp.Exp, Types.Type, bool) => int =

end

(** relation: submod_insert
**
** This relation inserts a `SubMod' into a list of unique `SubMod's,
** while keeping the uniqueness, merging the submod if necessary.
**)

relation submod_insert : (SubMod, SubMod list) => SubMod list =

axiom submod_insert (sub,[]) => [sub]

rule n1 = n2 &
merge (m1,m2) => m
----------------------
submod_insert (NAMEMOD(n1,m1),NAMEMOD(n2,m2)::tail)
=> (NAMEMOD(n1,m)::tail)

rule i1 = i2 &
merge (m1,m2) => m
----------------------
submod_insert (IDXMOD(i1,m1),IDXMOD(i2,m2)::tail)
=> (IDXMOD(i1,m)::tail)

axiom submod_insert (sub1, sub2) => sub1::sub2

end

(**
** - Lookup
**)
Expand All @@ -178,7 +210,10 @@ relation lookup_modification_p: (Mod,Absyn.Path) => Mod =

end

(** relation: lookup_modification *)
(** relation: lookup_modification
**
** This relation is used to look up an identifier in a modification.
**)

relation lookup_modification: (Mod,Absyn.Ident,int list) => Mod =

Expand Down Expand Up @@ -206,16 +241,20 @@ relation lookup_modification2 : (SubMod list,Absyn.Ident,int list)

axiom lookup_modification2([],_,_) => NOMOD

rule n = m (* & ss = s FIXME: subscripts *)
rule n = m
--------------------------------------
lookup_modification2(SUBMOD(n,ss,mod)::_,m,s) => mod
lookup_modification2(NAMEMOD(n,mod)::_,m,s) => mod

(* FIXME: Redeclaration *)

rule lookup_modification2(xs,n,s) => mod
---------------------------------
lookup_modification2(x::xs,n,s) => mod

rule print "- lookup_modification2 failed\n"
---------------------------------------
lookup_modification2 (_,_,_) => fail

end

(**
Expand Down Expand Up @@ -289,10 +328,9 @@ relation merge_subs2 : (SubMod list, SubMod)
(* Modifications in the list take precedence *)

rule n1 = n2 & print " merge clash in " & print n1 & print "\n"
(* FIXME: check subscripts? *)
-------
merge_subs2((s1 as SUBMOD(n1,subs1,m1))::ss,
SUBMOD(n2,subs2,m2)) => (ss, s1)
------------------------------------------------------------
merge_subs2((s1 as NAMEMOD(n1,m1))::ss,
NAMEMOD(n2,m2)) => (ss, s1)

rule merge_subs2(ss, s2) => (ss',s)
------------------------------
Expand Down Expand Up @@ -391,9 +429,13 @@ end

relation print_sub : SubMod => () =

rule print n & print_subscripts ss & print_mod mod
rule print n & print_mod mod
------------------
print_sub NAMEMOD(n,mod)

rule print_subscripts ss & print_mod mod
------------------
print_sub SUBMOD(n,ss,mod)
print_sub IDXMOD(ss,mod)

end

Expand Down

0 comments on commit a4591f7

Please sign in to comment.