-
Erwan Jahier authored
constants that are not on the base clock, add the suitable "when" statement if it was not present in the source code (the lic (and the ec/lv4) backend does not perform such kind of clock inference for constants.
Erwan Jahier authoredconstants that are not on the base clock, add the suitable "when" statement if it was not present in the source code (the lic (and the ec/lv4) backend does not perform such kind of clock inference for constants.
predefEvalClock.ml 2.16 KiB
(** Time-stamp: <modified the 06/03/2009 (at 14:22) by Erwan Jahier> *)
open Predef
(* exported *)
exception EvalClock_error of string
type clocker = UnifyClock.subst -> Eff.id_clock list list ->
Eff.id_clock list * UnifyClock.subst
(** A few useful clock profiles *)
let (constant_profile: string -> clocker) =
fun str s _ ->
let s, clk = UnifyClock.new_clock_var s in
[Ident.of_string str, clk], s
let (op_profile: clocker) =
fun s cl ->
match cl with
| clk::_ -> clk, s
| [] -> assert false
let if_clock_profile lxm sargs s =
function
| [clk1; clk2; clk3] -> clk2, s
| _ -> assert false
let rec fill x n = if n > 0 then (x::(fill x (n-1))) else []
let fillred_clock_profile lxm sargs s clks =
let (_, lto) = PredefEvalType.fillred_profile lxm sargs in
let clks = List.flatten clks in
fill (List.hd clks) (List.length lto), s
let map_clock_profile lxm sargs s clks =
let (_, lto) = PredefEvalType.map_profile lxm sargs in
let clks = List.flatten clks in
fill (List.hd clks) (List.length lto), s
let boolred_clock_profile lxm sargs s clks =
let (_, lto) = PredefEvalType.boolred_profile lxm sargs in
let clks = List.flatten clks in
fill (List.hd clks) (List.length lto), s
(* This table contains the clock profile of predefined operators *)
let (f: op -> Lxm.t -> Eff.static_arg list -> clocker) =
fun op lxm sargs s ->
match op with
| TRUE_n | FALSE_n | ICONST_n _ | RCONST_n _ ->
constant_profile (Predef.op2string op) s
| 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
-> op_profile s
| IF_n -> if_clock_profile lxm sargs s
| Red | Fill | FillRed -> fillred_clock_profile lxm sargs s
| Map -> map_clock_profile lxm sargs s
| BoolRed -> boolred_clock_profile lxm sargs s