summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lem_interp/run_interp.ml3
-rw-r--r--src/lexer.mll1
-rw-r--r--src/test/test3.sail6
3 files changed, 10 insertions, 0 deletions
diff --git a/src/lem_interp/run_interp.ml b/src/lem_interp/run_interp.ml
index ab5cc9f7..5708834d 100644
--- a/src/lem_interp/run_interp.ml
+++ b/src/lem_interp/run_interp.ml
@@ -54,6 +54,8 @@ let act_to_string = function
| Write_mem (id, args, sub, value) ->
sprintf "write_mem %s(%s)%s = %s" (id_to_string id) (val_to_string args)
(sub_to_string sub) (val_to_string value)
+ | Call_extern (name, arg) ->
+ "extern call to " ^ name
;;
module Reg = struct
@@ -75,6 +77,7 @@ let perform_action ((reg, mem) as env) = function
V_lit L_unit, (Reg.update id value reg, mem)
| Write_mem (id, args, None, value) ->
V_lit L_unit, (reg, Mem.update (id, args) value mem)
+ | Call_extern (name, arg) -> failwith "extern calls not implemented" (* XXX *)
| _ -> failwith "partial read/write not implemented" (* XXX *)
;;
diff --git a/src/lexer.mll b/src/lexer.mll
index 4a8058e5..7821b2b3 100644
--- a/src/lexer.mll
+++ b/src/lexer.mll
@@ -71,6 +71,7 @@ let kw_table =
("end", (fun _ -> End));
("enumerate", (fun _ -> Enumerate));
("else", (fun _ -> Else));
+ ("extern", (fun _ -> Extern));
("false", (fun _ -> False));
("forall", (fun _ -> Forall));
("foreach", (fun _ -> Foreach));
diff --git a/src/test/test3.sail b/src/test/test3.sail
index 6a88ced9..19a2d5d2 100644
--- a/src/test/test3.sail
+++ b/src/test/test3.sail
@@ -6,6 +6,9 @@ val ( nat -> nat effect { wmem , rmem } ) MEM
val ( nat -> nat effect { wmem , rmem } ) MEM_GPU
val ( ( nat * nat ) -> nat effect { wmem , rmem } ) MEM_SIZE
+(* extern function *)
+val extern ( nat -> nat pure ) add = "add"
+
function nat main _ = {
(* left-hand side function call = memory write *)
MEM(0) := 0;
@@ -24,4 +27,7 @@ function nat main _ = {
(* extra-parentheses are needed here *)
MEM_SIZE( (0,1) ) := 4;
MEM_SIZE( (0,1) );
+
+ (* extern calls *)
+ add(5);
}