Skip to content
Snippets Groups Projects
predefEvalClock.ml 1.95 KiB
Newer Older
(** Time-stamp: <modified the 28/08/2008 (at 15:35) by Erwan Jahier> *)
type clocker = Eff.clock Predef.evaluator
(* exported *)
exception EvalClock_error of string


(** A few useful clock profiles *)

let (constant_profile: clocker) = fun _ -> [UnifyClock.get_constant_clock ()]

let (op_profile: clocker) =
    | clk::_ -> clk
    | [] -> assert false
let if_clock_profile lxm sargs = 
  function
    | [clk1; clk2; clk3] -> clk2
    | _ -> assert false



let rec fill x n = if n > 0 then (x::(fill x (n-1))) else []

let fillred_clock_profile lxm sargs clks = 
  let (_, lto) = PredefEvalType.fillred_profile lxm sargs in
  let clks = List.flatten clks in
    fill (List.hd clks) (List.length lto)

let map_clock_profile lxm sargs clks = 
  let (_, lto) = PredefEvalType.map_profile lxm sargs in
  let clks = List.flatten clks in
    fill (List.hd clks) (List.length lto)

let boolred_clock_profile lxm sargs clks = 
  let (_, lto) = PredefEvalType.boolred_profile lxm sargs in
  let clks = List.flatten clks in
    fill (List.hd clks) (List.length lto)


(* This table contains the clock profile of predefined operators *)
let (f: op -> Lxm.t -> Eff.static_arg list -> clocker) = 
  fun op lxm sargs ->  
    match op with
      | TRUE_n | FALSE_n | ICONST_n _ | RCONST_n _ -> constant_profile

      | NOT_n | REAL2INT_n | INT2REAL_n | UMINUS_n | IUMINUS_n | RUMINUS_n
      | IMPL_n | AND_n | OR_n | XOR_n 
      | NEQ_n | EQ_n | LT_n | LTE_n | GT_n | GTE_n
      | MINUS_n  |  PLUS_n |  TIMES_n |  SLASH_n  
      | RMINUS_n | RPLUS_n | RTIMES_n | RSLASH_n  
      | DIV_n | MOD_n | IMINUS_n | IPLUS_n | ISLASH_n | ITIMES_n 
      | NOR_n | DIESE_n  
Erwan Jahier's avatar
Erwan Jahier committed
          -> op_profile

      | IF_n                 -> if_clock_profile lxm sargs
      | Red | Fill | FillRed -> fillred_clock_profile lxm sargs
      | Map                  -> map_clock_profile lxm sargs
      | BoolRed              -> boolred_clock_profile lxm sargs
Erwan Jahier's avatar
Erwan Jahier committed