Newer
Older
(** Time-stamp: <modified the 19/05/2009 (at 17:32) by Erwan Jahier> *)
(* XXX use Map.t
We have Two kind of substitutions.
- One is used to deal with the clock name binding, to relate node
parameters and node arguments.
- The other one is used to deal with polymorphic clock
variables. Indeed, constant clock is intrinsically
polymorphic. Hence, when clocking a contant (e.g., "42"), we
return the clock_info Ci_var i, where i is a fresh
integer. Afterwards, when encoutering an expression such as
"42+x", where we know the clock of x (clk_x), we produce the
substitution (i,clk_x).
XXX Shouldn't I merge the 2 kind of substitutions ? That would
mean I need to invent a fake var_info_eff, but it would make the
type subst1 = (Ident.t * Ident.t) list
type subst2
type subst = subst1 * subst2
(* = (Ident.t * Ident.t) list * (int * Eff.clock) list *)
val empty_subst : subst
val apply_subst:subst -> Eff.clock -> Eff.clock
(* only apply the part of the subst that deals with clock var *)
val apply_subst2:subst -> Eff.clock -> Eff.clock
val add_subst2 : int -> Eff.clock -> subst2 -> subst2
val add_link2 : int -> int -> subst2 -> subst2
val apply_subst_val_exp : subst -> Eff.val_exp -> Eff.val_exp
(** Raises a Compile_error is the 2 Eff.clock are not unifiable *)
val f : Lxm.t -> subst -> Eff.clock -> Eff.clock -> subst
val list : Lxm.t -> Eff.clock list -> subst -> Eff.clock * subst
val new_clock_var : subst -> subst * Eff.clock
val const_to_val_eff: Lxm.t -> bool -> subst -> Eff.const -> subst * Eff.val_exp