Newer
Older
(** Time-stamp: <modified the 28/08/2008 (at 15:35) by Erwan Jahier> *)
open Predef
(* exported *)
exception EvalClock_error of string
(** A few useful clock profiles *)
let (constant_profile: clocker) = fun _ -> [UnifyClock.get_constant_clock ()]
let (op_profile: clocker) =
function
| 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
| 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