Skip to content
Snippets Groups Projects
Commit 889c68bd authored by Erwan Jahier's avatar Erwan Jahier
Browse files

The -exec mode now supports enums.

parent 9f1e0453
No related branches found
No related tags found
No related merge requests found
(** Time-stamp: <modified the 21/03/2013 (at 09:56) by Erwan Jahier> *)
(** Time-stamp: <modified the 21/03/2013 (at 16:47) by Erwan Jahier> *)
open Lxm
open Lic
......
(* Time-stamp: <modified the 21/03/2013 (at 11:34) by Erwan Jahier> *)
(* Time-stamp: <modified the 21/03/2013 (at 17:04) by Erwan Jahier> *)
open SocExecValue
open Soc
......@@ -61,10 +61,8 @@ let lustre_mod ctx =
let lustre_eq ctx =
let (vn,vv) =
match ([get_val "x" ctx; get_val "y" ctx]) with
| [I x1; I x2] -> "z"::ctx.cpath,B(x1 = x2)
| [F x1; F x2] -> "z"::ctx.cpath,B(x1 = x2)
| [B x1; B x2] -> "z"::ctx.cpath,B(x1 = x2)
| [U; _] | [_;U] -> "z"::ctx.cpath,U
| [x1; x2] -> "z"::ctx.cpath,B(x1 = x2)
| _ -> assert false
in
{ ctx with s = sadd ctx.s vn vv }
......@@ -112,9 +110,8 @@ let lustre_not ctx =
let lustre_lt ctx =
let (vn,vv) =
match ([get_val "x" ctx; get_val "y" ctx]) with
| [I x1; I x2] -> "z"::ctx.cpath,B(x1 < x2)
| [F x1; F x2] -> "z"::ctx.cpath,B(x1 < x2)
| [U; _] | [_;U] -> "z"::ctx.cpath,U
| [x1; x2] -> "z"::ctx.cpath,B(x1 < x2)
| _ -> assert false
in
{ ctx with s = sadd ctx.s vn vv }
......@@ -122,9 +119,8 @@ let lustre_lt ctx =
let lustre_gt ctx =
let (vn,vv) =
match ([get_val "x" ctx; get_val "y" ctx]) with
| [I x1; I x2] -> "z"::ctx.cpath,B(x1 > x2)
| [F x1; F x2] -> "z"::ctx.cpath,B(x1 > x2)
| [U; _] | [_;U] -> "z"::ctx.cpath,U
| [x1; x2] -> "z"::ctx.cpath,B(x1 > x2)
| _ -> assert false
in
{ ctx with s = sadd ctx.s vn vv }
......@@ -132,9 +128,8 @@ let lustre_gt ctx =
let lustre_lte ctx =
let (vn,vv) =
match ([get_val "x" ctx; get_val "y" ctx]) with
| [I x1; I x2] -> "z"::ctx.cpath,B(x1 <= x2)
| [F x1; F x2] -> "z"::ctx.cpath,B(x1 <= x2)
| [U; _] | [_;U] -> "z"::ctx.cpath,U
| [x1; x2] -> "z"::ctx.cpath,B(x1 <= x2)
| _ -> assert false
in
{ ctx with s = sadd ctx.s vn vv }
......@@ -142,9 +137,8 @@ let lustre_lte ctx =
let lustre_gte ctx =
let (vn,vv) =
match ([get_val "x" ctx; get_val "y" ctx]) with
| [I x1; I x2] -> "z"::ctx.cpath,B(x1 >= x2)
| [F x1; F x2] -> "z"::ctx.cpath,B(x1 >= x2)
| [U; _] | [_;U] -> "z"::ctx.cpath,U
| [x1; x2] -> "z"::ctx.cpath,B(x1 >= x2)
| _ -> assert false
in
{ ctx with s = sadd ctx.s vn vv }
......@@ -162,8 +156,8 @@ let lustre_and ctx =
let lustre_neq ctx =
let (vn,vv) =
match ([get_val "x" ctx; get_val "y" ctx]) with
| [B x1; B x2] -> "z"::ctx.cpath,B(x1 <> x2)
| [U; _] | [_;U] -> "z"::ctx.cpath,U
| [x1; x2] -> "z"::ctx.cpath,B(x1 <> x2)
| _ -> assert false
in
{ ctx with s = sadd ctx.s vn vv }
......
(* Time-stamp: <modified the 21/03/2013 (at 11:22) by Erwan Jahier> *)
(* Time-stamp: <modified the 22/03/2013 (at 08:35) by Erwan Jahier> *)
open Soc
type t = I of int | F of float | B of bool | E of Soc.ident
type t = I of int | F of float | B of bool | E of Soc.ident * int
| A of t array | S of (Soc.ident * t) list | U
(* Meant to represent paths in the call tree. Actually it both
......@@ -173,7 +173,7 @@ let rec (to_string : t -> string) =
| F f -> string_of_float f
| B true -> "t"
| B false -> "f"
| E e -> e
| E (e,_) -> e
| S fl -> String.concat " " (List.map (fun (fn,fv) -> to_string fv) fl)
| A a ->
let str = ref "" in
......@@ -221,13 +221,22 @@ let rec (read_enum : ident list -> ident) =
let str = read_line () in
if List.mem str idl then str else (print_string "Bad enum; "; read_enum idl)
let rec pos_in_list i x l =
match l with
| e::l -> if e=x then i else pos_in_list (i+1) x l
| [] -> assert false (* should not occur *)
let (read_value : var -> t) =
fun (_,t) ->
match t with
| Bool -> print_string "Enter a bool (t/f):";flush stdout; B(read_line () = "t")
| Int -> print_string "Enter an int:"; flush stdout; I(read_int())
| Real -> print_string "Enter a float:"; flush stdout; F(read_float())
| Enum(_,idl) -> E(read_enum(idl))
| Enum(_,idl) ->
let e = read_enum(idl) in
let i = pos_in_list 0 e idl in
E(e,i)
| _ -> assert false (* finish me! *)
(* let (get_val : ident -> ctx -> t) = *)
......@@ -261,7 +270,7 @@ let (get_val : ident -> ctx -> t) =
let (get_enum : ident -> ctx -> ident) =
fun id ctx ->
match get_val id ctx with
| E e -> e
| E(e,_) -> e
| _ -> assert false (* should not fail *)
let rec (get_value : ctx -> var_expr -> t) =
......@@ -271,7 +280,8 @@ let rec (get_value : ctx -> var_expr -> t) =
| Const("true",Bool) -> B true
| Const("false",Bool) -> B false
| Const(id_in,Int) -> I (int_of_string id_in)
| Const(id_in,Real) -> F (float_of_string id_in)
| Const(id_in,Real) -> F (float_of_string id_in)
| Const(id,Enum(_,idl)) -> E(id, pos_in_list 0 id idl)
| Const(id,_) -> assert false (* finish me! *)
| Field(ve,fn,t) ->
let s = get_value ctx ve in
......
(* Time-stamp: <modified the 20/03/2013 (at 18:36) by Erwan Jahier> *)
(* Time-stamp: <modified the 22/03/2013 (at 08:35) by Erwan Jahier> *)
(** Manipulating data in the Soc interpreter *)
type t = | I of int | F of float | B of bool | E of Soc.ident
type t = | I of int | F of float | B of bool | E of Soc.ident * int
| A of t array
| S of (Soc.ident * t) list
| U (* to set uninitialized mem *)
......
(* Time-stamp: <modified the 21/03/2013 (at 10:48) by Erwan Jahier> *)
(* Time-stamp: <modified the 21/03/2013 (at 17:06) by Erwan Jahier> *)
(** Synchronous Object Code for Predefined operators. *)
......@@ -15,6 +15,7 @@ let r = Soc.Real
let aa t1 t2 = ["x", t1], ["z", t2]
let aaa t1 t2 t3 = ["x", t1; "y",t2], ["z", t3]
let aab t1 t2 = ["x", t1; "y",t2], ["z", Bool]
(* if/then/else *)
let baaa t = ["c", b; "xt", t; "xe", t], ["z", t]
......@@ -410,22 +411,16 @@ let soc_interface_of_predef:
| AstPredef.IUMINUS_n, [Int] -> of_soc_key (("Lustre::uminus"), types@[Int], None)
| AstPredef.UMINUS_n, [Real] -> of_soc_key (("Lustre::uminus"), types@[Real], None)
| AstPredef.RUMINUS_n, [Real] -> of_soc_key (("Lustre::uminus"), types@[Real], None)
| AstPredef.LT_n, [Int; Int] -> of_soc_key (("Lustre::lt"), types@[Int], None)
| AstPredef.LT_n, [Real; Real] -> of_soc_key (("Lustre::lt"), types@[Real], None)
| AstPredef.GT_n, [Int; Int] -> of_soc_key (("Lustre::gt"), types@[Int], None)
| AstPredef.GT_n, [Real; Real] -> of_soc_key (("Lustre::gt"), types@[Real], None)
| AstPredef.LTE_n, [Int; Int] -> of_soc_key (("Lustre::lte"), types@[Int], None)
| AstPredef.LTE_n, [Real; Real] -> of_soc_key (("Lustre::lte"), types@[Real], None)
| AstPredef.GTE_n, [Int; Int] -> of_soc_key (("Lustre::gte"), types@[Int], None)
| AstPredef.GTE_n, [Real; Real] -> of_soc_key (("Lustre::gte"), types@[Real], None)
| AstPredef.LT_n, [_; _] -> of_soc_key (("Lustre::lt"), types@[Bool], None)
| AstPredef.GT_n, [_; _] -> of_soc_key (("Lustre::gt"), types@[Bool], None)
| AstPredef.LTE_n, [_; _] -> of_soc_key (("Lustre::lte"), types@[Bool], None)
| AstPredef.GTE_n, [_; _] -> of_soc_key (("Lustre::gte"), types@[Bool], None)
| AstPredef.AND_n, [Bool; Bool] -> of_soc_key (("Lustre::and"), types@[Bool], None)
| AstPredef.OR_n, [Bool; Bool] -> of_soc_key (("Lustre::or"), types@[Bool], None)
| AstPredef.XOR_n, [Bool; Bool] -> of_soc_key (("Lustre::xor"), types@[Bool], None)
| AstPredef.IMPL_n, [Bool; Bool] -> of_soc_key (("Lustre::impl"), types@[Bool], None)
| AstPredef.EQ_n, [Bool; Bool] -> of_soc_key (("Lustre::eq"), types@[Bool], None)
| AstPredef.EQ_n, [Int; Int] -> of_soc_key (("Lustre::eq"), types@[Int], None)
| AstPredef.EQ_n, [Real; Real] -> of_soc_key (("Lustre::eq"), types@[Real], None)
| AstPredef.NEQ_n, [Bool; Bool] -> of_soc_key (("Lustre::neq"), types@[Bool], None)
| AstPredef.EQ_n , [_; _] -> of_soc_key (("Lustre::eq"), types@[Bool], None)
| AstPredef.NEQ_n, [_; _] -> of_soc_key (("Lustre::neq"), types@[Bool], None)
| AstPredef.NOT_n, [Bool] -> of_soc_key (("Lustre::not"), types@[Bool], None)
| AstPredef.TRUE_n, [] -> finish_me lxm ; assert false (* todo *)
......
(** Time-stamp: <modified the 21/03/2013 (at 09:55) by Erwan Jahier> *)
(** Time-stamp: <modified the 21/03/2013 (at 17:51) by Erwan Jahier> *)
open Soc
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment