Skip to content

Commit

Permalink
partly implemented rename_class
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@1548 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Peter Aronsson committed Feb 28, 2005
1 parent a79eaf5 commit 6f0d78f
Show file tree
Hide file tree
Showing 5 changed files with 203 additions and 39 deletions.
4 changes: 0 additions & 4 deletions modeq/dump.rml
Expand Up @@ -29,10 +29,6 @@
** Printing routines for debugging of the AST. These relations do
** nothing but print the data structures to the standard output.
**
** The implementation of the relations are excluded from the report,
** as they occupy a lot of space and do not convey any useful
** semantic information.
**
** The main entrypoint for this module is the relation "dump" which
** takes an entire program as an argument, and prints it all in
** Modelica source form. The other interface relations can be used
Expand Down
203 changes: 197 additions & 6 deletions modeq/interactive.rml
Expand Up @@ -876,6 +876,20 @@ relation evaluate_graphical_api: (InteractiveStmts, InteractiveSymbolTable) =>
),
st as SYMBOLTABLE(p,s,ic,iv,cf)) => (resstr,st)

rule (* For now, renaming a class clears all caches... *)
(* Substantial analysis required to find out what to keep in cache and
what must be thrown out *)
rename_class(p,old_cname,new_cname) => p' &
SCode.elaborate(p') => s'
-----------------------
evaluate_graphical_api(
ISTMTS([IEXP(Absyn.CALL(
Absyn.CREF_IDENT("renameClass",_),
Absyn.FUNCTIONARGS([Absyn.CREF(old_cname), Absyn.CREF(new_cname)],_)))],_
),
st as SYMBOLTABLE(p,s,ic,iv,cf))
=> ("OK",SYMBOLTABLE(p',s',[],[],[]))

end

relation componentref_to_path: Absyn.ComponentRef => Absyn.Path =
Expand All @@ -887,6 +901,183 @@ relation componentref_to_path: Absyn.ComponentRef => Absyn.Path =
componentref_to_path(Absyn.CREF_QUAL(id,_,x)) => Absyn.QUALIFIED(id,px)
end

(** relation: rename_class
** This relation renames a class (given as a qualified path name) to a new name
** -in the same scope-. All references to the class name in the program is updated to the
** new name. The relation does not allow a renaming that will move the class to antoher
** package. To do this, the class must be copied.
**)
relation rename_class: (Absyn.Program,
Absyn.ComponentRef, (* old class as qualified name*)
Absyn.ComponentRef) (* new class, as identifier *)
=> Absyn.Program =

rule (* class in package *)
Absyn.cref_to_path(old_class) => old_path &
traverse_classes(p,rename_class_visitor,(old_path,new_name),
true (* traverse protected*)) => ((p',_))
------------------------
rename_class(p,old_class as Absyn.CREF_QUAL(_,_,_),Absyn.CREF_IDENT(new_name,_))
=> p'
end

(**relation: rename_class_visitor
** This visitor renames a class given a new name
**)

relation rename_class_visitor: ((Absyn.Class* (Absyn.Path*string)))
=> ((Absyn.Class*(Absyn.Path*string))) =

rule Absyn.path_last_ident(old_class) => id2 &
id = id2
----------------
rename_class_visitor((Absyn.CLASS(id,a,b,c,d,e),(old_class,new_name)))
=> ((Absyn.CLASS(new_name,a,b,c,d,e),(old_class,new_name)))

axiom rename_class_visitor((class,args)) => ((class,args))

end


(** relation traverse_classes
** This relation traverses all classes of a program and applies a re-lation to each
** class. The re-lation takes the Absyn.Class and an additional argument and returns
** an updated class and the additional values.
**)
relation traverse_classes: (Absyn.Program,
((Absyn.Class * 'a) => (Absyn.Class * 'a)), (* rel-ation to apply*)
'a, (* extra value passed to re-lation*)
bool) (* true = traverse protected elements*)
=> (Absyn.Program* 'a) =

rule traverse_classes2(lst,visitor,args,traverse_prot) => ((lst',args'))
-------------------------------------------------------------------------
traverse_classes(Absyn.PROGRAM(lst,within),visitor,args,traverse_prot)
=> ((Absyn.PROGRAM(lst',within),args'))
end

(** relation: traverse_classes2
** Helper relation to traverse_classes.
**)
relation traverse_classes2:(Absyn.Class list,
((Absyn.Class * 'a) => (Absyn.Class * 'a)), (* rel-ation to apply*)
'a, (* extra value passed to re-lation*)
bool) (* true = traverse protected elements*)
=> (Absyn.Class list * 'a) =

axiom traverse_classes2([],_,args,_) => (([],args))

rule visitor((class,args)) => ((class',args')) &
traverse_inner_class(class,visitor,args',traverse_prot) => ((class'',args'')) &
traverse_classes2(classes,visitor,args'',traverse_prot) => ((classes',args'''))
------------------------
traverse_classes2(class::classes,visitor,args,traverse_prot)
=> ((class''::classes',args'''))

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

(** relation: traverse_inner_class
** Helper relation to traverse_inner_classes. This relation traverses all inner classes
** of a class.
**)

relation traverse_inner_class:(Absyn.Class, (* class to traverse inner classes in *)
((Absyn.Class * 'a) => (Absyn.Class * 'a)), (* visitor rlation*)
'a (* extra argument *),
bool ) (* true = traverse protected elts *)
=> (Absyn.Class * 'a) =


rule traverse_inner_class_parts(parts,visitor,args,visit_prot) => ((parts',args'))

--------------------------------------------------------------
traverse_inner_class(Absyn.CLASS(name,p,f,e,r,Absyn.PARTS(parts,str_opt)),visitor,args,visit_prot)
=> ((Absyn.CLASS(name,p,f,e,r,Absyn.PARTS(parts',str_opt)),args'))

axiom traverse_inner_class(cl,_,args,_) => ((cl,args))

end

(** relation: traverse_inner_class_parts
** Helper relation to traverse_inner_class
**)

relation traverse_inner_class_parts: (Absyn.ClassPart list,
((Absyn.Class * 'a) => (Absyn.Class * 'a)), (* visitor*)
'a,
bool) (* true = visit protected elements*)
=> (Absyn.ClassPart list * 'a) =

axiom traverse_inner_class_parts([],_,args,_) => (([],args))

rule traverse_inner_class_elements(elts,visitor,args,visit_prot) => ((elts',args')) &
traverse_inner_class_parts(parts,visitor,args',visit_prot) => ((parts',args''))
------------------------------------------------------------------
traverse_inner_class_parts(Absyn.PUBLIC(elts)::parts,visitor,args,visit_prot)
=> ((Absyn.PUBLIC(elts')::parts',args''))

rule traverse_inner_class_elements(elts,visitor,args,true) => ((elts',args')) &
traverse_inner_class_parts(parts,visitor,args',true) => ((parts',args''))
------------------------------------------------------------------
traverse_inner_class_parts(Absyn.PROTECTED(elts)::parts,visitor,args,true)
=> ((Absyn.PROTECTED(elts')::parts',args''))

rule traverse_inner_class_parts(parts,visitor,args,true) => ((parts',args'))
------------------------------------------------------------------
traverse_inner_class_parts(part::parts,visitor,args,true)
=> ((part::parts',args'))
end

(** relation traverse_inner_class_elements
** Helper relation to traverse_inner_class_parts.
**)
relation traverse_inner_class_elements:(Absyn.ElementItem list,
((Absyn.Class * 'a) => (Absyn.Class * 'a)), (* visitor*)
'a,
bool) (* visit protected elts *)
=> (Absyn.ElementItem list * 'a) =

axiom traverse_inner_class_elements([],_,args,_) => (([],args))

rule traverse_inner_class_elementspec(elt_spec,visitor,args,visit_prot)
=> ((elt_spec',args')) &
traverse_inner_class_elements(elts,visitor,args',visit_prot)
=> ((elts',args''))
-------------------------------------------------------------
traverse_inner_class_elements(Absyn.ELEMENTITEM(Absyn.ELEMENT(f,r,io,n,elt_spec,file,line,constr))::elts,visitor,args,visit_prot)
=> ((Absyn.ELEMENTITEM(Absyn.ELEMENT(f,r,io,n,elt_spec',file,line,constr))::elts',
args''))

rule traverse_inner_class_elements(elts,visitor,args,visit_prot)
=> ((elts',args'))
----------------------------------------------------------------
traverse_inner_class_elements(elt::elts,visitor,args,visit_prot)
=> ((elt::elts',args'))
end

(** relation: traverse_inner_class_elementspec
** Helper relation to traverse_inner_class_elements
**)

relation traverse_inner_class_elementspec: ( Absyn.ElementSpec,
((Absyn.Class * 'a) => (Absyn.Class * 'a)), (* visitor*)
'a,
bool) (* visit protected elts *)
=> (Absyn.ElementSpec * 'a) =

rule visitor((class,args)) => ((class',args')) &
traverse_inner_class(class',visitor,args',visit_prot) => ((class'',args''))
-------------------------------------
traverse_inner_class_elementspec(Absyn.CLASSDEF(repl,class),visitor,args,visit_prot)
=> ((Absyn.CLASSDEF(repl,class''),args''))

axiom traverse_inner_class_elementspec(elt_spec,_,args,_) => ((elt_spec,args))

end

(** relation: is_primitive
** This relation takes a component reference and a program.
** It returns the true if the refrenced type is a primitive type, otherwise it returns
Expand Down Expand Up @@ -920,7 +1111,7 @@ relation delete_class: (Absyn.ComponentRef, Absyn.Program) => (string, Absyn.Pro
Absyn.strip_last(parentcpath) => parentparentcpath &
get_pathed_class_in_program(cpath, p) => cdef &
get_pathed_class_in_program(parentcpath, p) => parentcdef &
remove_inner_class(cdef, parentcdef) => parentcdef' &
remove_inner_class(cdef, parentcdef) => parentcdef' &
update_program(Absyn.PROGRAM([parentcdef'], Absyn.WITHIN(parentparentcpath)), p) => newp
----------------------------------------------------------------------------
delete_class(class, p as Absyn.PROGRAM(clist, w)) => ("true", newp)
Expand All @@ -930,7 +1121,7 @@ relation delete_class: (Absyn.ComponentRef, Absyn.Program) => (string, Absyn.Pro
Absyn.strip_last(cpath) => parentcpath &
get_pathed_class_in_program(cpath, p) => cdef &
get_pathed_class_in_program(parentcpath, p) => parentcdef &
remove_inner_class(cdef, parentcdef) => parentcdef' &
remove_inner_class(cdef, parentcdef) => parentcdef' &
update_program(Absyn.PROGRAM([parentcdef'], Absyn.TOP), p) => newp
----------------------------------------------------------------------------
delete_class(class, p as Absyn.PROGRAM(clist, w)) => ("true", newp)
Expand Down Expand Up @@ -3177,7 +3368,7 @@ relation get_componentitems_annotations_from_items: (Absyn.ComponentItem list,

rule Lookup.lookup_class(env,Absyn.IDENT("Placement"),false) => (c,env') &
SCode.build_mod(SOME(Absyn.CLASSMOD(mod,NONE)),false) => mod' &
Mod.elab_mod(env',Prefix.NOPRE,mod') => mod'' &
Mod.elab_mod(env',Prefix.NOPRE,mod',false) => mod'' &
Inst.inst_class(env', mod'', Prefix.NOPRE, [], c,
[], false,Inst.TOP_CALL)
=> (dae, _, cs, t, state) &
Expand Down Expand Up @@ -3308,7 +3499,7 @@ relation get_annotation_string: (string,Absyn.Annotation) => string =
Inst.make_simple_env_from_program(p',Absyn.IDENT("Icon")) => env &
get_class_in_program("Icon",p) => placementc &
SCode.elab_class(placementc) => placementclass &
Mod.elab_mod (env,Prefix.NOPRE,mod') => mod'' &
Mod.elab_mod (env,Prefix.NOPRE,mod',false) => mod'' &
Inst.inst_class(env, mod'', Prefix.NOPRE, [], placementclass,
[], false,Inst.TOP_CALL)
=> (dae, _, cs, t, state) &
Expand All @@ -3331,7 +3522,7 @@ relation get_annotation_string: (string,Absyn.Annotation) => string =
Inst.make_env_from_program(p',Absyn.IDENT("Diagram")) => env &
get_class_in_program("Diagram",p) => placementc &
SCode.elab_class(placementc) => placementclass &
Mod.elab_mod (env,Prefix.NOPRE,mod') => mod'' &
Mod.elab_mod (env,Prefix.NOPRE,mod',false) => mod'' &
Inst.inst_class(env, mod'', Prefix.NOPRE, [], placementclass,
[], false,Inst.TOP_CALL)
=> (dae, _,cs, t, state) &
Expand All @@ -3354,7 +3545,7 @@ relation get_annotation_string: (string,Absyn.Annotation) => string =
Inst.make_env_from_program(p',Absyn.IDENT(anncname)) => env &
get_class_in_program(anncname,p) => placementc &
SCode.elab_class(placementc) => placementclass &
Mod.elab_mod (env,Prefix.NOPRE,mod') => mod'' &
Mod.elab_mod (env,Prefix.NOPRE,mod',false) => mod'' &
Inst.inst_class(env, mod'', Prefix.NOPRE, [], placementclass,
[], false,Inst.TOP_CALL)
=> (dae, _, cs, t, state) &
Expand Down
6 changes: 2 additions & 4 deletions modeq/prefix.rml
Expand Up @@ -26,15 +26,13 @@
**
** RCS: $Id$
**
** When instantiating an expression, there is a prefix that *sometimes*
** When instantiating an expression, there is a prefix that
** has to be added to each variable name to be able to use it in the
** flattened equation set.
**
** A prefix for a variable x could be for example a.b.c so that the
** fully qualified name is a.b.c.x.
**
** Some components should not have prefixes added, for example constants.
**
**
**)

module Prefix:
Expand Down
19 changes: 0 additions & 19 deletions modeq/runtime/systemimpl.c
Expand Up @@ -116,25 +116,6 @@ void System_5finit(void)
set_cflags("-I$MOSHHOME/../c_runtime -L$MOSHHOME/../c_runtime -lc_runtime -lm $MODELICAUSERCFLAGS");
}

RML_BEGIN_LABEL(System__vector_5fsetnth)
{
/* This will not work until the garbage collector in RML is rewritten
such that is can handle side effects correctly.
*/
rml_uint_t nelts = 0;
void *vec = rmlA0;
void *data;
rml_uint_t i = (rml_uint_t)RML_UNTAGFIXNUM(rmlA1);
if( i >= RML_HDRSLOTS(RML_GETHDR(vec)) ) {
RML_TAILCALLK(rmlFC);
} else {
RML_STRUCTDATA(vec)[i] = rmlA2;
RML_TAILCALLK(rmlSC);
}
}
RML_END_LABEL


RML_BEGIN_LABEL(System__strtok)
{
char *s;
Expand Down
10 changes: 4 additions & 6 deletions modeq/system.rml
Expand Up @@ -20,9 +20,10 @@
*)

(**
** file: types.rml
** module: Types
** description: Type system
** file: system.rml
** module: System
** description: This file contains runtime system specific relation, which are implemented in
** C.
**
** RCS: $Id$
**
Expand All @@ -31,9 +32,6 @@
**
**
**
**
**
**
**)

module System:
Expand Down

0 comments on commit 6f0d78f

Please sign in to comment.